Explorar o código

PPC: Use r2 instead of r29 as global data pointer

R29 was an unlucky choice as with recent toolchains (gcc-4.2.x) gcc
will refuse to use load/store multiple insns; instead, it issues a
list of simple load/store instructions upon function entry and exit,
resulting in bigger code size, which in turn makes the build for a
few boards fail.

Use r2 instead.

Signed-off-by: Wolfgang Denk <wd@denx.de>
Wolfgang Denk %!s(int64=17) %!d(string=hai) anos
pai
achega
e7670f6c1e

+ 2 - 2
README

@@ -3499,7 +3499,7 @@ GCC's implementation.
 
 For PowerPC, the following registers have specific use:
 	R1:	stack pointer
-	R2:	TOC pointer
+	R2:	reserved for system use
 	R3-R4:	parameter passing and return values
 	R5-R10: parameter passing
 	R13:	small data area pointer
@@ -3508,7 +3508,7 @@ For PowerPC, the following registers have specific use:
 
 	(U-Boot also uses R14 as internal GOT pointer.)
 
-    ==> U-Boot will use R29 to hold a pointer to the global data
+    ==> U-Boot will use R2 to hold a pointer to the global data
 
     Note: on PPC, we could use a static initializer (since the
     address of the global data structure is known at compile time),

+ 1 - 1
cpu/74xx_7xx/config.mk

@@ -23,4 +23,4 @@
 
 PLATFORM_RELFLAGS += -fPIC -ffixed-r14 -meabi -fno-strict-aliasing
 
-PLATFORM_CPPFLAGS += -DCONFIG_74xx_7xx -ffixed-r2 -ffixed-r29 -mstring
+PLATFORM_CPPFLAGS += -DCONFIG_74xx_7xx -ffixed-r2 -mstring

+ 1 - 1
cpu/mpc512x/config.mk

@@ -22,4 +22,4 @@
 PLATFORM_RELFLAGS += -fPIC -ffixed-r14 -meabi
 
 PLATFORM_CPPFLAGS += -DCONFIG_MPC512X -DCONFIG_E300 \
-			-ffixed-r2 -ffixed-r29 -msoft-float -mcpu=603e
+			-ffixed-r2 -msoft-float -mcpu=603e

+ 1 - 1
cpu/mpc5xx/config.mk

@@ -30,7 +30,7 @@
 
 PLATFORM_RELFLAGS += 	-fPIC -ffixed-r14 -meabi
 
-PLATFORM_CPPFLAGS +=	-DCONFIG_5xx -ffixed-r2 -ffixed-r29 -mpowerpc -msoft-float
+PLATFORM_CPPFLAGS +=	-DCONFIG_5xx -ffixed-r2 -mpowerpc -msoft-float
 
 # Use default linker script.  Board port can override in board/*/config.mk
 LDSCRIPT := $(SRCTREE)/cpu/mpc5xx/u-boot.lds

+ 1 - 1
cpu/mpc5xxx/config.mk

@@ -23,7 +23,7 @@
 
 PLATFORM_RELFLAGS += -fPIC -ffixed-r14 -meabi
 
-PLATFORM_CPPFLAGS += -DCONFIG_MPC5xxx -ffixed-r2 -ffixed-r29 \
+PLATFORM_CPPFLAGS += -DCONFIG_MPC5xxx -ffixed-r2 \
 		     -mstring -mcpu=603e -mmultiple
 
 # Use default linker script.  Board port can override in board/*/config.mk

+ 1 - 1
cpu/mpc8220/config.mk

@@ -23,7 +23,7 @@
 
 PLATFORM_RELFLAGS += -fPIC -ffixed-r14 -meabi
 
-PLATFORM_CPPFLAGS += -DCONFIG_MPC8220 -ffixed-r2 -ffixed-r29 \
+PLATFORM_CPPFLAGS += -DCONFIG_MPC8220 -ffixed-r2 \
 		     -mstring -mcpu=603e -mmultiple
 
 # Use default linker script.  Board port can override in board/*/config.mk

+ 1 - 1
cpu/mpc824x/config.mk

@@ -23,7 +23,7 @@
 
 PLATFORM_RELFLAGS += -fPIC -ffixed-r14 -meabi -fno-strict-aliasing
 
