diff options
| author | Macpaul Lin <macpaul@andestech.com> | 2011-10-11 22:33:20 +0000 | 
|---|---|---|
| committer | Wolfgang Denk <wd@denx.de> | 2011-10-22 00:53:48 +0200 | 
| commit | 72c73ddec3d50776fda2fcd92854f0d9fc9d4a33 (patch) | |
| tree | b6884d2e3f5870552bd74d6181df17d4ce72a94d | |
| parent | 463d47f66ce19aac043d98d77a958908e2a3eb39 (diff) | |
| download | olio-uboot-2014.01-72c73ddec3d50776fda2fcd92854f0d9fc9d4a33.tar.xz olio-uboot-2014.01-72c73ddec3d50776fda2fcd92854f0d9fc9d4a33.zip | |
nds32: standalone support
Add standalone program related support for nds32 architecture.
Signed-off-by: Macpaul Lin <macpaul@andestech.com>
| -rw-r--r-- | examples/standalone/nds32.lds | 56 | ||||
| -rw-r--r-- | examples/standalone/stubs.c | 17 | ||||
| -rw-r--r-- | examples/standalone/x86-testapp.c | 13 | 
3 files changed, 85 insertions, 1 deletions
| diff --git a/examples/standalone/nds32.lds b/examples/standalone/nds32.lds new file mode 100644 index 000000000..50b4c4b46 --- /dev/null +++ b/examples/standalone/nds32.lds @@ -0,0 +1,56 @@ +/* + * Copyright (C) 2011 Andes Technology Corporation + * Shawn Lin, Andes Technology Corporation <nobuhiro@andestech.com> + * Macpaul Lin, Andes Technology Corporation <macpaul@andestech.com> + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +OUTPUT_FORMAT("elf32-nds32", "elf32-nds32", "elf32-nds32") +OUTPUT_ARCH(nds32) +ENTRY(_start) +SECTIONS +{ +	. = ALIGN(4); +	.text : +	{ +		*(.text) +	} + +	. = ALIGN(4); +	.data : { *(.data) } + +	. = ALIGN(4); + +	.got : { +		__got_start = .; +		*(.got) +		__got_end = .; +	} + +	. = ALIGN(4); +	__bss_start = .; +	.bss : { *(.bss) } +	__bss_end = .; + +	. = ALIGN(4); +	.rela.text : { *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*) } + +	_end = .; +} diff --git a/examples/standalone/stubs.c b/examples/standalone/stubs.c index 507d38cea..11c756525 100644 --- a/examples/standalone/stubs.c +++ b/examples/standalone/stubs.c @@ -167,8 +167,23 @@ gd_t *global_data;  "	jmp %%g1\n"					\  "	nop\n"						\  	: : "i"(offsetof(gd_t, jt)), "i"(XF_ ## x * sizeof(void *)) : "g1" ); - +#elif defined(CONFIG_NDS32) +/* + * r16 holds the pointer to the global_data. gp is call clobbered. + * not support reduced register (16 GPR). + */ +#define EXPORT_FUNC(x) \ +	asm volatile (			\ +"	.globl " #x "\n"		\ +#x ":\n"				\ +"	lwi	$r16, [$gp + (%0)]\n"	\ +"	lwi	$r16, [$r16 + (%1)]\n"	\ +"	jr	$r16\n"			\ +	: : "i"(offsetof(gd_t, jt)), "i"(XF_ ## x * sizeof(void *)) : "$r16");  #else +/*"	addi	$sp, $sp, -24\n"	\ +"	br	$r16\n"			\*/ +  #error stubs definition missing for this architecture  #endif diff --git a/examples/standalone/x86-testapp.c b/examples/standalone/x86-testapp.c index e8603d9ba..1e16ec7e0 100644 --- a/examples/standalone/x86-testapp.c +++ b/examples/standalone/x86-testapp.c @@ -52,6 +52,17 @@ asm volatile (						\  "	lw	$25, %1($25)\n"				\  "	jr	$25\n"					\  	: : "i"(offsetof(xxx_t, pfunc)), "i"(XF_ ## x * sizeof(void *)) : "t9"); +#elif defined(__nds32__) +#define EXPORT_FUNC(x)					\ +asm volatile (						\ +"	.globl mon_" #x "\n"				\ +"mon_" #x ":\n"						\ +"	lwi	$r16, [$gp + (%0)]\n"			\ +"	lwi	$r16, [$r16 + (%1)]\n"			\ +"	jr	$r16\n"					\ +: : "i"(offsetof(xxx_t, pfunc)),			\ +"i"(XF_ ## x * sizeof(void *)) : "$r16"); +  #else  #error [No stub code for this arch]  #endif @@ -72,6 +83,8 @@ int main(void)  	register volatile xxx_t *pq asm("r8");  #elif defined(__mips__)  	register volatile xxx_t *pq asm("k0"); +#elif defined(__nds32__) +	register volatile xxx_t *pq asm("$r16");  #endif  	char buf[32]; |