Changeset View
Changeset View
Standalone View
Standalone View
head/sys/i386/i386/minidump_machdep_base.c
Show First 20 Lines • Show All 218 Lines • ▼ Show 20 Lines | for (va = KERNBASE; va < kernel_vm_end; va += NBPDR) { | ||||
} 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. */ | ||||
dumpsize = ptesize; | dumpsize = ptesize; | ||||
dumpsize += round_page(msgbufp->msg_size); | dumpsize += round_page(msgbufp->msg_size); | ||||
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(pa) { | ||||
/* Clear out undumpable pages now if needed */ | /* Clear out undumpable pages now if needed */ | ||||
if (is_dumpable(pa)) { | if (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; | ||||
/* 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; | ||||
mdhdr.kernbase = KERNBASE; | mdhdr.kernbase = KERNBASE; | ||||
mdhdr.paemode = pae_mode; | mdhdr.paemode = pae_mode; | ||||
mdhdr.dumpavailsize = round_page(sizeof(dump_avail)); | |||||
dump_init_header(di, &kdh, KERNELDUMPMAGIC, KERNELDUMP_I386_VERSION, | dump_init_header(di, &kdh, KERNELDUMPMAGIC, KERNELDUMP_I386_VERSION, | ||||
dumpsize); | dumpsize); | ||||
error = dump_start(di, &kdh); | error = dump_start(di, &kdh); | ||||
if (error != 0) | if (error != 0) | ||||
goto fail; | goto fail; | ||||
printf("Physical memory: %ju MB\n", ptoa((uintmax_t)physmem) / 1048576); | printf("Physical memory: %ju MB\n", ptoa((uintmax_t)physmem) / 1048576); | ||||
printf("Dumping %llu MB:", (long long)dumpsize >> 20); | printf("Dumping %llu MB:", (long long)dumpsize >> 20); | ||||
/* Dump my header */ | /* Dump my header */ | ||||
bzero(&fakept, sizeof(fakept)); | bzero(&fakept, sizeof(fakept)); | ||||
bcopy(&mdhdr, &fakept, sizeof(mdhdr)); | bcopy(&mdhdr, &fakept, sizeof(mdhdr)); | ||||
error = blk_write(di, (char *)&fakept, 0, PAGE_SIZE); | error = blk_write(di, (char *)&fakept, 0, PAGE_SIZE); | ||||
if (error) | if (error) | ||||
goto fail; | goto fail; | ||||
/* Dump msgbuf up front */ | /* Dump msgbuf up front */ | ||||
error = blk_write(di, (char *)msgbufp->msg_ptr, 0, round_page(msgbufp->msg_size)); | error = blk_write(di, (char *)msgbufp->msg_ptr, 0, round_page(msgbufp->msg_size)); | ||||
if (error) | |||||
goto fail; | |||||
/* Dump dump_avail */ | |||||
_Static_assert(sizeof(dump_avail) <= sizeof(fakept), | |||||
"Large dump_avail not handled"); | |||||
bzero(fakept, sizeof(fakept)); | |||||
memcpy(fakept, dump_avail, sizeof(dump_avail)); | |||||
error = blk_write(di, (char *)&fakept, 0, PAGE_SIZE); | |||||
if (error) | if (error) | ||||
goto fail; | goto fail; | ||||
/* Dump bitmap */ | /* Dump bitmap */ | ||||
error = blk_write(di, (char *)vm_page_dump, 0, | error = blk_write(di, (char *)vm_page_dump, 0, | ||||
round_page(BITSET_SIZE(vm_page_dump_pages))); | round_page(BITSET_SIZE(vm_page_dump_pages))); | ||||
if (error) | if (error) | ||||
goto fail; | goto fail; | ||||
▲ Show 20 Lines • Show All 69 Lines • Show Last 20 Lines |