فهرست منبع

nios2: fix r15 issue for gcc4

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>
Thomas Chou 15 سال پیش
والد
کامیت
0df01fd3d7
6فایلهای تغییر یافته به همراه20 افزوده شده و 18 حذف شده
  1. 8 0
      README
  2. 1 1
      arch/nios2/config.mk
  3. 0 7
      arch/nios2/cpu/start.S
  4. 1 1
      arch/nios2/include/asm/global_data.h
  5. 7 6
      doc/README.standalone
  6. 3 3
      examples/standalone/stubs.c

+ 8 - 0
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
     ==> 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,
 NOTE: DECLARE_GLOBAL_DATA_PTR must be used with file-global scope,
 or current versions of GCC may "optimize" the code too much.
 or current versions of GCC may "optimize" the code too much.
 
 

+ 1 - 1
arch/nios2/config.mk

@@ -27,6 +27,6 @@ CROSS_COMPILE ?= nios2-elf-
 STANDALONE_LOAD_ADDR = 0x02000000 -L $(gcclibdir)
 STANDALONE_LOAD_ADDR = 0x02000000 -L $(gcclibdir)
 
 
 PLATFORM_CPPFLAGS += -DCONFIG_NIOS2 -D__NIOS2__
 PLATFORM_CPPFLAGS += -DCONFIG_NIOS2 -D__NIOS2__
-PLATFORM_CPPFLAGS += -ffixed-r15 -G0
+PLATFORM_CPPFLAGS += -G0
 
 
 LDSCRIPT ?= $(SRCTREE)/$(CPUDIR)/u-boot.lds
 LDSCRIPT ?= $(SRCTREE)/$(CPUDIR)/u-boot.lds

+ 0 - 7
arch/nios2/cpu/start.S

@@ -113,13 +113,6 @@ _cur:	movhi	r5, %hi(_cur - _start)
 	 bne	r5, r6, 4b
 	 bne	r5, r6, 4b
 5:
 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 */
 	/* JUMP TO RELOC ADDR */
 	movhi	r4, %hi(_reloc)
 	movhi	r4, %hi(_reloc)
 	ori	r4, r4, %lo(_reloc)
 	ori	r4, r4, %lo(_reloc)

+ 1 - 1
arch/nios2/include/asm/global_data.h

@@ -48,6 +48,6 @@ typedef	struct	global_data {
 #define	GD_FLG_LOGINIT	0x00020		/* Log Buffer has been initialized	*/
 #define	GD_FLG_LOGINIT	0x00020		/* Log Buffer has been initialized	*/
 #define GD_FLG_DISABLE_CONSOLE	0x00040		/* Disable console (in & out)	 */
 #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_ */
 #endif /* __ASM_NIOS2_GLOBALDATA_H_ */

+ 7 - 6
doc/README.standalone

@@ -19,12 +19,12 @@ Design Notes on Exporting U-Boot Functions to Standalone Applications:
    thus the compiler cannot perform type checks on these assignments.
    thus the compiler cannot perform type checks on these assignments.
 
 
 2. The pointer to the jump table is passed to the application in a
 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
    The application can access the 'global_data' structure in the same
    way as U-Boot does:
    way as U-Boot does:
@@ -56,6 +56,7 @@ Design Notes on Exporting U-Boot Functions to Standalone Applications:
 	ARM		0x0c100000	0x0c100000
 	ARM		0x0c100000	0x0c100000
 	MIPS		0x80200000	0x80200000
 	MIPS		0x80200000	0x80200000
 	Blackfin	0x00001000	0x00001000
 	Blackfin	0x00001000	0x00001000
+	Nios II		0x02000000	0x02000000
 
 
    For example, the "hello world" application may be loaded and
    For example, the "hello world" application may be loaded and
    executed on a PowerPC board with the following commands:
    executed on a PowerPC board with the following commands:

+ 3 - 3
examples/standalone/stubs.c

@@ -84,7 +84,7 @@ gd_t *global_data;
 	: : "i"(offsetof(gd_t, jt)), "i"(XF_ ## x) : "r0");
 	: : "i"(offsetof(gd_t, jt)), "i"(XF_ ## x) : "r0");
 #elif defined(CONFIG_NIOS2)
 #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) \
 #define EXPORT_FUNC(x) \
 	asm volatile (			\
 	asm volatile (			\
@@ -92,11 +92,11 @@ gd_t *global_data;
 #x ":\n"				\
 #x ":\n"				\
 "	movhi	r8, %%hi(%0)\n"		\
 "	movhi	r8, %%hi(%0)\n"		\
 "	ori	r8, r0, %%lo(%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, 0(r8)\n"		\
 "	ldw	r8, %1(r8)\n"		\
 "	ldw	r8, %1(r8)\n"		\
 "	jmp	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)
 #elif defined(CONFIG_M68K)
 /*
 /*
  * d7 holds the pointer to the global_data, a0 is a call-clobbered
  * d7 holds the pointer to the global_data, a0 is a call-clobbered