Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/arch/hppa/hppa Split the reloc evaluation from the value...



details:   https://anonhg.NetBSD.org/src/rev/d9409e1a78c2
branches:  trunk
changeset: 789077:d9409e1a78c2
user:      skrll <skrll%NetBSD.org@localhost>
date:      Tue Aug 06 07:07:53 2013 +0000

description:
Split the reloc evaluation from the value encoding part.  Several relocs
can share the value encoding part.

Fixes the SEGREL32 relocs while here.

diffstat:

 sys/arch/hppa/hppa/kobj_machdep.c |  94 ++++++++++++++++++++------------------
 1 files changed, 50 insertions(+), 44 deletions(-)

diffs (153 lines):

diff -r f443ae5274ae -r d9409e1a78c2 sys/arch/hppa/hppa/kobj_machdep.c
--- a/sys/arch/hppa/hppa/kobj_machdep.c Tue Aug 06 06:40:43 2013 +0000
+++ b/sys/arch/hppa/hppa/kobj_machdep.c Tue Aug 06 07:07:53 2013 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: kobj_machdep.c,v 1.8 2013/08/06 06:40:43 skrll Exp $   */
+/*     $NetBSD: kobj_machdep.c,v 1.9 2013/08/06 07:07:53 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.8 2013/08/06 06:40:43 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kobj_machdep.c,v 1.9 2013/08/06 07:07:53 skrll Exp $");
 
 #define        ELFSIZE         ARCH_ELFSIZE
 
@@ -128,29 +128,18 @@
                /* symbol + addend */
                addr = kobj_sym_lookup(ko, symidx);
                value += addr;
-               if (*where != value)
-                       *where = value;
                break;
 
        case R_TYPE(DIR21L):
                /* LR(symbol, addend) */
                addr = kobj_sym_lookup(ko, symidx);
                value = LR(addr, value);
-               *where |=
-                   (((value >> 31) & 0x001) <<  0) |
-                   (((value >> 20) & 0x7ff) <<  1) |
-                   (((value >> 18) & 0x003) << 14) |
-                   (((value >> 13) & 0x01f) << 16) |
-                   (((value >> 11) & 0x003) << 12);
                break;
 
        case R_TYPE(DIR14R):
                /* RR(symbol, addend) */
                addr = kobj_sym_lookup(ko, symidx);
                value = RR(addr, value);
-               *where |=
-                    (((value >>  0) & 0x1fff) << 1) |
-                    (((value >> 13) & 0x1) << 0);
                break;
 
        case R_TYPE(PCREL17F):
@@ -158,7 +147,53 @@
                addr = kobj_sym_lookup(ko, symidx);
                value += addr - (Elf_Word)where - 8;
                value >>= 2;            /* bottom two bits not needed */
+               break;
 
+       case R_TYPE(DPREL21L):
+               /* LR(symbol - GP, addend) */
+               addr = kobj_sym_lookup(ko, symidx);
+               value = LR(addr - GP, value);
+               break;
+
+       case R_TYPE(DPREL14R):
+               /* RR(symbol - GP, addend) */
+               addr = kobj_sym_lookup(ko, symidx);
+               value = RR(addr - GP, value);
+               break;
+
+       case R_TYPE(PLABEL32):
+               /* fptr(symbol) */
+               addr = kobj_sym_lookup(ko, symidx);
+               value = addr;
+               break;
+
+       case R_TYPE(SEGREL32):
+               /* symbol - SB + addend */
+               /* XXX SB */
+               addr = kobj_sym_lookup(ko, symidx);
+               value += addr;
+               break;
+
+       default:
+               printf("%s: unexpected relocation type %d\n", __func__, rtype);
+               return -1;
+       }
+
+       switch (rtype) {
+       case R_TYPE(DIR32):
+       case R_TYPE(PLABEL32):
+       case R_TYPE(SEGREL32):
+               *where = value;
+               break;
+
+       case R_TYPE(DIR14R):
+       case R_TYPE(DPREL14R):
+               *where |=
+                    (((value >>  0) & 0x1fff) << 1) |
+                    (((value >> 13) & 0x1) << 0);
+               break;
+
+       case R_TYPE(PCREL17F):
                *where |=
                    (((value & 0x10000) >> 16) << 0) |          /* w */
                    (((value & 0x0f800) >> 11) << 16) |         /* w1 */
@@ -166,10 +201,8 @@
                    (((value & 0x003ff) << 1) << 2);            /* w2 */
                break;
 
+       case R_TYPE(DIR21L):
        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) |
@@ -177,37 +210,10 @@
                    (((value >> 13) & 0x01f) << 16) |
                    (((value >> 11) & 0x003) << 12);
                break;
-
-       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(PLABEL32):
-               /* fptr(symbol) */
-               addr = kobj_sym_lookup(ko, symidx);
-               if (*where != addr)
-                       *where = addr;
-               break;
 
-       case R_TYPE(SEGREL32):
-               /* symbol - SB + addend */
-               /* XXX SB */
-               addr = kobj_sym_lookup(ko, symidx);
-               value += addr;
-               if (*where != addr)
-                       *where = addr;
-               break;
-
-       default:
-               printf("%s: unexpected relocation type %d\n", __func__, rtype);
-               return -1;
-       }
        return 0;
 }
 



Home | Main Index | Thread Index | Old Index