diff options
author | simokawa <simokawa@FreeBSD.org> | 2007-06-15 11:35:11 +0000 |
---|---|---|
committer | simokawa <simokawa@FreeBSD.org> | 2007-06-15 11:35:11 +0000 |
commit | c6862c6dc24ac7f67bd815e9862f013ec2c2d2ff (patch) | |
tree | 33eceb3d8e26544bddeeadba110cd0822a873336 /lib/libkvm | |
parent | 720e13085ba01b1d03be74053bc062f340e719e9 (diff) | |
download | FreeBSD-src-c6862c6dc24ac7f67bd815e9862f013ec2c2d2ff.zip FreeBSD-src-c6862c6dc24ac7f67bd815e9862f013ec2c2d2ff.tar.gz |
Re-enable raw dump format support on i386 and amd64 for /dev/fwmem.
Diffstat (limited to 'lib/libkvm')
-rw-r--r-- | lib/libkvm/kvm.c | 2 | ||||
-rw-r--r-- | lib/libkvm/kvm_amd64.c | 27 | ||||
-rw-r--r-- | lib/libkvm/kvm_i386.c | 27 | ||||
-rw-r--r-- | lib/libkvm/kvm_private.h | 1 |
4 files changed, 39 insertions, 18 deletions
diff --git a/lib/libkvm/kvm.c b/lib/libkvm/kvm.c index 52694e0..418a15d 100644 --- a/lib/libkvm/kvm.c +++ b/lib/libkvm/kvm.c @@ -219,6 +219,8 @@ _kvm_open(kd, uf, mf, flag, errout) _kvm_syserr(kd, kd->program, "%s", uf); goto failed; } + if (strncmp(mf, _PATH_FWMEM, strlen(_PATH_FWMEM)) == 0) + kd->rawdump = 1; if (_kvm_initvtop(kd) < 0) goto failed; return (kd); diff --git a/lib/libkvm/kvm_amd64.c b/lib/libkvm/kvm_amd64.c index b465919..4624479 100644 --- a/lib/libkvm/kvm_amd64.c +++ b/lib/libkvm/kvm_amd64.c @@ -110,9 +110,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) @@ -147,7 +154,7 @@ _kvm_initvtop(kvm_t *kd) size_t hdrsz; 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)); @@ -158,13 +165,15 @@ _kvm_initvtop(kvm_t *kd) } kd->vmst->PML4 = 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; 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; diff --git a/lib/libkvm/kvm_private.h b/lib/libkvm/kvm_private.h index 2b6a49b..e791b41 100644 --- a/lib/libkvm/kvm_private.h +++ b/lib/libkvm/kvm_private.h @@ -61,6 +61,7 @@ struct __kvm { * only allocate it if necessary. */ struct vmstate *vmst; + int rawdump; /* raw dump format */ }; /* |