Date: Mon, 25 Jan 2010 02:13:01 +0000 (UTC) From: Nathan Whitehorn <nwhitehorn@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r202956 - projects/ppc64/lib/libkvm Message-ID: <201001250213.o0P2D1gU011574@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: nwhitehorn Date: Mon Jan 25 02:13:00 2010 New Revision: 202956 URL: http://svn.freebsd.org/changeset/base/202956 Log: First hash at ppc64 KVM implementation. Added: projects/ppc64/lib/libkvm/kvm_powerpc64.c - copied, changed from r202947, projects/ppc64/lib/libkvm/kvm_powerpc.c Copied and modified: projects/ppc64/lib/libkvm/kvm_powerpc64.c (from r202947, projects/ppc64/lib/libkvm/kvm_powerpc.c) ============================================================================== --- projects/ppc64/lib/libkvm/kvm_powerpc.c Sun Jan 24 20:15:59 2010 (r202947, copy source) +++ projects/ppc64/lib/libkvm/kvm_powerpc64.c Mon Jan 25 02:13:00 2010 (r202956) @@ -48,17 +48,17 @@ struct vmstate { void *map; size_t mapsz; size_t dmphdrsz; - Elf32_Ehdr *eh; - Elf32_Phdr *ph; + Elf64_Ehdr *eh; + Elf64_Phdr *ph; }; static int -valid_elf_header(Elf32_Ehdr *eh) +valid_elf_header(Elf64_Ehdr *eh) { if (!IS_ELF(*eh)) return (0); - if (eh->e_ident[EI_CLASS] != ELFCLASS32) + if (eh->e_ident[EI_CLASS] != ELFCLASS64) return (0); if (eh->e_ident[EI_DATA] != ELFDATA2MSB) return (0); @@ -68,7 +68,7 @@ valid_elf_header(Elf32_Ehdr *eh) return (0); if (be16toh(eh->e_type) != ET_CORE) return (0); - if (be16toh(eh->e_machine) != EM_PPC) + if (be16toh(eh->e_machine) != EM_PPC64) return (0); /* Can't think of anything else to check... */ return (1); @@ -80,7 +80,7 @@ dump_header_size(struct kerneldumpheader if (strcmp(dh->magic, KERNELDUMPMAGIC) != 0) return (0); - if (strcmp(dh->architecture, "powerpc") != 0) + if (strcmp(dh->architecture, "powerpc64") != 0) return (0); /* That should do it... */ return (sizeof(*dh)); @@ -122,7 +122,7 @@ powerpc_maphdrs(kvm_t *kd) goto inval; } mapsz = be16toh(vm->eh->e_phentsize) * be16toh(vm->eh->e_phnum) + - be32toh(vm->eh->e_phoff); + be64toh(vm->eh->e_phoff); munmap(vm->map, vm->mapsz); /* Map all headers. */ @@ -133,7 +133,7 @@ powerpc_maphdrs(kvm_t *kd) return (-1); } vm->eh = (void *)((uintptr_t)vm->map + vm->dmphdrsz); - vm->ph = (void *)((uintptr_t)vm->eh + be32toh(vm->eh->e_phoff)); + vm->ph = (void *)((uintptr_t)vm->eh + be64toh(vm->eh->e_phoff)); return (0); inval: @@ -149,16 +149,16 @@ powerpc_maphdrs(kvm_t *kd) * 0 when the virtual address is invalid. */ static size_t -powerpc_va2off(kvm_t *kd, u_long va, off_t *ofs) +powerpc64_va2off(kvm_t *kd, u_long va, off_t *ofs) { struct vmstate *vm = kd->vmst; - Elf32_Phdr *ph; + Elf64_Phdr *ph; int nph; ph = vm->ph; nph = be16toh(vm->eh->e_phnum); - while (nph && (va < be32toh(ph->p_vaddr) || - va >= be32toh(ph->p_vaddr) + be32toh(ph->p_memsz))) { + while (nph && (va < be64toh(ph->p_vaddr) || + va >= be64toh(ph->p_vaddr) + be64toh(ph->p_memsz))) { nph--; ph = (void *)((uintptr_t)ph + be16toh(vm->eh->e_phentsize)); } @@ -166,9 +166,9 @@ powerpc_va2off(kvm_t *kd, u_long va, off return (0); /* Segment found. Return file offset and range. */ - *ofs = vm->dmphdrsz + be32toh(ph->p_offset) + - (va - be32toh(ph->p_vaddr)); - return (be32toh(ph->p_memsz) - (va - be32toh(ph->p_vaddr))); + *ofs = vm->dmphdrsz + be64toh(ph->p_offset) + + (va - be64toh(ph->p_vaddr)); + return (be64toh(ph->p_memsz) - (va - be64toh(ph->p_vaddr))); } void @@ -210,8 +210,8 @@ _kvm_kvatop(kvm_t *kd, u_long va, off_t struct vmstate *vm; vm = kd->vmst; - if (vm->ph->p_paddr == ~0U) - return ((int)powerpc_va2off(kd, va, ofs)); + if (vm->ph->p_paddr == ~0UL) + return ((int)powerpc64_va2off(kd, va, ofs)); _kvm_err(kd, kd->program, "Raw corefile not supported"); return (0);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201001250213.o0P2D1gU011574>