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>
This commit is contained in:
Thomas Chou 2010-05-21 11:08:03 +08:00 committed by Scott McNutt
parent 661ba14051
commit 0df01fd3d7
6 changed files with 20 additions and 18 deletions

8
README
View File

@ -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.

View File

@ -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

View File

@ -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)

View File

@ -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_ */

View 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. 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 machine-dependent way. PowerPC, ARM, MIPS, Blackfin and Nios II
use a dedicated register to hold the pointer to the 'global_data' architectures use a dedicated register to hold the pointer to the
structure: r2 on PowerPC, r8 on ARM, k0 on MIPS, and P3 on Blackfin. 'global_data' structure: r2 on PowerPC, r8 on ARM, k0 on MIPS,
The x86 architecture does not use such a register; instead, the P3 on Blackfin and gp on Nios II. The x86 architecture does not
pointer to the 'global_data' structure is passed as 'argv[-1]' use such a register; instead, the pointer to the 'global_data'
pointer. 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:

View File

@ -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