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