diff options
author | David Howells <dhowells@redhat.com> | 2008-11-12 10:35:55 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-11-12 13:41:18 -0500 |
commit | 58a47481b6ecb6dd05ab4a788e1f2ae3c7c46f57 (patch) | |
tree | 2ffa67fd1236c9770418f9e5e7518ee7e098c535 /arch | |
parent | bd9384a9fdd6c15da6b01b2844c3471d07a45d64 (diff) |
MN10300: Don't do misalignment handling for userspace
Don't do misalignment handling for userspace misalignment faults: just
generate an appropriate SIGBUS instead.
Signed-off-by: David Howells <dhowells@redhat.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/mn10300/mm/misalignment.c | 52 |
1 files changed, 23 insertions, 29 deletions
diff --git a/arch/mn10300/mm/misalignment.c b/arch/mn10300/mm/misalignment.c index 7b670a3d7659..94c4a4358065 100644 --- a/arch/mn10300/mm/misalignment.c +++ b/arch/mn10300/mm/misalignment.c | |||
@@ -329,10 +329,11 @@ asmlinkage void misalignment(struct pt_regs *regs, enum exception_code code) | |||
329 | void *address; | 329 | void *address; |
330 | unsigned tmp, npop, dispsz, loop; | 330 | unsigned tmp, npop, dispsz, loop; |
331 | 331 | ||
332 | /* we don't fix up userspace misalignment faults */ | ||
332 | if (user_mode(regs)) | 333 | if (user_mode(regs)) |
333 | sp = regs->sp; | 334 | goto bus_error; |
334 | else | 335 | |
335 | sp = (unsigned long) regs + sizeof(*regs); | 336 | sp = (unsigned long) regs + sizeof(*regs); |
336 | 337 | ||
337 | kdebug("==>misalignment({pc=%lx,sp=%lx})", regs->pc, sp); | 338 | kdebug("==>misalignment({pc=%lx,sp=%lx})", regs->pc, sp); |
338 | 339 | ||
@@ -386,15 +387,15 @@ asmlinkage void misalignment(struct pt_regs *regs, enum exception_code code) | |||
386 | } | 387 | } |
387 | 388 | ||
388 | /* didn't manage to find a fixup */ | 389 | /* didn't manage to find a fixup */ |
389 | if (!user_mode(regs)) | 390 | printk(KERN_CRIT "MISALIGN: %lx: unsupported instruction %x\n", |
390 | printk(KERN_CRIT "MISALIGN: %lx: unsupported instruction %x\n", | 391 | regs->pc, opcode); |
391 | regs->pc, opcode); | ||
392 | 392 | ||
393 | failed: | 393 | failed: |
394 | set_fs(seg); | 394 | set_fs(seg); |
395 | if (die_if_no_fixup("misalignment error", regs, code)) | 395 | if (die_if_no_fixup("misalignment error", regs, code)) |
396 | return; | 396 | return; |
397 | 397 | ||
398 | bus_error: | ||
398 | info.si_signo = SIGBUS; | 399 | info.si_signo = SIGBUS; |
399 | info.si_errno = 0; | 400 | info.si_errno = 0; |
400 | info.si_code = BUS_ADRALN; | 401 | info.si_code = BUS_ADRALN; |
@@ -404,31 +405,27 @@ failed: | |||
404 | 405 | ||
405 | /* error reading opcodes */ | 406 | /* error reading opcodes */ |
406 | fetch_error: | 407 | fetch_error: |
407 | if (!user_mode(regs)) | 408 | printk(KERN_CRIT |
408 | printk(KERN_CRIT | 409 | "MISALIGN: %p: fault whilst reading instruction data\n", |
409 | "MISALIGN: %p: fault whilst reading instruction data\n", | 410 | pc); |
410 | pc); | ||
411 | goto failed; | 411 | goto failed; |
412 | 412 | ||
413 | bad_addr_mode: | 413 | bad_addr_mode: |
414 | if (!user_mode(regs)) | 414 | printk(KERN_CRIT |
415 | printk(KERN_CRIT | 415 | "MISALIGN: %lx: unsupported addressing mode %x\n", |
416 | "MISALIGN: %lx: unsupported addressing mode %x\n", | 416 | regs->pc, opcode); |
417 | regs->pc, opcode); | ||
418 | goto failed; | 417 | goto failed; |
419 | 418 | ||
420 | bad_reg_mode: | 419 | bad_reg_mode: |
421 | if (!user_mode(regs)) | 420 | printk(KERN_CRIT |
422 | printk(KERN_CRIT | 421 | "MISALIGN: %lx: unsupported register mode %x\n", |
423 | "MISALIGN: %lx: unsupported register mode %x\n", | 422 | regs->pc, opcode); |
424 | regs->pc, opcode); | ||
425 | goto failed; | 423 | goto failed; |
426 | 424 | ||
427 | unsupported_instruction: | 425 | unsupported_instruction: |
428 | if (!user_mode(regs)) | 426 | printk(KERN_CRIT |
429 | printk(KERN_CRIT | 427 | "MISALIGN: %lx: unsupported instruction %x (%s)\n", |
430 | "MISALIGN: %lx: unsupported instruction %x (%s)\n", | 428 | regs->pc, opcode, pop->name); |
431 | regs->pc, opcode, pop->name); | ||
432 | goto failed; | 429 | goto failed; |
433 | 430 | ||
434 | transfer_failed: | 431 | transfer_failed: |
@@ -476,16 +473,14 @@ found_opcode: | |||
476 | kdebug("disp=%lx", disp); | 473 | kdebug("disp=%lx", disp); |
477 | 474 | ||
478 | set_fs(KERNEL_XDS); | 475 | set_fs(KERNEL_XDS); |
479 | if (fixup || regs->epsw & EPSW_nSL) | 476 | if (fixup) |
480 | set_fs(seg); | 477 | set_fs(seg); |
481 | 478 | ||
482 | tmp = (pop->params[0] ^ pop->params[1]) & 0x80000000; | 479 | tmp = (pop->params[0] ^ pop->params[1]) & 0x80000000; |
483 | if (!tmp) { | 480 | if (!tmp) { |
484 | if (!user_mode(regs)) | 481 | printk(KERN_CRIT |
485 | printk(KERN_CRIT | 482 | "MISALIGN: %lx: insn not move to/from memory %x\n", |
486 | "MISALIGN: %lx:" | 483 | regs->pc, opcode); |
487 | " insn not move to/from memory %x\n", | ||
488 | regs->pc, opcode); | ||
489 | goto failed; | 484 | goto failed; |
490 | } | 485 | } |
491 | 486 | ||
@@ -548,7 +543,6 @@ found_opcode: | |||
548 | misalignment_MOV_Lcc(regs, opcode); | 543 | misalignment_MOV_Lcc(regs, opcode); |
549 | 544 | ||
550 | set_fs(seg); | 545 | set_fs(seg); |
551 | return; | ||
552 | } | 546 | } |
553 | 547 | ||
554 | /* | 548 | /* |