mirror of https://github.com/torvalds/linux.git
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 | ||
| Makefile | ||
| check_cc.sh | ||
| check_initial_reg_state.c | ||
| entry_from_vm86.c | ||
| fsgsbase.c | ||
| ioperm.c | ||
| iopl.c | ||
| ldt_gdt.c | ||
| 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.S | ||
| thunks_32.S | ||
| trivial_32bit_program.c | ||
| trivial_64bit_program.c | ||
| trivial_program.c | ||
| unwind_vdso.c | ||
| vdso_restorer.c | ||