Changeset View
Changeset View
Standalone View
Standalone View
sys/mips/mips/minidump_machdep.c
Show First 20 Lines • Show All 52 Lines • ▼ Show 20 Lines | |||||
#include <machine/minidump.h> | #include <machine/minidump.h> | ||||
#include <machine/cache.h> | #include <machine/cache.h> | ||||
CTASSERT(sizeof(struct kerneldumpheader) == 512); | CTASSERT(sizeof(struct kerneldumpheader) == 512); | ||||
static struct kerneldumpheader kdh; | static struct kerneldumpheader kdh; | ||||
/* Handle chunked writes. */ | /* Handle chunked writes. */ | ||||
static uint64_t counter, progress, dumpsize; | static uint64_t 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 struct { | |||||
int min_per; | |||||
int max_per; | |||||
int visited; | |||||
} progress_track[10] = { | |||||
{ 0, 10, 0}, | |||||
{ 10, 20, 0}, | |||||
{ 20, 30, 0}, | |||||
{ 30, 40, 0}, | |||||
{ 40, 50, 0}, | |||||
{ 50, 60, 0}, | |||||
{ 60, 70, 0}, | |||||
{ 70, 80, 0}, | |||||
{ 80, 90, 0}, | |||||
{ 90, 100, 0} | |||||
}; | |||||
static void | |||||
report_progress(uint64_t progress, uint64_t dumpsize) | |||||
{ | |||||
int sofar, i; | |||||
sofar = 100 - ((progress * 100) / dumpsize); | |||||
for (i = 0; i < nitems(progress_track); i++) { | |||||
if (sofar < progress_track[i].min_per || | |||||
sofar > progress_track[i].max_per) | |||||
continue; | |||||
if (progress_track[i].visited) | |||||
return; | |||||
progress_track[i].visited = 1; | |||||
printf("..%d%%", sofar); | |||||
return; | |||||
} | |||||
} | |||||
static int | static int | ||||
write_buffer(struct dumperinfo *di, char *ptr, size_t sz) | write_buffer(struct dumperinfo *di, char *ptr, size_t sz) | ||||
{ | { | ||||
size_t len; | size_t len; | ||||
int error, c; | int error, c; | ||||
u_int maxdumpsz; | u_int maxdumpsz; | ||||
maxdumpsz = di->maxiosize; | maxdumpsz = di->maxiosize; | ||||
if (maxdumpsz == 0) /* seatbelt */ | if (maxdumpsz == 0) /* seatbelt */ | ||||
maxdumpsz = PAGE_SIZE; | maxdumpsz = PAGE_SIZE; | ||||
error = 0; | error = 0; | ||||
while (sz) { | while (sz) { | ||||
len = min(maxdumpsz, sz); | len = min(maxdumpsz, sz); | ||||
counter += len; | |||||
progress -= len; | |||||
if (counter >> 22) { | dumpsys_pb_progress(len); | ||||
report_progress(progress, dumpsize); | |||||
counter &= (1<<22) - 1; | |||||
} | |||||
wdog_kern_pat(WD_LASTVAL); | wdog_kern_pat(WD_LASTVAL); | ||||
if (ptr) { | if (ptr) { | ||||
error = dump_append(di, ptr, 0, len); | error = dump_append(di, ptr, 0, len); | ||||
if (error) | if (error) | ||||
return (error); | return (error); | ||||
ptr += len; | ptr += len; | ||||
sz -= len; | sz -= len; | ||||
Show All 24 Lines | minidumpsys(struct dumperinfo *di) | ||||
vm_offset_t va; | vm_offset_t va; | ||||
pt_entry_t *pte; | pt_entry_t *pte; | ||||
int i, error; | int i, error; | ||||
void *dump_va; | void *dump_va; | ||||
/* Flush cache */ | /* Flush cache */ | ||||
mips_dcache_wbinv_all(); | mips_dcache_wbinv_all(); | ||||
counter = 0; | |||||
/* Walk page table pages, set bits in vm_page_dump */ | /* Walk page table pages, set bits in vm_page_dump */ | ||||
ptesize = 0; | ptesize = 0; | ||||
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++) { | ||||
Show All 23 Lines | VM_PAGE_DUMP_FOREACH(pa) { | ||||
/* Clear out undumpable pages now if needed */ | /* Clear out undumpable pages now if needed */ | ||||
if (dump_page_is_dumpable(pa)) | if (dump_page_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; | 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); | ||||
mdhdr.version = MINIDUMP_VERSION; | mdhdr.version = MINIDUMP_VERSION; | ||||
mdhdr.msgbufsize = msgbufp->msg_size; | mdhdr.msgbufsize = msgbufp->msg_size; | ||||
mdhdr.bitmapsize = round_page(BITSET_SIZE(vm_page_dump_pages)); | mdhdr.bitmapsize = round_page(BITSET_SIZE(vm_page_dump_pages)); | ||||
mdhdr.ptesize = ptesize; | mdhdr.ptesize = ptesize; | ||||
▲ Show 20 Lines • Show All 107 Lines • Show Last 20 Lines |