diff options
author | Hidetoshi Shimokawa <simokawa@FreeBSD.org> | 2007-06-15 11:35:11 +0000 |
---|---|---|
committer | Hidetoshi Shimokawa <simokawa@FreeBSD.org> | 2007-06-15 11:35:11 +0000 |
commit | d7dc9f7649656e8f5c8366ba26e644dea159d01b (patch) | |
tree | 33eceb3d8e26544bddeeadba110cd0822a873336 | |
parent | b1cf245735f43f214605eedbf2f0988c82fe8186 (diff) | |
download | src-d7dc9f7649656e8f5c8366ba26e644dea159d01b.tar.gz src-d7dc9f7649656e8f5c8366ba26e644dea159d01b.zip |
Re-enable raw dump format support on i386 and amd64 for /dev/fwmem.
Notes
Notes:
svn path=/head/; revision=170772
-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 52694e0808b1..418a15dd7da0 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 b4659191fe3d..462447946954 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 45d2064c3c18..523cfa684f3d 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 2b6a49b21f0f..e791b41b2fb5 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 */ }; /* |