static int _kvm_minidump_vatop(kvm_t *kd, u_long va, off_t *pa) { struct vmstate *vm; u_long offset; pt_entry_t pte; u_long pteindex; u_long a; off_t ofs; uint32_t *ptemap; vm = kd->vmst; ptemap = vm->ptemap; offset = va & (PAGE_SIZE - 1); if (va >= vm->hdr.kernbase) { pteindex = (va - vm->hdr.kernbase) >> PAGE_SHIFT; pte = ptemap[pteindex]; if ((pte & PG_V) == 0) { _kvm_err(kd, kd->program, "_kvm_vatop: pte not valid"); goto invalid; } a = pte & PG_FRAME; ofs = hpt_find(kd, a); if (ofs == -1) { _kvm_err(kd, kd->program, "_kvm_vatop: physical address 0x%lx not in minidump", a); goto invalid; } *pa = ofs + offset; return (PAGE_SIZE - offset); } else {
static int _kvm_minidump_vatop_v1(kvm_t *kd, u_long va, off_t *pa) { struct vmstate *vm; u_long offset; pt_entry_t pte; u_long pteindex; u_long a; off_t ofs; vm = kd->vmst; offset = va & (PAGE_SIZE - 1); if (va >= vm->hdr.kernbase) { pteindex = (va - vm->hdr.kernbase) >> PAGE_SHIFT; if (pteindex >= vm->hdr.pmapsize / sizeof(*vm->page_map)) goto invalid; pte = vm->page_map[pteindex]; if (((u_long)pte & PG_V) == 0) { _kvm_err(kd, kd->program, "_kvm_vatop: pte not valid"); goto invalid; } a = pte & PG_FRAME; ofs = hpt_find(kd, a); if (ofs == -1) { _kvm_err(kd, kd->program, "_kvm_vatop: physical address 0x%lx not in minidump", a); goto invalid; } *pa = ofs + offset; return (PAGE_SIZE - offset); } else if (va >= vm->hdr.dmapbase && va < vm->hdr.dmapend) {