Source-Changes-HG archive

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

[src/trunk]: src/sys/arch/arm/arm32 Support R_ARM_REL32 and R_ARM_PREL31.



details:   https://anonhg.NetBSD.org/src/rev/8d38c097b6ab
branches:  trunk
changeset: 789613:8d38c097b6ab
user:      skrll <skrll%NetBSD.org@localhost>
date:      Tue Aug 27 06:39:43 2013 +0000

description:
Support R_ARM_REL32 and R_ARM_PREL31.

ok matt.

diffstat:

 sys/arch/arm/arm32/kobj_machdep.c |  40 ++++++++++++++++++++++++++++++++++----
 1 files changed, 35 insertions(+), 5 deletions(-)

diffs (76 lines):

diff -r 157492d77607 -r 8d38c097b6ab sys/arch/arm/arm32/kobj_machdep.c
--- a/sys/arch/arm/arm32/kobj_machdep.c Tue Aug 27 03:41:59 2013 +0000
+++ b/sys/arch/arm/arm32/kobj_machdep.c Tue Aug 27 06:39:43 2013 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: kobj_machdep.c,v 1.7 2013/08/09 07:12:42 matt Exp $    */
+/*     $NetBSD: kobj_machdep.c,v 1.8 2013/08/27 06:39:43 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.7 2013/08/09 07:12:42 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kobj_machdep.c,v 1.8 2013/08/27 06:39:43 skrll Exp $");
 
 #define        ELFSIZE         ARCH_ELFSIZE
 
@@ -118,7 +118,7 @@
                        *where = addr;
                return 0;
 
-       case R_ARM_MOVW_ABS_NC:
+       case R_ARM_MOVW_ABS_NC: /* (S + A) | T */
        case R_ARM_MOVT_ABS:
                if ((*where & 0x0fb00000) != 0x03000000)
                        break;
@@ -131,9 +131,9 @@
                    | ((addr << 4) & 0x000f0000) | (addr & 0x00000fff);
                return 0;
 
-       case R_ARM_CALL:
+       case R_ARM_CALL:        /* ((S + A) | T) -  P */
        case R_ARM_JUMP24:
-       case R_ARM_PC24:
+       case R_ARM_PC24:        /* Deprecated */
                if (local && (*where & 0x00ffffff) != 0x00fffffe)
                        return 0;
 
@@ -165,6 +165,36 @@
                *where = (*where & 0xff000000) | ((addend >> 2) & 0x00ffffff);
                return 0;
 
+       case R_ARM_REL32:       /* ((S + A) | T) -  P */
+               /* T = 0 for now */
+               addr = kobj_sym_lookup(ko, symidx);
+               if (addr == 0)
+                       break;
+
+               addend += (uintptr_t)addr - (uintptr_t)where;
+               *where = addend;
+               return 0;
+
+       case R_ARM_PREL31:      /* ((S + A) | T) -  P */
+               /* 42 R_ARM_PREL31 4 sign_extend(P[30:0]) 31 - bit 2's complement */
+               /* Sign extend if necessary */
+               if (addend & 0x40000000)
+                       addend |= 0xc0000000;
+               /* T = 0 for now */
+               addr = kobj_sym_lookup(ko, symidx);
+               if (addr == 0)
+                       break;
+
+               addend += (uintptr_t)addr - (uintptr_t)where;
+
+               if ((addend & 0x80000000) != 0x00000000 &&
+                   (addend & 0x80000000) != 0x80000000) {
+                       printf ("Relocation %x too far @ %p\n", addend, where);
+                       return -1;
+               }
+
+               *where = (*where & 0x80000000) | (addend & 0x7fffffff);
+
        default:
                break;
        }



Home | Main Index | Thread Index | Old Index