kernel/arch/riscv64/trap/
exception.rs

1use 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        /* Environment call from U-mode */
13        8 => {
14            /* Execute SystemCall */
15            match syscall_dispatcher(trapframe) {
16                Ok(ret) => {
17                    trapframe.set_return_value(ret);
18                }
19                Err(msg) => {
20                    // panic!("Syscall error: {}", msg);
21                    println!("Syscall error: {}", msg);
22                    trapframe.set_return_value(usize::MAX); // Set error code: -1
23                    trapframe.epc += 4;
24                }
25            }
26        }
27        /* Instruction page fault */
28        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        /* Load/Store page fault */
52        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}