diff options
| -rw-r--r-- | README | 8 | ||||
| -rw-r--r-- | arch/nios2/config.mk | 2 | ||||
| -rw-r--r-- | arch/nios2/cpu/start.S | 7 | ||||
| -rw-r--r-- | arch/nios2/include/asm/global_data.h | 2 | ||||
| -rw-r--r-- | doc/README.standalone | 13 | ||||
| -rw-r--r-- | examples/standalone/stubs.c | 6 | 
6 files changed, 20 insertions, 18 deletions
| @@ -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. diff --git a/arch/nios2/config.mk b/arch/nios2/config.mk index 8e5d6ef03..6789038bd 100644 --- a/arch/nios2/config.mk +++ b/arch/nios2/config.mk @@ -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 diff --git a/arch/nios2/cpu/start.S b/arch/nios2/cpu/start.S index d1016ea71..76d3b5215 100644 --- a/arch/nios2/cpu/start.S +++ b/arch/nios2/cpu/start.S @@ -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) diff --git a/arch/nios2/include/asm/global_data.h b/arch/nios2/include/asm/global_data.h index 34aa96277..f1b348293 100644 --- a/arch/nios2/include/asm/global_data.h +++ b/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_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_ */ diff --git a/doc/README.standalone b/doc/README.standalone index 885c92fb3..638108749 100644 --- a/doc/README.standalone +++ b/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.  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: diff --git a/examples/standalone/stubs.c b/examples/standalone/stubs.c index ce3371d91..0187708e0 100644 --- a/examples/standalone/stubs.c +++ b/examples/standalone/stubs.c @@ -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 |