mirror of
https://github.com/adulau/aha.git
synced 2024-12-29 04:06:22 +00:00
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>
This commit is contained in:
parent
bd9384a9fd
commit
58a47481b6
1 changed files with 23 additions and 29 deletions
|
@ -329,10 +329,11 @@ asmlinkage void misalignment(struct pt_regs *regs, enum exception_code code)
|
||||||
void *address;
|
void *address;
|
||||||
unsigned tmp, npop, dispsz, loop;
|
unsigned tmp, npop, dispsz, loop;
|
||||||
|
|
||||||
|
/* we don't fix up userspace misalignment faults */
|
||||||
if (user_mode(regs))
|
if (user_mode(regs))
|
||||||
sp = regs->sp;
|
goto bus_error;
|
||||||
else
|
|
||||||
sp = (unsigned long) regs + sizeof(*regs);
|
sp = (unsigned long) regs + sizeof(*regs);
|
||||||
|
|
||||||
kdebug("==>misalignment({pc=%lx,sp=%lx})", regs->pc, sp);
|
kdebug("==>misalignment({pc=%lx,sp=%lx})", regs->pc, sp);
|
||||||
|
|
||||||
|
@ -386,15 +387,15 @@ asmlinkage void misalignment(struct pt_regs *regs, enum exception_code code)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* didn't manage to find a fixup */
|
/* didn't manage to find a fixup */
|
||||||
if (!user_mode(regs))
|
printk(KERN_CRIT "MISALIGN: %lx: unsupported instruction %x\n",
|
||||||
printk(KERN_CRIT "MISALIGN: %lx: unsupported instruction %x\n",
|
regs->pc, opcode);
|
||||||
regs->pc, opcode);
|
|
||||||
|
|
||||||
failed:
|
failed:
|
||||||
set_fs(seg);
|
set_fs(seg);
|
||||||
if (die_if_no_fixup("misalignment error", regs, code))
|
if (die_if_no_fixup("misalignment error", regs, code))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
bus_error:
|
||||||
info.si_signo = SIGBUS;
|
info.si_signo = SIGBUS;
|
||||||
info.si_errno = 0;
|
info.si_errno = 0;
|
||||||
info.si_code = BUS_ADRALN;
|
info.si_code = BUS_ADRALN;
|
||||||
|
@ -404,31 +405,27 @@ failed:
|
||||||
|
|
||||||
/* error reading opcodes */
|
/* error reading opcodes */
|
||||||
fetch_error:
|
fetch_error:
|
||||||
if (!user_mode(regs))
|
printk(KERN_CRIT
|
||||||
printk(KERN_CRIT
|
"MISALIGN: %p: fault whilst reading instruction data\n",
|
||||||
"MISALIGN: %p: fault whilst reading instruction data\n",
|
pc);
|
||||||
pc);
|
|
||||||
goto failed;
|
goto failed;
|
||||||
|
|
||||||
bad_addr_mode:
|
bad_addr_mode:
|
||||||
if (!user_mode(regs))
|
printk(KERN_CRIT
|
||||||
printk(KERN_CRIT
|
"MISALIGN: %lx: unsupported addressing mode %x\n",
|
||||||
"MISALIGN: %lx: unsupported addressing mode %x\n",
|
regs->pc, opcode);
|
||||||
regs->pc, opcode);
|
|
||||||
goto failed;
|
goto failed;
|
||||||
|
|
||||||
bad_reg_mode:
|
bad_reg_mode:
|
||||||
if (!user_mode(regs))
|
printk(KERN_CRIT
|
||||||
printk(KERN_CRIT
|
"MISALIGN: %lx: unsupported register mode %x\n",
|
||||||
"MISALIGN: %lx: unsupported register mode %x\n",
|
regs->pc, opcode);
|
||||||
regs->pc, opcode);
|
|
||||||
goto failed;
|
goto failed;
|
||||||
|
|
||||||
unsupported_instruction:
|
unsupported_instruction:
|
||||||
if (!user_mode(regs))
|
printk(KERN_CRIT
|
||||||
printk(KERN_CRIT
|
"MISALIGN: %lx: unsupported instruction %x (%s)\n",
|
||||||
"MISALIGN: %lx: unsupported instruction %x (%s)\n",
|
regs->pc, opcode, pop->name);
|
||||||
regs->pc, opcode, pop->name);
|
|
||||||
goto failed;
|
goto failed;
|
||||||
|
|
||||||
transfer_failed:
|
transfer_failed:
|
||||||
|
@ -476,16 +473,14 @@ found_opcode:
|
||||||
kdebug("disp=%lx", disp);
|
kdebug("disp=%lx", disp);
|
||||||
|
|
||||||
set_fs(KERNEL_XDS);
|
set_fs(KERNEL_XDS);
|
||||||
if (fixup || regs->epsw & EPSW_nSL)
|
if (fixup)
|
||||||
set_fs(seg);
|
set_fs(seg);
|
||||||
|
|
||||||
tmp = (pop->params[0] ^ pop->params[1]) & 0x80000000;
|
tmp = (pop->params[0] ^ pop->params[1]) & 0x80000000;
|
||||||
if (!tmp) {
|
if (!tmp) {
|
||||||
if (!user_mode(regs))
|
printk(KERN_CRIT
|
||||||
printk(KERN_CRIT
|
"MISALIGN: %lx: insn not move to/from memory %x\n",
|
||||||
"MISALIGN: %lx:"
|
regs->pc, opcode);
|
||||||
" insn not move to/from memory %x\n",
|
|
||||||
regs->pc, opcode);
|
|
||||||
goto failed;
|
goto failed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -548,7 +543,6 @@ found_opcode:
|
||||||
misalignment_MOV_Lcc(regs, opcode);
|
misalignment_MOV_Lcc(regs, opcode);
|
||||||
|
|
||||||
set_fs(seg);
|
set_fs(seg);
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in a new issue