aboutsummaryrefslogtreecommitdiffstats
path: root/tools/testing/selftests/x86/single_step_syscall.c
diff options
context:
space:
mode:
authorAndy Lutomirski <luto@kernel.org>2020-06-26 10:21:16 -0700
committerThomas Gleixner <tglx@linutronix.de>2020-07-01 10:00:27 +0200
commitcced0b24bb545bfe74fea96de84adc23c0146b05 (patch)
tree4cf94eb54ae3f64b4c4b54c696f0e5fabd081078 /tools/testing/selftests/x86/single_step_syscall.c
parentselftests/x86/syscall_nt: Clear weird flags after each test (diff)
downloadlinux-dev-cced0b24bb545bfe74fea96de84adc23c0146b05.tar.xz
linux-dev-cced0b24bb545bfe74fea96de84adc23c0146b05.zip
selftests/x86: Consolidate and fix get/set_eflags() helpers
There are several copies of get_eflags() and set_eflags() and they all are buggy. Consolidate them and fix them. The fixes are: Add memory clobbers. These are probably unnecessary but they make sure that the compiler doesn't move something past one of these calls when it shouldn't. Respect the redzone on x86_64. There has no failure been observed related to this, but it's definitely a bug. Signed-off-by: Andy Lutomirski <luto@kernel.org> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Link: https://lkml.kernel.org/r/982ce58ae8dea2f1e57093ee894760e35267e751.1593191971.git.luto@kernel.org
Diffstat (limited to 'tools/testing/selftests/x86/single_step_syscall.c')
-rw-r--r--tools/testing/selftests/x86/single_step_syscall.c17
1 files changed, 2 insertions, 15 deletions
diff --git a/tools/testing/selftests/x86/single_step_syscall.c b/tools/testing/selftests/x86/single_step_syscall.c
index 1063328e275c..120ac741fe44 100644
--- a/tools/testing/selftests/x86/single_step_syscall.c
+++ b/tools/testing/selftests/x86/single_step_syscall.c
@@ -31,6 +31,8 @@
#include <sys/ptrace.h>
#include <sys/user.h>
+#include "helpers.h"
+
static void sethandler(int sig, void (*handler)(int, siginfo_t *, void *),
int flags)
{
@@ -67,21 +69,6 @@ static unsigned char altstack_data[SIGSTKSZ];
# define INT80_CLOBBERS
#endif
-static unsigned long get_eflags(void)
-{
- unsigned long eflags;
- asm volatile ("pushf" WIDTH "\n\tpop" WIDTH " %0" : "=rm" (eflags));
- return eflags;
-}
-
-static void set_eflags(unsigned long eflags)
-{
- asm volatile ("push" WIDTH " %0\n\tpopf" WIDTH
- : : "rm" (eflags) : "flags");
-}
-
-#define X86_EFLAGS_TF (1UL << 8)
-
static void sigtrap(int sig, siginfo_t *info, void *ctx_void)
{
ucontext_t *ctx = (ucontext_t*)ctx_void;