@@ -826,44 +826,49 @@ __bad_area_nosemaphore(struct pt_regs *regs, unsigned long error_code,
826
826
{
827
827
struct task_struct * tsk = current ;
828
828
829
- /* User mode accesses just cause a SIGSEGV */
830
- if (user_mode (regs ) && (error_code & X86_PF_USER )) {
831
- /*
832
- * It's possible to have interrupts off here:
833
- */
834
- local_irq_enable ();
829
+ if (!user_mode (regs )) {
830
+ no_context (regs , error_code , address , pkey , si_code );
831
+ return ;
832
+ }
835
833
836
- /*
837
- * Valid to do another page fault here because this one came
838
- * from user space:
839
- */
840
- if (is_prefetch (regs , error_code , address ))
841
- return ;
834
+ if (!(error_code & X86_PF_USER )) {
835
+ /* Implicit user access to kernel memory -- just oops */
836
+ page_fault_oops (regs , error_code , address );
837
+ return ;
838
+ }
842
839
843
- if (is_errata100 (regs , address ))
844
- return ;
840
+ /*
841
+ * User mode accesses just cause a SIGSEGV.
842
+ * It's possible to have interrupts off here:
843
+ */
844
+ local_irq_enable ();
845
845
846
- sanitize_error_code (address , & error_code );
846
+ /*
847
+ * Valid to do another page fault here because this one came
848
+ * from user space:
849
+ */
850
+ if (is_prefetch (regs , error_code , address ))
851
+ return ;
847
852
848
- if (fixup_vdso_exception (regs , X86_TRAP_PF , error_code , address ))
849
- return ;
853
+ if (is_errata100 (regs , address ))
854
+ return ;
850
855
851
- if (likely (show_unhandled_signals ))
852
- show_signal_msg (regs , error_code , address , tsk );
856
+ sanitize_error_code (address , & error_code );
853
857
854
- set_signal_archinfo (address , error_code );
858
+ if (fixup_vdso_exception (regs , X86_TRAP_PF , error_code , address ))
859
+ return ;
855
860
856
- if (si_code == SEGV_PKUERR )
857
- force_sig_pkuerr (( void __user * ) address , pkey );
861
+ if (likely ( show_unhandled_signals ) )
862
+ show_signal_msg ( regs , error_code , address , tsk );
858
863
859
- force_sig_fault ( SIGSEGV , si_code , ( void __user * ) address );
864
+ set_signal_archinfo ( address , error_code );
860
865
861
- local_irq_disable ();
866
+ if (si_code == SEGV_PKUERR )
867
+ force_sig_pkuerr ((void __user * )address , pkey );
862
868
863
- return ;
864
- }
869
+ force_sig_fault (SIGSEGV , si_code , (void __user * )address );
865
870
866
- no_context ( regs , error_code , address , SIGSEGV , si_code );
871
+ local_irq_disable ( );
867
872
}
868
873
869
874
static noinline void
0 commit comments