|
@@ -451,6 +451,7 @@ int __handle_fault(unsigned long uaddr, unsigned long pgm_int_code, int write)
|
|
|
struct pt_regs regs;
|
|
|
int access, fault;
|
|
|
|
|
|
+ /* Emulate a uaccess fault from kernel mode. */
|
|
|
regs.psw.mask = psw_kernel_bits | PSW_MASK_DAT | PSW_MASK_MCHECK;
|
|
|
if (!irqs_disabled())
|
|
|
regs.psw.mask |= PSW_MASK_IO | PSW_MASK_EXT;
|
|
@@ -460,12 +461,12 @@ int __handle_fault(unsigned long uaddr, unsigned long pgm_int_code, int write)
|
|
|
regs.int_parm_long = (uaddr & PAGE_MASK) | 2;
|
|
|
access = write ? VM_WRITE : VM_READ;
|
|
|
fault = do_exception(®s, access);
|
|
|
- if (unlikely(fault)) {
|
|
|
- if (fault & VM_FAULT_OOM)
|
|
|
- return -EFAULT;
|
|
|
- else if (fault & VM_FAULT_SIGBUS)
|
|
|
- do_sigbus(®s);
|
|
|
- }
|
|
|
+ /*
|
|
|
+ * Since the fault happened in kernel mode while performing a uaccess
|
|
|
+ * all we need to do now is emulating a fixup in case "fault" is not
|
|
|
+ * zero.
|
|
|
+ * For the calling uaccess functions this results always in -EFAULT.
|
|
|
+ */
|
|
|
return fault ? -EFAULT : 0;
|
|
|
}
|
|
|
|