From nobody Thu Mar 10 18:17:22 2022 X-Original-To: dev-commits-src-main@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 711D41A00A83; Thu, 10 Mar 2022 18:17:22 +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 4KDy2p2F6bz4glM; Thu, 10 Mar 2022 18:17:22 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1646936242; 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=XKmdZ2If6KoLOZ2BKITWnJNh0OXUyBa+fXQt6uZcKJY=; b=Le1RyVurHFiJsZU0hXzdLuFdkCdvnkHBQL+FrVR50OUdcmlqKVY05gisTz9v4WZtj/14Kk kVKrR0AIH51O/RZrFAop+M1m+Y2Fwknog8CWkjwscKX+Z9bRCtpQ8C8KrrIFU534ePXB21 5UnR+r0/z+pEJu89s3Kr9WSv0WkwJdHXbQ4H5wY8kor+oBUQ5R6n7PSguxrtstq3XwInwd bgywYxo36WmZhslNvr1/0tkM1HgiV2pBtK4f1EEhvlLwkAmKu2jv74q3XcNuM8koxc4awQ WtOFHTCvlDINz8AEvETAa1oaxmzkoU0TEKQW7Rh0/C3Z4jIpUg84dFuBFvisTg== 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 235421DF8; Thu, 10 Mar 2022 18:17:22 +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 22AIHMb4084706; Thu, 10 Mar 2022 18:17:22 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 22AIHML3084705; Thu, 10 Mar 2022 18:17:22 GMT (envelope-from git) Date: Thu, 10 Mar 2022 18:17:22 GMT Message-Id: <202203101817.22AIHML3084705@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Andrew Turner Subject: git: ba3b60200191 - main - Split out creating the arm64 L2 dmap entries List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-main@freebsd.org X-BeenThere: dev-commits-src-main@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/main X-Git-Reftype: branch X-Git-Commit: ba3b60200191399c3c128e9acee47b5254514822 Auto-Submitted: auto-generated ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1646936242; 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=XKmdZ2If6KoLOZ2BKITWnJNh0OXUyBa+fXQt6uZcKJY=; b=Z2BNLR6PzRhbFCFVnhVSmPKsL5noGHN9hDEi4Q9klf/jugdpPVV+ca84KpZQTOhgFuVH2b /3psZTPtNoQkeXMEEUfXYecZ+l6WmdNKPU0TD5QyJ7NzMUptZ7pSAM5fZnuaTPV5gGQgd0 DvFGrDNtnktDBz3hIdHppv0LDPn+VsKeP79U0PBGn6Ty77vBBpMhnUZ1rffukIKh52iZqW EZ4ficoX7XJXRRR8+0UEO2+I5lQ4fBwFOyX8kUVsXDYhpgdQsSuWZlR3vmh9Kg8ADWLrjt RHAAudCAhj7emwRkeasFv9fdNsqABRVb15sbn3WoqZ4/NtQ3NhbwdiptPCwq+Q== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1646936242; a=rsa-sha256; cv=none; b=SHMr2vITOdIekFnRo4hjold085vt8uJHfk2c2/Y13Yzj5ExxeRwDilm+cT+vgh1wEAS2Jp LLt3PrbgaS65/qe8c4RgYuoS+rr9UiF1S9Sb2N8h/25VfM4d55D2eE3d/S292hS8+57YVP cUMSCwsdrDLrHkVjQEkvBQXQ5AYNyr/pz0TUYVYhVcjzairH9OgY/5jPltlqjo+qRSyx4C 1P40oAsd5PAtPQAoLttBiThTgz3WqP+cnaME8rfp9RvDYcff3FbYH0LRnWo++sHCCg0X8+ rQfJcTtAx9J5Nnowv3pxWwjIA8nTn645Es6QYORcz3kuByNsbVo0ThwQiTk/Sg== ARC-Authentication-Results: i=1; mx1.freebsd.org; none X-ThisMailContainsUnwantedMimeParts: N The branch main has been updated by andrew: URL: https://cgit.FreeBSD.org/src/commit/?id=ba3b60200191399c3c128e9acee47b5254514822 commit ba3b60200191399c3c128e9acee47b5254514822 Author: Andrew Turner AuthorDate: 2022-03-10 18:00:40 +0000 Commit: Andrew Turner CommitDate: 2022-03-10 18:17: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 --- 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 e3e6f9036dc2..c11a13e13866 100644 --- a/sys/arm64/arm64/pmap.c +++ b/sys/arm64/arm64/pmap.c @@ -803,14 +803,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; @@ -828,40 +876,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] && @@ -875,29 +891,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) {