Register clearing as a separate assembly routine in entry.S

This commit is contained in:
Imbus 2025-06-26 02:57:34 +02:00
parent e101c0910f
commit 2490a4e4df

73
entry.S
View file

@ -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