Changeset View
Changeset View
Standalone View
Standalone View
head/lib/libkvm/kvm_minidump_powerpc64.c
Show First 20 Lines • Show All 62 Lines • ▼ Show 20 Lines | _powerpc64_minidump_freevtop(kvm_t *kd) | ||||
kd->vmst = NULL; | kd->vmst = NULL; | ||||
} | } | ||||
static int | static int | ||||
_powerpc64_minidump_initvtop(kvm_t *kd) | _powerpc64_minidump_initvtop(kvm_t *kd) | ||||
{ | { | ||||
struct vmstate *vmst; | struct vmstate *vmst; | ||||
struct minidumphdr *hdr; | struct minidumphdr *hdr; | ||||
off_t bitmap_off, pmap_off, sparse_off; | off_t dump_avail_off, bitmap_off, pmap_off, sparse_off; | ||||
const char *mmu_name; | const char *mmu_name; | ||||
/* Alloc VM */ | /* Alloc VM */ | ||||
vmst = _kvm_malloc(kd, sizeof(*vmst)); | vmst = _kvm_malloc(kd, sizeof(*vmst)); | ||||
if (vmst == NULL) { | if (vmst == NULL) { | ||||
_kvm_err(kd, kd->program, "cannot allocate vm"); | _kvm_err(kd, kd->program, "cannot allocate vm"); | ||||
return (-1); | return (-1); | ||||
} | } | ||||
hdr = &vmst->hdr; | hdr = &vmst->hdr; | ||||
kd->vmst = vmst; | kd->vmst = vmst; | ||||
PPC64_MMU_OPS(kd) = NULL; | PPC64_MMU_OPS(kd) = NULL; | ||||
/* Read minidump header */ | /* Read minidump header */ | ||||
if (pread(kd->pmfd, hdr, sizeof(*hdr), 0) != sizeof(*hdr)) { | if (pread(kd->pmfd, hdr, sizeof(*hdr), 0) != sizeof(*hdr)) { | ||||
_kvm_err(kd, kd->program, "cannot read minidump header"); | _kvm_err(kd, kd->program, "cannot read minidump header"); | ||||
goto failed; | goto failed; | ||||
} | } | ||||
/* Check magic */ | /* Check magic */ | ||||
if (strncmp(MINIDUMP_MAGIC, hdr->magic, sizeof(hdr->magic)) != 0) { | if (strncmp(MINIDUMP_MAGIC, hdr->magic, sizeof(hdr->magic)) != 0) { | ||||
_kvm_err(kd, kd->program, "not a minidump for this platform"); | _kvm_err(kd, kd->program, "not a minidump for this platform"); | ||||
goto failed; | goto failed; | ||||
} | } | ||||
/* Check version */ | /* Check version */ | ||||
hdr->version = be32toh(hdr->version); | hdr->version = be32toh(hdr->version); | ||||
if (hdr->version != MINIDUMP_VERSION) { | if (hdr->version != MINIDUMP_VERSION && hdr->version != 1) { | ||||
_kvm_err(kd, kd->program, "wrong minidump version. " | _kvm_err(kd, kd->program, "wrong minidump version. " | ||||
"Expected %d got %d", MINIDUMP_VERSION, hdr->version); | "Expected %d got %d", MINIDUMP_VERSION, hdr->version); | ||||
goto failed; | goto failed; | ||||
} | } | ||||
/* Convert header fields to host endian */ | /* Convert header fields to host endian */ | ||||
hdr->msgbufsize = be32toh(hdr->msgbufsize); | hdr->msgbufsize = be32toh(hdr->msgbufsize); | ||||
hdr->bitmapsize = be32toh(hdr->bitmapsize); | hdr->bitmapsize = be32toh(hdr->bitmapsize); | ||||
hdr->pmapsize = be32toh(hdr->pmapsize); | hdr->pmapsize = be32toh(hdr->pmapsize); | ||||
hdr->kernbase = be64toh(hdr->kernbase); | hdr->kernbase = be64toh(hdr->kernbase); | ||||
hdr->kernend = be64toh(hdr->kernend); | hdr->kernend = be64toh(hdr->kernend); | ||||
hdr->dmapbase = be64toh(hdr->dmapbase); | hdr->dmapbase = be64toh(hdr->dmapbase); | ||||
hdr->dmapend = be64toh(hdr->dmapend); | hdr->dmapend = be64toh(hdr->dmapend); | ||||
hdr->hw_direct_map = be32toh(hdr->hw_direct_map); | hdr->hw_direct_map = be32toh(hdr->hw_direct_map); | ||||
hdr->startkernel = be64toh(hdr->startkernel); | hdr->startkernel = be64toh(hdr->startkernel); | ||||
hdr->endkernel = be64toh(hdr->endkernel); | hdr->endkernel = be64toh(hdr->endkernel); | ||||
hdr->dumpavailsize = hdr->version == MINIDUMP_VERSION ? | |||||
be32toh(hdr->dumpavailsize) : 0; | |||||
vmst->kimg_start = PPC64_KERNBASE; | vmst->kimg_start = PPC64_KERNBASE; | ||||
vmst->kimg_end = PPC64_KERNBASE + hdr->endkernel - hdr->startkernel; | vmst->kimg_end = PPC64_KERNBASE + hdr->endkernel - hdr->startkernel; | ||||
/* dump header */ | /* dump header */ | ||||
dprintf("%s: mmu_name=%s,\n\t" | dprintf("%s: mmu_name=%s,\n\t" | ||||
"msgbufsize=0x%jx, bitmapsize=0x%jx, pmapsize=0x%jx, " | "msgbufsize=0x%jx, bitmapsize=0x%jx, pmapsize=0x%jx, " | ||||
"kernbase=0x%jx, kernend=0x%jx,\n\t" | "kernbase=0x%jx, kernend=0x%jx,\n\t" | ||||
Show All 16 Lines | _powerpc64_minidump_initvtop(kvm_t *kd) | ||||
else { | else { | ||||
_kvm_err(kd, kd->program, "unsupported MMU: %s", mmu_name); | _kvm_err(kd, kd->program, "unsupported MMU: %s", mmu_name); | ||||
goto failed; | goto failed; | ||||
} | } | ||||
if (PPC64_MMU_OP(kd, init) == -1) | if (PPC64_MMU_OP(kd, init) == -1) | ||||
goto failed; | goto failed; | ||||
/* Get dump parts' offsets */ | /* Get dump parts' offsets */ | ||||
bitmap_off = PPC64_PAGE_SIZE + ppc64_round_page(hdr->msgbufsize); | dump_avail_off = PPC64_PAGE_SIZE + ppc64_round_page(hdr->msgbufsize); | ||||
bitmap_off = dump_avail_off + ppc64_round_page(hdr->dumpavailsize); | |||||
pmap_off = bitmap_off + ppc64_round_page(hdr->bitmapsize); | pmap_off = bitmap_off + ppc64_round_page(hdr->bitmapsize); | ||||
sparse_off = pmap_off + ppc64_round_page(hdr->pmapsize); | sparse_off = pmap_off + ppc64_round_page(hdr->pmapsize); | ||||
/* dump offsets */ | /* dump offsets */ | ||||
dprintf("%s: msgbuf_off=0x%jx, bitmap_off=0x%jx, pmap_off=0x%jx, " | dprintf("%s: msgbuf_off=0x%jx, bitmap_off=0x%jx, pmap_off=0x%jx, " | ||||
"sparse_off=0x%jx\n", | "sparse_off=0x%jx\n", | ||||
__func__, (uintmax_t)PPC64_PAGE_SIZE, (uintmax_t)bitmap_off, | __func__, (uintmax_t)PPC64_PAGE_SIZE, (uintmax_t)bitmap_off, | ||||
(uintmax_t)pmap_off, (uintmax_t)sparse_off); | (uintmax_t)pmap_off, (uintmax_t)sparse_off); | ||||
/* build physical address lookup table for sparse pages */ | /* build physical address lookup table for sparse pages */ | ||||
if (_kvm_pt_init(kd, hdr->bitmapsize, bitmap_off, sparse_off, | if (_kvm_pt_init(kd, hdr->dumpavailsize, dump_avail_off, | ||||
PPC64_PAGE_SIZE, sizeof(uint64_t)) == -1) | hdr->bitmapsize, bitmap_off, sparse_off, PPC64_PAGE_SIZE, | ||||
sizeof(uint64_t)) == -1) | |||||
goto failed; | goto failed; | ||||
if (_kvm_pmap_init(kd, hdr->pmapsize, pmap_off) == -1) | if (_kvm_pmap_init(kd, hdr->pmapsize, pmap_off) == -1) | ||||
goto failed; | goto failed; | ||||
return (0); | return (0); | ||||
failed: | failed: | ||||
_powerpc64_minidump_freevtop(kd); | _powerpc64_minidump_freevtop(kd); | ||||
▲ Show 20 Lines • Show All 46 Lines • Show Last 20 Lines |