xref: /linux/tools/testing/selftests/x86/helpers.h (revision 1260ed77798502de9c98020040d2995008de10cc)
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