aboutsummaryrefslogtreecommitdiff
path: root/sys/arm64/arm64/minidump_machdep.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/arm64/arm64/minidump_machdep.c')
-rw-r--r--sys/arm64/arm64/minidump_machdep.c20
1 files changed, 12 insertions, 8 deletions
diff --git a/sys/arm64/arm64/minidump_machdep.c b/sys/arm64/arm64/minidump_machdep.c
index 3dfeb3dfef1e..87bf41b27fdf 100644
--- a/sys/arm64/arm64/minidump_machdep.c
+++ b/sys/arm64/arm64/minidump_machdep.c
@@ -30,8 +30,6 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
#include "opt_watchdog.h"
#include <sys/param.h>
@@ -183,7 +181,7 @@ cpu_minidumpsys(struct dumperinfo *di, const struct minidumpstate *state)
l1e = atomic_load_64(l1);
l2e = atomic_load_64(l2);
if ((l1e & ATTR_DESCR_MASK) == L1_BLOCK) {
- pa = l1e & ~ATTR_MASK;
+ pa = PTE_TO_PHYS(l1e);
for (i = 0; i < Ln_ENTRIES * Ln_ENTRIES;
i++, pa += PAGE_SIZE)
if (vm_phys_is_dumpable(pa))
@@ -192,7 +190,7 @@ cpu_minidumpsys(struct dumperinfo *di, const struct minidumpstate *state)
pmapsize += (Ln_ENTRIES - 1) * PAGE_SIZE;
va += L1_SIZE - L2_SIZE;
} else if ((l2e & ATTR_DESCR_MASK) == L2_BLOCK) {
- pa = l2e & ~ATTR_MASK;
+ pa = PTE_TO_PHYS(l2e);
for (i = 0; i < Ln_ENTRIES; i++, pa += PAGE_SIZE) {
if (vm_phys_is_dumpable(pa))
vm_page_dump_add(state->dump_bitset,
@@ -203,7 +201,7 @@ cpu_minidumpsys(struct dumperinfo *di, const struct minidumpstate *state)
l3e = atomic_load_64(&l3[i]);
if ((l3e & ATTR_DESCR_MASK) != L3_PAGE)
continue;
- pa = l3e & ~ATTR_MASK;
+ pa = PTE_TO_PHYS(l3e);
if (PHYS_IN_DMAP(pa) && vm_phys_is_dumpable(pa))
vm_page_dump_add(state->dump_bitset,
pa);
@@ -239,7 +237,13 @@ cpu_minidumpsys(struct dumperinfo *di, const struct minidumpstate *state)
mdhdr.dmapbase = DMAP_MIN_ADDRESS;
mdhdr.dmapend = DMAP_MAX_ADDRESS;
mdhdr.dumpavailsize = round_page(sizeof(dump_avail));
+#if PAGE_SIZE == PAGE_SIZE_4K
mdhdr.flags = MINIDUMP_FLAG_PS_4K;
+#elif PAGE_SIZE == PAGE_SIZE_16K
+ mdhdr.flags = MINIDUMP_FLAG_PS_16K;
+#else
+#error Unsupported page size
+#endif
dump_init_header(di, &kdh, KERNELDUMPMAGIC, KERNELDUMP_AARCH64_VERSION,
dumpsize);
@@ -300,7 +304,7 @@ cpu_minidumpsys(struct dumperinfo *di, const struct minidumpstate *state)
* Handle a 1GB block mapping: write out 512 fake L2
* pages.
*/
- pa = (l1e & ~ATTR_MASK) | (va & L1_OFFSET);
+ pa = PTE_TO_PHYS(l1e) | (va & L1_OFFSET);
for (i = 0; i < Ln_ENTRIES; i++) {
for (j = 0; j < Ln_ENTRIES; j++) {
@@ -320,7 +324,7 @@ cpu_minidumpsys(struct dumperinfo *di, const struct minidumpstate *state)
bzero(&tmpbuffer, sizeof(tmpbuffer));
va += L1_SIZE - L2_SIZE;
} else if ((l2e & ATTR_DESCR_MASK) == L2_BLOCK) {
- pa = (l2e & ~ATTR_MASK) | (va & L2_OFFSET);
+ pa = PTE_TO_PHYS(l2e) | (va & L2_OFFSET);
/* Generate fake l3 entries based upon the l1 entry */
for (i = 0; i < Ln_ENTRIES; i++) {
@@ -337,7 +341,7 @@ cpu_minidumpsys(struct dumperinfo *di, const struct minidumpstate *state)
bzero(&tmpbuffer, sizeof(tmpbuffer));
continue;
} else {
- pa = l2e & ~ATTR_MASK;
+ pa = PTE_TO_PHYS(l2e);
/*
* We always write a page, even if it is zero. If pa