[mips,mipsel] Fix branch emulation of branch likely instructions.

svn path=/dists/sid/linux/; revision=21375
This commit is contained in:
Aurelien Jarno 2014-06-02 09:00:38 +00:00
parent 5ce668d894
commit 013ec287e6
3 changed files with 69 additions and 0 deletions

3
debian/changelog vendored
View File

@ -92,6 +92,9 @@ linux (3.14.5-1) UNRELEASED; urgency=medium
* [arm64] Initial kernel configuration and packaging (Closes: #745349).
* [armhf] Add virtio-modules udeb.
[ Aurelien Jarno ]
* [mips,mipsel] Fix branch emulation of branch likely instructions.
-- Ben Hutchings <ben@decadent.org.uk> Wed, 21 May 2014 21:24:50 +0100
linux (3.14.4-1) unstable; urgency=high

View File

@ -0,0 +1,65 @@
From: Ralf Baechle <ralf@linux-mips.org>
Date: Thu, 22 May 2014 23:19:00 +0200
Subject: MIPS: Fix branch emulation of branch likely instructions.
Origin: https://git.kernel.org/linus/41ca86e8502952116234fa558f4277092a5aaae9
Two issues:
o For beql_op, beql_op, bne_op, bnel_op, blez_op, blezl_op, bgtz_op and
bgtzl_op the wrong field was being checked for the instruction opcode.
o For blez_op / blezl_op and bgtz_op / bgtzl_op the test was testing
for the wrong opcode.
This bug got introduced by d8d4e3ae0b5c179c0bfd3f0af5b352d13bea9cfa [MIPS
Kprobes: Refactor branch emulation].
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Acked-by: Leonid Yegoshin <Leonid.Yegoshin@imgtec.com>
Acked-by: Victor Kamensky <kamensky@cisco.com>
---
arch/mips/kernel/branch.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/arch/mips/kernel/branch.c b/arch/mips/kernel/branch.c
index 4d78bf4..76122ff 100644
--- a/arch/mips/kernel/branch.c
+++ b/arch/mips/kernel/branch.c
@@ -317,7 +317,7 @@ int __compute_return_epc_for_insn(struct pt_regs *regs,
if (regs->regs[insn.i_format.rs] ==
regs->regs[insn.i_format.rt]) {
epc = epc + 4 + (insn.i_format.simmediate << 2);
- if (insn.i_format.rt == beql_op)
+ if (insn.i_format.opcode == beql_op)
ret = BRANCH_LIKELY_TAKEN;
} else
epc += 8;
@@ -329,7 +329,7 @@ int __compute_return_epc_for_insn(struct pt_regs *regs,
if (regs->regs[insn.i_format.rs] !=
regs->regs[insn.i_format.rt]) {
epc = epc + 4 + (insn.i_format.simmediate << 2);
- if (insn.i_format.rt == bnel_op)
+ if (insn.i_format.opcode == bnel_op)
ret = BRANCH_LIKELY_TAKEN;
} else
epc += 8;
@@ -341,7 +341,7 @@ int __compute_return_epc_for_insn(struct pt_regs *regs,
/* rt field assumed to be zero */
if ((long)regs->regs[insn.i_format.rs] <= 0) {
epc = epc + 4 + (insn.i_format.simmediate << 2);
- if (insn.i_format.rt == bnel_op)
+ if (insn.i_format.opcode == blezl_op)
ret = BRANCH_LIKELY_TAKEN;
} else
epc += 8;
@@ -353,7 +353,7 @@ int __compute_return_epc_for_insn(struct pt_regs *regs,
/* rt field assumed to be zero */
if ((long)regs->regs[insn.i_format.rs] > 0) {
epc = epc + 4 + (insn.i_format.simmediate << 2);
- if (insn.i_format.rt == bnel_op)
+ if (insn.i_format.opcode == bgtzl_op)
ret = BRANCH_LIKELY_TAKEN;
} else
epc += 8;
--
2.0.0.rc0

View File

@ -88,3 +88,4 @@ debian/net-revert-lockdep-changes-in-3.14.5.patch
debian/sockdiag-avoid-abi-change-in-3.14.5.patch
debian/target-avoid-abi-change-in-3.14.5.patch
debian/netfilter-avoid-abi-change-in-3.14.5.patch
bugfix/mips/MIPS-Fix-branch-emulation-of-branch-likely-instructi.patch