#define __LUNAIX_FAULT_H
#include <lunaix/mm/mm.h>
-#include <lunaix/pcontext.h>
+#include <lunaix/mm/page.h>
#include <lunaix/mm/procvm.h>
+#include <lunaix/hart_state.h>
#define RESOLVE_OK ( 0b000001 )
#define NO_PREALLOC ( 0b000010 )
struct fault_context
{
- isr_param* ictx;
+ struct hart_state* hstate;
struct
{
ptr_t fault_refva; // referneced va, for ptep fault, equals to fault_va otherwise
pte_t resolving; // the pte that will resolve the fault
- ptr_t prealloc_pa; // preallocated physical page in-case of empty fault-pte
+ struct leaflet* prealloc; // preallocated physical page in-case of empty fault-pte
- bool kernel_vmfault:1; // faulting address that is kernel
- bool ptep_fault:1; // faulting address is a ptep
- bool remote_fault:1; // referenced faulting address is remote vms
- bool kernel_access:1; // kernel mem access causing the fault
+ struct
+ {
+ bool kernel_vmfault:1; // faulting address that is kernel
+ bool ptep_fault:1; // faulting address is a ptep
+ bool remote_fault:1; // referenced faulting address is remote vms
+ bool kernel_access:1; // kernel mem access causing the fault
+ };
struct proc_mm* mm; // process memory space associated with fault, might be remote
struct mm_region* vmr;
int resolve_type;
};
-bool
-__arch_prepare_fault_context(struct fault_context* context);
-
static inline void
-fault_resolved(struct fault_context* fault, pte_t resolved, int flags)
+fault_resolved(struct fault_context* fault, int flags)
{
- fault->resolving = resolved;
fault->resolve_type |= (flags | RESOLVE_OK);
}
+
+bool
+handle_page_fault(struct fault_context* fault);
+
+void noret
+fault_resolving_failed(struct fault_context* fault);
+
#endif /* __LUNAIX_FAULT_H */