diff options
Diffstat (limited to 'lib/libkvm/kvm_i386.c')
-rw-r--r-- | lib/libkvm/kvm_i386.c | 27 |
1 files changed, 18 insertions, 9 deletions
diff --git a/lib/libkvm/kvm_i386.c b/lib/libkvm/kvm_i386.c index 45d2064..523cfa6 100644 --- a/lib/libkvm/kvm_i386.c +++ b/lib/libkvm/kvm_i386.c @@ -116,9 +116,16 @@ static size_t _kvm_pa2off(kvm_t *kd, uint64_t pa, off_t *ofs) { Elf_Ehdr *e = kd->vmst->mmapbase; - Elf_Phdr *p = (Elf_Phdr*)((char*)e + e->e_phoff); - int n = e->e_phnum; + Elf_Phdr *p; + int n; + if (kd->rawdump) { + *ofs = pa; + return (PAGE_SIZE - ((size_t)pa & PAGE_MASK)); + } + + p = (Elf_Phdr*)((char*)e + e->e_phoff); + n = e->e_phnum; while (n && (pa < p->p_paddr || pa >= p->p_paddr + p->p_memsz)) p++, n--; if (n == 0) @@ -154,7 +161,7 @@ _kvm_initvtop(kvm_t *kd) int i; char minihdr[8]; - if (pread(kd->pmfd, &minihdr, 8, 0) == 8) + if (!kd->rawdump && pread(kd->pmfd, &minihdr, 8, 0) == 8) if (memcmp(&minihdr, "minidump", 8) == 0) return (_kvm_minidump_initvtop(kd)); @@ -165,13 +172,15 @@ _kvm_initvtop(kvm_t *kd) } kd->vmst->PTD = 0; - if (_kvm_maphdrs(kd, sizeof(Elf_Ehdr)) == -1) - return (-1); + if (kd->rawdump == 0) { + if (_kvm_maphdrs(kd, sizeof(Elf_Ehdr)) == -1) + return (-1); - ehdr = kd->vmst->mmapbase; - hdrsz = ehdr->e_phoff + ehdr->e_phentsize * ehdr->e_phnum; - if (_kvm_maphdrs(kd, hdrsz) == -1) - return (-1); + ehdr = kd->vmst->mmapbase; + hdrsz = ehdr->e_phoff + ehdr->e_phentsize * ehdr->e_phnum; + if (_kvm_maphdrs(kd, hdrsz) == -1) + return (-1); + } nlist[0].n_name = "kernbase"; nlist[1].n_name = 0; |