nds32: standalone support
authorMacpaul Lin <macpaul@andestech.com>
Tue, 11 Oct 2011 22:33:20 +0000 (22:33 +0000)
committerWolfgang Denk <wd@denx.de>
Fri, 21 Oct 2011 22:53:48 +0000 (00:53 +0200)
Add standalone program related support for nds32 architecture.

Signed-off-by: Macpaul Lin <macpaul@andestech.com>
examples/standalone/nds32.lds [new file with mode: 0644]
examples/standalone/stubs.c
examples/standalone/x86-testapp.c

diff --git a/examples/standalone/nds32.lds b/examples/standalone/nds32.lds
new file mode 100644 (file)
index 0000000..50b4c4b
--- /dev/null
@@ -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 = .;
+}
index 507d38c..11c7565 100644 (file)
@@ -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
 
index e8603d9..1e16ec7 100644 (file)
@@ -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];