Skip to content

Commit 0112db0

Browse files
Leonid Yegoshingregkh
authored andcommitted
MIPS: R2-on-R6 MULTU/MADDU/MSUBU emulation bugfix
commit d65e5677ad5b3a49c43f60ec07644dc1f87bbd2e upstream. MIPS instructions MULTU, MADDU and MSUBU emulation requires registers HI/LO to be converted to signed 32bits before 64bit sign extension on MIPS64. Bug was found on running MIPS32 R2 test application on MIPS64 R6 kernel. Fixes: b0a668f ("MIPS: kernel: mips-r2-to-r6-emul: Add R2 emulator for MIPS R6") Signed-off-by: Leonid Yegoshin <Leonid.Yegoshin@imgtec.com> Reported-by: Nikola.Veljkovic@imgtec.com Cc: paul.burton@imgtec.com Cc: yamada.masahiro@socionext.com Cc: akpm@linux-foundation.org Cc: andrea.gelmini@gelma.net Cc: macro@imgtec.com Cc: linux-mips@linux-mips.org Patchwork: https://patchwork.linux-mips.org/patch/14043/ Signed-off-by: Ralf Baechle <ralf@linux-mips.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 304b692 commit 0112db0

1 file changed

Lines changed: 6 additions & 6 deletions

File tree

arch/mips/kernel/mips-r2-to-r6-emul.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -434,8 +434,8 @@ static int multu_func(struct pt_regs *regs, u32 ir)
434434
rs = regs->regs[MIPSInst_RS(ir)];
435435
res = (u64)rt * (u64)rs;
436436
rt = res;
437-
regs->lo = (s64)rt;
438-
regs->hi = (s64)(res >> 32);
437+
regs->lo = (s64)(s32)rt;
438+
regs->hi = (s64)(s32)(res >> 32);
439439

440440
MIPS_R2_STATS(muls);
441441

@@ -671,9 +671,9 @@ static int maddu_func(struct pt_regs *regs, u32 ir)
671671
res += ((((s64)rt) << 32) | (u32)rs);
672672

673673
rt = res;
674-
regs->lo = (s64)rt;
674+
regs->lo = (s64)(s32)rt;
675675
rs = res >> 32;
676-
regs->hi = (s64)rs;
676+
regs->hi = (s64)(s32)rs;
677677

678678
MIPS_R2_STATS(dsps);
679679

@@ -729,9 +729,9 @@ static int msubu_func(struct pt_regs *regs, u32 ir)
729729
res = ((((s64)rt) << 32) | (u32)rs) - res;
730730

731731
rt = res;
732-
regs->lo = (s64)rt;
732+
regs->lo = (s64)(s32)rt;
733733
rs = res >> 32;
734-
regs->hi = (s64)rs;
734+
regs->hi = (s64)(s32)rs;
735735

736736
MIPS_R2_STATS(dsps);
737737

0 commit comments

Comments
 (0)