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