1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-only 2*4882a593Smuzhiyun #ifndef __SELFTESTS_X86_HELPERS_H 3*4882a593Smuzhiyun #define __SELFTESTS_X86_HELPERS_H 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun #include <asm/processor-flags.h> 6*4882a593Smuzhiyun get_eflags(void)7*4882a593Smuzhiyunstatic inline unsigned long get_eflags(void) 8*4882a593Smuzhiyun { 9*4882a593Smuzhiyun unsigned long eflags; 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun asm volatile ( 12*4882a593Smuzhiyun #ifdef __x86_64__ 13*4882a593Smuzhiyun "subq $128, %%rsp\n\t" 14*4882a593Smuzhiyun "pushfq\n\t" 15*4882a593Smuzhiyun "popq %0\n\t" 16*4882a593Smuzhiyun "addq $128, %%rsp" 17*4882a593Smuzhiyun #else 18*4882a593Smuzhiyun "pushfl\n\t" 19*4882a593Smuzhiyun "popl %0" 20*4882a593Smuzhiyun #endif 21*4882a593Smuzhiyun : "=r" (eflags) :: "memory"); 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun return eflags; 24*4882a593Smuzhiyun } 25*4882a593Smuzhiyun set_eflags(unsigned long eflags)26*4882a593Smuzhiyunstatic inline void set_eflags(unsigned long eflags) 27*4882a593Smuzhiyun { 28*4882a593Smuzhiyun asm volatile ( 29*4882a593Smuzhiyun #ifdef __x86_64__ 30*4882a593Smuzhiyun "subq $128, %%rsp\n\t" 31*4882a593Smuzhiyun "pushq %0\n\t" 32*4882a593Smuzhiyun "popfq\n\t" 33*4882a593Smuzhiyun "addq $128, %%rsp" 34*4882a593Smuzhiyun #else 35*4882a593Smuzhiyun "pushl %0\n\t" 36*4882a593Smuzhiyun "popfl" 37*4882a593Smuzhiyun #endif 38*4882a593Smuzhiyun :: "r" (eflags) : "flags", "memory"); 39*4882a593Smuzhiyun } 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun #endif /* __SELFTESTS_X86_HELPERS_H */ 42