summaryrefslogtreecommitdiffstats
path: root/lib/libkvm/kvm_i386.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libkvm/kvm_i386.c')
-rw-r--r--lib/libkvm/kvm_i386.c27
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;
OpenPOWER on IntegriCloud