Changeset View
Changeset View
Standalone View
Standalone View
sys/amd64/amd64/minidump_machdep.c
Show First 20 Lines • Show All 165 Lines • ▼ Show 20 Lines | cpu_minidumpsys(struct dumperinfo *di, const struct minidumpstate *state) | ||||
uint32_t pmapsize; | uint32_t pmapsize; | ||||
vm_offset_t va, kva_end; | vm_offset_t va, kva_end; | ||||
int error; | int error; | ||||
uint64_t *pml4, *pdp, *pd, *pt, pa; | uint64_t *pml4, *pdp, *pd, *pt, pa; | ||||
uint64_t pdpe, pde, pte; | uint64_t pdpe, pde, pte; | ||||
int ii, j, k, n; | int ii, j, k, n; | ||||
int retry_count; | int retry_count; | ||||
struct minidumphdr mdhdr; | struct minidumphdr mdhdr; | ||||
struct msgbuf *mbp; | |||||
retry_count = 0; | retry_count = 0; | ||||
retry: | retry: | ||||
retry_count++; | retry_count++; | ||||
/* Snapshot the KVA upper bound in case it grows. */ | /* Snapshot the KVA upper bound in case it grows. */ | ||||
kva_end = MAX(KERNBASE + nkpt * NBPDR, kernel_vm_end); | kva_end = MAX(KERNBASE + nkpt * NBPDR, kernel_vm_end); | ||||
▲ Show 20 Lines • Show All 65 Lines • ▼ Show 20 Lines | for (n = 0; n < NPDEPG; n++, va += NBPDR) { | ||||
pa = pte & PG_FRAME; | pa = pte & PG_FRAME; | ||||
if (PHYS_IN_DMAP(pa) && vm_phys_is_dumpable(pa)) | if (PHYS_IN_DMAP(pa) && vm_phys_is_dumpable(pa)) | ||||
dump_add_page(pa); | dump_add_page(pa); | ||||
} | } | ||||
} | } | ||||
} | } | ||||
/* Calculate dump size. */ | /* Calculate dump size. */ | ||||
mbp = state->msgbufp; | |||||
dumpsize = pmapsize; | dumpsize = pmapsize; | ||||
dumpsize += round_page(msgbufp->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(pa) { | ||||
/* Clear out undumpable pages now if needed */ | /* Clear out undumpable pages now if needed */ | ||||
if (PHYS_IN_DMAP(pa) && vm_phys_is_dumpable(pa)) { | if (PHYS_IN_DMAP(pa) && vm_phys_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; | ||||
wdog_next = progress = dumpsize; | wdog_next = progress = dumpsize; | ||||
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.pmapsize = pmapsize; | mdhdr.pmapsize = pmapsize; | ||||
mdhdr.kernbase = VM_MIN_KERNEL_ADDRESS; | mdhdr.kernbase = VM_MIN_KERNEL_ADDRESS; | ||||
mdhdr.dmapbase = DMAP_MIN_ADDRESS; | mdhdr.dmapbase = DMAP_MIN_ADDRESS; | ||||
mdhdr.dmapend = DMAP_MAX_ADDRESS; | mdhdr.dmapend = DMAP_MAX_ADDRESS; | ||||
mdhdr.dumpavailsize = round_page(sizeof(dump_avail)); | mdhdr.dumpavailsize = round_page(sizeof(dump_avail)); | ||||
dump_init_header(di, &kdh, KERNELDUMPMAGIC, KERNELDUMP_AMD64_VERSION, | dump_init_header(di, &kdh, KERNELDUMPMAGIC, KERNELDUMP_AMD64_VERSION, | ||||
Show All 9 Lines | retry: | ||||
/* Dump my header */ | /* Dump my header */ | ||||
bzero(&fakepd, sizeof(fakepd)); | bzero(&fakepd, sizeof(fakepd)); | ||||
bcopy(&mdhdr, &fakepd, sizeof(mdhdr)); | bcopy(&mdhdr, &fakepd, sizeof(mdhdr)); | ||||
error = blk_write(di, (char *)&fakepd, 0, PAGE_SIZE); | error = blk_write(di, (char *)&fakepd, 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, mbp->msg_ptr, 0, round_page(mbp->msg_size)); | ||||
markj: While here, the casts to `(char *)` can be dropped. | |||||
if (error) | if (error) | ||||
goto fail; | goto fail; | ||||
/* Dump dump_avail */ | /* Dump dump_avail */ | ||||
_Static_assert(sizeof(dump_avail) <= sizeof(fakepd), | _Static_assert(sizeof(dump_avail) <= sizeof(fakepd), | ||||
"Large dump_avail not handled"); | "Large dump_avail not handled"); | ||||
bzero(&fakepd, sizeof(fakepd)); | bzero(&fakepd, sizeof(fakepd)); | ||||
memcpy(fakepd, dump_avail, sizeof(dump_avail)); | memcpy(fakepd, dump_avail, sizeof(dump_avail)); | ||||
▲ Show 20 Lines • Show All 102 Lines • Show Last 20 Lines |
While here, the casts to (char *) can be dropped.