linux/tools/testing/selftests/x86
Andy Lutomirski 8bb2610bc4 x86/entry/64/compat: Preserve r8-r11 in int $0x80
32-bit user code that uses int $80 doesn't care about r8-r11.  There is,
however, some 64-bit user code that intentionally uses int $0x80 to invoke
32-bit system calls.  From what I've seen, basically all such code assumes
that r8-r15 are all preserved, but the kernel clobbers r8-r11.  Since I
doubt that there's any code that depends on int $0x80 zeroing r8-r11,
change the kernel to preserve them.

I suspect that very little user code is broken by the old clobber, since
r8-r11 are only rarely allocated by gcc, and they're clobbered by function
calls, so they only way we'd see a problem is if the same function that
invokes int $0x80 also spills something important to one of these
registers.

The current behavior seems to date back to the historical commit
"[PATCH] x86-64 merge for 2.6.4".  Before that, all regs were
preserved.  I can't find any explanation of why this change was made.

Update the test_syscall_vdso_32 testcase as well to verify the new
behavior, and it strengthens the test to make sure that the kernel doesn't
accidentally permute r8..r15.

Suggested-by: Denys Vlasenko <dvlasenk@redhat.com>
Signed-off-by: Andy Lutomirski <luto@kernel.org>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Dominik Brodowski <linux@dominikbrodowski.net>
Link: https://lkml.kernel.org/r/d4c4d9985fbe64f8c9e19291886453914b48caee.1523975710.git.luto@kernel.org
2018-04-27 17:07:58 +02:00
..
.gitignore selftests: x86: add missing executables to .gitignore 2017-05-03 10:55:20 -06:00
check_cc.sh selftests, x86: Rework x86 target architecture detection 2015-05-12 20:02:40 -06:00
check_initial_reg_state.c selftests/x86: Add check_initial_reg_state() 2016-01-29 09:46:37 +01:00
entry_from_vm86.c selftests/x86/entry_from_vm86: Add test cases for POPF 2018-03-14 09:21:01 +01:00
fsgsbase.c selftests/x86/fsgsbase: Test selectors 1, 2, and 3 2017-08-10 17:15:13 +02:00
ioperm.c License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
iopl.c License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
ldt_gdt.c x86/ldt: Make the LDT mapping RO 2017-12-23 21:13:01 +01:00
Makefile Merge branch 'x86-pti-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip 2018-02-14 17:02:15 -08:00
mpx-debug.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
mpx-dig.c License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
mpx-hw.h x86/mpx/selftests: Fix up weird arrays 2017-11-21 09:34:52 +01:00
mpx-mini-test.c selftests/x86/mpx: Fix incorrect bounds with old _sigfault 2018-02-15 01:15:52 +01:00
mpx-mm.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
pkey-helpers.h x86/pkeys/selftests: Fix protection keys write() warning 2017-11-21 09:34:52 +01:00
protection_keys.c selftests/x86/pkeys: Remove unused functions 2018-02-13 09:04:56 +01:00
ptrace_syscall.c selftests/x86/ptrace_syscall: Fix for yet more glibc interference 2018-03-19 09:06:15 +01:00
raw_syscall_helper_32.S License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
sigreturn.c selftests/x86/sigreturn: Use CX, not AX, as the scratch register 2016-09-13 20:34:15 +02:00
single_step_syscall.c selftests/x86: Do not rely on "int $0x80" in single_step_syscall.c 2018-02-15 01:15:48 +01:00
syscall_arg_fault.c x86/entry, selftests/x86: Add a test for 32-bit fast syscall arg faults 2015-07-07 10:58:30 +02:00
syscall_nt.c selftests/x86: In syscall_nt, test NT|TF as well 2016-03-10 09:48:12 +01:00
sysret_rip.c selftests/x86: Add a selftest for SYSRET to noncanonical addresses 2017-01-05 09:20:02 +01:00
sysret_ss_attrs.c x86, selftests: Add a test for the "sysret_ss_attrs" bug 2015-05-08 13:33:59 +02:00
test_FCMOV.c License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
test_FCOMI.c License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
test_FISTTP.c License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
test_mremap_vdso.c selftests/x86: Do not rely on "int $0x80" in test_mremap_vdso.c 2018-02-13 09:05:37 +01:00
test_syscall_vdso.c x86/entry/64/compat: Preserve r8-r11 in int $0x80 2018-04-27 17:07:58 +02:00
test_vdso.c selftests/x86: Clean up and document sscanf() usage 2018-02-13 09:04:56 +01:00
test_vsyscall.c x86/vsyscall/64: Drop "native" vsyscalls 2018-03-08 06:48:15 +01:00
thunks_32.S x86/asm/entry/32, selftests: Add 'test_syscall_vdso' test 2015-09-18 09:40:48 +02:00
thunks.S x86, selftests: Add a test for the "sysret_ss_attrs" bug 2015-05-08 13:33:59 +02:00
trivial_32bit_program.c selftests, x86: Rework x86 target architecture detection 2015-05-12 20:02:40 -06:00
trivial_64bit_program.c selftest, x86: fix incorrect comment 2015-05-26 15:58:41 -06:00
unwind_vdso.c selftests/x86: Style fixes for the 'unwind_vdso' test 2015-10-14 16:56:28 +02:00
vdso_restorer.c selftests/x86: Test __kernel_sigreturn and __kernel_rt_sigreturn 2016-01-13 10:34:40 +01:00