在riscv上实现异常处理,能够进入异常处理程序 (#564)

This commit is contained in:
LoGin
2024-03-08 23:23:06 +08:00
committed by GitHub
parent c3dc6f2ff9
commit 5c4224e5a8
17 changed files with 701 additions and 80 deletions

View File

@ -0,0 +1,172 @@
use core::hint::spin_loop;
use system_error::SystemError;
use crate::{kdebug, kerror};
use super::TrapFrame;
type ExceptionHandler = fn(&mut TrapFrame) -> Result<(), SystemError>;
static EXCEPTION_HANDLERS: [ExceptionHandler; 16] = [
do_trap_insn_misaligned, // 0
do_trap_insn_access_fault, // 1
do_trap_insn_illegal, // 2
do_trap_break, // 3
do_trap_load_misaligned, // 4
do_trap_load_access_fault, // 5
do_trap_store_misaligned, // 6
do_trap_store_access_fault, // 7
do_trap_user_env_call, // 8
default_handler, // 9
default_handler, // 10
default_handler, // 11
do_trap_insn_page_fault, // 12
do_trap_load_page_fault, // 13
default_handler, // 14
do_trap_store_page_fault, // 15
];
#[no_mangle]
unsafe extern "C" fn riscv64_do_irq(trap_frame: &mut TrapFrame) {
if trap_frame.cause.is_interrupt() {
riscv64_do_interrupt(trap_frame);
} else if trap_frame.cause.is_exception() {
riscv64_do_exception(trap_frame);
}
}
/// 处理中断
fn riscv64_do_interrupt(_trap_frame: &mut TrapFrame) {
kdebug!("todo: riscv64_do_irq: interrupt");
loop {
spin_loop();
}
}
/// 处理异常
fn riscv64_do_exception(trap_frame: &mut TrapFrame) {
kdebug!(
"riscv64_do_exception: from_user: {}",
trap_frame.from_user()
);
let code = trap_frame.cause.code();
if code < EXCEPTION_HANDLERS.len() {
let handler = EXCEPTION_HANDLERS[code];
handler(trap_frame).ok();
} else {
kerror!("riscv64_do_irq: exception code out of range");
loop {
// kernel die
spin_loop();
}
};
}
fn default_handler(_trap_frame: &mut TrapFrame) -> Result<(), SystemError> {
kerror!("riscv64_do_irq: handler not found");
loop {
spin_loop();
}
}
/// 处理指令地址不对齐异常 #0
fn do_trap_insn_misaligned(_trap_frame: &mut TrapFrame) -> Result<(), SystemError> {
kerror!("riscv64_do_irq: do_trap_insn_misaligned");
loop {
spin_loop();
}
}
/// 处理指令访问异常 #1
fn do_trap_insn_access_fault(_trap_frame: &mut TrapFrame) -> Result<(), SystemError> {
kerror!("riscv64_do_irq: do_trap_insn_access_fault");
loop {
spin_loop();
}
}
/// 处理非法指令异常 #2
fn do_trap_insn_illegal(_trap_frame: &mut TrapFrame) -> Result<(), SystemError> {
kerror!("riscv64_do_irq: do_trap_insn_illegal");
loop {
spin_loop();
}
}
/// 处理断点异常 #3
fn do_trap_break(_trap_frame: &mut TrapFrame) -> Result<(), SystemError> {
kerror!("riscv64_do_irq: do_trap_break");
loop {
spin_loop();
}
}
/// 处理加载地址不对齐异常 #4
fn do_trap_load_misaligned(_trap_frame: &mut TrapFrame) -> Result<(), SystemError> {
kerror!("riscv64_do_irq: do_trap_load_misaligned");
loop {
spin_loop();
}
}
/// 处理加载访问异常 #5
fn do_trap_load_access_fault(_trap_frame: &mut TrapFrame) -> Result<(), SystemError> {
kerror!("riscv64_do_irq: do_trap_load_access_fault");
loop {
spin_loop();
}
}
/// 处理存储地址不对齐异常 #6
fn do_trap_store_misaligned(_trap_frame: &mut TrapFrame) -> Result<(), SystemError> {
kerror!("riscv64_do_irq: do_trap_store_misaligned");
loop {
spin_loop();
}
}
/// 处理存储访问异常 #7
fn do_trap_store_access_fault(_trap_frame: &mut TrapFrame) -> Result<(), SystemError> {
kerror!("riscv64_do_irq: do_trap_store_access_fault");
loop {
spin_loop();
}
}
/// 处理环境调用异常 #8
fn do_trap_user_env_call(_trap_frame: &mut TrapFrame) -> Result<(), SystemError> {
kerror!("riscv64_do_irq: do_trap_user_env_call");
loop {
spin_loop();
}
}
// 9-11 reserved
/// 处理指令页错误异常 #12
fn do_trap_insn_page_fault(_trap_frame: &mut TrapFrame) -> Result<(), SystemError> {
kerror!("riscv64_do_irq: do_insn_page_fault");
loop {
spin_loop();
}
}
/// 处理页加载错误异常 #13
fn do_trap_load_page_fault(_trap_frame: &mut TrapFrame) -> Result<(), SystemError> {
kerror!("riscv64_do_irq: do_trap_load_page_fault");
loop {
spin_loop();
}
}
// 14 reserved
/// 处理页存储错误异常 #15
fn do_trap_store_page_fault(_trap_frame: &mut TrapFrame) -> Result<(), SystemError> {
kerror!("riscv64_do_irq: do_trap_store_page_fault");
loop {
spin_loop();
}
}