Changeset View
Changeset View
Standalone View
Standalone View
sys/arm64/arm64/minidump_machdep.c
Show First 20 Lines • Show All 181 Lines • ▼ Show 20 Lines | for (va = VM_MIN_KERNEL_ADDRESS; va < kva_end; va += L2_SIZE) { | ||||
l1e = atomic_load_64(l1); | l1e = atomic_load_64(l1); | ||||
l2e = atomic_load_64(l2); | l2e = atomic_load_64(l2); | ||||
if ((l1e & ATTR_DESCR_MASK) == L1_BLOCK) { | if ((l1e & ATTR_DESCR_MASK) == L1_BLOCK) { | ||||
pa = l1e & ~ATTR_MASK; | pa = l1e & ~ATTR_MASK; | ||||
for (i = 0; i < Ln_ENTRIES * Ln_ENTRIES; | for (i = 0; i < Ln_ENTRIES * Ln_ENTRIES; | ||||
i++, pa += PAGE_SIZE) | i++, pa += PAGE_SIZE) | ||||
if (vm_phys_is_dumpable(pa)) | if (vm_phys_is_dumpable(pa)) | ||||
dump_add_page(pa); | vm_page_dump_add(state->dump_bitset, | ||||
pa); | |||||
pmapsize += (Ln_ENTRIES - 1) * PAGE_SIZE; | pmapsize += (Ln_ENTRIES - 1) * PAGE_SIZE; | ||||
va += L1_SIZE - L2_SIZE; | va += L1_SIZE - L2_SIZE; | ||||
} else if ((l2e & ATTR_DESCR_MASK) == L2_BLOCK) { | } else if ((l2e & ATTR_DESCR_MASK) == L2_BLOCK) { | ||||
pa = l2e & ~ATTR_MASK; | pa = l2e & ~ATTR_MASK; | ||||
for (i = 0; i < Ln_ENTRIES; i++, pa += PAGE_SIZE) { | for (i = 0; i < Ln_ENTRIES; i++, pa += PAGE_SIZE) { | ||||
if (vm_phys_is_dumpable(pa)) | if (vm_phys_is_dumpable(pa)) | ||||
dump_add_page(pa); | vm_page_dump_add(state->dump_bitset, | ||||
pa); | |||||
} | } | ||||
} else if ((l2e & ATTR_DESCR_MASK) == L2_TABLE) { | } else if ((l2e & ATTR_DESCR_MASK) == L2_TABLE) { | ||||
for (i = 0; i < Ln_ENTRIES; i++) { | for (i = 0; i < Ln_ENTRIES; i++) { | ||||
l3e = atomic_load_64(&l3[i]); | l3e = atomic_load_64(&l3[i]); | ||||
if ((l3e & ATTR_DESCR_MASK) != L3_PAGE) | if ((l3e & ATTR_DESCR_MASK) != L3_PAGE) | ||||
continue; | continue; | ||||
pa = l3e & ~ATTR_MASK; | pa = l3e & ~ATTR_MASK; | ||||
pa = l3e & ~ATTR_MASK; | |||||
if (PHYS_IN_DMAP(pa) && vm_phys_is_dumpable(pa)) | if (PHYS_IN_DMAP(pa) && vm_phys_is_dumpable(pa)) | ||||
dump_add_page(pa); | vm_page_dump_add(state->dump_bitset, | ||||
pa); | |||||
} | } | ||||
} | } | ||||
} | } | ||||
/* Calculate dump size. */ | /* Calculate dump size. */ | ||||
mbp = state->msgbufp; | mbp = state->msgbufp; | ||||
dumpsize = pmapsize; | dumpsize = pmapsize; | ||||
dumpsize += round_page(mbp->msg_size); | dumpsize += round_page(mbp->msg_size); | ||||
dumpsize += round_page(sizeof(dump_avail)); | dumpsize += round_page(sizeof(dump_avail)); | ||||
dumpsize += round_page(BITSET_SIZE(vm_page_dump_pages)); | dumpsize += round_page(BITSET_SIZE(vm_page_dump_pages)); | ||||
VM_PAGE_DUMP_FOREACH(pa) { | VM_PAGE_DUMP_FOREACH(state->dump_bitset, pa) { | ||||
if (PHYS_IN_DMAP(pa) && vm_phys_is_dumpable(pa)) | if (PHYS_IN_DMAP(pa) && vm_phys_is_dumpable(pa)) | ||||
dumpsize += PAGE_SIZE; | dumpsize += PAGE_SIZE; | ||||
else | else | ||||
dump_drop_page(pa); | vm_page_dump_drop(state->dump_bitset, pa); | ||||
} | } | ||||
dumpsize += PAGE_SIZE; | dumpsize += PAGE_SIZE; | ||||
dumpsys_pb_init(dumpsize); | dumpsys_pb_init(dumpsize); | ||||
/* Initialize mdhdr */ | /* Initialize mdhdr */ | ||||
bzero(&mdhdr, sizeof(mdhdr)); | bzero(&mdhdr, sizeof(mdhdr)); | ||||
strcpy(mdhdr.magic, MINIDUMP_MAGIC); | strcpy(mdhdr.magic, MINIDUMP_MAGIC); | ||||
Show All 34 Lines | _Static_assert(sizeof(dump_avail) <= sizeof(tmpbuffer), | ||||
"Large dump_avail not handled"); | "Large dump_avail not handled"); | ||||
bzero(tmpbuffer, sizeof(tmpbuffer)); | bzero(tmpbuffer, sizeof(tmpbuffer)); | ||||
memcpy(tmpbuffer, dump_avail, sizeof(dump_avail)); | memcpy(tmpbuffer, dump_avail, sizeof(dump_avail)); | ||||
error = blk_write(di, (char *)&tmpbuffer, 0, PAGE_SIZE); | error = blk_write(di, (char *)&tmpbuffer, 0, PAGE_SIZE); | ||||
if (error) | if (error) | ||||
goto fail; | goto fail; | ||||
/* Dump bitmap */ | /* Dump bitmap */ | ||||
error = blk_write(di, (char *)vm_page_dump, 0, | error = blk_write(di, (char *)state->dump_bitset, 0, | ||||
round_page(BITSET_SIZE(vm_page_dump_pages))); | round_page(BITSET_SIZE(vm_page_dump_pages))); | ||||
if (error) | if (error) | ||||
goto fail; | goto fail; | ||||
/* Dump kernel page directory pages */ | /* Dump kernel page directory pages */ | ||||
bzero(&tmpbuffer, sizeof(tmpbuffer)); | bzero(&tmpbuffer, sizeof(tmpbuffer)); | ||||
for (va = VM_MIN_KERNEL_ADDRESS; va < kva_end; va += L2_SIZE) { | for (va = VM_MIN_KERNEL_ADDRESS; va < kva_end; va += L2_SIZE) { | ||||
if (!pmap_get_tables(pmap_kernel(), va, &l0, &l1, &l2, &l3)) { | if (!pmap_get_tables(pmap_kernel(), va, &l0, &l1, &l2, &l3)) { | ||||
▲ Show 20 Lines • Show All 64 Lines • ▼ Show 20 Lines | if ((l1e & ATTR_DESCR_MASK) == L1_BLOCK) { | ||||
error = blk_write(di, (char *)&tmpbuffer, 0, | error = blk_write(di, (char *)&tmpbuffer, 0, | ||||
PAGE_SIZE); | PAGE_SIZE); | ||||
if (error) | if (error) | ||||
goto fail; | goto fail; | ||||
} | } | ||||
} | } | ||||
/* Dump memory chunks */ | /* Dump memory chunks */ | ||||
VM_PAGE_DUMP_FOREACH(pa) { | VM_PAGE_DUMP_FOREACH(state->dump_bitset, pa) { | ||||
error = blk_write(di, 0, pa, PAGE_SIZE); | error = blk_write(di, 0, pa, PAGE_SIZE); | ||||
if (error) | if (error) | ||||
goto fail; | goto fail; | ||||
} | } | ||||
error = blk_flush(di); | error = blk_flush(di); | ||||
if (error) | if (error) | ||||
goto fail; | goto fail; | ||||
Show All 30 Lines |