From nobody Mon Apr 04 11:06:04 2022 X-Original-To: dev-commits-src-branches@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 8F20C1A9717D; Mon, 4 Apr 2022 11:06:05 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4KX7Hd1yB9z3NVH; Mon, 4 Apr 2022 11:06:05 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1649070365; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=dEyd0OdRhrMpkrfTUEYdTZ+1a927XkTW5uwwwtCNDEI=; b=mbLNZ6KBmHJmkUVWnYf7gYb3PtT6Gu7w1TLZRklf67+Hul0llHZXZeP84kFwc0oRps55y+ UCFHJbHIRcKlWUIgxLGlnxcKrjpPULV/JvRD/TrHwfNZd0C//DscoakX1wZWg6eY+vLXZT estNCcpW9DJTa8W/AEmeStdQEZ797YxFjbzRdSXjsJJMzAbZ7cH0FItFuwlbZC+Fk04d7/ Dy129jLI4ozLifp4FPZZf0kGETtk65ytCwBsMBzHwErXXpkEK5NZxZh7E/HdrEU04f9Ujj M2a3f97JHMQqpN78jnnPtreJkw5Dr5ubBM5Wwgd6dSzXZKQzg5ACfduKhShyaA== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id DF6D910B3B; Mon, 4 Apr 2022 11:06:04 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 234B64YE086596; Mon, 4 Apr 2022 11:06:04 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 234B64Mi086595; Mon, 4 Apr 2022 11:06:04 GMT (envelope-from git) Date: Mon, 4 Apr 2022 11:06:04 GMT Message-Id: <202204041106.234B64Mi086595@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Andrew Turner Subject: git: 7fba91f52d17 - stable/13 - Split out creating the arm64 L2 dmap entries List-Id: Commits to the stable branches of the FreeBSD src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-branches List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-branches@freebsd.org X-BeenThere: dev-commits-src-branches@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: andrew X-Git-Repository: src X-Git-Refname: refs/heads/stable/13 X-Git-Reftype: branch X-Git-Commit: 7fba91f52d17e11c4f01a5688dc52dcc86580f0c Auto-Submitted: auto-generated ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1649070365; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=dEyd0OdRhrMpkrfTUEYdTZ+1a927XkTW5uwwwtCNDEI=; b=Dz6jZ7X8dLbjpPFEu2QPCDedtPQ/2bgCIEupc0ILIeVLakozbjJ5+1ThPlA4A+RYyalWAP y5AhF4ctBFTGI+Xn5unRMdvPTtu0tbT3hRaNWyXC4N3jEHz30QQDrNmaEEpilNZwqC8gDg A6k1EJ95+IrY1REe/OIc+GQlQb8CbUG7Xe5VbFt0P3sqBpBTgGzZnke/5B5m3m4ZJz9dw8 Ax1suWnW2D+VezLcn9Hys/150ap9bm2fhkPN1E+esLG92gAiGxu4BWE4JRmz5OL8qpW/7W 7DuSzApPhZ1BauhOPrUosm8Jk/WZUHwJXemtaTSx7/wweATdunoF7gwiTgpcmA== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1649070365; a=rsa-sha256; cv=none; b=yzAovwxv1wet6WRcKTzxcNA0s3SQG+fBD75n6NaqghLN2Nn925m8gLs54uArq5g2fQr13K Mf13cjs3UuXn6Vltlq7+tIDIu3dtZzmOWiEZmQtdExy0zv/byMpiFFR66bE/oMKyFxqZPU hF5uachFATAhPFJrYu/mTjAbjGjPP1ijGus7LhYl3dUBw5O6SZXYm+K427M9hjf76SODYn CnAz29lekAChtnEnH0fXKQvs906NTMDdX1MMhAJbJGKzUXZDtjE1JS9ujvgmL8RLu0A+kA UXeqAu1WCnNMZ2kLl1MqY6qY4rL3Y8k34uvCeeSLgKQMIQKhXHKN8fOw32HmMQ== ARC-Authentication-Results: i=1; mx1.freebsd.org; none X-ThisMailContainsUnwantedMimeParts: N The branch stable/13 has been updated by andrew: URL: https://cgit.FreeBSD.org/src/commit/?id=7fba91f52d17e11c4f01a5688dc52dcc86580f0c commit 7fba91f52d17e11c4f01a5688dc52dcc86580f0c Author: Andrew Turner AuthorDate: 2022-03-10 18:00:40 +0000 Commit: Andrew Turner CommitDate: 2022-04-04 09:37:06 +0000 Split out creating the arm64 L2 dmap entries When creating the DMAP region we may need to create level 2 page table entries at the start and end of a block of memory. The code to do this was almost identical so we can merge into a single function. Sponsored by: The FreeBSD Foundation (cherry picked from commit ba3b60200191399c3c128e9acee47b5254514822) --- sys/arm64/arm64/pmap.c | 113 +++++++++++++++++++++++-------------------------- 1 file changed, 54 insertions(+), 59 deletions(-) diff --git a/sys/arm64/arm64/pmap.c b/sys/arm64/arm64/pmap.c index a7e5cb9186ca..0129457874e2 100644 --- a/sys/arm64/arm64/pmap.c +++ b/sys/arm64/arm64/pmap.c @@ -761,14 +761,62 @@ pmap_early_vtophys(vm_offset_t va) return (pa_page | (va & PAR_LOW_MASK)); } +static vm_offset_t +pmap_bootstrap_dmap_l2(vm_offset_t *va, vm_paddr_t *pa, u_int *prev_l1_slot, + pt_entry_t **l2p, int i, vm_offset_t freemempos) +{ + pt_entry_t *l2; + vm_paddr_t l2_pa; + u_int l1_slot, l2_slot; + bool first; + + l2 = *l2p; + l1_slot = ((*va - DMAP_MIN_ADDRESS) >> L1_SHIFT); + if (l1_slot != *prev_l1_slot) { + *prev_l1_slot = l1_slot; + l2 = (pt_entry_t *)freemempos; + l2_pa = pmap_early_vtophys((vm_offset_t)l2); + freemempos += PAGE_SIZE; + + pmap_store(&pagetable_dmap[l1_slot], + (l2_pa & ~Ln_TABLE_MASK) | + TATTR_PXN_TABLE | L1_TABLE); + + memset(l2, 0, PAGE_SIZE); + } + KASSERT(l2 != NULL, + ("pmap_bootstrap_dmap_l2: NULL l2 map")); + for (first = true; *va < DMAP_MAX_ADDRESS && *pa < physmap[i + 1]; + *pa += L2_SIZE, *va += L2_SIZE) { + /* + * Stop if we are about to walk off the end of what the + * current L1 slot can address. + */ + if (!first && (*pa & L1_OFFSET) == 0) + break; + + first = false; + l2_slot = pmap_l2_index(*va); + pmap_store(&l2[l2_slot], + (*pa & ~L2_OFFSET) | ATTR_DEFAULT | + ATTR_S1_XN | + ATTR_S1_IDX(VM_MEMATTR_WRITE_BACK) | + L2_BLOCK); + } + MPASS(*va == (*pa - dmap_phys_base + DMAP_MIN_ADDRESS)); + *l2p = l2; + + return (freemempos); +} + static vm_offset_t pmap_bootstrap_dmap(vm_offset_t kern_l1, vm_paddr_t min_pa, vm_offset_t freemempos) { pt_entry_t *l2; vm_offset_t va; - vm_paddr_t l2_pa, pa; - u_int l1_slot, l2_slot, prev_l1_slot; + vm_paddr_t pa; + u_int l1_slot, prev_l1_slot; int i; dmap_phys_base = min_pa & ~L1_OFFSET; @@ -786,40 +834,8 @@ pmap_bootstrap_dmap(vm_offset_t kern_l1, vm_paddr_t min_pa, /* Create L2 mappings at the start of the region */ if ((pa & L1_OFFSET) != 0) { - l1_slot = ((va - DMAP_MIN_ADDRESS) >> L1_SHIFT); - if (l1_slot != prev_l1_slot) { - prev_l1_slot = l1_slot; - l2 = (pt_entry_t *)freemempos; - l2_pa = pmap_early_vtophys((vm_offset_t)l2); - freemempos += PAGE_SIZE; - - pmap_store(&pagetable_dmap[l1_slot], - (l2_pa & ~Ln_TABLE_MASK) | - TATTR_PXN_TABLE | L1_TABLE); - - memset(l2, 0, PAGE_SIZE); - } - KASSERT(l2 != NULL, - ("pmap_bootstrap_dmap: NULL l2 map")); - for (; va < DMAP_MAX_ADDRESS && pa < physmap[i + 1]; - pa += L2_SIZE, va += L2_SIZE) { - /* - * We are on a boundary, stop to - * create a level 1 block - */ - if ((pa & L1_OFFSET) == 0) - break; - - l2_slot = pmap_l2_index(va); - KASSERT(l2_slot != 0, ("...")); - pmap_store(&l2[l2_slot], - (pa & ~L2_OFFSET) | ATTR_DEFAULT | - ATTR_S1_XN | - ATTR_S1_IDX(VM_MEMATTR_WRITE_BACK) | - L2_BLOCK); - } - KASSERT(va == (pa - dmap_phys_base + DMAP_MIN_ADDRESS), - ("...")); + freemempos = pmap_bootstrap_dmap_l2(&va, &pa, + &prev_l1_slot, &l2, i, freemempos); } for (; va < DMAP_MAX_ADDRESS && pa < physmap[i + 1] && @@ -833,29 +849,8 @@ pmap_bootstrap_dmap(vm_offset_t kern_l1, vm_paddr_t min_pa, /* Create L2 mappings at the end of the region */ if (pa < physmap[i + 1]) { - l1_slot = ((va - DMAP_MIN_ADDRESS) >> L1_SHIFT); - if (l1_slot != prev_l1_slot) { - prev_l1_slot = l1_slot; - l2 = (pt_entry_t *)freemempos; - l2_pa = pmap_early_vtophys((vm_offset_t)l2); - freemempos += PAGE_SIZE; - - pmap_store(&pagetable_dmap[l1_slot], - (l2_pa & ~Ln_TABLE_MASK) | L1_TABLE); - - memset(l2, 0, PAGE_SIZE); - } - KASSERT(l2 != NULL, - ("pmap_bootstrap_dmap: NULL l2 map")); - for (; va < DMAP_MAX_ADDRESS && pa < physmap[i + 1]; - pa += L2_SIZE, va += L2_SIZE) { - l2_slot = pmap_l2_index(va); - pmap_store(&l2[l2_slot], - (pa & ~L2_OFFSET) | ATTR_DEFAULT | - ATTR_S1_XN | - ATTR_S1_IDX(VM_MEMATTR_WRITE_BACK) | - L2_BLOCK); - } + freemempos = pmap_bootstrap_dmap_l2(&va, &pa, + &prev_l1_slot, &l2, i, freemempos); } if (pa > dmap_phys_max) {