Commit 7f18f151 authored by Ralf Baechle's avatar Ralf Baechle

[MIPS] Fix build warning in unaligned load/store emulator.

Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
parent c3dd8cdf
...@@ -101,16 +101,14 @@ static u32 unaligned_action; ...@@ -101,16 +101,14 @@ static u32 unaligned_action;
#endif #endif
extern void show_registers(struct pt_regs *regs); extern void show_registers(struct pt_regs *regs);
static inline int emulate_load_store_insn(struct pt_regs *regs, static void emulate_load_store_insn(struct pt_regs *regs,
void __user *addr, unsigned int __user *pc, void __user *addr, unsigned int __user *pc)
unsigned long **regptr, unsigned long *newvalue)
{ {
union mips_instruction insn; union mips_instruction insn;
unsigned long value; unsigned long value;
unsigned int res; unsigned int res;
regs->regs[0] = 0; regs->regs[0] = 0;
*regptr=NULL;
/* /*
* This load never faults. * This load never faults.
...@@ -179,8 +177,8 @@ static inline int emulate_load_store_insn(struct pt_regs *regs, ...@@ -179,8 +177,8 @@ static inline int emulate_load_store_insn(struct pt_regs *regs,
: "r" (addr), "i" (-EFAULT)); : "r" (addr), "i" (-EFAULT));
if (res) if (res)
goto fault; goto fault;
*newvalue = value; compute_return_epc(regs);
*regptr = &regs->regs[insn.i_format.rt]; regs->regs[insn.i_format.rt] = value;
break; break;
case lw_op: case lw_op:
...@@ -209,8 +207,8 @@ static inline int emulate_load_store_insn(struct pt_regs *regs, ...@@ -209,8 +207,8 @@ static inline int emulate_load_store_insn(struct pt_regs *regs,
: "r" (addr), "i" (-EFAULT)); : "r" (addr), "i" (-EFAULT));
if (res) if (res)
goto fault; goto fault;
*newvalue = value; compute_return_epc(regs);
*regptr = &regs->regs[insn.i_format.rt]; regs->regs[insn.i_format.rt] = value;
break; break;
case lhu_op: case lhu_op:
...@@ -243,8 +241,8 @@ static inline int emulate_load_store_insn(struct pt_regs *regs, ...@@ -243,8 +241,8 @@ static inline int emulate_load_store_insn(struct pt_regs *regs,
: "r" (addr), "i" (-EFAULT)); : "r" (addr), "i" (-EFAULT));
if (res) if (res)
goto fault; goto fault;
*newvalue = value; compute_return_epc(regs);
*regptr = &regs->regs[insn.i_format.rt]; regs->regs[insn.i_format.rt] = value;
break; break;
case lwu_op: case lwu_op:
...@@ -283,8 +281,8 @@ static inline int emulate_load_store_insn(struct pt_regs *regs, ...@@ -283,8 +281,8 @@ static inline int emulate_load_store_insn(struct pt_regs *regs,
: "r" (addr), "i" (-EFAULT)); : "r" (addr), "i" (-EFAULT));
if (res) if (res)
goto fault; goto fault;
*newvalue = value; compute_return_epc(regs);
*regptr = &regs->regs[insn.i_format.rt]; regs->regs[insn.i_format.rt] = value;
break; break;
#endif /* CONFIG_64BIT */ #endif /* CONFIG_64BIT */
...@@ -325,8 +323,8 @@ static inline int emulate_load_store_insn(struct pt_regs *regs, ...@@ -325,8 +323,8 @@ static inline int emulate_load_store_insn(struct pt_regs *regs,
: "r" (addr), "i" (-EFAULT)); : "r" (addr), "i" (-EFAULT));
if (res) if (res)
goto fault; goto fault;
*newvalue = value; compute_return_epc(regs);
*regptr = &regs->regs[insn.i_format.rt]; regs->regs[insn.i_format.rt] = value;
break; break;
#endif /* CONFIG_64BIT */ #endif /* CONFIG_64BIT */
...@@ -367,6 +365,7 @@ static inline int emulate_load_store_insn(struct pt_regs *regs, ...@@ -367,6 +365,7 @@ static inline int emulate_load_store_insn(struct pt_regs *regs,
: "r" (value), "r" (addr), "i" (-EFAULT)); : "r" (value), "r" (addr), "i" (-EFAULT));
if (res) if (res)
goto fault; goto fault;
compute_return_epc(regs);
break; break;
case sw_op: case sw_op:
...@@ -397,6 +396,7 @@ static inline int emulate_load_store_insn(struct pt_regs *regs, ...@@ -397,6 +396,7 @@ static inline int emulate_load_store_insn(struct pt_regs *regs,
: "r" (value), "r" (addr), "i" (-EFAULT)); : "r" (value), "r" (addr), "i" (-EFAULT));
if (res) if (res)
goto fault; goto fault;
compute_return_epc(regs);
break; break;
case sd_op: case sd_op:
...@@ -435,6 +435,7 @@ static inline int emulate_load_store_insn(struct pt_regs *regs, ...@@ -435,6 +435,7 @@ static inline int emulate_load_store_insn(struct pt_regs *regs,
: "r" (value), "r" (addr), "i" (-EFAULT)); : "r" (value), "r" (addr), "i" (-EFAULT));
if (res) if (res)
goto fault; goto fault;
compute_return_epc(regs);
break; break;
#endif /* CONFIG_64BIT */ #endif /* CONFIG_64BIT */
...@@ -473,34 +474,31 @@ static inline int emulate_load_store_insn(struct pt_regs *regs, ...@@ -473,34 +474,31 @@ static inline int emulate_load_store_insn(struct pt_regs *regs,
unaligned_instructions++; unaligned_instructions++;
#endif #endif
return 0; return;
fault: fault:
/* Did we have an exception handler installed? */ /* Did we have an exception handler installed? */
if (fixup_exception(regs)) if (fixup_exception(regs))
return 1; return;
die_if_kernel ("Unhandled kernel unaligned access", regs); die_if_kernel ("Unhandled kernel unaligned access", regs);
send_sig(SIGSEGV, current, 1); send_sig(SIGSEGV, current, 1);
return 0; return;
sigbus: sigbus:
die_if_kernel("Unhandled kernel unaligned access", regs); die_if_kernel("Unhandled kernel unaligned access", regs);
send_sig(SIGBUS, current, 1); send_sig(SIGBUS, current, 1);
return 0; return;
sigill: sigill:
die_if_kernel("Unhandled kernel unaligned access or invalid instruction", regs); die_if_kernel("Unhandled kernel unaligned access or invalid instruction", regs);
send_sig(SIGILL, current, 1); send_sig(SIGILL, current, 1);
return 0;
} }
asmlinkage void do_ade(struct pt_regs *regs) asmlinkage void do_ade(struct pt_regs *regs)
{ {
unsigned long *regptr, newval;
extern int do_dsemulret(struct pt_regs *); extern int do_dsemulret(struct pt_regs *);
unsigned int __user *pc; unsigned int __user *pc;
mm_segment_t seg; mm_segment_t seg;
...@@ -538,16 +536,7 @@ asmlinkage void do_ade(struct pt_regs *regs) ...@@ -538,16 +536,7 @@ asmlinkage void do_ade(struct pt_regs *regs)
seg = get_fs(); seg = get_fs();
if (!user_mode(regs)) if (!user_mode(regs))
set_fs(KERNEL_DS); set_fs(KERNEL_DS);
if (!emulate_load_store_insn(regs, (void __user *)regs->cp0_badvaddr, pc, emulate_load_store_insn(regs, (void __user *)regs->cp0_badvaddr, pc);
&regptr, &newval)) {
compute_return_epc(regs);
/*
* Now that branch is evaluated, update the dest
* register if necessary
*/
if (regptr)
*regptr = newval;
}
set_fs(seg); set_fs(seg);
return; return;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment