git: f9ba99eaa24f - main - physmem: Add a way to read all memory
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Tue, 12 May 2026 16:55:29 UTC
The branch main has been updated by andrew:
URL: https://cgit.FreeBSD.org/src/commit/?id=f9ba99eaa24fb41a69c5480621427fe64333986f
commit f9ba99eaa24fb41a69c5480621427fe64333986f
Author: Sarah Walker <sarah.walker2@arm.com>
AuthorDate: 2026-05-12 11:10:32 +0000
Commit: Andrew Turner <andrew@FreeBSD.org>
CommitDate: 2026-05-12 16:54:40 +0000
physmem: Add a way to read all memory
In Arm CCA we need to find all memory to protect it. This needs to find
all memory, ignoring any excluded memory to protect it from the host.
Add physmem_all that reads all physical memory regions.
Co-developed-by: Andrew Turner <andrew@> (writing tests & commit message)
Sponsored by: Arm Ltd
---
sys/kern/subr_physmem.c | 6 ++++++
sys/sys/physmem.h | 1 +
tests/sys/kern/subr_physmem_test.c | 33 +++++++++++++++++++++++++++++++++
3 files changed, 40 insertions(+)
diff --git a/sys/kern/subr_physmem.c b/sys/kern/subr_physmem.c
index 6b97b36a6c51..7458c8147ad1 100644
--- a/sys/kern/subr_physmem.c
+++ b/sys/kern/subr_physmem.c
@@ -503,6 +503,12 @@ physmem_avail(vm_paddr_t *avail, size_t maxavail)
return (regions_to_avail(avail, EXFLAG_NOALLOC, maxavail, 0, NULL, NULL));
}
+size_t
+physmem_all(vm_paddr_t *avail, size_t maxavail)
+{
+ return (regions_to_avail(avail, 0, maxavail, 0, NULL, NULL));
+}
+
bool
physmem_excluded(vm_paddr_t pa, vm_size_t sz)
{
diff --git a/sys/sys/physmem.h b/sys/sys/physmem.h
index 1b75dc63dc40..97c3ad9f3154 100644
--- a/sys/sys/physmem.h
+++ b/sys/sys/physmem.h
@@ -54,6 +54,7 @@
void physmem_hardware_region(uint64_t pa, uint64_t sz);
void physmem_exclude_region(vm_paddr_t pa, vm_size_t sz, uint32_t flags);
size_t physmem_avail(vm_paddr_t *avail, size_t maxavail);
+size_t physmem_all(vm_paddr_t *avail, size_t maxavail);
void physmem_init_kernel_globals(void);
void physmem_print_tables(void);
bool physmem_excluded(vm_paddr_t pa, vm_size_t sz);
diff --git a/tests/sys/kern/subr_physmem_test.c b/tests/sys/kern/subr_physmem_test.c
index b810a2016473..31bd30447e3b 100644
--- a/tests/sys/kern/subr_physmem_test.c
+++ b/tests/sys/kern/subr_physmem_test.c
@@ -79,6 +79,12 @@ ATF_TC_BODY(hwregion, tc)
ATF_CHECK_EQ(len, 2);
ATF_CHECK_EQ(avail[0], 2 * PAGE_SIZE);
ATF_CHECK_EQ(avail[1], 7 * PAGE_SIZE);
+
+ /* Check physmem_all */
+ len = physmem_all(avail, nitems(avail));
+ ATF_CHECK_EQ(len, 2);
+ ATF_CHECK_EQ(avail[0], 2 * PAGE_SIZE);
+ ATF_CHECK_EQ(avail[1], 7 * PAGE_SIZE);
}
ATF_TC_WITHOUT_HEAD(hwregion_exclude);
@@ -106,6 +112,27 @@ ATF_TC_BODY(hwregion_exclude, tc)
ATF_CHECK_EQ(avail[1], 3 * PAGE_SIZE);
ATF_CHECK_EQ(avail[2], 6 * PAGE_SIZE);
ATF_CHECK_EQ(avail[3], 7 * PAGE_SIZE);
+
+ /* Check physmem_all */
+ len = physmem_all(avail, 6);
+ ATF_CHECK_EQ(len, 2);
+ ATF_CHECK_EQ(avail[0], 2 * PAGE_SIZE);
+ ATF_CHECK_EQ(avail[1], 7 * PAGE_SIZE);
+
+ /* Check an excluded region out of the included memory works */
+ physmem_exclude_region(7 * PAGE_SIZE, PAGE_SIZE, EXFLAG_NOALLOC);
+ len = physmem_avail(avail, 6);
+ ATF_CHECK_EQ(len, 4);
+ ATF_CHECK_EQ(avail[0], 2 * PAGE_SIZE);
+ ATF_CHECK_EQ(avail[1], 3 * PAGE_SIZE);
+ ATF_CHECK_EQ(avail[2], 6 * PAGE_SIZE);
+ ATF_CHECK_EQ(avail[3], 7 * PAGE_SIZE);
+
+ /* Check physmem_all */
+ len = physmem_all(avail, 6);
+ ATF_CHECK_EQ(len, 2);
+ ATF_CHECK_EQ(avail[0], 2 * PAGE_SIZE);
+ ATF_CHECK_EQ(avail[1], 7 * PAGE_SIZE);
}
ATF_TC_WITHOUT_HEAD(hwregion_unordered);
@@ -125,6 +152,12 @@ ATF_TC_BODY(hwregion_unordered, tc)
ATF_CHECK_EQ(len, 2);
ATF_CHECK_EQ(avail[0], PAGE_SIZE);
ATF_CHECK_EQ(avail[1], 3 * PAGE_SIZE);
+
+ /* Check physmem_all */
+ len = physmem_all(avail, 4);
+ ATF_CHECK_EQ(len, 2);
+ ATF_CHECK_EQ(avail[0], PAGE_SIZE);
+ ATF_CHECK_EQ(avail[1], 3 * PAGE_SIZE);
}
ATF_TP_ADD_TCS(tp)