diff options
| -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 | /* |
