From 2490a4e4dfb3fd0ea334ab510c10aefb45a5f02b Mon Sep 17 00:00:00 2001 From: Imbus <> Date: Thu, 26 Jun 2025 02:57:34 +0200 Subject: [PATCH] Register clearing as a separate assembly routine in entry.S --- entry.S | 73 +++++++++++++++++++++++++++++++++------------------------ 1 file changed, 42 insertions(+), 31 deletions(-) diff --git a/entry.S b/entry.S index 377f81f..f32657c 100644 --- a/entry.S +++ b/entry.S @@ -1,10 +1,46 @@ .section .text .globl _start _start: - li x1, 0x0 - li x2, 0x0 - li x3, 0x0 - li x4, 0x0 + # Both call and j will work here, but since ra will be cleared, + # we will need a jump instruction back (from _clear) to continue. + call _clear + +continue: + li t0, 0x10000000 # UART base address + li t1, 'E' # Character to print + sb t1, 0(t0) + li t1, 'n' + sb t1, 0(t0) + li t1, 't' + sb t1, 0(t0) + li t1, 'r' + sb t1, 0(t0) + li t1, 'y' + sb t1, 0(t0) + li t1, '\n' + sb t1, 0(t0) + + # Set up a stack for C. + la sp, stack0 + li a0, 1024*4 # a0 = 4096 + csrr a1, mhartid # a1 = hart id + addi a1, a1, 1 # hartid + 1 + mul a0, a0, a1 # a0 *= hartid+1 + add sp, sp, a0 # sp += a0 + + # Jump to start() in start.c + call start + +1: + j 1b # Infinite loop + +.section .text +.globl _clear +_clear: + li x1, 0x0 # ra: Return address + li x2, 0x0 # sp: Stack points + li x3, 0x0 # gp: Global pointer + li x4, 0x0 # tp: Thread pointer li x5, 0x0 li x6, 0x0 li x7, 0x0 @@ -33,30 +69,5 @@ _start: li x30, 0x0 li x31, 0x0 - li t0, 0x10000000 # UART base address - li t1, 'E' # Character to print - sb t1, 0(t0) - li t1, 'n' - sb t1, 0(t0) - li t1, 't' - sb t1, 0(t0) - li t1, 'r' - sb t1, 0(t0) - li t1, 'y' - sb t1, 0(t0) - li t1, '\n' - sb t1, 0(t0) - - # Set up a stack for C. - la sp, stack0 - li a0, 1024*4 # a0 = 4096 - csrr a1, mhartid # a1 = hart id - addi a1, a1, 1 # hartid + 1 - mul a0, a0, a1 # a0 *= hartid+1 - add sp, sp, a0 # sp += a0 - - # Jump to start() in start.c - call start - -1: - j 1b # Infinite loop + # ret wont work here since we cleared x1 + j continue