-PLATFORM_CPPFLAGS += -DCONFIG_MPC824X -ffixed-r2 -ffixed-r29 -mstring -mcpu=603e -msoft-float
+PLATFORM_CPPFLAGS += -DCONFIG_MPC824X -ffixed-r2 -mstring -mcpu=603e -msoft-float
 
 # Use default linker script.  Board port can override in board/*/config.mk
 LDSCRIPT := $(SRCTREE)/cpu/mpc824x/u-boot.lds

+ 1 - 1
cpu/mpc8260/config.mk

@@ -23,7 +23,7 @@
 
 PLATFORM_RELFLAGS += -fPIC -ffixed-r14 -meabi
 
-PLATFORM_CPPFLAGS += -DCONFIG_8260 -DCONFIG_CPM2 -ffixed-r2 -ffixed-r29 \
+PLATFORM_CPPFLAGS += -DCONFIG_8260 -DCONFIG_CPM2 -ffixed-r2 \
 		     -mstring -mcpu=603e -mmultiple
 
 # Use default linker script.  Board port can override in board/*/config.mk

+ 1 - 1
cpu/mpc83xx/config.mk

@@ -23,7 +23,7 @@
 PLATFORM_RELFLAGS += -fPIC -ffixed-r14 -meabi
 
 PLATFORM_CPPFLAGS += -DCONFIG_MPC83XX -DCONFIG_E300 \
-			-ffixed-r2 -ffixed-r29 -msoft-float
+			-ffixed-r2 -msoft-float
 
 # Use default linker script.  Board port can override in board/*/config.mk
 LDSCRIPT := $(SRCTREE)/cpu/mpc83xx/u-boot.lds

+ 2 - 1
cpu/mpc85xx/config.mk

@@ -23,4 +23,5 @@
 
 PLATFORM_RELFLAGS += -fPIC -ffixed-r14 -meabi
 
-PLATFORM_CPPFLAGS += -DCONFIG_MPC85xx -DCONFIG_E500 -ffixed-r2 -ffixed-r29 -Wa,-me500 -msoft-float -mno-string
+PLATFORM_CPPFLAGS += -DCONFIG_MPC85xx -DCONFIG_E500 -ffixed-r2 \
+			-Wa,-me500 -msoft-float -mno-string

+ 1 - 1
cpu/mpc86xx/config.mk

@@ -23,4 +23,4 @@
 
 PLATFORM_RELFLAGS += -fPIC -ffixed-r14 -meabi
 
-PLATFORM_CPPFLAGS += -DCONFIG_MPC86xx -ffixed-r2 -ffixed-r29 -mstring
+PLATFORM_CPPFLAGS += -DCONFIG_MPC86xx -ffixed-r2 -mstring

+ 1 - 1
cpu/mpc86xx/start.S

@@ -723,7 +723,7 @@ relocate_code:
 
 	mr	r1,  r3		/* Set new stack pointer		*/
 	mr	r9,  r4		/* Save copy of Global Data pointer	*/
-	mr	r29, r9		/* Save for DECLARE_GLOBAL_DATA_PTR	*/
+	mr	r2,  r9		/* Save for DECLARE_GLOBAL_DATA_PTR	*/
 	mr	r10, r5		/* Save copy of Destination Address	*/
 
 	mr	r3,  r5				/* Destination Address	*/

+ 1 - 1
cpu/mpc8xx/config.mk

@@ -23,4 +23,4 @@
 
 PLATFORM_RELFLAGS += -fPIC -ffixed-r14 -meabi -fno-strict-aliasing
 
-PLATFORM_CPPFLAGS += -DCONFIG_8xx -ffixed-r2 -ffixed-r29 -mstring -mcpu=860 -msoft-float
+PLATFORM_CPPFLAGS += -DCONFIG_8xx -ffixed-r2 -mstring -mcpu=860 -msoft-float

+ 1 - 1
cpu/ppc4xx/config.mk

@@ -22,7 +22,7 @@
 #
 
 PLATFORM_RELFLAGS += -fPIC -ffixed-r14 -meabi -fno-strict-aliasing
