Module Name: src Committed By: skrll Date: Tue Dec 13 12:55:51 UTC 2011
Modified Files: src/sys/arch/hppa/hppa: kobj_machdep.c Log Message: Fix DIR21L relocations where we missed a bit of 'b' Add support for DPREL relocations. Modulo debug information in modules /usr/tests/modules now passes all tests on NetBSD/hp700 (with a MODULAR kernel) To generate a diff of this commit: cvs rdiff -u -r1.5 -r1.6 src/sys/arch/hppa/hppa/kobj_machdep.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/hppa/hppa/kobj_machdep.c diff -u src/sys/arch/hppa/hppa/kobj_machdep.c:1.5 src/sys/arch/hppa/hppa/kobj_machdep.c:1.6 --- src/sys/arch/hppa/hppa/kobj_machdep.c:1.5 Thu Apr 30 15:34:24 2009 +++ src/sys/arch/hppa/hppa/kobj_machdep.c Tue Dec 13 12:55:50 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: kobj_machdep.c,v 1.5 2009/04/30 15:34:24 skrll Exp $ */ +/* $NetBSD: kobj_machdep.c,v 1.6 2011/12/13 12:55:50 skrll Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. @@ -52,7 +52,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: kobj_machdep.c,v 1.5 2009/04/30 15:34:24 skrll Exp $"); +__KERNEL_RCSID(0, "$NetBSD: kobj_machdep.c,v 1.6 2011/12/13 12:55:50 skrll Exp $"); #define ELFSIZE ARCH_ELFSIZE @@ -105,6 +105,9 @@ kobj_reloc(kobj_t ko, uintptr_t relocbas Elf_Addr addr, value; Elf_Word rtype, symidx; const Elf_Rela *rela; + extern int __data_start; + + unsigned int GP = (int) &__data_start; if (!isrela) { printf("kobj_reloc: only support RELA relocations\n"); @@ -151,7 +154,7 @@ kobj_reloc(kobj_t ko, uintptr_t relocbas value = LR(addr, value); *where |= (((value >> 31) & 0x001) << 0) | - (((value >> 20) & 0x3ff) << 1) | + (((value >> 20) & 0x7ff) << 1) | (((value >> 18) & 0x003) << 14) | (((value >> 13) & 0x01f) << 16) | (((value >> 11) & 0x003) << 12); @@ -170,11 +173,28 @@ kobj_reloc(kobj_t ko, uintptr_t relocbas (((value & 0x003ff) << 1) << 2); /* w2 */ break; -#if 0 - case R_TYPE(DPREL17F): + case R_TYPE(DPREL14R): + /* RR(symbol - GP, addend) */ + addr = kobj_sym_lookup(ko, symidx); + value = RR(addr - GP, value); + *where |= + (((value >> 0) & 0x1fff) << 1) | + (((value >> 13) & 0x1) << 0); + break; + + case R_TYPE(DPREL21L): + /* LR(symbol - GP, addend) */ + addr = kobj_sym_lookup(ko, symidx); + value = LR(addr - GP, value); + *where |= + (((value >> 31) & 0x001) << 0) | + (((value >> 20) & 0x7ff) << 1) | + (((value >> 18) & 0x003) << 14) | + (((value >> 13) & 0x01f) << 16) | + (((value >> 11) & 0x003) << 12); break; -#endif + case R_TYPE(SEGREL32): /* symbol - SB + addend */ /* XXX SB */