1use axhal::{
2 mem::VirtAddr,
3 paging::MappingFlags,
4 trap::{PAGE_FAULT, register_trap_handler},
5};
6use axtask::{TaskExtRef, current};
7use linux_raw_sys::general::SIGSEGV;
8use starry_api::do_exit;
9use starry_core::mm::is_accessing_user_memory;
10
11#[register_trap_handler(PAGE_FAULT)]
12fn handle_page_fault(vaddr: VirtAddr, access_flags: MappingFlags, is_user: bool) -> bool {
13 warn!(
14 "Page fault at {:#x}, access_flags: {:#x?}",
15 vaddr, access_flags
16 );
17 if !is_user && !is_accessing_user_memory() {
18 return false;
19 }
20
21 let curr = current();
22 if !curr
23 .task_ext()
24 .process_data()
25 .aspace
26 .lock()
27 .handle_page_fault(vaddr, access_flags)
28 {
29 warn!(
30 "{} ({:?}): segmentation fault at {:#x}, exit!",
31 curr.id_name(),
32 curr.task_ext().thread,
33 vaddr
34 );
35 do_exit(SIGSEGV as _, true);
36 }
37 true
38}