/* SPDX-License-Identifier: GPL-2.0-only */ #ifndef SELFTEST_KVM_UTIL_ARCH_H #define SELFTEST_KVM_UTIL_ARCH_H #include #include #include "kvm_util_types.h" #include "test_util.h" extern bool is_forced_emulation_enabled; struct kvm_vm_arch { vm_vaddr_t gdt; vm_vaddr_t tss; vm_vaddr_t idt; uint64_t c_bit; uint64_t s_bit; int sev_fd; bool is_pt_protected; }; static inline bool __vm_arch_has_protected_memory(struct kvm_vm_arch *arch) { return arch->c_bit || arch->s_bit; } #define vm_arch_has_protected_memory(vm) \ __vm_arch_has_protected_memory(&(vm)->arch) #define vcpu_arch_put_guest(mem, __val) \ do { \ const typeof(mem) val = (__val); \ \ if (!is_forced_emulation_enabled || guest_random_bool(&guest_rng)) { \ (mem) = val; \ } else if (guest_random_bool(&guest_rng)) { \ __asm__ __volatile__(KVM_FEP "mov %1, %0" \ : "+m" (mem) \ : "r" (val) : "memory"); \ } else { \ uint64_t __old = READ_ONCE(mem); \ \ __asm__ __volatile__(KVM_FEP LOCK_PREFIX "cmpxchg %[new], %[ptr]" \ : [ptr] "+m" (mem), [old] "+a" (__old) \ : [new]"r" (val) : "memory", "cc"); \ } \ } while (0) #endif // SELFTEST_KVM_UTIL_ARCH_H