Add exception handling
This commit is contained in:
83
common.s
83
common.s
@ -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
172
kernel.s
@ -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
2
run.sh
@ -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
|
||||||
|
Reference in New Issue
Block a user