Add exception handling

This commit is contained in:
2025-06-26 22:54:56 +02:00
parent 45543d302f
commit dc5dc57162
3 changed files with 191 additions and 66 deletions

View File

@ -3,7 +3,7 @@
# obtain one at https://mozilla.org/MPL/2.0/. # obtain one at https://mozilla.org/MPL/2.0/.
.global _is_alpha, _is_digit, _is_alnum, _is_upper, _is_lower .global _is_alpha, _is_digit, _is_alnum, _is_upper, _is_lower
.global _write_s, _read_file, _write_error, _write_c, _write_i, _print_i .global write_s, _read_file, _write_error, write_c, write_i, _print_i
.global _memcmp, _memchr, _memmem, _memcpy, _mmap .global _memcmp, _memchr, _memmem, _memcpy, _mmap
.global _current, _get, _advance, _label_counter .global _current, _get, _advance, _label_counter
.global _divide_by_zero_error, _exit, _strings_index, _string_equal .global _divide_by_zero_error, _exit, _strings_index, _string_equal
@ -175,28 +175,44 @@ _is_alnum:
addi sp, sp, 16 addi sp, sp, 16
ret ret
# Writes a string to the standard output. # Prints a string.
# #
# Parameters: # Parameters:
# a0 - Length of the string. # a0 - Length of the string.
# a1 - String pointer. # a1 - String pointer.
.type _write_s, @function .type write_s, @function
_write_s: write_s:
# Prologue. # Prologue.
addi sp, sp, -8 addi sp, sp, -32
sw ra, 4(sp) sw ra, 28(sp)
sw s0, 0(sp) sw s0, 24(sp)
addi s0, sp, 8 addi s0, sp, 32
mv a2, a0 sw s1, 20(sp)
li a0, STDOUT sw s2, 16(sp)
li a7, SYS_WRITE
ecall mv s1, a0
mv s2, a1
.Lwrite_s_if:
beqz s1, .Lwrite_s_end
lw a0, (s2)
call write_c
addi s1, s1, -1
addi s2, s2, 1
j .Lwrite_s_if
.Lwrite_s_end:
lw s1, 20(sp)
lw s2, 16(sp)
# Epilogue. # Epilogue.
lw ra, 4(sp) lw ra, 28(sp)
lw s0, 0(sp) lw s0, 24(sp)
addi sp, sp, 8 addi sp, sp, 32
ret ret
# Reads standard input into a buffer. # Reads standard input into a buffer.
@ -308,8 +324,8 @@ _print_i:
# #
# Parameters: # Parameters:
# a0 - Whole number. # a0 - Whole number.
.type _write_i, @function .type write_i, @function
_write_i: write_i:
addi sp, sp, -32 addi sp, sp, -32
sw ra, 28(sp) sw ra, 28(sp)
sw s0, 24(sp) sw s0, 24(sp)
@ -319,33 +335,28 @@ _write_i:
call _print_i call _print_i
addi a1, sp, 0 addi a1, sp, 0
call _write_s call write_s
lw ra, 28(sp) lw ra, 28(sp)
lw s0, 24(sp) lw s0, 24(sp)
addi sp, sp, 32 addi sp, sp, 32
ret ret
# Writes a character from a0 into the standard output. # Prints a character from a0.
.type _write_c, @function #
_write_c: # Arguments:
# Prologue # a0 - Character.
addi sp, sp, -16 .type write_c, @function
sw ra, 12(sp) write_c:
sw s0, 8(sp) li a1, 0
addi s0, sp, 16 li a2, 0
li a3, 0
li a4, 0
li a5, 0
li a6, 0
li a7, 1 # sbi_console_putchar.
sb a0, 4(sp)
li a0, STDOUT
addi a1, sp, 4
li a2, 1
li a7, SYS_WRITE
ecall ecall
# Epilogue.
lw ra, 12(sp)
lw s0, 8(sp)
add sp, sp, 16
ret ret
# a0 - Pointer to an array to get the first element. # a0 - Pointer to an array to get the first element.

172
kernel.s
View File

@ -2,7 +2,8 @@
.section .rodata .section .rodata
hello_world: .asciz "\nHello world!\n" panic_message: .asciz "\nPanic"
.equ PANIC_MESSAGE_SIZE, . - panic_message
.section .text .section .text
@ -18,21 +19,6 @@ bzero:
.Lbzero_end: .Lbzero_end:
ret 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 .type kernel_main, @function
kernel_main: kernel_main:
# Prologue. # Prologue.
@ -41,28 +27,156 @@ kernel_main:
sw s0, 24(sp) sw s0, 24(sp)
addi s0, sp, 32 addi s0, sp, 32
sw s1, 20(sp) la t0, kernel_entry
csrw stvec, t0
la s1, hello_world unimp
.Lkernel_main_if:
lw a0, (s1)
beqz a0, .Lkernel_main
call putchar
addi s1, s1, 1
j .Lkernel_main_if
.Lkernel_main: .Lkernel_main:
j .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. # Epilogue.
lw ra, 28(sp) lw ra, 28(sp)
lw s0, 24(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 ret
.section .text.boot .section .text.boot

2
run.sh
View File

@ -7,7 +7,7 @@ QEMU=qemu-system-riscv32
# Path to clang and compiler flags # Path to clang and compiler flags
CC=../riscv32-ilp32d--glibc/bin/riscv32-linux-gcc CC=../riscv32-ilp32d--glibc/bin/riscv32-linux-gcc
CFLAGS="-O2 -g3 -Wall -march=rv32im -mabi=ilp32 -fno-stack-protector -ffreestanding -nostdlib -static" CFLAGS="-O2 -g3 -Wall -march=rv32imzicsr -mabi=ilp32 -fno-stack-protector -ffreestanding -nostdlib -static"
# Build the kernel # Build the kernel
$CC $CFLAGS -T kernel.ld -Wl,-Map=kernel.map -o kernel.elf kernel.s common.s $CC $CFLAGS -T kernel.ld -Wl,-Map=kernel.map -o kernel.elf kernel.s common.s