mirror of
https://github.com/torvalds/linux.git
synced 2024-12-14 07:02:23 +00:00
a20d452a2d
Atom-based CPUs trigger stack fault when invoke 32-bit SYSENTER instruction with invalid register values. So we also need SIGBUS handling in this case. Following is assembly when the fault exception happens. (gdb) disassemble $eip Dump of assembler code for function __kernel_vsyscall: 0xf7fd8fe0 <+0>: push %ecx 0xf7fd8fe1 <+1>: push %edx 0xf7fd8fe2 <+2>: push %ebp 0xf7fd8fe3 <+3>: mov %esp,%ebp 0xf7fd8fe5 <+5>: sysenter 0xf7fd8fe7 <+7>: int $0x80 => 0xf7fd8fe9 <+9>: pop %ebp 0xf7fd8fea <+10>: pop %edx 0xf7fd8feb <+11>: pop %ecx 0xf7fd8fec <+12>: ret End of assembler dump. According to Intel SDM, this could also be a Stack Segment Fault(#SS, 12), except a normal Page Fault(#PF, 14). Especially, in section 6.9 of Vol.3A, both stack and page faults are within the 10th(lowest priority) class, and as it said, "exceptions within each class are implementation-dependent and may vary from processor to processor". It's expected for processors like Intel Atom to trigger stack fault(SIGBUS), while we get page fault(SIGSEGV) from common Core processors. Signed-off-by: Tong Bo <bo.tong@intel.com> Acked-by: Andy Lutomirski <luto@kernel.org> Signed-off-by: Shuah Khan <skhan@linuxfoundation.org> |
||
---|---|---|
.. | ||
.gitignore | ||
check_cc.sh | ||
check_initial_reg_state.c | ||
entry_from_vm86.c | ||
fsgsbase.c | ||
ioperm.c | ||
iopl.c | ||
ldt_gdt.c | ||
Makefile | ||
mov_ss_trap.c | ||
mpx-debug.h | ||
mpx-dig.c | ||
mpx-hw.h | ||
mpx-mini-test.c | ||
mpx-mm.h | ||
pkey-helpers.h | ||
protection_keys.c | ||
ptrace_syscall.c | ||
raw_syscall_helper_32.S | ||
sigreturn.c | ||
single_step_syscall.c | ||
syscall_arg_fault.c | ||
syscall_nt.c | ||
sysret_rip.c | ||
sysret_ss_attrs.c | ||
test_FCMOV.c | ||
test_FCOMI.c | ||
test_FISTTP.c | ||
test_mremap_vdso.c | ||
test_syscall_vdso.c | ||
test_vdso.c | ||
test_vsyscall.c | ||
thunks_32.S | ||
thunks.S | ||
trivial_32bit_program.c | ||
trivial_64bit_program.c | ||
trivial_program.c | ||
unwind_vdso.c | ||
vdso_restorer.c |