diff options
author | Ralf Baechle <ralf@linux-mips.org> | 2007-07-29 04:16:19 -0400 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 2007-07-31 16:35:30 -0400 |
commit | 7f18f151f474b11c0fb7f1c9b7bb59b6d04a6fc2 (patch) | |
tree | 013335bdff51adbb317d31b3ff233e0f6ff34621 /arch/mips/kernel/unaligned.c | |
parent | c3dd8cdf8563ac46b27b0cacfda5e7e6b18c4a46 (diff) |
[MIPS] Fix build warning in unaligned load/store emulator.
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Diffstat (limited to 'arch/mips/kernel/unaligned.c')
-rw-r--r-- | arch/mips/kernel/unaligned.c | 51 |
1 files changed, 20 insertions, 31 deletions
diff --git a/arch/mips/kernel/unaligned.c b/arch/mips/kernel/unaligned.c index 5565b89b98e6..d34b1fb3665d 100644 --- a/arch/mips/kernel/unaligned.c +++ b/arch/mips/kernel/unaligned.c | |||
@@ -101,16 +101,14 @@ static u32 unaligned_action; | |||
101 | #endif | 101 | #endif |
102 | extern void show_registers(struct pt_regs *regs); | 102 | extern void show_registers(struct pt_regs *regs); |
103 | 103 | ||
104 | static inline int emulate_load_store_insn(struct pt_regs *regs, | 104 | static void emulate_load_store_insn(struct pt_regs *regs, |
105 | void __user *addr, unsigned int __user *pc, | 105 | void __user *addr, unsigned int __user *pc) |
106 | unsigned long **regptr, unsigned long *newvalue) | ||
107 | { | 106 | { |
108 | union mips_instruction insn; | 107 | union mips_instruction insn; |
109 | unsigned long value; | 108 | unsigned long value; |
110 | unsigned int res; | 109 | unsigned int res; |
111 | 110 | ||
112 | regs->regs[0] = 0; | 111 | regs->regs[0] = 0; |
113 | *regptr=NULL; | ||
114 | 112 | ||
115 | /* | 113 | /* |
116 | * This load never faults. | 114 | * This load never faults. |
@@ -179,8 +177,8 @@ static inline int emulate_load_store_insn(struct pt_regs *regs, | |||
179 | : "r" (addr), "i" (-EFAULT)); | 177 | : "r" (addr), "i" (-EFAULT)); |
180 | if (res) | 178 | if (res) |
181 | goto fault; | 179 | goto fault; |
182 | *newvalue = value; | 180 | compute_return_epc(regs); |
183 | *regptr = ®s->regs[insn.i_format.rt]; | 181 | regs->regs[insn.i_format.rt] = value; |
184 | break; | 182 | break; |
185 | 183 | ||
186 | case lw_op: | 184 | case lw_op: |
@@ -209,8 +207,8 @@ static inline int emulate_load_store_insn(struct pt_regs *regs, | |||
209 | : "r" (addr), "i" (-EFAULT)); | 207 | : "r" (addr), "i" (-EFAULT)); |
210 | if (res) | 208 | if (res) |
211 | goto fault; | 209 | goto fault; |
212 | *newvalue = value; | 210 | compute_return_epc(regs); |
213 | *regptr = ®s->regs[insn.i_format.rt]; | 211 | regs->regs[insn.i_format.rt] = value; |
214 | break; | 212 | break; |
215 | 213 | ||
216 | case lhu_op: | 214 | case lhu_op: |
@@ -243,8 +241,8 @@ static inline int emulate_load_store_insn(struct pt_regs *regs, | |||
243 | : "r" (addr), "i" (-EFAULT)); | 241 | : "r" (addr), "i" (-EFAULT)); |
244 | if (res) | 242 | if (res) |
245 | goto fault; | 243 | goto fault; |
246 | *newvalue = value; | 244 | compute_return_epc(regs); |
247 | *regptr = ®s->regs[insn.i_format.rt]; | 245 | regs->regs[insn.i_format.rt] = value; |
248 | break; | 246 | break; |
249 | 247 | ||
250 | case lwu_op: | 248 | case lwu_op: |
@@ -283,8 +281,8 @@ static inline int emulate_load_store_insn(struct pt_regs *regs, | |||
283 | : "r" (addr), "i" (-EFAULT)); | 281 | : "r" (addr), "i" (-EFAULT)); |
284 | if (res) | 282 | if (res) |
285 | goto fault; | 283 | goto fault; |
286 | *newvalue = value; | 284 | compute_return_epc(regs); |
287 | *regptr = ®s->regs[insn.i_format.rt]; | 285 | regs->regs[insn.i_format.rt] = value; |
288 | break; | 286 | break; |
289 | #endif /* CONFIG_64BIT */ | 287 | #endif /* CONFIG_64BIT */ |
290 | 288 | ||
@@ -325,8 +323,8 @@ static inline int emulate_load_store_insn(struct pt_regs *regs, | |||
325 | : "r" (addr), "i" (-EFAULT)); | 323 | : "r" (addr), "i" (-EFAULT)); |
326 | if (res) | 324 | if (res) |
327 | goto fault; | 325 | goto fault; |
328 | *newvalue = value; | 326 | compute_return_epc(regs); |
329 | *regptr = ®s->regs[insn.i_format.rt]; | 327 | regs->regs[insn.i_format.rt] = value; |
330 | break; | 328 | break; |
331 | #endif /* CONFIG_64BIT */ | 329 | #endif /* CONFIG_64BIT */ |
332 | 330 | ||
@@ -367,6 +365,7 @@ static inline int emulate_load_store_insn(struct pt_regs *regs, | |||
367 | : "r" (value), "r" (addr), "i" (-EFAULT)); | 365 | : "r" (value), "r" (addr), "i" (-EFAULT)); |
368 | if (res) | 366 | if (res) |
369 | goto fault; | 367 | goto fault; |
368 | compute_return_epc(regs); | ||
370 | break; | 369 | break; |
371 | 370 | ||
372 | case sw_op: | 371 | case sw_op: |
@@ -397,6 +396,7 @@ static inline int emulate_load_store_insn(struct pt_regs *regs, | |||
397 | : "r" (value), "r" (addr), "i" (-EFAULT)); | 396 | : "r" (value), "r" (addr), "i" (-EFAULT)); |
398 | if (res) | 397 | if (res) |
399 | goto fault; | 398 | goto fault; |
399 | compute_return_epc(regs); | ||
400 | break; | 400 | break; |
401 | 401 | ||
402 | case sd_op: | 402 | case sd_op: |
@@ -435,6 +435,7 @@ static inline int emulate_load_store_insn(struct pt_regs *regs, | |||
435 | : "r" (value), "r" (addr), "i" (-EFAULT)); | 435 | : "r" (value), "r" (addr), "i" (-EFAULT)); |
436 | if (res) | 436 | if (res) |
437 | goto fault; | 437 | goto fault; |
438 | compute_return_epc(regs); | ||
438 | break; | 439 | break; |
439 | #endif /* CONFIG_64BIT */ | 440 | #endif /* CONFIG_64BIT */ |
440 | 441 | ||
@@ -473,34 +474,31 @@ static inline int emulate_load_store_insn(struct pt_regs *regs, | |||
473 | unaligned_instructions++; | 474 | unaligned_instructions++; |
474 | #endif | 475 | #endif |
475 | 476 | ||
476 | return 0; | 477 | return; |
477 | 478 | ||
478 | fault: | 479 | fault: |
479 | /* Did we have an exception handler installed? */ | 480 | /* Did we have an exception handler installed? */ |
480 | if (fixup_exception(regs)) | 481 | if (fixup_exception(regs)) |
481 | return 1; | 482 | return; |
482 | 483 | ||
483 | die_if_kernel ("Unhandled kernel unaligned access", regs); | 484 | die_if_kernel ("Unhandled kernel unaligned access", regs); |
484 | send_sig(SIGSEGV, current, 1); | 485 | send_sig(SIGSEGV, current, 1); |
485 | 486 | ||
486 | return 0; | 487 | return; |
487 | 488 | ||
488 | sigbus: | 489 | sigbus: |
489 | die_if_kernel("Unhandled kernel unaligned access", regs); | 490 | die_if_kernel("Unhandled kernel unaligned access", regs); |
490 | send_sig(SIGBUS, current, 1); | 491 | send_sig(SIGBUS, current, 1); |
491 | 492 | ||
492 | return 0; | 493 | return; |
493 | 494 | ||
494 | sigill: | 495 | sigill: |
495 | die_if_kernel("Unhandled kernel unaligned access or invalid instruction", regs); | 496 | die_if_kernel("Unhandled kernel unaligned access or invalid instruction", regs); |
496 | send_sig(SIGILL, current, 1); | 497 | send_sig(SIGILL, current, 1); |
497 | |||
498 | return 0; | ||
499 | } | 498 | } |
500 | 499 | ||
501 | asmlinkage void do_ade(struct pt_regs *regs) | 500 | asmlinkage void do_ade(struct pt_regs *regs) |
502 | { | 501 | { |
503 | unsigned long *regptr, newval; | ||
504 | extern int do_dsemulret(struct pt_regs *); | 502 | extern int do_dsemulret(struct pt_regs *); |
505 | unsigned int __user *pc; | 503 | unsigned int __user *pc; |
506 | mm_segment_t seg; | 504 | mm_segment_t seg; |
@@ -538,16 +536,7 @@ asmlinkage void do_ade(struct pt_regs *regs) | |||
538 | seg = get_fs(); | 536 | seg = get_fs(); |
539 | if (!user_mode(regs)) | 537 | if (!user_mode(regs)) |
540 | set_fs(KERNEL_DS); | 538 | set_fs(KERNEL_DS); |
541 | if (!emulate_load_store_insn(regs, (void __user *)regs->cp0_badvaddr, pc, | 539 | emulate_load_store_insn(regs, (void __user *)regs->cp0_badvaddr, pc); |
542 | ®ptr, &newval)) { | ||
543 | compute_return_epc(regs); | ||
544 | /* | ||
545 | * Now that branch is evaluated, update the dest | ||
546 | * register if necessary | ||
547 | */ | ||
548 | if (regptr) | ||
549 | *regptr = newval; | ||
550 | } | ||
551 | set_fs(seg); | 540 | set_fs(seg); |
552 | 541 | ||
553 | return; | 542 | return; |