oops_end(flags, regs, sig);
 }
 
-static void set_signal_archinfo(unsigned long address,
-                               unsigned long error_code)
+static void sanitize_error_code(unsigned long address,
+                               unsigned long *error_code)
 {
-       struct task_struct *tsk = current;
-
        /*
         * To avoid leaking information about the kernel page
         * table layout, pretend that user-mode accesses to
         * information and does not appear to cause any problems.
         */
        if (address >= TASK_SIZE_MAX)
-               error_code |= X86_PF_PROT;
+               *error_code |= X86_PF_PROT;
+}
+
+static void set_signal_archinfo(unsigned long address,
+                               unsigned long error_code)
+{
+       struct task_struct *tsk = current;
 
        tsk->thread.trap_nr = X86_TRAP_PF;
        tsk->thread.error_code = error_code | X86_PF_USER;
                 * faulting through the emulate_vsyscall() logic.
                 */
                if (current->thread.sig_on_uaccess_err && signal) {
+                       sanitize_error_code(address, &error_code);
+
                        set_signal_archinfo(address, error_code);
 
                        /* XXX: hwpoison faults will set the wrong code. */
                if (is_errata100(regs, address))
                        return;
 
-               /*
-                * To avoid leaking information about the kernel page table
-                * layout, pretend that user-mode accesses to kernel addresses
-                * are always protection faults.
-                */
-               if (address >= TASK_SIZE_MAX)
-                       error_code |= X86_PF_PROT;
+               sanitize_error_code(address, &error_code);
 
                if (likely(show_unhandled_signals))
                        show_signal_msg(regs, error_code, address, tsk);
        if (is_prefetch(regs, error_code, address))
                return;
 
+       sanitize_error_code(address, &error_code);
+
        set_signal_archinfo(address, error_code);
 
 #ifdef CONFIG_MEMORY_FAILURE