X-Git-Url: https://gerrit.opnfv.org/gerrit/gitweb?a=blobdiff_plain;f=kernel%2Farch%2Fparisc%2Fkernel%2Funaligned.c;fp=kernel%2Farch%2Fparisc%2Fkernel%2Funaligned.c;h=8d49614d600d88907b19bbbdfaefc979687cd278;hb=52f993b8e89487ec9ee15a7fb4979e0f09a45b27;hp=d7c0acb35ec248c51329a5cb4594189bd5f5040f;hpb=c189ccac5702322ed843fe17057035b7222a59b6;p=kvmfornfv.git diff --git a/kernel/arch/parisc/kernel/unaligned.c b/kernel/arch/parisc/kernel/unaligned.c index d7c0acb35..8d49614d6 100644 --- a/kernel/arch/parisc/kernel/unaligned.c +++ b/kernel/arch/parisc/kernel/unaligned.c @@ -666,7 +666,7 @@ void handle_unaligned(struct pt_regs *regs) break; } - if (modify && R1(regs->iir)) + if (ret == 0 && modify && R1(regs->iir)) regs->gr[R1(regs->iir)] = newbase; @@ -677,6 +677,14 @@ void handle_unaligned(struct pt_regs *regs) if (ret) { + /* + * The unaligned handler failed. + * If we were called by __get_user() or __put_user() jump + * to it's exception fixup handler instead of crashing. + */ + if (!user_mode(regs) && fixup_exception(regs)) + return; + printk(KERN_CRIT "Unaligned handler failed, ret = %d\n", ret); die_if_kernel("Unaligned data reference", regs, 28);