summaryrefslogtreecommitdiff
path: root/firmware/payloads/dummy_head.S
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/payloads/dummy_head.S')
-rw-r--r--firmware/payloads/dummy_head.S87
1 files changed, 87 insertions, 0 deletions
diff --git a/firmware/payloads/dummy_head.S b/firmware/payloads/dummy_head.S
new file mode 100644
index 0000000..1b36319
--- /dev/null
+++ b/firmware/payloads/dummy_head.S
@@ -0,0 +1,87 @@
+/*
+ * Copyright (c) 2018 Western Digital Corporation or its affiliates.
+ *
+ * Authors:
+ * Anup Patel <anup.patel@wdc.com>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#define __ASM_STR(x) x
+
+#if __riscv_xlen == 64
+#define __REG_SEL(a, b) __ASM_STR(a)
+#define RISCV_PTR .dword
+#elif __riscv_xlen == 32
+#define __REG_SEL(a, b) __ASM_STR(b)
+#define RISCV_PTR .word
+#else
+#error "Unexpected __riscv_xlen"
+#endif
+
+#define REG_L __REG_SEL(ld, lw)
+#define REG_S __REG_SEL(sd, sw)
+
+ .align 3
+ .section .entry, "ax", %progbits
+ .globl _start
+_start:
+ /* Pick one hart to run the main boot sequence */
+ la a3, _hart_lottery
+ li a2, 1
+ amoadd.w a3, a2, (a3)
+ bnez a3, _start_hang
+
+ /* Save a0 and a1 */
+ la a3, _boot_a0
+ REG_S a0, 0(a3)
+ la a3, _boot_a1
+ REG_S a1, 0(a3)
+
+ /* Zero-out BSS */
+ la a4, _bss_start
+ la a5, _bss_end
+_bss_zero:
+ REG_S zero, (a4)
+ add a4, a4, __SIZEOF_POINTER__
+ blt a4, a5, _bss_zero
+
+_start_warm:
+ /* Disable and clear all interrupts */
+ csrw sie, zero
+ csrw sip, zero
+
+ /* Setup exception vectors */
+ la a3, _start_hang
+ csrw stvec, a3
+
+ /* Setup stack */
+ la a3, _payload_end
+ li a4, 0x2000
+ add sp, a3, a4
+
+ /* Jump to C main */
+ la a3, _boot_a0
+ REG_L a0, 0(a3)
+ la a3, _boot_a1
+ REG_L a1, 0(a3)
+ call dummy_main
+
+ /* We don't expect to reach here hence just hang */
+ j _start_hang
+
+ .align 3
+ .section .entry, "ax", %progbits
+ .globl _start_hang
+_start_hang:
+ wfi
+ j _start_hang
+
+ .align 3
+ .section .entry, "ax", %progbits
+_hart_lottery:
+ RISCV_PTR 0
+_boot_a0:
+ RISCV_PTR 0
+_boot_a1:
+ RISCV_PTR 0