18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 28c2ecf20Sopenharmony_ci#ifndef __SELFTESTS_X86_HELPERS_H 38c2ecf20Sopenharmony_ci#define __SELFTESTS_X86_HELPERS_H 48c2ecf20Sopenharmony_ci 58c2ecf20Sopenharmony_ci#include <asm/processor-flags.h> 68c2ecf20Sopenharmony_ci 78c2ecf20Sopenharmony_cistatic inline unsigned long get_eflags(void) 88c2ecf20Sopenharmony_ci{ 98c2ecf20Sopenharmony_ci unsigned long eflags; 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ci asm volatile ( 128c2ecf20Sopenharmony_ci#ifdef __x86_64__ 138c2ecf20Sopenharmony_ci "subq $128, %%rsp\n\t" 148c2ecf20Sopenharmony_ci "pushfq\n\t" 158c2ecf20Sopenharmony_ci "popq %0\n\t" 168c2ecf20Sopenharmony_ci "addq $128, %%rsp" 178c2ecf20Sopenharmony_ci#else 188c2ecf20Sopenharmony_ci "pushfl\n\t" 198c2ecf20Sopenharmony_ci "popl %0" 208c2ecf20Sopenharmony_ci#endif 218c2ecf20Sopenharmony_ci : "=r" (eflags) :: "memory"); 228c2ecf20Sopenharmony_ci 238c2ecf20Sopenharmony_ci return eflags; 248c2ecf20Sopenharmony_ci} 258c2ecf20Sopenharmony_ci 268c2ecf20Sopenharmony_cistatic inline void set_eflags(unsigned long eflags) 278c2ecf20Sopenharmony_ci{ 288c2ecf20Sopenharmony_ci asm volatile ( 298c2ecf20Sopenharmony_ci#ifdef __x86_64__ 308c2ecf20Sopenharmony_ci "subq $128, %%rsp\n\t" 318c2ecf20Sopenharmony_ci "pushq %0\n\t" 328c2ecf20Sopenharmony_ci "popfq\n\t" 338c2ecf20Sopenharmony_ci "addq $128, %%rsp" 348c2ecf20Sopenharmony_ci#else 358c2ecf20Sopenharmony_ci "pushl %0\n\t" 368c2ecf20Sopenharmony_ci "popfl" 378c2ecf20Sopenharmony_ci#endif 388c2ecf20Sopenharmony_ci :: "r" (eflags) : "flags", "memory"); 398c2ecf20Sopenharmony_ci} 408c2ecf20Sopenharmony_ci 418c2ecf20Sopenharmony_ci#endif /* __SELFTESTS_X86_HELPERS_H */ 42