Changeset View
Changeset View
Standalone View
Standalone View
sys/mips/mips/minidump_machdep.c
Show First 20 Lines • Show All 58 Lines • ▼ Show 20 Lines | |||||
/* Handle chunked writes. */ | /* Handle chunked writes. */ | ||||
static uint64_t counter, progress, dumpsize; | static uint64_t counter, progress, dumpsize; | ||||
/* Just auxiliary bufffer */ | /* Just auxiliary bufffer */ | ||||
static char tmpbuffer[PAGE_SIZE] __aligned(sizeof(uint64_t)); | static char tmpbuffer[PAGE_SIZE] __aligned(sizeof(uint64_t)); | ||||
extern pd_entry_t *kernel_segmap; | extern pd_entry_t *kernel_segmap; | ||||
static int | |||||
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 (1); | |||||
} | |||||
return (0); | |||||
} | |||||
static struct { | static struct { | ||||
int min_per; | int min_per; | ||||
int max_per; | int max_per; | ||||
int visited; | int visited; | ||||
} progress_track[10] = { | } progress_track[10] = { | ||||
{ 0, 10, 0}, | { 0, 10, 0}, | ||||
{ 10, 20, 0}, | { 10, 20, 0}, | ||||
{ 20, 30, 0}, | { 20, 30, 0}, | ||||
▲ Show 20 Lines • Show All 94 Lines • ▼ Show 20 Lines | minidumpsys(struct dumperinfo *di) | ||||
for (va = VM_MIN_KERNEL_ADDRESS; va < kernel_vm_end; va += NBPDR) { | for (va = VM_MIN_KERNEL_ADDRESS; va < kernel_vm_end; va += NBPDR) { | ||||
ptesize += PAGE_SIZE; | ptesize += PAGE_SIZE; | ||||
pte = pmap_pte(kernel_pmap, va); | pte = pmap_pte(kernel_pmap, va); | ||||
KASSERT(pte != NULL, ("pte for %jx is NULL", (uintmax_t)va)); | KASSERT(pte != NULL, ("pte for %jx is NULL", (uintmax_t)va)); | ||||
for (i = 0; i < NPTEPG; i++) { | for (i = 0; i < NPTEPG; i++) { | ||||
if (pte_test(&pte[i], PTE_V)) { | if (pte_test(&pte[i], PTE_V)) { | ||||
pa = TLBLO_PTE_TO_PA(pte[i]); | pa = TLBLO_PTE_TO_PA(pte[i]); | ||||
if (is_dumpable(pa)) | if (vm_phys_is_dumpable(pa)) | ||||
dump_add_page(pa); | dump_add_page(pa); | ||||
} | } | ||||
} | } | ||||
} | } | ||||
/* | /* | ||||
* Now mark pages from 0 to phys_avail[0], that's where kernel | * Now mark pages from 0 to phys_avail[0], that's where kernel | ||||
* and pages allocated by pmap_steal reside | * and pages allocated by pmap_steal reside | ||||
*/ | */ | ||||
for (pa = 0; pa < phys_avail[0]; pa += PAGE_SIZE) { | for (pa = 0; pa < phys_avail[0]; pa += 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 = ptesize; | dumpsize = ptesize; | ||||
dumpsize += round_page(msgbufp->msg_size); | dumpsize += round_page(msgbufp->msg_size); | ||||
dumpsize += round_page(nitems(dump_avail) * sizeof(uint64_t)); | dumpsize += round_page(nitems(dump_avail) * sizeof(uint64_t)); | ||||
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 114 Lines • Show Last 20 Lines |