git: 496453e9de3f - main - amd64/aarch64 pmap: Switch type of pmap_preinit_mapping.va to void *
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Thu, 23 Apr 2026 18:16:26 UTC
The branch main has been updated by jhb:
URL: https://cgit.FreeBSD.org/src/commit/?id=496453e9de3f27f84b6c68d2377f5e525d132967
commit 496453e9de3f27f84b6c68d2377f5e525d132967
Author: John Baldwin <jhb@FreeBSD.org>
AuthorDate: 2026-04-23 17:05:55 +0000
Commit: John Baldwin <jhb@FreeBSD.org>
CommitDate: 2026-04-23 17:05:55 +0000
amd64/aarch64 pmap: Switch type of pmap_preinit_mapping.va to void *
Effort: CHERI upstreaming
Reviewed by: kib
Sponsored by: AFRL, DARPA
Pull Request: https://github.com/freebsd/freebsd-src/pull/2068
---
sys/amd64/amd64/pmap.c | 32 +++++++++++++++++---------------
sys/arm64/arm64/pmap.c | 24 +++++++++++++-----------
2 files changed, 30 insertions(+), 26 deletions(-)
diff --git a/sys/amd64/amd64/pmap.c b/sys/amd64/amd64/pmap.c
index b9ecc230495d..60a5b5a2da9a 100644
--- a/sys/amd64/amd64/pmap.c
+++ b/sys/amd64/amd64/pmap.c
@@ -530,7 +530,7 @@ struct kva_layout_s kva_layout_la57 = {
#define PMAP_PREINIT_MAPPING_COUNT 8
static struct pmap_preinit_mapping {
vm_paddr_t pa;
- vm_offset_t va;
+ void *va;
vm_size_t sz;
int mode;
} pmap_preinit_mapping[PMAP_PREINIT_MAPPING_COUNT];
@@ -2608,7 +2608,7 @@ pmap_init(void)
pmap_initialized = 1;
for (i = 0; i < PMAP_PREINIT_MAPPING_COUNT; i++) {
ppim = pmap_preinit_mapping + i;
- if (ppim->va == 0)
+ if (ppim->va == NULL)
continue;
/* Make the direct map consistent */
if (ppim->pa < dmaplimit && ppim->pa + ppim->sz <= dmaplimit) {
@@ -2617,7 +2617,7 @@ pmap_init(void)
}
if (!bootverbose)
continue;
- printf("PPIM %u: PA=%#lx, VA=%#lx, size=%#lx, mode=%#x\n", i,
+ printf("PPIM %u: PA=%#lx, VA=%p, size=%#lx, mode=%#x\n", i,
ppim->pa, ppim->va, ppim->sz, ppim->mode);
}
@@ -9407,13 +9407,13 @@ pmap_mapdev_internal(vm_paddr_t pa, vm_size_t size, int mode, int flags)
va = NULL;
for (i = 0; i < PMAP_PREINIT_MAPPING_COUNT; i++) {
ppim = pmap_preinit_mapping + i;
- if (ppim->va == 0) {
+ if (ppim->va == NULL) {
ppim->pa = pa;
ppim->sz = size;
ppim->mode = mode;
- ppim->va = virtual_avail;
+ ppim->va = (void *)virtual_avail;
virtual_avail += size;
- va = (void *)ppim->va;
+ va = ppim->va;
break;
}
}
@@ -9495,15 +9495,17 @@ void
pmap_unmapdev(void *p, vm_size_t size)
{
struct pmap_preinit_mapping *ppim;
- vm_offset_t offset, va;
+ char *va;
+ vm_offset_t offset;
int i;
- va = (vm_offset_t)p;
+ va = p;
/* If we gave a direct map region in pmap_mapdev, do nothing */
- if (va >= kva_layout.dmap_low && va < kva_layout.dmap_high)
+ if ((vm_offset_t)va >= kva_layout.dmap_low &&
+ (vm_offset_t)va < kva_layout.dmap_high)
return;
- offset = va & PAGE_MASK;
+ offset = (vm_offset_t)va & PAGE_MASK;
size = round_page(offset + size);
va = trunc_page(va);
for (i = 0; i < PMAP_PREINIT_MAPPING_COUNT; i++) {
@@ -9512,17 +9514,17 @@ pmap_unmapdev(void *p, vm_size_t size)
if (pmap_initialized)
return;
ppim->pa = 0;
- ppim->va = 0;
+ ppim->va = NULL;
ppim->sz = 0;
ppim->mode = 0;
- if (va + size == virtual_avail)
- virtual_avail = va;
+ if (va + size == (void *)virtual_avail)
+ virtual_avail = (vm_offset_t)va;
return;
}
}
if (pmap_initialized) {
- pmap_qremove((void *)va, atop(size));
- kva_free((void *)va, size);
+ pmap_qremove(va, atop(size));
+ kva_free(va, size);
}
}
diff --git a/sys/arm64/arm64/pmap.c b/sys/arm64/arm64/pmap.c
index 0ce4435e481d..4e216ea01ab5 100644
--- a/sys/arm64/arm64/pmap.c
+++ b/sys/arm64/arm64/pmap.c
@@ -319,7 +319,7 @@ static int vm_initialized = 0; /* No need to use pre-init maps when set */
*/
static struct pmap_preinit_mapping {
vm_paddr_t pa;
- vm_offset_t va;
+ void *va;
vm_size_t size;
} pmap_preinit_mapping[PMAP_PREINIT_MAPPING_COUNT];
@@ -8042,7 +8042,7 @@ pmap_mapbios(vm_paddr_t pa, vm_size_t size)
/* Mark entries as allocated */
ppim = pmap_preinit_mapping + i;
ppim->pa = pa;
- ppim->va = va + offset;
+ ppim->va = (char *)va + offset;
ppim->size = size;
}
@@ -8104,20 +8104,21 @@ void
pmap_unmapbios(void *p, vm_size_t size)
{
struct pmap_preinit_mapping *ppim;
- vm_offset_t offset, va, va_trunc;
+ char *va;
+ vm_offset_t offset, va_trunc;
pd_entry_t *pde;
pt_entry_t *l2;
int error __diagused, i, lvl, l2_blocks, block;
bool preinit_map;
- va = (vm_offset_t)p;
+ va = p;
if (VIRT_IN_DMAP(va)) {
KASSERT(VIRT_IN_DMAP(va + size - 1),
- ("%s: End address not in DMAP region: %lx", __func__,
+ ("%s: End address not in DMAP region: %p", __func__,
va + size - 1));
/* Ensure the attributes are as expected for the DMAP region */
PMAP_LOCK(kernel_pmap);
- error = pmap_change_props_locked(p, size,
+ error = pmap_change_props_locked(va, size,
PROT_READ | PROT_WRITE, VM_MEMATTR_DEFAULT, false);
PMAP_UNLOCK(kernel_pmap);
KASSERT(error == 0, ("%s: Failed to reset DMAP attributes: %d",
@@ -8138,12 +8139,13 @@ pmap_unmapbios(void *p, vm_size_t size)
if (ppim->va == va) {
KASSERT(ppim->size == size,
("pmap_unmapbios: size mismatch"));
- ppim->va = 0;
+ ppim->va = NULL;
ppim->pa = 0;
ppim->size = 0;
preinit_map = true;
offset = block * L2_SIZE;
- va_trunc = rounddown2(va, L2_SIZE) + offset;
+ va_trunc = rounddown2((vm_offset_t)va, L2_SIZE) +
+ offset;
/* Remove L2_BLOCK */
pde = pmap_pde(kernel_pmap, va_trunc, &lvl);
@@ -8165,14 +8167,14 @@ pmap_unmapbios(void *p, vm_size_t size)
/* Unmap the pages reserved with kva_alloc. */
if (vm_initialized) {
- offset = va & PAGE_MASK;
+ offset = (vm_offset_t)va & PAGE_MASK;
size = round_page(offset + size);
va = trunc_page(va);
/* Unmap and invalidate the pages */
- pmap_kremove_device(va, size);
+ pmap_kremove_device((vm_offset_t)va, size);
- kva_free((void *)va, size);
+ kva_free(va, size);
}
}