riscv: save hart ID in register tp instead of s0
authorLukas Auer <lukas.auer@aisec.fraunhofer.de>
Sun, 17 Mar 2019 18:28:36 +0000 (19:28 +0100)
committerAndes <uboot@andestech.com>
Mon, 8 Apr 2019 01:44:26 +0000 (09:44 +0800)
The hart ID passed by the previous boot stage is currently stored in
register s0. If we divert the control flow inside a function, which is
required as part of multi-hart support, the function epilog may not be
called, clobbering register s0. Save the hart ID in the unallocatable
register tp instead to protect the hart ID.

Signed-off-by: Lukas Auer <lukas.auer@aisec.fraunhofer.de>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
Reviewed-by: Rick Chen <rick@andestech.com>
Reviewed-by: Anup Patel <anup.patel@wdc.com>
arch/riscv/cpu/start.S

index a30f6f7..bcc0ff6 100644 (file)
@@ -36,7 +36,7 @@
 .globl _start
 _start:
        /* save hart id and dtb pointer */
-       mv      s0, a0
+       mv      tp, a0
        mv      s1, a1
 
        la      t0, trap_entry
@@ -64,7 +64,7 @@ call_board_init_f_0:
        jal     board_init_f_init_reserve
 
        /* save the boot hart id to global_data */
-       SREG    s0, GD_BOOT_HART(gp)
+       SREG    tp, GD_BOOT_HART(gp)
 
        /* Enable cache */
        jal     icache_enable