Register clearing as a separate assembly routine in entry.S
This commit is contained in:
parent
e101c0910f
commit
2490a4e4df
1 changed files with 42 additions and 31 deletions
73
entry.S
73
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
|
||||
|
|
Loading…
Add table
Reference in a new issue