Changeset View
Changeset View
Standalone View
Standalone View
sys/i386/i386/minidump_machdep_base.c
Show First 20 Lines • Show All 54 Lines • ▼ Show 20 Lines | |||||
#define MD_ALIGN(x) (((off_t)(x) + PAGE_MASK) & ~PAGE_MASK) | #define MD_ALIGN(x) (((off_t)(x) + PAGE_MASK) & ~PAGE_MASK) | ||||
#define DEV_ALIGN(x) roundup2((off_t)(x), DEV_BSIZE) | #define DEV_ALIGN(x) roundup2((off_t)(x), DEV_BSIZE) | ||||
static struct kerneldumpheader kdh; | static struct kerneldumpheader kdh; | ||||
/* Handle chunked writes. */ | /* Handle chunked writes. */ | ||||
static size_t fragsz; | static size_t fragsz; | ||||
static void *dump_va; | static void *dump_va; | ||||
static uint64_t counter, progress; | |||||
#define PG2MB(pgs) (((pgs) + (1 << 8) - 1) >> 8) | |||||
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 All 30 Lines | if (ptr != NULL) { | ||||
error = blk_flush(di); | error = blk_flush(di); | ||||
if (error) | if (error) | ||||
return (error); | return (error); | ||||
} | } | ||||
while (sz) { | while (sz) { | ||||
len = maxdumpsz - fragsz; | len = maxdumpsz - fragsz; | ||||
if (len > sz) | if (len > sz) | ||||
len = sz; | len = sz; | ||||
counter += len; | |||||
progress -= len; | |||||
if (counter >> 24) { | |||||
printf(" %lld", PG2MB(progress >> PAGE_SHIFT)); | |||||
counter &= (1<<24) - 1; | |||||
} | |||||
dumpsys_pb_progress(len); | |||||
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 40 Lines | minidumpsys(struct dumperinfo *di) | ||||
vm_offset_t va; | vm_offset_t va; | ||||
int error; | int error; | ||||
uint64_t pa; | uint64_t pa; | ||||
pd_entry_t *pd; | pd_entry_t *pd; | ||||
pt_entry_t *pt; | pt_entry_t *pt; | ||||
int j, k; | int j, k; | ||||
struct minidumphdr mdhdr; | struct minidumphdr mdhdr; | ||||
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 = KERNBASE; va < kernel_vm_end; va += NBPDR) { | for (va = KERNBASE; va < kernel_vm_end; va += NBPDR) { | ||||
/* | /* | ||||
* We always write a page, even if it is zero. Each | * We always write a page, even if it is zero. Each | ||||
* page written corresponds to 2MB of space | * page written corresponds to 2MB of space | ||||
*/ | */ | ||||
ptesize += PAGE_SIZE; | ptesize += PAGE_SIZE; | ||||
Show All 34 Lines | VM_PAGE_DUMP_FOREACH(pa) { | ||||
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 109 Lines • Show Last 20 Lines |