mirror of
https://github.com/AsahiLinux/u-boot
synced 2025-02-16 05:58:49 +00:00
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:
parent
661ba14051
commit
0df01fd3d7
6 changed files with 20 additions and 18 deletions
8
README
8
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.
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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_ */
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue