1/* SPDX-License-Identifier: GPL-2.0-only */
2/*
3 * tools/testing/selftests/kvm/include/kvm_util.h
4 *
5 * Copyright (C) 2018, Google LLC.
6 */
7#ifndef SELFTEST_KVM_UTIL_H
8#define SELFTEST_KVM_UTIL_H
9
10#include "test_util.h"
11
12#include "asm/kvm.h"
13#include "linux/list.h"
14#include "linux/kvm.h"
15#include <sys/ioctl.h>
16
17#include "sparsebit.h"
18
19
20/*
21 * Callers of kvm_util only have an incomplete/opaque description of the
22 * structure kvm_util is using to maintain the state of a VM.
23 */
24struct kvm_vm;
25
26typedef uint64_t vm_paddr_t; /* Virtual Machine (Guest) physical address */
27typedef uint64_t vm_vaddr_t; /* Virtual Machine (Guest) virtual address */
28
29/* Minimum allocated guest virtual and physical addresses */
30#define KVM_UTIL_MIN_VADDR		0x2000
31
32#define DEFAULT_GUEST_PHY_PAGES		512
33#define DEFAULT_GUEST_STACK_VADDR_MIN	0xab6000
34#define DEFAULT_STACK_PGS		5
35
36enum vm_guest_mode {
37	VM_MODE_P52V48_4K,
38	VM_MODE_P52V48_64K,
39	VM_MODE_P48V48_4K,
40	VM_MODE_P48V48_64K,
41	VM_MODE_P40V48_4K,
42	VM_MODE_P40V48_64K,
43	VM_MODE_PXXV48_4K,	/* For 48bits VA but ANY bits PA */
44	NUM_VM_MODES,
45};
46
47#if defined(__aarch64__)
48#define VM_MODE_DEFAULT VM_MODE_P40V48_4K
49#elif defined(__x86_64__)
50#define VM_MODE_DEFAULT VM_MODE_PXXV48_4K
51#else
52#define VM_MODE_DEFAULT VM_MODE_P52V48_4K
53#endif
54
55#define vm_guest_mode_string(m) vm_guest_mode_string[m]
56extern const char * const vm_guest_mode_string[];
57
58enum vm_mem_backing_src_type {
59	VM_MEM_SRC_ANONYMOUS,
60	VM_MEM_SRC_ANONYMOUS_THP,
61	VM_MEM_SRC_ANONYMOUS_HUGETLB,
62};
63
64int kvm_check_cap(long cap);
65int vm_enable_cap(struct kvm_vm *vm, struct kvm_enable_cap *cap);
66int vcpu_enable_cap(struct kvm_vm *vm, uint32_t vcpu_id,
67		    struct kvm_enable_cap *cap);
68void vm_enable_dirty_ring(struct kvm_vm *vm, uint32_t ring_size);
69
70struct kvm_vm *vm_create(enum vm_guest_mode mode, uint64_t phy_pages, int perm);
71void kvm_vm_free(struct kvm_vm *vmp);
72void kvm_vm_restart(struct kvm_vm *vmp, int perm);
73void kvm_vm_release(struct kvm_vm *vmp);
74void kvm_vm_get_dirty_log(struct kvm_vm *vm, int slot, void *log);
75void kvm_vm_clear_dirty_log(struct kvm_vm *vm, int slot, void *log,
76			    uint64_t first_page, uint32_t num_pages);
77
78int kvm_memcmp_hva_gva(void *hva, struct kvm_vm *vm, const vm_vaddr_t gva,
79		       size_t len);
80
81void kvm_vm_elf_load(struct kvm_vm *vm, const char *filename,
82		     uint32_t data_memslot, uint32_t pgd_memslot);
83
84void vm_dump(FILE *stream, struct kvm_vm *vm, uint8_t indent);
85
86/*
87 * VM VCPU Dump
88 *
89 * Input Args:
90 *   stream - Output FILE stream
91 *   vm     - Virtual Machine
92 *   vcpuid - VCPU ID
93 *   indent - Left margin indent amount
94 *
95 * Output Args: None
96 *
97 * Return: None
98 *
99 * Dumps the current state of the VCPU specified by @vcpuid, within the VM
100 * given by @vm, to the FILE stream given by @stream.
101 */
102void vcpu_dump(FILE *stream, struct kvm_vm *vm, uint32_t vcpuid,
103	       uint8_t indent);
104
105void vm_create_irqchip(struct kvm_vm *vm);
106
107void vm_userspace_mem_region_add(struct kvm_vm *vm,
108	enum vm_mem_backing_src_type src_type,
109	uint64_t guest_paddr, uint32_t slot, uint64_t npages,
110	uint32_t flags);
111
112void vcpu_ioctl(struct kvm_vm *vm, uint32_t vcpuid, unsigned long ioctl,
113		void *arg);
114int _vcpu_ioctl(struct kvm_vm *vm, uint32_t vcpuid, unsigned long ioctl,
115		void *arg);
116void vm_ioctl(struct kvm_vm *vm, unsigned long ioctl, void *arg);
117void vm_mem_region_set_flags(struct kvm_vm *vm, uint32_t slot, uint32_t flags);
118void vm_mem_region_move(struct kvm_vm *vm, uint32_t slot, uint64_t new_gpa);
119void vm_mem_region_delete(struct kvm_vm *vm, uint32_t slot);
120void vm_vcpu_add(struct kvm_vm *vm, uint32_t vcpuid);
121vm_vaddr_t vm_vaddr_alloc(struct kvm_vm *vm, size_t sz, vm_vaddr_t vaddr_min,
122			  uint32_t data_memslot, uint32_t pgd_memslot);
123void virt_map(struct kvm_vm *vm, uint64_t vaddr, uint64_t paddr,
124	      unsigned int npages, uint32_t pgd_memslot);
125void *addr_gpa2hva(struct kvm_vm *vm, vm_paddr_t gpa);
126void *addr_gva2hva(struct kvm_vm *vm, vm_vaddr_t gva);
127vm_paddr_t addr_hva2gpa(struct kvm_vm *vm, void *hva);
128
129/*
130 * Address Guest Virtual to Guest Physical
131 *
132 * Input Args:
133 *   vm - Virtual Machine
134 *   gva - VM virtual address
135 *
136 * Output Args: None
137 *
138 * Return:
139 *   Equivalent VM physical address
140 *
141 * Returns the VM physical address of the translated VM virtual
142 * address given by @gva.
143 */
144vm_paddr_t addr_gva2gpa(struct kvm_vm *vm, vm_vaddr_t gva);
145
146struct kvm_run *vcpu_state(struct kvm_vm *vm, uint32_t vcpuid);
147void vcpu_run(struct kvm_vm *vm, uint32_t vcpuid);
148int _vcpu_run(struct kvm_vm *vm, uint32_t vcpuid);
149void vcpu_run_complete_io(struct kvm_vm *vm, uint32_t vcpuid);
150void vcpu_set_guest_debug(struct kvm_vm *vm, uint32_t vcpuid,
151			  struct kvm_guest_debug *debug);
152void vcpu_set_mp_state(struct kvm_vm *vm, uint32_t vcpuid,
153		       struct kvm_mp_state *mp_state);
154struct kvm_reg_list *vcpu_get_reg_list(struct kvm_vm *vm, uint32_t vcpuid);
155void vcpu_regs_get(struct kvm_vm *vm, uint32_t vcpuid, struct kvm_regs *regs);
156void vcpu_regs_set(struct kvm_vm *vm, uint32_t vcpuid, struct kvm_regs *regs);
157
158/*
159 * VM VCPU Args Set
160 *
161 * Input Args:
162 *   vm - Virtual Machine
163 *   vcpuid - VCPU ID
164 *   num - number of arguments
165 *   ... - arguments, each of type uint64_t
166 *
167 * Output Args: None
168 *
169 * Return: None
170 *
171 * Sets the first @num function input registers of the VCPU with @vcpuid,
172 * per the C calling convention of the architecture, to the values given
173 * as variable args. Each of the variable args is expected to be of type
174 * uint64_t. The maximum @num can be is specific to the architecture.
175 */
176void vcpu_args_set(struct kvm_vm *vm, uint32_t vcpuid, unsigned int num, ...);
177
178void vcpu_sregs_get(struct kvm_vm *vm, uint32_t vcpuid,
179		    struct kvm_sregs *sregs);
180void vcpu_sregs_set(struct kvm_vm *vm, uint32_t vcpuid,
181		    struct kvm_sregs *sregs);
182int _vcpu_sregs_set(struct kvm_vm *vm, uint32_t vcpuid,
183		    struct kvm_sregs *sregs);
184void vcpu_fpu_get(struct kvm_vm *vm, uint32_t vcpuid,
185		  struct kvm_fpu *fpu);
186void vcpu_fpu_set(struct kvm_vm *vm, uint32_t vcpuid,
187		  struct kvm_fpu *fpu);
188void vcpu_get_reg(struct kvm_vm *vm, uint32_t vcpuid, struct kvm_one_reg *reg);
189void vcpu_set_reg(struct kvm_vm *vm, uint32_t vcpuid, struct kvm_one_reg *reg);
190#ifdef __KVM_HAVE_VCPU_EVENTS
191void vcpu_events_get(struct kvm_vm *vm, uint32_t vcpuid,
192		     struct kvm_vcpu_events *events);
193void vcpu_events_set(struct kvm_vm *vm, uint32_t vcpuid,
194		     struct kvm_vcpu_events *events);
195#endif
196#ifdef __x86_64__
197void vcpu_nested_state_get(struct kvm_vm *vm, uint32_t vcpuid,
198			   struct kvm_nested_state *state);
199int vcpu_nested_state_set(struct kvm_vm *vm, uint32_t vcpuid,
200			  struct kvm_nested_state *state, bool ignore_error);
201#endif
202
203const char *exit_reason_str(unsigned int exit_reason);
204
205void virt_pgd_alloc(struct kvm_vm *vm, uint32_t pgd_memslot);
206
207/*
208 * VM Virtual Page Map
209 *
210 * Input Args:
211 *   vm - Virtual Machine
212 *   vaddr - VM Virtual Address
213 *   paddr - VM Physical Address
214 *   memslot - Memory region slot for new virtual translation tables
215 *
216 * Output Args: None
217 *
218 * Return: None
219 *
220 * Within @vm, creates a virtual translation for the page starting
221 * at @vaddr to the page starting at @paddr.
222 */
223void virt_pg_map(struct kvm_vm *vm, uint64_t vaddr, uint64_t paddr,
224		 uint32_t memslot);
225
226vm_paddr_t vm_phy_page_alloc(struct kvm_vm *vm, vm_paddr_t paddr_min,
227			     uint32_t memslot);
228vm_paddr_t vm_phy_pages_alloc(struct kvm_vm *vm, size_t num,
229			      vm_paddr_t paddr_min, uint32_t memslot);
230
231/*
232 * Create a VM with reasonable defaults
233 *
234 * Input Args:
235 *   vcpuid - The id of the single VCPU to add to the VM.
236 *   extra_mem_pages - The number of extra pages to add (this will
237 *                     decide how much extra space we will need to
238 *                     setup the page tables using memslot 0)
239 *   guest_code - The vCPU's entry point
240 *
241 * Output Args: None
242 *
243 * Return:
244 *   Pointer to opaque structure that describes the created VM.
245 */
246struct kvm_vm *vm_create_default(uint32_t vcpuid, uint64_t extra_mem_pages,
247				 void *guest_code);
248
249/*
250 * Adds a vCPU with reasonable defaults (e.g. a stack)
251 *
252 * Input Args:
253 *   vm - Virtual Machine
254 *   vcpuid - The id of the VCPU to add to the VM.
255 *   guest_code - The vCPU's entry point
256 */
257void vm_vcpu_add_default(struct kvm_vm *vm, uint32_t vcpuid, void *guest_code);
258
259bool vm_is_unrestricted_guest(struct kvm_vm *vm);
260
261unsigned int vm_get_page_size(struct kvm_vm *vm);
262unsigned int vm_get_page_shift(struct kvm_vm *vm);
263unsigned int vm_get_max_gfn(struct kvm_vm *vm);
264int vm_get_fd(struct kvm_vm *vm);
265
266unsigned int vm_calc_num_guest_pages(enum vm_guest_mode mode, size_t size);
267unsigned int vm_num_host_pages(enum vm_guest_mode mode, unsigned int num_guest_pages);
268unsigned int vm_num_guest_pages(enum vm_guest_mode mode, unsigned int num_host_pages);
269static inline unsigned int
270vm_adjust_num_guest_pages(enum vm_guest_mode mode, unsigned int num_guest_pages)
271{
272	unsigned int n;
273	n = vm_num_guest_pages(mode, vm_num_host_pages(mode, num_guest_pages));
274#ifdef __s390x__
275	/* s390 requires 1M aligned guest sizes */
276	n = (n + 255) & ~255;
277#endif
278	return n;
279}
280
281struct kvm_userspace_memory_region *
282kvm_userspace_memory_region_find(struct kvm_vm *vm, uint64_t start,
283				 uint64_t end);
284
285struct kvm_dirty_log *
286allocate_kvm_dirty_log(struct kvm_userspace_memory_region *region);
287
288int vm_create_device(struct kvm_vm *vm, struct kvm_create_device *cd);
289
290#define sync_global_to_guest(vm, g) ({				\
291	typeof(g) *_p = addr_gva2hva(vm, (vm_vaddr_t)&(g));	\
292	memcpy(_p, &(g), sizeof(g));				\
293})
294
295#define sync_global_from_guest(vm, g) ({			\
296	typeof(g) *_p = addr_gva2hva(vm, (vm_vaddr_t)&(g));	\
297	memcpy(&(g), _p, sizeof(g));				\
298})
299
300void assert_on_unhandled_exception(struct kvm_vm *vm, uint32_t vcpuid);
301
302/* Common ucalls */
303enum {
304	UCALL_NONE,
305	UCALL_SYNC,
306	UCALL_ABORT,
307	UCALL_DONE,
308};
309
310#define UCALL_MAX_ARGS 6
311
312struct ucall {
313	uint64_t cmd;
314	uint64_t args[UCALL_MAX_ARGS];
315};
316
317void ucall_init(struct kvm_vm *vm, void *arg);
318void ucall_uninit(struct kvm_vm *vm);
319void ucall(uint64_t cmd, int nargs, ...);
320uint64_t get_ucall(struct kvm_vm *vm, uint32_t vcpu_id, struct ucall *uc);
321
322#define GUEST_SYNC_ARGS(stage, arg1, arg2, arg3, arg4)	\
323				ucall(UCALL_SYNC, 6, "hello", stage, arg1, arg2, arg3, arg4)
324#define GUEST_SYNC(stage)	ucall(UCALL_SYNC, 2, "hello", stage)
325#define GUEST_DONE()		ucall(UCALL_DONE, 0)
326#define __GUEST_ASSERT(_condition, _nargs, _args...) do {	\
327	if (!(_condition))					\
328		ucall(UCALL_ABORT, 2 + _nargs,			\
329			"Failed guest assert: "			\
330			#_condition, __LINE__, _args);		\
331} while (0)
332
333#define GUEST_ASSERT(_condition) \
334	__GUEST_ASSERT((_condition), 0, 0)
335
336#define GUEST_ASSERT_1(_condition, arg1) \
337	__GUEST_ASSERT((_condition), 1, (arg1))
338
339#define GUEST_ASSERT_2(_condition, arg1, arg2) \
340	__GUEST_ASSERT((_condition), 2, (arg1), (arg2))
341
342#define GUEST_ASSERT_3(_condition, arg1, arg2, arg3) \
343	__GUEST_ASSERT((_condition), 3, (arg1), (arg2), (arg3))
344
345#define GUEST_ASSERT_4(_condition, arg1, arg2, arg3, arg4) \
346	__GUEST_ASSERT((_condition), 4, (arg1), (arg2), (arg3), (arg4))
347
348#endif /* SELFTEST_KVM_UTIL_H */
349