Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 41fa29e4 authored by Leonid Yegoshin's avatar Leonid Yegoshin Committed by Ralf Baechle
Browse files

MIPS64: R6: R2 emulation bugfix



Error recovery pointers for fixups was improperly set as ".word"
which is unsuitable for MIPS64.

Replaced by STR(PTR)

[ralf@linux-mips.org: Apply changes as requested in the review process.]

Signed-off-by: default avatarLeonid Yegoshin <Leonid.Yegoshin@imgtec.com>
Reviewed-by: default avatarJames Hogan <james.hogan@imgtec.com>
Reviewed-by: default avatarMarkos Chandras <markos.chandras@imgtec.com>
Fixes: b0a668fb ("MIPS: kernel: mips-r2-to-r6-emul: Add R2 emulator for MIPS R6")
Cc: macro@linux-mips.org
Cc: linux-mips@linux-mips.org
Cc: linux-kernel@vger.kernel.org
Cc: <stable@vger.kernel.org> # 4.0+
Patchwork: https://patchwork.linux-mips.org/patch/9911/


Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
parent 8d4925e9
Loading
Loading
Loading
Loading
+53 −52
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@
#include <asm/inst.h>
#include <asm/mips-r2-to-r6-emul.h>
#include <asm/local.h>
#include <asm/mipsregs.h>
#include <asm/ptrace.h>
#include <asm/uaccess.h>

@@ -1251,10 +1252,10 @@ int mipsr2_decoder(struct pt_regs *regs, u32 inst, unsigned long *fcr31)
			"	j	10b\n"
			"	.previous\n"
			"	.section	__ex_table,\"a\"\n"
			"	.word	1b,8b\n"
			"	.word	2b,8b\n"
			"	.word	3b,8b\n"
			"	.word	4b,8b\n"
			STR(PTR) " 1b,8b\n"
			STR(PTR) " 2b,8b\n"
			STR(PTR) " 3b,8b\n"
			STR(PTR) " 4b,8b\n"
			"	.previous\n"
			"	.set	pop\n"
			: "+&r"(rt), "=&r"(rs),
@@ -1326,10 +1327,10 @@ int mipsr2_decoder(struct pt_regs *regs, u32 inst, unsigned long *fcr31)
			"	j	10b\n"
			"       .previous\n"
			"	.section	__ex_table,\"a\"\n"
			"	.word	1b,8b\n"
			"	.word	2b,8b\n"
			"	.word	3b,8b\n"
			"	.word	4b,8b\n"
			STR(PTR) " 1b,8b\n"
			STR(PTR) " 2b,8b\n"
			STR(PTR) " 3b,8b\n"
			STR(PTR) " 4b,8b\n"
			"	.previous\n"
			"	.set	pop\n"
			: "+&r"(rt), "=&r"(rs),
@@ -1397,10 +1398,10 @@ int mipsr2_decoder(struct pt_regs *regs, u32 inst, unsigned long *fcr31)
			"	j	9b\n"
			"	.previous\n"
			"	.section        __ex_table,\"a\"\n"
			"	.word	1b,8b\n"
			"	.word	2b,8b\n"
			"	.word	3b,8b\n"
			"	.word	4b,8b\n"
			STR(PTR) " 1b,8b\n"
			STR(PTR) " 2b,8b\n"
			STR(PTR) " 3b,8b\n"
			STR(PTR) " 4b,8b\n"
			"	.previous\n"
			"	.set	pop\n"
			: "+&r"(rt), "=&r"(rs),
@@ -1467,10 +1468,10 @@ int mipsr2_decoder(struct pt_regs *regs, u32 inst, unsigned long *fcr31)
			"	j	9b\n"
			"	.previous\n"
			"	.section        __ex_table,\"a\"\n"
			"	.word	1b,8b\n"
			"	.word	2b,8b\n"
			"	.word	3b,8b\n"
			"	.word	4b,8b\n"
			STR(PTR) " 1b,8b\n"
			STR(PTR) " 2b,8b\n"
			STR(PTR) " 3b,8b\n"
			STR(PTR) " 4b,8b\n"
			"	.previous\n"
			"	.set	pop\n"
			: "+&r"(rt), "=&r"(rs),
@@ -1582,14 +1583,14 @@ int mipsr2_decoder(struct pt_regs *regs, u32 inst, unsigned long *fcr31)
			"	j	9b\n"
			"	.previous\n"
			"	.section        __ex_table,\"a\"\n"
			"	.word	1b,8b\n"
			"	.word	2b,8b\n"
			"	.word	3b,8b\n"
			"	.word	4b,8b\n"
			"	.word	5b,8b\n"
			"	.word	6b,8b\n"
			"	.word	7b,8b\n"
			"	.word	0b,8b\n"
			STR(PTR) " 1b,8b\n"
			STR(PTR) " 2b,8b\n"
			STR(PTR) " 3b,8b\n"
			STR(PTR) " 4b,8b\n"
			STR(PTR) " 5b,8b\n"
			STR(PTR) " 6b,8b\n"
			STR(PTR) " 7b,8b\n"
			STR(PTR) " 0b,8b\n"
			"	.previous\n"
			"	.set	pop\n"
			: "+&r"(rt), "=&r"(rs),
