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>
This commit is contained in:
parent
3c234efa69
commit
e7670f6c1e
4
README
4
README
@ -3499,7 +3499,7 @@ GCC's implementation.
|
|||||||
|
|
||||||
For PowerPC, the following registers have specific use:
|
For PowerPC, the following registers have specific use:
|
||||||
R1: stack pointer
|
R1: stack pointer
|
||||||
R2: TOC pointer
|
R2: reserved for system use
|
||||||
R3-R4: parameter passing and return values
|
R3-R4: parameter passing and return values
|
||||||
R5-R10: parameter passing
|
R5-R10: parameter passing
|
||||||
R13: small data area pointer
|
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 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
|
Note: on PPC, we could use a static initializer (since the
|
||||||
address of the global data structure is known at compile time),
|
address of the global data structure is known at compile time),
|
||||||
|
@ -23,4 +23,4 @@
|
|||||||
|
|
||||||
PLATFORM_RELFLAGS += -fPIC -ffixed-r14 -meabi -fno-strict-aliasing
|
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
|
||||||
|
@ -22,4 +22,4 @@
|
|||||||
PLATFORM_RELFLAGS += -fPIC -ffixed-r14 -meabi
|
PLATFORM_RELFLAGS += -fPIC -ffixed-r14 -meabi
|
||||||
|
|
||||||
PLATFORM_CPPFLAGS += -DCONFIG_MPC512X -DCONFIG_E300 \
|
PLATFORM_CPPFLAGS += -DCONFIG_MPC512X -DCONFIG_E300 \
|
||||||
-ffixed-r2 -ffixed-r29 -msoft-float -mcpu=603e
|
-ffixed-r2 -msoft-float -mcpu=603e
|
||||||
|
@ -30,7 +30,7 @@
|
|||||||
|
|
||||||
PLATFORM_RELFLAGS += -fPIC -ffixed-r14 -meabi
|
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
|
# Use default linker script. Board port can override in board/*/config.mk
|
||||||
LDSCRIPT := $(SRCTREE)/cpu/mpc5xx/u-boot.lds
|
LDSCRIPT := $(SRCTREE)/cpu/mpc5xx/u-boot.lds
|
||||||
|
@ -23,7 +23,7 @@
|
|||||||
|
|
||||||
PLATFORM_RELFLAGS += -fPIC -ffixed-r14 -meabi
|
PLATFORM_RELFLAGS += -fPIC -ffixed-r14 -meabi
|
||||||
|
|
||||||
PLATFORM_CPPFLAGS += -DCONFIG_MPC5xxx -ffixed-r2 -ffixed-r29 \
|
PLATFORM_CPPFLAGS += -DCONFIG_MPC5xxx -ffixed-r2 \
|
||||||
-mstring -mcpu=603e -mmultiple
|
-mstring -mcpu=603e -mmultiple
|
||||||
|
|
||||||
# Use default linker script. Board port can override in board/*/config.mk
|
# Use default linker script. Board port can override in board/*/config.mk
|
||||||
|
@ -23,7 +23,7 @@
|
|||||||
|
|
||||||
PLATFORM_RELFLAGS += -fPIC -ffixed-r14 -meabi
|
PLATFORM_RELFLAGS += -fPIC -ffixed-r14 -meabi
|
||||||
|
|
||||||
PLATFORM_CPPFLAGS += -DCONFIG_MPC8220 -ffixed-r2 -ffixed-r29 \
|
PLATFORM_CPPFLAGS += -DCONFIG_MPC8220 -ffixed-r2 \
|
||||||
-mstring -mcpu=603e -mmultiple
|
-mstring -mcpu=603e -mmultiple
|
||||||
|
|
||||||
# Use default linker script. Board port can override in board/*/config.mk
|
# Use default linker script. Board port can override in board/*/config.mk
|
||||||
|
@ -23,7 +23,7 @@
|
|||||||
|
|
||||||
PLATFORM_RELFLAGS += -fPIC -ffixed-r14 -meabi -fno-strict-aliasing
|
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
|
# Use default linker script. Board port can override in board/*/config.mk
|
||||||
LDSCRIPT := $(SRCTREE)/cpu/mpc824x/u-boot.lds
|
LDSCRIPT := $(SRCTREE)/cpu/mpc824x/u-boot.lds
|
||||||
|
@ -23,7 +23,7 @@
|
|||||||
|
|
||||||
PLATFORM_RELFLAGS += -fPIC -ffixed-r14 -meabi
|
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
|
-mstring -mcpu=603e -mmultiple
|
||||||
|
|
||||||
# Use default linker script. Board port can override in board/*/config.mk
|
# Use default linker script. Board port can override in board/*/config.mk
|
||||||
|
@ -23,7 +23,7 @@
|
|||||||
PLATFORM_RELFLAGS += -fPIC -ffixed-r14 -meabi
|
PLATFORM_RELFLAGS += -fPIC -ffixed-r14 -meabi
|
||||||
|
|
||||||
PLATFORM_CPPFLAGS += -DCONFIG_MPC83XX -DCONFIG_E300 \
|
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
|
# Use default linker script. Board port can override in board/*/config.mk
|
||||||
LDSCRIPT := $(SRCTREE)/cpu/mpc83xx/u-boot.lds
|
LDSCRIPT := $(SRCTREE)/cpu/mpc83xx/u-boot.lds
|
||||||
|
@ -23,4 +23,5 @@
|
|||||||
|
|
||||||
PLATFORM_RELFLAGS += -fPIC -ffixed-r14 -meabi
|
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
|
||||||
|
@ -23,4 +23,4 @@
|
|||||||
|
|
||||||
PLATFORM_RELFLAGS += -fPIC -ffixed-r14 -meabi
|
PLATFORM_RELFLAGS += -fPIC -ffixed-r14 -meabi
|
||||||
|
|
||||||
PLATFORM_CPPFLAGS += -DCONFIG_MPC86xx -ffixed-r2 -ffixed-r29 -mstring
|
PLATFORM_CPPFLAGS += -DCONFIG_MPC86xx -ffixed-r2 -mstring
|
||||||
|
@ -723,7 +723,7 @@ relocate_code:
|
|||||||
|
|
||||||
mr r1, r3 /* Set new stack pointer */
|
mr r1, r3 /* Set new stack pointer */
|
||||||
mr r9, r4 /* Save copy of Global Data 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 r10, r5 /* Save copy of Destination Address */
|
||||||
|
|
||||||
mr r3, r5 /* Destination Address */
|
mr r3, r5 /* Destination Address */
|
||||||
|
@ -23,4 +23,4 @@
|
|||||||
|
|
||||||
PLATFORM_RELFLAGS += -fPIC -ffixed-r14 -meabi -fno-strict-aliasing
|
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
|
||||||
|
@ -22,7 +22,7 @@
|
|||||||
#
|
#
|
||||||
|
|
||||||
PLATFORM_RELFLAGS += -fPIC -ffixed-r14 -meabi -fno-strict-aliasing
|
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/')
|
cfg=$(shell grep configs $(OBJTREE)/include/config.h | sed 's/.*<\(configs.*\)>/\1/')
|
||||||
is440=$(shell grep CONFIG_440 $(TOPDIR)/include/$(cfg))
|
is440=$(shell grep CONFIG_440 $(TOPDIR)/include/$(cfg))
|
||||||
|
@ -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
|
2. The pointer to the jump table is passed to the application in a
|
||||||
machine-dependent way. PowerPC, ARM and MIPS architectures use a
|
machine-dependent way. PowerPC, ARM and MIPS architectures use a
|
||||||
dedicated register to hold the pointer to the 'global_data'
|
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
|
architecture does not use such a register; instead, the pointer to
|
||||||
the 'global_data' structure is passed as 'argv[-1]' pointer.
|
the 'global_data' structure is passed as 'argv[-1]' pointer.
|
||||||
|
|
||||||
|
@ -25,14 +25,14 @@ gd_t *global_data;
|
|||||||
: : "i"(XF_ ## x * sizeof(void *)) : "eax", "ecx");
|
: : "i"(XF_ ## x * sizeof(void *)) : "eax", "ecx");
|
||||||
#elif defined(CONFIG_PPC)
|
#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
|
* register
|
||||||
*/
|
*/
|
||||||
#define EXPORT_FUNC(x) \
|
#define EXPORT_FUNC(x) \
|
||||||
asm volatile ( \
|
asm volatile ( \
|
||||||
" .globl " #x "\n" \
|
" .globl " #x "\n" \
|
||||||
#x ":\n" \
|
#x ":\n" \
|
||||||
" lwz %%r11, %0(%%r29)\n" \
|
" lwz %%r11, %0(%%r2)\n" \
|
||||||
" lwz %%r11, %1(%%r11)\n" \
|
" lwz %%r11, %1(%%r11)\n" \
|
||||||
" mtctr %%r11\n" \
|
" mtctr %%r11\n" \
|
||||||
" bctr\n" \
|
" bctr\n" \
|
||||||
|
@ -70,7 +70,7 @@ mmu_init:
|
|||||||
* we can load the instruction and data TLB registers with the
|
* we can load the instruction and data TLB registers with the
|
||||||
* same values.
|
* same values.
|
||||||
*/
|
*/
|
||||||
lwz r9,20(r29) /* gd->ram_size */
|
lwz r9,20(r2) /* gd->ram_size */
|
||||||
addis r9,r9,-0x80
|
addis r9,r9,-0x80
|
||||||
|
|
||||||
mr r8, r9 /* Higher 8 Meg in SDRAM */
|
mr r8, r9 /* Higher 8 Meg in SDRAM */
|
||||||
|
@ -30,11 +30,11 @@ asm volatile ( \
|
|||||||
asm volatile ( \
|
asm volatile ( \
|
||||||
" .globl mon_" #x "\n" \
|
" .globl mon_" #x "\n" \
|
||||||
"mon_" #x ":\n" \
|
"mon_" #x ":\n" \
|
||||||
" lwz %%r11, %0(%%r29)\n" \
|
" lwz %%r11, %0(%%r2)\n" \
|
||||||
" lwz %%r11, %1(%%r11)\n" \
|
" lwz %%r11, %1(%%r11)\n" \
|
||||||
" mtctr %%r11\n" \
|
" mtctr %%r11\n" \
|
||||||
" bctr\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__)
|
#elif defined(__arm__)
|
||||||
#define EXPORT_FUNC(x) \
|
#define EXPORT_FUNC(x) \
|
||||||
asm volatile ( \
|
asm volatile ( \
|
||||||
@ -67,7 +67,7 @@ int main(void)
|
|||||||
#if defined(__i386__)
|
#if defined(__i386__)
|
||||||
xxx_t *pq;
|
xxx_t *pq;
|
||||||
#elif defined(__powerpc__)
|
#elif defined(__powerpc__)
|
||||||
register volatile xxx_t *pq asm("r29");
|
register volatile xxx_t *pq asm("r2");
|
||||||
#elif defined(__arm__)
|
#elif defined(__arm__)
|
||||||
register volatile xxx_t *pq asm("r8");
|
register volatile xxx_t *pq asm("r8");
|
||||||
#elif defined(__mips__)
|
#elif defined(__mips__)
|
||||||
|
@ -163,7 +163,7 @@ typedef struct global_data {
|
|||||||
#define GD_FLG_SILENT 0x00004 /* Silent mode */
|
#define GD_FLG_SILENT 0x00004 /* Silent mode */
|
||||||
|
|
||||||
#if 1
|
#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 */
|
#else /* We could use plain global data, but the resulting code is bigger */
|
||||||
#define XTRN_DECLARE_GLOBAL_DATA_PTR extern
|
#define XTRN_DECLARE_GLOBAL_DATA_PTR extern
|
||||||
#define DECLARE_GLOBAL_DATA_PTR XTRN_DECLARE_GLOBAL_DATA_PTR \
|
#define DECLARE_GLOBAL_DATA_PTR XTRN_DECLARE_GLOBAL_DATA_PTR \
|
||||||
|
Loading…
Reference in New Issue
Block a user