| // SPDX-License-Identifier: GPL-2.0-only |
| #ifndef __SELFTESTS_X86_HELPERS_H |
| #define __SELFTESTS_X86_HELPERS_H |
| |
| #include <signal.h> |
| #include <string.h> |
| |
| #include <asm/processor-flags.h> |
| |
| #include "../kselftest.h" |
| |
| static inline unsigned long get_eflags(void) |
| { |
| #ifdef __x86_64__ |
| return __builtin_ia32_readeflags_u64(); |
| #else |
| return __builtin_ia32_readeflags_u32(); |
| #endif |
| } |
| |
| static inline void set_eflags(unsigned long eflags) |
| { |
| #ifdef __x86_64__ |
| __builtin_ia32_writeeflags_u64(eflags); |
| #else |
| __builtin_ia32_writeeflags_u32(eflags); |
| #endif |
| } |
| |
| static inline void sethandler(int sig, void (*handler)(int, siginfo_t *, void *), int flags) |
| { |
| struct sigaction sa; |
| |
| memset(&sa, 0, sizeof(sa)); |
| sa.sa_sigaction = handler; |
| sa.sa_flags = SA_SIGINFO | flags; |
| sigemptyset(&sa.sa_mask); |
| if (sigaction(sig, &sa, 0)) |
| ksft_exit_fail_msg("sigaction failed"); |
| } |
| |
| static inline void clearhandler(int sig) |
| { |
| struct sigaction sa; |
| |
| memset(&sa, 0, sizeof(sa)); |
| sa.sa_handler = SIG_DFL; |
| sigemptyset(&sa.sa_mask); |
| if (sigaction(sig, &sa, 0)) |
| ksft_exit_fail_msg("sigaction failed"); |
| } |
| |
| #endif /* __SELFTESTS_X86_HELPERS_H */ |