starry/
mm.rs

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}