Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F107061293
D44677.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
3 KB
Referenced Files
None
Subscribers
None
D44677.diff
View Options
diff --git a/sys/arm64/arm64/efirt_machdep.c b/sys/arm64/arm64/efirt_machdep.c
--- a/sys/arm64/arm64/efirt_machdep.c
+++ b/sys/arm64/arm64/efirt_machdep.c
@@ -144,13 +144,8 @@
vm_offset_t
efi_phys_to_kva(vm_paddr_t paddr)
{
- vm_offset_t vaddr;
-
- if (PHYS_IN_DMAP(paddr)) {
- vaddr = PHYS_TO_DMAP(paddr);
- if (pmap_klookup(vaddr, NULL))
- return (vaddr);
- }
+ if (PHYS_IN_DMAP(paddr))
+ return (PHYS_TO_DMAP(paddr));
/* TODO: Map memory not in the DMAP */
diff --git a/sys/arm64/arm64/machdep.c b/sys/arm64/arm64/machdep.c
--- a/sys/arm64/arm64/machdep.c
+++ b/sys/arm64/arm64/machdep.c
@@ -444,7 +444,7 @@
/*
* If it is within the DMAP region and is writable use that.
*/
- if (PHYS_IN_DMAP(pa)) {
+ if (PHYS_IN_DMAP_RANGE(pa)) {
addr = (void *)PHYS_TO_DMAP(pa);
if (PAR_SUCCESS(arm64_address_translate_s1e1w(
(vm_offset_t)addr))) {
diff --git a/sys/arm64/arm64/minidump_machdep.c b/sys/arm64/arm64/minidump_machdep.c
--- a/sys/arm64/arm64/minidump_machdep.c
+++ b/sys/arm64/arm64/minidump_machdep.c
@@ -202,7 +202,8 @@
if ((l3e & ATTR_DESCR_MASK) != L3_PAGE)
continue;
pa = PTE_TO_PHYS(l3e);
- if (PHYS_IN_DMAP(pa) && vm_phys_is_dumpable(pa))
+ if (PHYS_IN_DMAP_RANGE(pa) &&
+ vm_phys_is_dumpable(pa))
vm_page_dump_add(state->dump_bitset,
pa);
}
@@ -216,7 +217,7 @@
dumpsize += round_page(sizeof(dump_avail));
dumpsize += round_page(BITSET_SIZE(vm_page_dump_pages));
VM_PAGE_DUMP_FOREACH(state->dump_bitset, pa) {
- if (PHYS_IN_DMAP(pa) && vm_phys_is_dumpable(pa))
+ if (PHYS_IN_DMAP_RANGE(pa) && vm_phys_is_dumpable(pa))
dumpsize += PAGE_SIZE;
else
vm_page_dump_drop(state->dump_bitset, pa);
@@ -347,7 +348,7 @@
* We always write a page, even if it is zero. If pa
* is malformed, write the zeroed tmpbuffer.
*/
- if (PHYS_IN_DMAP(pa) && vm_phys_is_dumpable(pa))
+ if (PHYS_IN_DMAP_RANGE(pa) && vm_phys_is_dumpable(pa))
error = blk_write(di, NULL, pa, PAGE_SIZE);
else
error = blk_write(di, (char *)&tmpbuffer, 0,
diff --git a/sys/arm64/include/vmparam.h b/sys/arm64/include/vmparam.h
--- a/sys/arm64/include/vmparam.h
+++ b/sys/arm64/include/vmparam.h
@@ -223,9 +223,21 @@
#define DMAP_MIN_PHYSADDR (dmap_phys_base)
#define DMAP_MAX_PHYSADDR (dmap_phys_max)
-/* True if pa is in the dmap range */
-#define PHYS_IN_DMAP(pa) ((pa) >= DMAP_MIN_PHYSADDR && \
+/*
+ * Checks to see if a physical address is in the DMAP range.
+ * - PHYS_IN_DMAP_RANGE will return true that may be within the DMAP range
+ * but not accessible through the DMAP, e.g. device memory between two
+ * DMAP physical address regions.
+ * - PHYS_IN_DMAP will check if DMAP address is mapped before returning true.
+ *
+ * PHYS_IN_DMAP_RANGE should only be used when a check on the address is
+ * performed, e.g. by checking the physical address is within phys_avail,
+ * or checking the virtual address is mapped.
+ */
+#define PHYS_IN_DMAP_RANGE(pa) ((pa) >= DMAP_MIN_PHYSADDR && \
(pa) < DMAP_MAX_PHYSADDR)
+#define PHYS_IN_DMAP(pa) (PHYS_IN_DMAP_RANGE(pa) && \
+ pmap_klookup(PHYS_TO_DMAP(pa), NULL))
/* True if va is in the dmap range */
#define VIRT_IN_DMAP(va) ((va) >= DMAP_MIN_ADDRESS && \
(va) < (dmap_max_addr))
@@ -233,7 +245,7 @@
#define PMAP_HAS_DMAP 1
#define PHYS_TO_DMAP(pa) \
({ \
- KASSERT(PHYS_IN_DMAP(pa), \
+ KASSERT(PHYS_IN_DMAP_RANGE(pa), \
("%s: PA out of range, PA: 0x%lx", __func__, \
(vm_paddr_t)(pa))); \
((pa) - dmap_phys_base) + DMAP_MIN_ADDRESS; \
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Fri, Jan 10, 12:13 PM (14 h, 4 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
15742527
Default Alt Text
D44677.diff (3 KB)
Attached To
Mode
D44677: arm64: Check DMAP address is valid in PHYS_IN_DMAP
Attached
Detach File
Event Timeline
Log In to Comment