File Index
Files and directories
Sign in
FILE

kvm_util_arch.h

File preview with syntax highlighting.

linux-6.19.14/tools/testing/selftests/kvm/include/x86/kvm_util_arch.h C
 1/* SPDX-License-Identifier: GPL-2.0-only */
 2#ifndef SELFTEST_KVM_UTIL_ARCH_H
 3#define SELFTEST_KVM_UTIL_ARCH_H
 4
 5#include <stdbool.h>
 6#include <stdint.h>
 7
 8#include "kvm_util_types.h"
 9#include "test_util.h"
10
11extern bool is_forced_emulation_enabled;
12
13struct kvm_vm_arch {
14	vm_vaddr_t gdt;
15	vm_vaddr_t tss;
16	vm_vaddr_t idt;
17
18	uint64_t c_bit;
19	uint64_t s_bit;
20	int sev_fd;
21	bool is_pt_protected;
22};
23
24static inline bool __vm_arch_has_protected_memory(struct kvm_vm_arch *arch)
25{
26	return arch->c_bit || arch->s_bit;
27}
28
29#define vm_arch_has_protected_memory(vm) \
30	__vm_arch_has_protected_memory(&(vm)->arch)
31
32#define vcpu_arch_put_guest(mem, __val)							\
33do {											\
34	const typeof(mem) val = (__val);						\
35											\
36	if (!is_forced_emulation_enabled || guest_random_bool(&guest_rng)) {		\
37		(mem) = val;								\
38	} else if (guest_random_bool(&guest_rng)) {					\
39		__asm__ __volatile__(KVM_FEP "mov %1, %0"				\
40				     : "+m" (mem)					\
41				     : "r" (val) : "memory");				\
42	} else {									\
43		uint64_t __old = READ_ONCE(mem);					\
44											\
45		__asm__ __volatile__(KVM_FEP LOCK_PREFIX "cmpxchg %[new], %[ptr]"	\
46				     : [ptr] "+m" (mem), [old] "+a" (__old)		\
47				     : [new]"r" (val) : "memory", "cc");		\
48	}										\
49} while (0)
50
51#endif  // SELFTEST_KVM_UTIL_ARCH_H
~/ Read-only file preview.