1 // SPDX-License-Identifier: GPL-2.0-only
2 #ifndef __SELFTESTS_X86_HELPERS_H
3 #define __SELFTESTS_X86_HELPERS_H
4
5 #include <signal.h>
6 #include <string.h>
7
8 #include <asm/processor-flags.h>
9
10 #include "../kselftest.h"
11
get_eflags(void)12 static inline unsigned long get_eflags(void)
13 {
14 #ifdef __x86_64__
15 return __builtin_ia32_readeflags_u64();
16 #else
17 return __builtin_ia32_readeflags_u32();
18 #endif
19 }
20
set_eflags(unsigned long eflags)21 static inline void set_eflags(unsigned long eflags)
22 {
23 #ifdef __x86_64__
24 __builtin_ia32_writeeflags_u64(eflags);
25 #else
26 __builtin_ia32_writeeflags_u32(eflags);
27 #endif
28 }
29
sethandler(int sig,void (* handler)(int,siginfo_t *,void *),int flags)30 static inline void sethandler(int sig, void (*handler)(int, siginfo_t *, void *), int flags)
31 {
32 struct sigaction sa;
33
34 memset(&sa, 0, sizeof(sa));
35 sa.sa_sigaction = handler;
36 sa.sa_flags = SA_SIGINFO | flags;
37 sigemptyset(&sa.sa_mask);
38 if (sigaction(sig, &sa, 0))
39 ksft_exit_fail_msg("sigaction failed");
40 }
41
clearhandler(int sig)42 static inline void clearhandler(int sig)
43 {
44 struct sigaction sa;
45
46 memset(&sa, 0, sizeof(sa));
47 sa.sa_handler = SIG_DFL;
48 sigemptyset(&sa.sa_mask);
49 if (sigaction(sig, &sa, 0))
50 ksft_exit_fail_msg("sigaction failed");
51 }
52
53 #endif /* __SELFTESTS_X86_HELPERS_H */
54