X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/3d33d9c0d1894c447324d8327200c212ddad3716..bb5ae5c85c0812c52e8d53187f2c6b0ee9525c8c:/lunaix-os/arch/aarch64/fault.c diff --git a/lunaix-os/arch/aarch64/fault.c b/lunaix-os/arch/aarch64/fault.c index e551d68..29f8e97 100644 --- a/lunaix-os/arch/aarch64/fault.c +++ b/lunaix-os/arch/aarch64/fault.c @@ -1,9 +1,36 @@ #include #include +#include #include +bool +__arch_prepare_fault_context(struct fault_context* fault) +{ + struct hart_state* hs = fault->hstate; + + ptr_t ptr = read_sysreg(FAR_EL1); + if (!ptr) { + return false; + } + + fault->fault_ptep = mkptep_va(VMS_SELF, ptr); + fault->fault_data = esr_ec(hs->execp.syndrome); + fault->fault_instn = hart_pc(hs); + fault->fault_va = ptr; + + return true; +} + void handle_mm_abort(struct hart_state* state) { - // TODO + struct fault_context fault; + + __arch_prepare_fault_context(&fault); + + if (!handle_page_fault(&fault)) { + fault_resolving_failed(&fault); + } + + return; } \ No newline at end of file