aa64: finalise context switch, page fault handler and syscall
[lunaix-os.git] / lunaix-os / arch / aarch64 / fault.c
1 #include <lunaix/mm/fault.h>
2 #include <asm/aa64_exception.h>
3 #include <asm/aa64_msrs.h>
4 #include <asm/hart.h>
5
6 bool
7 __arch_prepare_fault_context(struct fault_context* fault)
8 {
9     struct hart_state* hs = fault->hstate;
10
11     ptr_t ptr = read_sysreg(FAR_EL1);
12     if (!ptr) {
13         return false;
14     }
15
16     fault->fault_ptep  = mkptep_va(VMS_SELF, ptr);
17     fault->fault_data  = esr_ec(hs->execp.syndrome);
18     fault->fault_instn = hart_pc(hs);
19     fault->fault_va    = ptr;
20
21     return true;
22 }
23
24 void 
25 handle_mm_abort(struct hart_state* state)
26 {
27     struct fault_context fault;
28
29     __arch_prepare_fault_context(&fault);
30
31     if (!handle_page_fault(&fault)) {
32         fault_resolving_failed(&fault);
33     }
34
35     return;
36 }