Call fixup_sgx_enclu_exception() in the SIGSEGV and SIGBUS paths of
the page fault handler immediately prior to signaling.  If the fault
is fixed, return cleanly and do not generate a signal.

In the SIGSEGV flow, make sure the error code passed to userspace has
been sanitized.

Cc: Andy Lutomirski <[email protected]>
Cc: Jarkko Sakkinen <[email protected]>
Cc: Dave Hansen <[email protected]>
Cc: Josh Triplett <[email protected]>
Signed-off-by: Sean Christopherson <[email protected]>
---
 arch/x86/mm/fault.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c
index 7e8a7558ca07..d3903965334c 100644
--- a/arch/x86/mm/fault.c
+++ b/arch/x86/mm/fault.c
@@ -28,6 +28,7 @@
 #include <asm/mmu_context.h>           /* vma_pkey()                   */
 #include <asm/efi.h>                   /* efi_recover_from_page_fault()*/
 #include <asm/desc.h>                  /* store_idt(), ...             */
+#include <asm/sgx.h>                   /* fixup_sgx_enclu_exception()  */
 
 #define CREATE_TRACE_POINTS
 #include <asm/trace/exceptions.h>
@@ -928,6 +929,9 @@ __bad_area_nosemaphore(struct pt_regs *regs, unsigned long 
error_code,
                if (address >= TASK_SIZE_MAX)
                        error_code |= X86_PF_PROT;
 
+               if (fixup_sgx_enclu_exception(regs, X86_TRAP_PF, error_code, 
address))
+                       return;
+
                if (likely(show_unhandled_signals))
                        show_signal_msg(regs, error_code, address, tsk);
 
@@ -1045,6 +1049,9 @@ do_sigbus(struct pt_regs *regs, unsigned long error_code, 
unsigned long address,
        if (is_prefetch(regs, error_code, address))
                return;
 
+       if (fixup_sgx_enclu_exception(regs, X86_TRAP_PF, error_code, address))
+               return;
+
        set_signal_archinfo(address, error_code);
 
 #ifdef CONFIG_MEMORY_FAILURE
-- 
2.19.2

Reply via email to