Changeset View
Changeset View
Standalone View
Standalone View
sys/i386/i386/minidump_machdep_base.c
Show First 20 Lines • Show All 185 Lines • ▼ Show 20 Lines | for (va = KERNBASE; va < kva_end; va += NBPDR) { | ||||
pd = IdlePTD; /* always mapped! */ | pd = IdlePTD; /* always mapped! */ | ||||
j = va >> PDRSHIFT; | j = va >> PDRSHIFT; | ||||
pde = pte_load(&pd[va >> PDRSHIFT]); | pde = pte_load(&pd[va >> PDRSHIFT]); | ||||
if ((pde & (PG_PS | PG_V)) == (PG_PS | PG_V)) { | if ((pde & (PG_PS | PG_V)) == (PG_PS | PG_V)) { | ||||
/* This is an entire 2M page. */ | /* This is an entire 2M page. */ | ||||
pa = pde & PG_PS_FRAME; | pa = pde & PG_PS_FRAME; | ||||
for (k = 0; k < NPTEPG; k++) { | for (k = 0; k < NPTEPG; k++) { | ||||
if (vm_phys_is_dumpable(pa)) | if (vm_phys_is_dumpable(pa)) | ||||
dump_add_page(pa); | vm_page_dump_add(state->dump_bitset, | ||||
pa); | |||||
pa += PAGE_SIZE; | pa += PAGE_SIZE; | ||||
} | } | ||||
continue; | continue; | ||||
} | } | ||||
if ((pde & PG_V) == PG_V) { | if ((pde & PG_V) == PG_V) { | ||||
/* set bit for each valid page in this 2MB block */ | /* set bit for each valid page in this 2MB block */ | ||||
pt = pmap_kenter_temporary(pde & PG_FRAME, 0); | pt = pmap_kenter_temporary(pde & PG_FRAME, 0); | ||||
for (k = 0; k < NPTEPG; k++) { | for (k = 0; k < NPTEPG; k++) { | ||||
pte = pte_load(&pt[k]); | pte = pte_load(&pt[k]); | ||||
if ((pte & PG_V) == PG_V) { | if ((pte & PG_V) == PG_V) { | ||||
pa = pte & PG_FRAME; | pa = pte & PG_FRAME; | ||||
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 { | } else { | ||||
/* nothing, we're going to dump a null page */ | /* nothing, we're going to dump a null page */ | ||||
} | } | ||||
} | } | ||||
/* Calculate dump size. */ | /* Calculate dump size. */ | ||||
mbp = state->msgbufp; | mbp = state->msgbufp; | ||||
dumpsize = ptesize; | dumpsize = ptesize; | ||||
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) { | ||||
/* Clear out undumpable pages now if needed */ | /* Clear out undumpable pages now if needed */ | ||||
if (vm_phys_is_dumpable(pa)) { | if (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)); | ||||
▲ Show 20 Lines • Show All 77 Lines • ▼ Show 20 Lines | if ((pde & PG_V) == PG_V) { | ||||
/* flush, in case we reuse fakept in the same block */ | /* flush, in case we reuse fakept in the same block */ | ||||
error = blk_flush(di); | error = blk_flush(di); | ||||
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 21 Lines |