@@ -1701,14 +1702,14 @@ int mipsr2_decoder(struct pt_regs *regs, u32 inst, unsigned long *fcr31)
			"	j      9b\n"
			"	.previous\n"
			"	.section        __ex_table,\"a\"\n"
			"	.word  1b,8b\n"
			"	.word  2b,8b\n"
			"	.word  3b,8b\n"
			"	.word  4b,8b\n"
			"	.word  5b,8b\n"
			"	.word  6b,8b\n"
			"	.word  7b,8b\n"
			"	.word  0b,8b\n"
			STR(PTR) " 1b,8b\n"
			STR(PTR) " 2b,8b\n"
			STR(PTR) " 3b,8b\n"
			STR(PTR) " 4b,8b\n"
			STR(PTR) " 5b,8b\n"
			STR(PTR) " 6b,8b\n"
			STR(PTR) " 7b,8b\n"
			STR(PTR) " 0b,8b\n"
			"	.previous\n"
			"	.set    pop\n"
			: "+&r"(rt), "=&r"(rs),
@@ -1820,14 +1821,14 @@ int mipsr2_decoder(struct pt_regs *regs, u32 inst, unsigned long *fcr31)
			"	j	9b\n"
			"	.previous\n"
			"	.section        __ex_table,\"a\"\n"
			"	.word	1b,8b\n"
			"	.word	2b,8b\n"
			"	.word	3b,8b\n"
			"	.word	4b,8b\n"
			"	.word	5b,8b\n"
			"	.word	6b,8b\n"
			"	.word	7b,8b\n"
			"	.word	0b,8b\n"
			STR(PTR) " 1b,8b\n"
			STR(PTR) " 2b,8b\n"
			STR(PTR) " 3b,8b\n"
			STR(PTR) " 4b,8b\n"
			STR(PTR) " 5b,8b\n"
			STR(PTR) " 6b,8b\n"
			STR(PTR) " 7b,8b\n"
			STR(PTR) " 0b,8b\n"
			"	.previous\n"
			"	.set	pop\n"
			: "+&r"(rt), "=&r"(rs),
@@ -1938,14 +1939,14 @@ int mipsr2_decoder(struct pt_regs *regs, u32 inst, unsigned long *fcr31)
			"       j	9b\n"
			"       .previous\n"
			"       .section        __ex_table,\"a\"\n"
			"       .word	1b,8b\n"
			"       .word	2b,8b\n"
			"       .word	3b,8b\n"
			"       .word	4b,8b\n"
			"       .word	5b,8b\n"
			"       .word	6b,8b\n"
			"       .word	7b,8b\n"
			"       .word	0b,8b\n"
			STR(PTR) " 1b,8b\n"
			STR(PTR) " 2b,8b\n"
			STR(PTR) " 3b,8b\n"
			STR(PTR) " 4b,8b\n"
			STR(PTR) " 5b,8b\n"
			STR(PTR) " 6b,8b\n"
			STR(PTR) " 7b,8b\n"
			STR(PTR) " 0b,8b\n"
			"       .previous\n"
			"       .set	pop\n"
			: "+&r"(rt), "=&r"(rs),
@@ -2000,7 +2001,7 @@ int mipsr2_decoder(struct pt_regs *regs, u32 inst, unsigned long *fcr31)
			"j	2b\n"
			".previous\n"
			".section        __ex_table,\"a\"\n"
			".word  1b, 3b\n"
			STR(PTR) " 1b,3b\n"
			".previous\n"
			: "=&r"(res), "+&r"(err)
			: "r"(vaddr), "i"(SIGSEGV)
@@ -2058,7 +2059,7 @@ int mipsr2_decoder(struct pt_regs *regs, u32 inst, unsigned long *fcr31)
			"j	2b\n"
			".previous\n"
			".section        __ex_table,\"a\"\n"
			".word	1b, 3b\n"
			STR(PTR) " 1b,3b\n"
			".previous\n"
			: "+&r"(res), "+&r"(err)
			: "r"(vaddr), "i"(SIGSEGV));
@@ -2119,7 +2120,7 @@ int mipsr2_decoder(struct pt_regs *regs, u32 inst, unsigned long *fcr31)
			"j	2b\n"
			".previous\n"
			".section        __ex_table,\"a\"\n"
			".word  1b, 3b\n"
			STR(PTR) " 1b,3b\n"
			".previous\n"
			: "=&r"(res), "+&r"(err)
			: "r"(vaddr), "i"(SIGSEGV)
@@ -2182,7 +2183,7 @@ int mipsr2_decoder(struct pt_regs *regs, u32 inst, unsigned long *fcr31)
			"j	2b\n"
			".previous\n"
			".section        __ex_table,\"a\"\n"
			".word	1b, 3b\n"
			STR(PTR) " 1b,3b\n"
			".previous\n"
			: "+&r"(res), "+&r"(err)
			: "r"(vaddr), "i"(SIGSEGV));