-PLATFORM_CPPFLAGS += -DCONFIG_4xx -ffixed-r2 -ffixed-r29 -mstring -msoft-float
+PLATFORM_CPPFLAGS += -DCONFIG_4xx -ffixed-r2 -mstring -msoft-float
 
 cfg=$(shell grep configs $(OBJTREE)/include/config.h | sed 's/.*<\(configs.*\)>/\1/')
 is440=$(shell grep CONFIG_440 $(TOPDIR)/include/$(cfg))

+ 1 - 1
doc/README.standalone

@@ -21,7 +21,7 @@ Design Notes on Exporting U-Boot Functions to Standalone Applications:
 2. The pointer to the jump table is passed to the application in a
    machine-dependent way. PowerPC, ARM and MIPS architectures use a
    dedicated register to hold the pointer to the 'global_data'
-   structure: r29 on PowerPC, r8 on ARM and k0 on MIPS. The x86
+   structure: r2 on PowerPC, r8 on ARM and k0 on MIPS. The x86
    architecture does not use such a register; instead, the pointer to
    the 'global_data' structure is passed as 'argv[-1]' pointer.
 

+ 2 - 2
examples/stubs.c

@@ -25,14 +25,14 @@ gd_t *global_data;
 	: : "i"(XF_ ## x * sizeof(void *)) : "eax", "ecx");
 #elif defined(CONFIG_PPC)
 /*
- * r29 holds the pointer to the global_data, r11 is a call-clobbered
+ * r2 holds the pointer to the global_data, r11 is a call-clobbered
  * register
  */
 #define EXPORT_FUNC(x) \
 	asm volatile (			\
 "	.globl " #x "\n"		\
 #x ":\n"				\
-"	lwz	%%r11, %0(%%r29)\n"	\
+"	lwz	%%r11, %0(%%r2)\n"	\
 "	lwz	%%r11, %1(%%r11)\n"	\
 "	mtctr	%%r11\n"		\
 "	bctr\n"				\

+ 1 - 1
examples/test_burst_lib.S

@@ -70,7 +70,7 @@ mmu_init:
 	 * we can load the instruction and data TLB registers with the
 	 * same values.
 	 */
-	lwz	r9,20(r29)		/* gd->ram_size */
+	lwz	r9,20(r2)		/* gd->ram_size */
 	addis	r9,r9,-0x80
 
 	mr	r8, r9			/* Higher 8 Meg in SDRAM */

+ 3 - 3
examples/x86-testapp.c

@@ -30,11 +30,11 @@ asm volatile (						\
 asm volatile (						\
 "	.globl mon_" #x "\n"				\
 "mon_" #x ":\n"						\
-"	lwz	%%r11, %0(%%r29)\n"			\
+"	lwz	%%r11, %0(%%r2)\n"			\
 "	lwz	%%r11, %1(%%r11)\n"			\
 "	mtctr	%%r11\n"				\
 "	bctr\n"					\
-	: : "i"(offsetof(xxx_t, pfunc)), "i"(XF_ ## x * sizeof(void *)) : "r11", "r29");
+	: : "i"(offsetof(xxx_t, pfunc)), "i"(XF_ ## x * sizeof(void *)) : "r11", "r2");
 #elif defined(__arm__)
 #define EXPORT_FUNC(x)					\
 asm volatile (						\
@@ -67,7 +67,7 @@ int main(void)
 #if defined(__i386__)
 	xxx_t *pq;
 #elif defined(__powerpc__)
-	register volatile xxx_t *pq asm("r29");
+	register volatile xxx_t *pq asm("r2");
 #elif defined(__arm__)
 	register volatile xxx_t *pq asm("r8");
 #elif defined(__mips__)

+ 1 - 1
include/asm-ppc/global_data.h

@@ -163,7 +163,7 @@ typedef	struct	global_data {
 #define	GD_FLG_SILENT	0x00004		/* Silent mode				*/
 
 #if 1
-#define DECLARE_GLOBAL_DATA_PTR     register volatile gd_t *gd asm ("r29")
+#define DECLARE_GLOBAL_DATA_PTR     register volatile gd_t *gd asm ("r2")
 #else /* We could use plain global data, but the resulting code is bigger */
 #define XTRN_DECLARE_GLOBAL_DATA_PTR	extern
 #define DECLARE_GLOBAL_DATA_PTR     XTRN_DECLARE_GLOBAL_DATA_PTR \