Changeset View
Changeset View
Standalone View
Standalone View
sys/mips/mips/minidump_machdep.c
Show First 20 Lines • Show All 103 Lines • ▼ Show 20 Lines | write_buffer(struct dumperinfo *di, char *ptr, size_t sz) | ||||
return (0); | return (0); | ||||
} | } | ||||
int | int | ||||
cpu_minidumpsys(struct dumperinfo *di, struct minidumpstate *state) | cpu_minidumpsys(struct dumperinfo *di, struct minidumpstate *state) | ||||
{ | { | ||||
struct minidumphdr mdhdr; | struct minidumphdr mdhdr; | ||||
struct msgbuf *mbp; | |||||
uint64_t *dump_avail_buf; | uint64_t *dump_avail_buf; | ||||
uint32_t ptesize; | uint32_t ptesize; | ||||
vm_paddr_t pa; | vm_paddr_t pa; | ||||
vm_offset_t prev_pte = 0; | vm_offset_t prev_pte = 0; | ||||
uint32_t count = 0; | uint32_t count = 0; | ||||
vm_offset_t va; | vm_offset_t va; | ||||
pt_entry_t *pte; | pt_entry_t *pte; | ||||
int i, error; | int i, error; | ||||
Show All 23 Lines | cpu_minidumpsys(struct dumperinfo *di, struct minidumpstate *state) | ||||
* 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 (dump_page_is_dumpable(pa)) | if (dump_page_is_dumpable(pa)) | ||||
dump_add_page(pa); | dump_add_page(pa); | ||||
} | } | ||||
/* Calculate dump size. */ | /* Calculate dump size. */ | ||||
mbp = state->msgbufp; | |||||
dumpsize = ptesize; | dumpsize = ptesize; | ||||
dumpsize += round_page(msgbufp->msg_size); | dumpsize += round_page(mbp->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 (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; | ||||
dumpsys_pb_init(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 = mbp->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; | ||||
mdhdr.kernbase = VM_MIN_KERNEL_ADDRESS; | mdhdr.kernbase = VM_MIN_KERNEL_ADDRESS; | ||||
mdhdr.dumpavailsize = round_page(nitems(dump_avail) * sizeof(uint64_t)); | mdhdr.dumpavailsize = round_page(nitems(dump_avail) * sizeof(uint64_t)); | ||||
dump_init_header(di, &kdh, KERNELDUMPMAGIC, KERNELDUMP_MIPS_VERSION, | dump_init_header(di, &kdh, KERNELDUMPMAGIC, KERNELDUMP_MIPS_VERSION, | ||||
dumpsize); | dumpsize); | ||||
error = dump_start(di, &kdh); | error = dump_start(di, &kdh); | ||||
if (error != 0) | if (error != 0) | ||||
goto fail; | goto fail; | ||||
printf("Dumping %llu out of %ju MB:", (long long)dumpsize >> 20, | printf("Dumping %llu out of %ju MB:", (long long)dumpsize >> 20, | ||||
ptoa((uintmax_t)physmem) / 1048576); | ptoa((uintmax_t)physmem) / 1048576); | ||||
/* Dump my header */ | /* Dump my header */ | ||||
bzero(tmpbuffer, sizeof(tmpbuffer)); | bzero(tmpbuffer, sizeof(tmpbuffer)); | ||||
bcopy(&mdhdr, tmpbuffer, sizeof(mdhdr)); | bcopy(&mdhdr, tmpbuffer, sizeof(mdhdr)); | ||||
error = write_buffer(di, tmpbuffer, PAGE_SIZE); | error = write_buffer(di, tmpbuffer, PAGE_SIZE); | ||||
if (error) | if (error) | ||||
goto fail; | goto fail; | ||||
/* Dump msgbuf up front */ | /* Dump msgbuf up front */ | ||||
error = write_buffer(di, (char *)msgbufp->msg_ptr, | error = write_buffer(di, (char *)mbp->msg_ptr, | ||||
round_page(msgbufp->msg_size)); | round_page(mbp->msg_size)); | ||||
if (error) | if (error) | ||||
goto fail; | goto fail; | ||||
/* Dump dump_avail. Make a copy using 64-bit physical addresses. */ | /* Dump dump_avail. Make a copy using 64-bit physical addresses. */ | ||||
_Static_assert(nitems(dump_avail) * sizeof(uint64_t) <= | _Static_assert(nitems(dump_avail) * sizeof(uint64_t) <= | ||||
sizeof(tmpbuffer), "Large dump_avail not handled"); | sizeof(tmpbuffer), "Large dump_avail not handled"); | ||||
bzero(tmpbuffer, sizeof(tmpbuffer)); | bzero(tmpbuffer, sizeof(tmpbuffer)); | ||||
if (sizeof(dump_avail[0]) != sizeof(uint64_t)) { | if (sizeof(dump_avail[0]) != sizeof(uint64_t)) { | ||||
▲ Show 20 Lines • Show All 76 Lines • Show Last 20 Lines |