diff options
Diffstat (limited to 'arch')
-rw-r--r-- | arch/powerpc/kernel/align.c | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/arch/powerpc/kernel/align.c b/arch/powerpc/kernel/align.c index ee5b690a0bed..52e5758ea368 100644 --- a/arch/powerpc/kernel/align.c +++ b/arch/powerpc/kernel/align.c | |||
@@ -764,6 +764,16 @@ int fix_alignment(struct pt_regs *regs) | |||
764 | nb = aligninfo[instr].len; | 764 | nb = aligninfo[instr].len; |
765 | flags = aligninfo[instr].flags; | 765 | flags = aligninfo[instr].flags; |
766 | 766 | ||
767 | /* ldbrx/stdbrx overlap lfs/stfs in the DSISR unfortunately */ | ||
768 | if (IS_XFORM(instruction) && ((instruction >> 1) & 0x3ff) == 532) { | ||
769 | nb = 8; | ||
770 | flags = LD+SW; | ||
771 | } else if (IS_XFORM(instruction) && | ||
772 | ((instruction >> 1) & 0x3ff) == 660) { | ||
773 | nb = 8; | ||
774 | flags = ST+SW; | ||
775 | } | ||
776 | |||
767 | /* Byteswap little endian loads and stores */ | 777 | /* Byteswap little endian loads and stores */ |
768 | swiz = 0; | 778 | swiz = 0; |
769 | if (regs->msr & MSR_LE) { | 779 | if (regs->msr & MSR_LE) { |