riscv: replace use of callee-saved register in standalone
authorLukas Auer <lukas.auer@aisec.fraunhofer.de>
Fri, 4 Jan 2019 00:37:32 +0000 (01:37 +0100)
committerAndes <uboot@andestech.com>
Tue, 15 Jan 2019 01:36:31 +0000 (09:36 +0800)
Register x19 (s3) is a callee-saved register. It must not be used to
load and jump to exported functions without saving it beforehand.
Replace it with t0, a temporary and caller-saved register.

Change the code comment to reflect this and fix it to correctly list gp
as the register with the pointer to global data.

Signed-off-by: Lukas Auer <lukas.auer@aisec.fraunhofer.de>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
Tested-by: Bin Meng <bmeng.cn@gmail.com>
examples/standalone/stubs.c

index fadde669fa94ff185b97d594427d3072a73006f5..f37d209da6db2b731b06a581a8a92886a0a6af36 100644 (file)
@@ -174,16 +174,16 @@ gd_t *global_data;
        : : "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.
+ * gp holds the pointer to the global_data. t0 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");
+"      lw      t0, %0(gp)\n"           \
+"      lw      t0, %1(t0)\n"           \
+"      jr      t0\n"                   \
+       : : "i"(offsetof(gd_t, jt)), "i"(FO(x)) : "t0");
 #elif defined(CONFIG_ARC)
 /*
  * r25 holds the pointer to the global_data. r10 is call clobbered.