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