helpers.h 1.1 KB

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