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