Index: kvm.c =================================================================== RCS file: /home/ncvs/src/lib/libkvm/kvm.c,v retrieving revision 1.30 diff -c -r1.30 kvm.c *** kvm.c 8 Jan 2007 17:35:36 -0000 1.30 --- kvm.c 11 Jun 2007 02:05:22 -0000 *************** *** 219,224 **** --- 219,226 ---- _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); Index: kvm_amd64.c =================================================================== RCS file: /home/ncvs/src/lib/libkvm/kvm_amd64.c,v retrieving revision 1.21 diff -c -r1.21 kvm_amd64.c *** kvm_amd64.c 8 Jan 2007 17:35:36 -0000 1.21 --- kvm_amd64.c 11 Jun 2007 02:15:54 -0000 *************** *** 110,118 **** _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; while (n && (pa < p->p_paddr || pa >= p->p_paddr + p->p_memsz)) p++, n--; if (n == 0) --- 110,125 ---- _kvm_pa2off(kvm_t *kd, uint64_t pa, off_t *ofs) { Elf_Ehdr *e = kd->vmst->mmapbase; ! 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) *************** *** 158,170 **** } kd->vmst->PML4 = 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); nlist[0].n_name = "kernbase"; nlist[1].n_name = 0; --- 165,179 ---- } kd->vmst->PML4 = 0; ! 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); ! } nlist[0].n_name = "kernbase"; nlist[1].n_name = 0; Index: kvm_i386.c =================================================================== RCS file: /home/ncvs/src/lib/libkvm/kvm_i386.c,v retrieving revision 1.20 diff -c -r1.20 kvm_i386.c *** kvm_i386.c 8 Jan 2007 17:35:36 -0000 1.20 --- kvm_i386.c 11 Jun 2007 02:09:11 -0000 *************** *** 116,124 **** _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; while (n && (pa < p->p_paddr || pa >= p->p_paddr + p->p_memsz)) p++, n--; if (n == 0) --- 116,131 ---- _kvm_pa2off(kvm_t *kd, uint64_t pa, off_t *ofs) { Elf_Ehdr *e = kd->vmst->mmapbase; ! 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) *************** *** 165,177 **** } kd->vmst->PTD = 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); nlist[0].n_name = "kernbase"; nlist[1].n_name = 0; --- 172,186 ---- } kd->vmst->PTD = 0; ! 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); ! } nlist[0].n_name = "kernbase"; nlist[1].n_name = 0; Index: kvm_private.h =================================================================== RCS file: /home/ncvs/src/lib/libkvm/kvm_private.h,v retrieving revision 1.11 diff -c -r1.11 kvm_private.h *** kvm_private.h 8 Jan 2007 17:35:36 -0000 1.11 --- kvm_private.h 11 Jun 2007 02:04:44 -0000 *************** *** 61,66 **** --- 61,67 ---- * only allocate it if necessary. */ struct vmstate *vmst; + int rawdump; /* raw dump format */ }; /*