Add exception handling
This commit is contained in:
172
kernel.s
172
kernel.s
@ -2,7 +2,8 @@
|
||||
|
||||
.section .rodata
|
||||
|
||||
hello_world: .asciz "\nHello world!\n"
|
||||
panic_message: .asciz "\nPanic"
|
||||
.equ PANIC_MESSAGE_SIZE, . - panic_message
|
||||
|
||||
.section .text
|
||||
|
||||
@ -18,21 +19,6 @@ bzero:
|
||||
.Lbzero_end:
|
||||
ret
|
||||
|
||||
# Arguments:
|
||||
# a0 - Character.
|
||||
.type putchar, @function
|
||||
putchar:
|
||||
li a1, 0
|
||||
li a2, 0
|
||||
li a3, 0
|
||||
li a4, 0
|
||||
li a5, 0
|
||||
li a6, 0
|
||||
li a7, 1 # sbi_console_putchar.
|
||||
|
||||
ecall
|
||||
ret
|
||||
|
||||
.type kernel_main, @function
|
||||
kernel_main:
|
||||
# Prologue.
|
||||
@ -41,28 +27,156 @@ kernel_main:
|
||||
sw s0, 24(sp)
|
||||
addi s0, sp, 32
|
||||
|
||||
sw s1, 20(sp)
|
||||
la t0, kernel_entry
|
||||
csrw stvec, t0
|
||||
|
||||
la s1, hello_world
|
||||
|
||||
.Lkernel_main_if:
|
||||
lw a0, (s1)
|
||||
beqz a0, .Lkernel_main
|
||||
|
||||
call putchar
|
||||
addi s1, s1, 1
|
||||
|
||||
j .Lkernel_main_if
|
||||
unimp
|
||||
|
||||
.Lkernel_main:
|
||||
j .Lkernel_main
|
||||
|
||||
lw s1, 20(sp)
|
||||
# Epilogue.
|
||||
lw ra, 28(sp)
|
||||
lw s0, 24(sp)
|
||||
addi sp, sp, 32
|
||||
ret
|
||||
|
||||
.balign 4
|
||||
.type kernel_entry, @function
|
||||
kernel_entry:
|
||||
csrw sscratch, sp
|
||||
addi sp, sp, -4 * 31
|
||||
|
||||
sw ra, 0(sp)
|
||||
sw gp, 4(sp)
|
||||
sw tp, 8(sp)
|
||||
sw t0, 12(sp)
|
||||
sw t1, 16(sp)
|
||||
sw t2, 20(sp)
|
||||
sw t3, 24(sp)
|
||||
sw t4, 28(sp)
|
||||
sw t5, 32(sp)
|
||||
sw t6, 36(sp)
|
||||
sw a0, 40(sp)
|
||||
sw a1, 44(sp)
|
||||
sw a2, 48(sp)
|
||||
sw a3, 52(sp)
|
||||
sw a4, 56(sp)
|
||||
sw a5, 60(sp)
|
||||
sw a6, 64(sp)
|
||||
sw a7, 68(sp)
|
||||
sw s0, 72(sp)
|
||||
sw s1, 76(sp)
|
||||
sw s2, 80(sp)
|
||||
sw s3, 84(sp)
|
||||
sw s4, 88(sp)
|
||||
sw s5, 92(sp)
|
||||
sw s6, 96(sp)
|
||||
sw s7, 100(sp)
|
||||
sw s8, 104(sp)
|
||||
sw s9, 108(sp)
|
||||
sw s10, 112(sp)
|
||||
sw s11, 116(sp)
|
||||
|
||||
csrr a0, sscratch
|
||||
sw a0, 120(sp)
|
||||
|
||||
mv a0, sp
|
||||
call handle_trap
|
||||
|
||||
lw ra, 0(sp)
|
||||
lw gp, 4(sp)
|
||||
lw tp, 8(sp)
|
||||
lw t0, 12(sp)
|
||||
lw t1, 16(sp)
|
||||
lw t2, 20(sp)
|
||||
lw t3, 24(sp)
|
||||
lw t4, 28(sp)
|
||||
lw t5, 32(sp)
|
||||
lw t6, 36(sp)
|
||||
lw a0, 40(sp)
|
||||
lw a1, 44(sp)
|
||||
lw a2, 48(sp)
|
||||
lw a3, 52(sp)
|
||||
lw a4, 56(sp)
|
||||
lw a5, 60(sp)
|
||||
lw a6, 64(sp)
|
||||
lw a7, 68(sp)
|
||||
lw s0, 72(sp)
|
||||
lw s1, 76(sp)
|
||||
lw s2, 80(sp)
|
||||
lw s3, 84(sp)
|
||||
lw s4, 88(sp)
|
||||
lw s5, 92(sp)
|
||||
lw s6, 96(sp)
|
||||
lw s7, 100(sp)
|
||||
lw s8, 104(sp)
|
||||
lw s9, 108(sp)
|
||||
lw s10, 112(sp)
|
||||
lw s11, 116(sp)
|
||||
lw sp, 120(sp)
|
||||
|
||||
sret
|
||||
|
||||
.type handle_trap, @function
|
||||
handle_trap:
|
||||
# Prologue.
|
||||
addi sp, sp, -32
|
||||
sw ra, 28(sp)
|
||||
sw s0, 24(sp)
|
||||
addi s0, sp, 32
|
||||
|
||||
csrr t0, scause
|
||||
csrr t1, stval
|
||||
csrr t2, sepc
|
||||
|
||||
li a0, PANIC_MESSAGE_SIZE
|
||||
la a1, panic_message
|
||||
call write_s
|
||||
|
||||
li a0, ' '
|
||||
call write_c
|
||||
|
||||
csrr a0, scause
|
||||
call write_i
|
||||
|
||||
li a0, ','
|
||||
call write_c
|
||||
|
||||
csrr a0, stval
|
||||
call write_i
|
||||
|
||||
li a0, ','
|
||||
call write_c
|
||||
|
||||
csrr a0, sepc
|
||||
call write_i
|
||||
|
||||
call panic
|
||||
|
||||
# Epilogue.
|
||||
lw ra, 28(sp)
|
||||
lw s0, 24(sp)
|
||||
add sp, sp, 32
|
||||
addi sp, sp, 32
|
||||
ret
|
||||
|
||||
.type panic, @function
|
||||
panic:
|
||||
# Prologue.
|
||||
addi sp, sp, -32
|
||||
sw ra, 28(sp)
|
||||
sw s0, 24(sp)
|
||||
addi s0, sp, 32
|
||||
|
||||
li a0, '\n'
|
||||
call write_c
|
||||
.Lpanic:
|
||||
j .Lpanic
|
||||
|
||||
# Epilogue.
|
||||
lw ra, 28(sp)
|
||||
lw s0, 24(sp)
|
||||
addi sp, sp, 32
|
||||
ret
|
||||
|
||||
.section .text.boot
|
||||
|
Reference in New Issue
Block a user