Changeset View
Changeset View
Standalone View
Standalone View
sys/riscv/riscv/minidump_machdep.c
Show First 20 Lines • Show All 93 Lines • ▼ Show 20 Lines | for (i = 0; i < nitems(progress_track); i++) { | ||||
if (progress_track[i].visited) | if (progress_track[i].visited) | ||||
return; | return; | ||||
progress_track[i].visited = 1; | progress_track[i].visited = 1; | ||||
printf("..%d%%", sofar); | printf("..%d%%", sofar); | ||||
return; | return; | ||||
} | } | ||||
} | } | ||||
static bool | |||||
is_dumpable(vm_paddr_t pa) | |||||
{ | |||||
vm_page_t m; | |||||
int i; | |||||
if ((m = vm_phys_paddr_to_vm_page(pa)) != NULL) | |||||
return ((m->flags & PG_NODUMP) == 0); | |||||
for (i = 0; dump_avail[i] != 0 || dump_avail[i + 1] != 0; i += 2) { | |||||
if (pa >= dump_avail[i] && pa < dump_avail[i + 1]) | |||||
return (true); | |||||
} | |||||
return (false); | |||||
} | |||||
static int | static int | ||||
blk_flush(struct dumperinfo *di) | blk_flush(struct dumperinfo *di) | ||||
{ | { | ||||
int error; | int error; | ||||
if (fragsz == 0) | if (fragsz == 0) | ||||
return (0); | return (0); | ||||
▲ Show 20 Lines • Show All 110 Lines • ▼ Show 20 Lines | for (va = VM_MIN_KERNEL_ADDRESS; va < kernel_vm_end; va += L2_SIZE) { | ||||
/* We should always be using the l2 table for kvm */ | /* We should always be using the l2 table for kvm */ | ||||
if (l2 == NULL) | if (l2 == NULL) | ||||
continue; | continue; | ||||
/* l2 may be a superpage */ | /* l2 may be a superpage */ | ||||
if ((*l2 & PTE_RWX) != 0) { | if ((*l2 & PTE_RWX) != 0) { | ||||
pa = (*l2 >> PTE_PPN1_S) << L2_SHIFT; | pa = (*l2 >> PTE_PPN1_S) << L2_SHIFT; | ||||
for (i = 0; i < Ln_ENTRIES; i++, pa += PAGE_SIZE) { | for (i = 0; i < Ln_ENTRIES; i++, pa += PAGE_SIZE) { | ||||
if (is_dumpable(pa)) | if (vm_phys_is_dumpable(pa)) | ||||
dump_add_page(pa); | dump_add_page(pa); | ||||
} | } | ||||
} else { | } else { | ||||
for (i = 0; i < Ln_ENTRIES; i++) { | for (i = 0; i < Ln_ENTRIES; i++) { | ||||
if ((l3[i] & PTE_V) == 0) | if ((l3[i] & PTE_V) == 0) | ||||
continue; | continue; | ||||
pa = (l3[i] >> PTE_PPN0_S) * PAGE_SIZE; | pa = (l3[i] >> PTE_PPN0_S) * PAGE_SIZE; | ||||
if (is_dumpable(pa)) | if (vm_phys_is_dumpable(pa)) | ||||
dump_add_page(pa); | dump_add_page(pa); | ||||
} | } | ||||
} | } | ||||
} | } | ||||
/* Calculate dump size */ | /* Calculate dump size */ | ||||
dumpsize = pmapsize; | dumpsize = pmapsize; | ||||
dumpsize += round_page(msgbufp->msg_size); | dumpsize += round_page(msgbufp->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(pa) { | ||||
/* Clear out undumpable pages now if needed */ | /* Clear out undumpable pages now if needed */ | ||||
if (is_dumpable(pa)) | if (vm_phys_is_dumpable(pa)) | ||||
dumpsize += PAGE_SIZE; | dumpsize += PAGE_SIZE; | ||||
else | else | ||||
dump_drop_page(pa); | dump_drop_page(pa); | ||||
} | } | ||||
dumpsize += PAGE_SIZE; | dumpsize += PAGE_SIZE; | ||||
progress = dumpsize; | progress = dumpsize; | ||||
▲ Show 20 Lines • Show All 128 Lines • Show Last 20 Lines |