]> git.sur5r.net Git - u-boot/commitdiff
nios2: fix r15 issue for gcc4
authorThomas Chou <thomas@wytron.com.tw>
Fri, 21 May 2010 03:08:03 +0000 (11:08 +0800)
committerScott McNutt <smcnutt@psyent.com>
Fri, 28 May 2010 14:56:03 +0000 (10:56 -0400)
The "-ffixed-r15" option doesn't work well for gcc4. Since we
don't use gp for small data with option "-G0", we can use gp
as global data pointer. This allows compiler to use r15. It
is necessary for gcc4 to work properly.

Signed-off-by: Thomas Chou <thomas@wytron.com.tw>
Signed-off-by: Scott McNutt <smcnutt@psyent.com>
README
arch/nios2/config.mk
arch/nios2/cpu/start.S
arch/nios2/include/asm/global_data.h
doc/README.standalone
examples/standalone/stubs.c

diff --git a/README b/README
index 81692c0a49fedd8444663ec331383916591582f2..acb3308d2b16bc1d2c466476e18fcf56d4233fb0 100644 (file)
--- a/README
+++ b/README
@@ -4023,6 +4023,14 @@ On ARM, the following registers are used:
 
     ==> U-Boot will use R8 to hold a pointer to the global data
 
+On Nios II, the ABI is documented here:
+       http://www.altera.com/literature/hb/nios2/n2cpu_nii51016.pdf
+
+    ==> U-Boot will use gp to hold a pointer to the global data
+
+    Note: on Nios II, we give "-G0" option to gcc and don't use gp
+    to access small data sections, so gp is free.
+
 NOTE: DECLARE_GLOBAL_DATA_PTR must be used with file-global scope,
 or current versions of GCC may "optimize" the code too much.
 
index 8e5d6ef03c141abed1cdb941b3f7a078068ded13..6789038bdd39ad6779e2a801acd1e2298af9e649 100644 (file)
@@ -27,6 +27,6 @@ CROSS_COMPILE ?= nios2-elf-
 STANDALONE_LOAD_ADDR = 0x02000000 -L $(gcclibdir)
 
 PLATFORM_CPPFLAGS += -DCONFIG_NIOS2 -D__NIOS2__
-PLATFORM_CPPFLAGS += -ffixed-r15 -G0
+PLATFORM_CPPFLAGS += -G0
 
 LDSCRIPT ?= $(SRCTREE)/$(CPUDIR)/u-boot.lds
index d1016ea718370edf951299759895614b8af43854..76d3b521547f1d8c793514ea38ea52018dbf9697 100644 (file)
@@ -113,13 +113,6 @@ _cur:      movhi   r5, %hi(_cur - _start)
         bne    r5, r6, 4b
 5:
 
-       /* GLOBAL POINTER -- the global pointer is used to reference
-        * "small data" (see -G switch). The linker script must
-        * provide the gp address.
-        */
-        movhi  gp, %hi(_gp)
-        ori    gp, gp, %lo(_gp)
-
        /* JUMP TO RELOC ADDR */
        movhi   r4, %hi(_reloc)
        ori     r4, r4, %lo(_reloc)
index 34aa96277adec03ce8e68be936126942cc622545..f1b348293ffe423397f48c0d8c7ad33838b39906 100644 (file)
@@ -48,6 +48,6 @@ typedef       struct  global_data {
 #define        GD_FLG_LOGINIT  0x00020         /* Log Buffer has been initialized      */
 #define GD_FLG_DISABLE_CONSOLE 0x00040         /* Disable console (in & out)    */
 
-#define DECLARE_GLOBAL_DATA_PTR     register gd_t *gd asm ("r15")
+#define DECLARE_GLOBAL_DATA_PTR     register gd_t *gd asm ("gp")
 
 #endif /* __ASM_NIOS2_GLOBALDATA_H_ */
index 885c92fb3a27d969c0b60bbbf2174dedcb2deccb..63810874936976e4d7b0c2998109f2b8ccee9623 100644 (file)
@@ -19,12 +19,12 @@ Design Notes on Exporting U-Boot Functions to Standalone Applications:
    thus the compiler cannot perform type checks on these assignments.
 
 2. The pointer to the jump table is passed to the application in a
-   machine-dependent way. PowerPC, ARM, MIPS and Blackfin architectures
-   use a dedicated register to hold the pointer to the 'global_data'
-   structure: r2 on PowerPC, r8 on ARM, k0 on MIPS, and P3 on Blackfin.
-   The x86 architecture does not use such a register; instead, the
-   pointer to the 'global_data' structure is passed as 'argv[-1]'
-   pointer.
+   machine-dependent way. PowerPC, ARM, MIPS, Blackfin and Nios II
+   architectures use a dedicated register to hold the pointer to the
+   'global_data' structure: r2 on PowerPC, r8 on ARM, k0 on MIPS,
+   P3 on Blackfin and gp on Nios II. The x86 architecture does not
+   use such a register; instead, the pointer to the 'global_data'
+   structure is passed as 'argv[-1]' pointer.
 
    The application can access the 'global_data' structure in the same
    way as U-Boot does:
@@ -56,6 +56,7 @@ Design Notes on Exporting U-Boot Functions to Standalone Applications:
        ARM             0x0c100000      0x0c100000
        MIPS            0x80200000      0x80200000
        Blackfin        0x00001000      0x00001000
+       Nios II         0x02000000      0x02000000
 
    For example, the "hello world" application may be loaded and
    executed on a PowerPC board with the following commands:
index ce3371d912281f9f71931a5071ef0ac774cb9ce1..0187708e0bdc1baf0a6892f5dd374d8d70929b1a 100644 (file)
@@ -84,7 +84,7 @@ gd_t *global_data;
        : : "i"(offsetof(gd_t, jt)), "i"(XF_ ## x) : "r0");
 #elif defined(CONFIG_NIOS2)
 /*
- * r15 holds the pointer to the global_data, r8 is call-clobbered
+ * gp holds the pointer to the global_data, r8 is call-clobbered
  */
 #define EXPORT_FUNC(x) \
        asm volatile (                  \
@@ -92,11 +92,11 @@ gd_t *global_data;
 #x ":\n"                               \
 "      movhi   r8, %%hi(%0)\n"         \
 "      ori     r8, r0, %%lo(%0)\n"     \
-"      add     r8, r8, r15\n"          \
+"      add     r8, r8, gp\n"           \
 "      ldw     r8, 0(r8)\n"            \
 "      ldw     r8, %1(r8)\n"           \
 "      jmp     r8\n"                   \
-       : : "i"(offsetof(gd_t, jt)), "i"(XF_ ## x * sizeof(void *)) : "r15");
+       : : "i"(offsetof(gd_t, jt)), "i"(XF_ ## x * sizeof(void *)) : "gp");
 #elif defined(CONFIG_M68K)
 /*
  * d7 holds the pointer to the global_data, a0 is a call-clobbered