riscv: Support standalone
authorRick Chen <rick@andestech.com>
Tue, 26 Dec 2017 05:55:57 +0000 (13:55 +0800)
committerTom Rini <trini@konsulko.com>
Fri, 12 Jan 2018 13:05:12 +0000 (08:05 -0500)
Run hello_world successfully.

U-Boot 2018.01-rc2-00033-gb265b91-dirty (Dec 22 2017 - 13:54:21 +0800)

DRAM:  1 GiB
MMC:   mmc@f0e00000: 0
SF: Detected mx25u1635e with page size 256 Bytes, erase size 4 KiB, total 2 MiB
In:    serial@f0300000
Out:   serial@f0300000
Err:   serial@f0300000
Net:
Warning: mac@e0100000 (eth0) using random MAC address - 0a:47:9b:f8:b4:f2
eth0: mac@e0100000
RISC-V # mmc rescan
RISC-V # fatls mmc 0:1
318907   u-boot-ae250-64.bin
1252   hello_world_ae250_32.bin
328787   u-boot-ae250-32.bin

3 file(s), 0 dir(s)

RISC-V # fatload mmc 0:1 0x600000 hello_world_ae250_32.bin
reading hello_world_ae250_32.bin
1252 bytes read in 23 ms (52.7 KiB/s)
RISC-V # go 0x600000
Example expects ABI version 9
Actual U-Boot ABI version 9
Hello World
argc = 1
argv[0] = "0x600000"
argv[1] = "$B@"
Hit any key to exit ...

RISC-V #

Signed-off-by: Rick Chen <rick@andestech.com>
Signed-off-by: Rick Chen <rickchen36@gmail.com>
Signed-off-by: Greentime Hu <green.hu@gmail.com>
examples/standalone/riscv.lds [new file with mode: 0644]
examples/standalone/stubs.c

diff --git a/examples/standalone/riscv.lds b/examples/standalone/riscv.lds
new file mode 100644 (file)
index 0000000..7d8c482
--- /dev/null
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2017 Andes Technology Corporation
+ * Rick Chen, Andes Technology Corporation <rick@andestech.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+OUTPUT_ARCH(riscv)
+ENTRY(_start)
+SECTIONS
+{
+    . = ALIGN(4);
+    .text :
+    {
+        *(.text)
+    }
+
+    . = ALIGN(4);
+    .data : {
+                       __global_pointer$ = . + 0x800;
+                       *(.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 9c7a8c00f8b222dbb0a869827d997960fdb1f1fe..fadde669fa94ff185b97d594427d3072a73006f5 100644 (file)
@@ -172,6 +172,18 @@ gd_t *global_data;
 "      lwi     $r16, [$r16 + (%1)]\n"  \
 "      jr      $r16\n"                 \
        : : "i"(offsetof(gd_t, jt)), "i"(FO(x)) : "$r16");
+#elif defined(CONFIG_RISCV)
+/*
+ * t7 holds the pointer to the global_data. gp is call clobbered.
+ */
+#define EXPORT_FUNC(f, a, x, ...)      \
+       asm volatile (                  \
+"      .globl " #x "\n"                \
+#x ":\n"                               \
+"      lw      x19, %0(gp)\n"          \
+"      lw      x19, %1(x19)\n"         \
+"      jr      x19\n"                  \
+       : : "i"(offsetof(gd_t, jt)), "i"(FO(x)) : "x19");
 #elif defined(CONFIG_ARC)
 /*
  * r25 holds the pointer to the global_data. r10 is call clobbered.