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_MAX_VCPUS 512
  20
  21/*
  22 * Callers of kvm_util only have an incomplete/opaque description of the
  23 * structure kvm_util is using to maintain the state of a VM.
  24 */
  25struct kvm_vm;
  26
  27typedef uint64_t vm_paddr_t; /* Virtual Machine (Guest) physical address */
  28typedef uint64_t vm_vaddr_t; /* Virtual Machine (Guest) virtual address */
  29
  30/* Minimum allocated guest virtual and physical addresses */
  31#define KVM_UTIL_MIN_VADDR              0x2000
  32
  33#define DEFAULT_GUEST_PHY_PAGES         512
  34#define DEFAULT_GUEST_STACK_VADDR_MIN   0xab6000
  35#define DEFAULT_STACK_PGS               5
  36
  37enum vm_guest_mode {
  38        VM_MODE_P52V48_4K,
  39        VM_MODE_P52V48_64K,
  40        VM_MODE_P48V48_4K,
  41        VM_MODE_P48V48_64K,
  42        VM_MODE_P40V48_4K,
  43        VM_MODE_P40V48_64K,
  44        VM_MODE_PXXV48_4K,      /* For 48bits VA but ANY bits PA */
  45        NUM_VM_MODES,
  46};
  47
  48#if defined(__aarch64__)
  49
  50#define VM_MODE_DEFAULT                 VM_MODE_P40V48_4K
  51#define MIN_PAGE_SHIFT                  12U
  52#define ptes_per_page(page_size)        ((page_size) / 8)
  53
  54#elif defined(__x86_64__)
  55
  56#define VM_MODE_DEFAULT                 VM_MODE_PXXV48_4K
  57#define MIN_PAGE_SHIFT                  12U
  58#define ptes_per_page(page_size)        ((page_size) / 8)
  59
  60#elif defined(__s390x__)
  61
  62#define VM_MODE_DEFAULT                 VM_MODE_P52V48_4K
  63#define MIN_PAGE_SHIFT                  12U
  64#define ptes_per_page(page_size)        ((page_size) / 16)
  65
  66#endif
  67
  68#define MIN_PAGE_SIZE           (1U << MIN_PAGE_SHIFT)
  69#define PTES_PER_MIN_PAGE       ptes_per_page(MIN_PAGE_SIZE)
  70
  71#define vm_guest_mode_string(m) vm_guest_mode_string[m]
  72extern const char * const vm_guest_mode_string[];
  73
  74struct vm_guest_mode_params {
  75        unsigned int pa_bits;
  76        unsigned int va_bits;
  77        unsigned int page_size;
  78        unsigned int page_shift;
  79};
  80extern const struct vm_guest_mode_params vm_guest_mode_params[];
  81
  82enum vm_mem_backing_src_type {
  83        VM_MEM_SRC_ANONYMOUS,
  84        VM_MEM_SRC_ANONYMOUS_THP,
  85        VM_MEM_SRC_ANONYMOUS_HUGETLB,
  86};
  87
  88int kvm_check_cap(long cap);
  89int vm_enable_cap(struct kvm_vm *vm, struct kvm_enable_cap *cap);
  90int vcpu_enable_cap(struct kvm_vm *vm, uint32_t vcpu_id,
  91                    struct kvm_enable_cap *cap);
  92void vm_enable_dirty_ring(struct kvm_vm *vm, uint32_t ring_size);
  93
  94struct kvm_vm *vm_create(enum vm_guest_mode mode, uint64_t phy_pages, int perm);
  95void kvm_vm_free(struct kvm_vm *vmp);
  96void kvm_vm_restart(struct kvm_vm *vmp, int perm);
  97void kvm_vm_release(struct kvm_vm *vmp);
  98void kvm_vm_get_dirty_log(struct kvm_vm *vm, int slot, void *log);
  99void kvm_vm_clear_dirty_log(struct kvm_vm *vm, int slot, void *log,
 100                            uint64_t first_page, uint32_t num_pages);
 101uint32_t kvm_vm_reset_dirty_ring(struct kvm_vm *vm);
 102
 103int kvm_memcmp_hva_gva(void *hva, struct kvm_vm *vm, const vm_vaddr_t gva,
 104                       size_t len);
 105
 106void kvm_vm_elf_load(struct kvm_vm *vm, const char *filename,
 107                     uint32_t data_memslot, uint32_t pgd_memslot);
 108
 109void vm_dump(FILE *stream, struct kvm_vm *vm, uint8_t indent);
 110
 111/*
 112 * VM VCPU Dump
 113 *
 114 * Input Args:
 115 *   stream - Output FILE stream
 116 *   vm     - Virtual Machine
 117 *   vcpuid - VCPU ID
 118 *   indent - Left margin indent amount
 119 *
 120 * Output Args: None
 121 *
 122 * Return: None
 123 *
 124 * Dumps the current state of the VCPU specified by @vcpuid, within the VM
 125 * given by @vm, to the FILE stream given by @stream.
 126 */
 127void vcpu_dump(FILE *stream, struct kvm_vm *vm, uint32_t vcpuid,
 128               uint8_t indent);
 129
 130void vm_create_irqchip(struct kvm_vm *vm);
 131
 132void vm_userspace_mem_region_add(struct kvm_vm *vm,
 133        enum vm_mem_backing_src_type src_type,
 134        uint64_t guest_paddr, uint32_t slot, uint64_t npages,
 135        uint32_t flags);
 136
 137void vcpu_ioctl(struct kvm_vm *vm, uint32_t vcpuid, unsigned long ioctl,
 138                void *arg);
 139int _vcpu_ioctl(struct kvm_vm *vm, uint32_t vcpuid, unsigned long ioctl,
 140                void *arg);
 141void vm_ioctl(struct kvm_vm *vm, unsigned long ioctl, void *arg);
 142void kvm_ioctl(struct kvm_vm *vm, unsigned long ioctl, void *arg);
 143int _kvm_ioctl(struct kvm_vm *vm, unsigned long ioctl, void *arg);
 144void vm_mem_region_set_flags(struct kvm_vm *vm, uint32_t slot, uint32_t flags);
 145void vm_mem_region_move(struct kvm_vm *vm, uint32_t slot, uint64_t new_gpa);
 146void vm_mem_region_delete(struct kvm_vm *vm, uint32_t slot);
 147void vm_vcpu_add(struct kvm_vm *vm, uint32_t vcpuid);
 148vm_vaddr_t vm_vaddr_alloc(struct kvm_vm *vm, size_t sz, vm_vaddr_t vaddr_min,
 149                          uint32_t data_memslot, uint32_t pgd_memslot);
 150void virt_map(struct kvm_vm *vm, uint64_t vaddr, uint64_t paddr,
 151              unsigned int npages, uint32_t pgd_memslot);
 152void *addr_gpa2hva(struct kvm_vm *vm, vm_paddr_t gpa);
 153void *addr_gva2hva(struct kvm_vm *vm, vm_vaddr_t gva);
 154vm_paddr_t addr_hva2gpa(struct kvm_vm *vm, void *hva);
 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
 232const char *exit_reason_str(unsigned int exit_reason);
 233
 234void virt_pgd_alloc(struct kvm_vm *vm, uint32_t pgd_memslot);
 235
 236/*
 237 * VM Virtual Page Map
 238 *
 239 * Input Args:
 240 *   vm - Virtual Machine
 241 *   vaddr - VM Virtual Address
 242 *   paddr - VM Physical Address
 243 *   memslot - Memory region slot for new virtual translation tables
 244 *
 245 * Output Args: None
 246 *
 247 * Return: None
 248 *
 249 * Within @vm, creates a virtual translation for the page starting
 250 * at @vaddr to the page starting at @paddr.
 251 */
 252void virt_pg_map(struct kvm_vm *vm, uint64_t vaddr, uint64_t paddr,
 253                 uint32_t memslot);
 254
 255vm_paddr_t vm_phy_page_alloc(struct kvm_vm *vm, vm_paddr_t paddr_min,
 256                             uint32_t memslot);
 257vm_paddr_t vm_phy_pages_alloc(struct kvm_vm *vm, size_t num,
 258                              vm_paddr_t paddr_min, uint32_t memslot);
 259
 260/*
 261 * Create a VM with reasonable defaults
 262 *
 263 * Input Args:
 264 *   vcpuid - The id of the single VCPU to add to the VM.
 265 *   extra_mem_pages - The number of extra pages to add (this will
 266 *                     decide how much extra space we will need to
 267 *                     setup the page tables using memslot 0)
 268 *   guest_code - The vCPU's entry point
 269 *
 270 * Output Args: None
 271 *
 272 * Return:
 273 *   Pointer to opaque structure that describes the created VM.
 274 */
 275struct kvm_vm *vm_create_default(uint32_t vcpuid, uint64_t extra_mem_pages,
 276                                 void *guest_code);
 277
 278/* Same as vm_create_default, but can be used for more than one vcpu */
 279struct kvm_vm *vm_create_default_with_vcpus(uint32_t nr_vcpus, uint64_t extra_mem_pages,
 280                                            uint32_t num_percpu_pages, void *guest_code,
 281                                            uint32_t vcpuids[]);
 282
 283/* Like vm_create_default_with_vcpus, but accepts mode as a parameter */
 284struct kvm_vm *vm_create_with_vcpus(enum vm_guest_mode mode, uint32_t nr_vcpus,
 285                                    uint64_t extra_mem_pages, uint32_t num_percpu_pages,
 286                                    void *guest_code, uint32_t vcpuids[]);
 287
 288/*
 289 * Adds a vCPU with reasonable defaults (e.g. a stack)
 290 *
 291 * Input Args:
 292 *   vm - Virtual Machine
 293 *   vcpuid - The id of the VCPU to add to the VM.
 294 *   guest_code - The vCPU's entry point
 295 */
 296void vm_vcpu_add_default(struct kvm_vm *vm, uint32_t vcpuid, void *guest_code);
 297
 298bool vm_is_unrestricted_guest(struct kvm_vm *vm);
 299
 300unsigned int vm_get_page_size(struct kvm_vm *vm);
 301unsigned int vm_get_page_shift(struct kvm_vm *vm);
 302unsigned int vm_get_max_gfn(struct kvm_vm *vm);
 303int vm_get_fd(struct kvm_vm *vm);
 304
 305unsigned int vm_calc_num_guest_pages(enum vm_guest_mode mode, size_t size);
 306unsigned int vm_num_host_pages(enum vm_guest_mode mode, unsigned int num_guest_pages);
 307unsigned int vm_num_guest_pages(enum vm_guest_mode mode, unsigned int num_host_pages);
 308static inline unsigned int
 309vm_adjust_num_guest_pages(enum vm_guest_mode mode, unsigned int num_guest_pages)
 310{
 311        unsigned int n;
 312        n = vm_num_guest_pages(mode, vm_num_host_pages(mode, num_guest_pages));
 313#ifdef __s390x__
 314        /* s390 requires 1M aligned guest sizes */
 315        n = (n + 255) & ~255;
 316#endif
 317        return n;
 318}
 319
 320struct kvm_userspace_memory_region *
 321kvm_userspace_memory_region_find(struct kvm_vm *vm, uint64_t start,
 322                                 uint64_t end);
 323
 324struct kvm_dirty_log *
 325allocate_kvm_dirty_log(struct kvm_userspace_memory_region *region);
 326
 327int vm_create_device(struct kvm_vm *vm, struct kvm_create_device *cd);
 328
 329#define sync_global_to_guest(vm, g) ({                          \
 330        typeof(g) *_p = addr_gva2hva(vm, (vm_vaddr_t)&(g));     \
 331        memcpy(_p, &(g), sizeof(g));                            \
 332})
 333
 334#define sync_global_from_guest(vm, g) ({                        \
 335        typeof(g) *_p = addr_gva2hva(vm, (vm_vaddr_t)&(g));     \
 336        memcpy(&(g), _p, sizeof(g));                            \
 337})
 338
 339void assert_on_unhandled_exception(struct kvm_vm *vm, uint32_t vcpuid);
 340
 341/* Common ucalls */
 342enum {
 343        UCALL_NONE,
 344        UCALL_SYNC,
 345        UCALL_ABORT,
 346        UCALL_DONE,
 347};
 348
 349#define UCALL_MAX_ARGS 6
 350
 351struct ucall {
 352        uint64_t cmd;
 353        uint64_t args[UCALL_MAX_ARGS];
 354};
 355
 356void ucall_init(struct kvm_vm *vm, void *arg);
 357void ucall_uninit(struct kvm_vm *vm);
 358void ucall(uint64_t cmd, int nargs, ...);
 359uint64_t get_ucall(struct kvm_vm *vm, uint32_t vcpu_id, struct ucall *uc);
 360
 361#define GUEST_SYNC_ARGS(stage, arg1, arg2, arg3, arg4)  \
 362                                ucall(UCALL_SYNC, 6, "hello", stage, arg1, arg2, arg3, arg4)
 363#define GUEST_SYNC(stage)       ucall(UCALL_SYNC, 2, "hello", stage)
 364#define GUEST_DONE()            ucall(UCALL_DONE, 0)
 365#define __GUEST_ASSERT(_condition, _nargs, _args...) do {       \
 366        if (!(_condition))                                      \
 367                ucall(UCALL_ABORT, 2 + _nargs,                  \
 368                        "Failed guest assert: "                 \
 369                        #_condition, __LINE__, _args);          \
 370} while (0)
 371
 372#define GUEST_ASSERT(_condition) \
 373        __GUEST_ASSERT((_condition), 0, 0)
 374
 375#define GUEST_ASSERT_1(_condition, arg1) \
 376        __GUEST_ASSERT((_condition), 1, (arg1))
 377
 378#define GUEST_ASSERT_2(_condition, arg1, arg2) \
 379        __GUEST_ASSERT((_condition), 2, (arg1), (arg2))
 380
 381#define GUEST_ASSERT_3(_condition, arg1, arg2, arg3) \
 382        __GUEST_ASSERT((_condition), 3, (arg1), (arg2), (arg3))
 383
 384#define GUEST_ASSERT_4(_condition, arg1, arg2, arg3, arg4) \
 385        __GUEST_ASSERT((_condition), 4, (arg1), (arg2), (arg3), (arg4))
 386
 387#endif /* SELFTEST_KVM_UTIL_H */
 388