kernel/arch/riscv64/trap/
exception.rs1use core::arch::asm;
2use core::panic;
3
4use crate::abi::syscall_dispatcher;
5use crate::arch::trap::print_traplog;
6use crate::arch::Trapframe;
7use crate::println;
8use crate::sched::scheduler::get_scheduler;
9
10pub fn arch_exception_handler(trapframe: &mut Trapframe, cause: usize) {
11 match cause {
12 8 => {
14 match syscall_dispatcher(trapframe) {
16 Ok(ret) => {
17 trapframe.set_return_value(ret);
18 }
19 Err(msg) => {
20 println!("Syscall error: {}", msg);
22 trapframe.set_return_value(usize::MAX); trapframe.epc += 4;
24 }
25 }
26 }
27 12 => {
29 let vaddr = trapframe.epc as usize;
30 let task = get_scheduler().get_current_task(trapframe.get_cpuid()).unwrap();
31 let manager = &task.vm_manager;
32 match manager.search_memory_map(vaddr) {
33 Some(mmap) => {
34 match manager.get_root_page_table() {
35 Some(root_page_table) => {
36 let paddr = mmap.get_paddr(vaddr).unwrap();
37 root_page_table.map(vaddr, paddr, mmap.permissions);
38 }
39 None => {
40 print_traplog(trapframe);
41 panic!("Root page table is not found");
42 }
43 }
44 }
45 None => {
46 print_traplog(trapframe);
47 panic!("Not found memory map matched with vaddr: {:#x}", vaddr);
48 }
49 }
50 }
51 13 | 15 => {
53 let vaddr;
54 unsafe {
55 asm!("csrr {}, stval", out(reg) vaddr);
56 }
57 let task = get_scheduler().get_current_task(trapframe.get_cpuid()).unwrap();
58 let manager = &task.vm_manager;
59 match manager.search_memory_map(vaddr) {
60 Some(mmap) => {
61 match manager.get_root_page_table() {
62 Some(root_page_table) => {
63 let paddr = mmap.get_paddr(vaddr).unwrap();
64 root_page_table.map(vaddr, paddr, mmap.permissions);
65 }
66 None => {
67 print_traplog(trapframe);
68 panic!("Root page table is not found");
69 }
70 }
71 }
72 None => {
73 print_traplog(trapframe);
74 panic!("Not found memory map matched with vaddr: {:#x}", vaddr);
75 }
76 }
77 },
78 _ => {
79 print_traplog(trapframe);
80 panic!("Unhandled exception: {}", cause);
81
82 }
83 }
84}