mirror of
https://github.com/torvalds/linux.git
synced 2026-06-06 13:37:36 +02:00
parisc/unaligned: Fix ldw() and stw() unalignment handlers
commit a972798368 upstream.
Fix 3 bugs:
a) emulate_stw() doesn't return the error code value, so faulting
instructions are not reported and aborted.
b) Tell emulate_ldw() to handle fldw_l as floating point instruction
c) Tell emulate_ldw() to handle ldw_m as integer instruction
Signed-off-by: Helge Deller <deller@gmx.de>
Cc: stable@vger.kernel.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
397b5433f7
commit
646b532f32
|
|
@ -340,7 +340,7 @@ static int emulate_stw(struct pt_regs *regs, int frreg, int flop)
|
||||||
: "r" (val), "r" (regs->ior), "r" (regs->isr)
|
: "r" (val), "r" (regs->ior), "r" (regs->isr)
|
||||||
: "r19", "r20", "r21", "r22", "r1", FIXUP_BRANCH_CLOBBER );
|
: "r19", "r20", "r21", "r22", "r1", FIXUP_BRANCH_CLOBBER );
|
||||||
|
|
||||||
return 0;
|
return ret;
|
||||||
}
|
}
|
||||||
static int emulate_std(struct pt_regs *regs, int frreg, int flop)
|
static int emulate_std(struct pt_regs *regs, int frreg, int flop)
|
||||||
{
|
{
|
||||||
|
|
@ -619,10 +619,10 @@ void handle_unaligned(struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
case OPCODE_FLDW_L:
|
case OPCODE_FLDW_L:
|
||||||
flop=1;
|
flop=1;
|
||||||
ret = emulate_ldw(regs, R2(regs->iir),0);
|
ret = emulate_ldw(regs, R2(regs->iir), 1);
|
||||||
break;
|
break;
|
||||||
case OPCODE_LDW_M:
|
case OPCODE_LDW_M:
|
||||||
ret = emulate_ldw(regs, R2(regs->iir),1);
|
ret = emulate_ldw(regs, R2(regs->iir), 0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OPCODE_FSTW_L:
|
case OPCODE_FSTW_L:
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user