cachepc-qemu

Fork of AMDESE/qemu with changes for cachepc side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-qemu
Log | Files | Refs | Submodules | LICENSE | sfeed.txt

kvm.h (18186B)


      1/*
      2 * QEMU KVM support
      3 *
      4 * Copyright IBM, Corp. 2008
      5 *
      6 * Authors:
      7 *  Anthony Liguori   <aliguori@us.ibm.com>
      8 *
      9 * This work is licensed under the terms of the GNU GPL, version 2 or later.
     10 * See the COPYING file in the top-level directory.
     11 *
     12 */
     13
     14#ifndef QEMU_KVM_H
     15#define QEMU_KVM_H
     16
     17#include "qemu/queue.h"
     18#include "hw/core/cpu.h"
     19#include "exec/memattrs.h"
     20#include "qemu/accel.h"
     21#include "qom/object.h"
     22
     23#ifdef NEED_CPU_H
     24# ifdef CONFIG_KVM
     25#  include <linux/kvm.h>
     26#  define CONFIG_KVM_IS_POSSIBLE
     27# endif
     28#else
     29# define CONFIG_KVM_IS_POSSIBLE
     30#endif
     31
     32#ifdef CONFIG_KVM_IS_POSSIBLE
     33
     34extern bool kvm_allowed;
     35extern bool kvm_kernel_irqchip;
     36extern bool kvm_split_irqchip;
     37extern bool kvm_async_interrupts_allowed;
     38extern bool kvm_halt_in_kernel_allowed;
     39extern bool kvm_eventfds_allowed;
     40extern bool kvm_irqfds_allowed;
     41extern bool kvm_resamplefds_allowed;
     42extern bool kvm_msi_via_irqfd_allowed;
     43extern bool kvm_gsi_routing_allowed;
     44extern bool kvm_gsi_direct_mapping;
     45extern bool kvm_readonly_mem_allowed;
     46extern bool kvm_direct_msi_allowed;
     47extern bool kvm_ioeventfd_any_length_allowed;
     48extern bool kvm_msi_use_devid;
     49
     50#define kvm_enabled()           (kvm_allowed)
     51/**
     52 * kvm_irqchip_in_kernel:
     53 *
     54 * Returns: true if an in-kernel irqchip was created.
     55 * What this actually means is architecture and machine model
     56 * specific: on PC, for instance, it means that the LAPIC
     57 * is in kernel.  This function should never be used from generic
     58 * target-independent code: use one of the following functions or
     59 * some other specific check instead.
     60 */
     61#define kvm_irqchip_in_kernel() (kvm_kernel_irqchip)
     62
     63/**
     64 * kvm_irqchip_is_split:
     65 *
     66 * Returns: true if the irqchip implementation is split between
     67 * user and kernel space.  The details are architecture and
     68 * machine specific.  On PC, it means that the PIC, IOAPIC, and
     69 * PIT are in user space while the LAPIC is in the kernel.
     70 */
     71#define kvm_irqchip_is_split() (kvm_split_irqchip)
     72
     73/**
     74 * kvm_async_interrupts_enabled:
     75 *
     76 * Returns: true if we can deliver interrupts to KVM
     77 * asynchronously (ie by ioctl from any thread at any time)
     78 * rather than having to do interrupt delivery synchronously
     79 * (where the vcpu must be stopped at a suitable point first).
     80 */
     81#define kvm_async_interrupts_enabled() (kvm_async_interrupts_allowed)
     82
     83/**
     84 * kvm_halt_in_kernel
     85 *
     86 * Returns: true if halted cpus should still get a KVM_RUN ioctl to run
     87 * inside of kernel space. This only works if MP state is implemented.
     88 */
     89#define kvm_halt_in_kernel() (kvm_halt_in_kernel_allowed)
     90
     91/**
     92 * kvm_eventfds_enabled:
     93 *
     94 * Returns: true if we can use eventfds to receive notifications
     95 * from a KVM CPU (ie the kernel supports eventds and we are running
     96 * with a configuration where it is meaningful to use them).
     97 */
     98#define kvm_eventfds_enabled() (kvm_eventfds_allowed)
     99
    100/**
    101 * kvm_irqfds_enabled:
    102 *
    103 * Returns: true if we can use irqfds to inject interrupts into
    104 * a KVM CPU (ie the kernel supports irqfds and we are running
    105 * with a configuration where it is meaningful to use them).
    106 */
    107#define kvm_irqfds_enabled() (kvm_irqfds_allowed)
    108
    109/**
    110 * kvm_resamplefds_enabled:
    111 *
    112 * Returns: true if we can use resamplefds to inject interrupts into
    113 * a KVM CPU (ie the kernel supports resamplefds and we are running
    114 * with a configuration where it is meaningful to use them).
    115 */
    116#define kvm_resamplefds_enabled() (kvm_resamplefds_allowed)
    117
    118/**
    119 * kvm_msi_via_irqfd_enabled:
    120 *
    121 * Returns: true if we can route a PCI MSI (Message Signaled Interrupt)
    122 * to a KVM CPU via an irqfd. This requires that the kernel supports
    123 * this and that we're running in a configuration that permits it.
    124 */
    125#define kvm_msi_via_irqfd_enabled() (kvm_msi_via_irqfd_allowed)
    126
    127/**
    128 * kvm_gsi_routing_enabled:
    129 *
    130 * Returns: true if GSI routing is enabled (ie the kernel supports
    131 * it and we're running in a configuration that permits it).
    132 */
    133#define kvm_gsi_routing_enabled() (kvm_gsi_routing_allowed)
    134
    135/**
    136 * kvm_gsi_direct_mapping:
    137 *
    138 * Returns: true if GSI direct mapping is enabled.
    139 */
    140#define kvm_gsi_direct_mapping() (kvm_gsi_direct_mapping)
    141
    142/**
    143 * kvm_readonly_mem_enabled:
    144 *
    145 * Returns: true if KVM readonly memory is enabled (ie the kernel
    146 * supports it and we're running in a configuration that permits it).
    147 */
    148#define kvm_readonly_mem_enabled() (kvm_readonly_mem_allowed)
    149
    150/**
    151 * kvm_direct_msi_enabled:
    152 *
    153 * Returns: true if KVM allows direct MSI injection.
    154 */
    155#define kvm_direct_msi_enabled() (kvm_direct_msi_allowed)
    156
    157/**
    158 * kvm_ioeventfd_any_length_enabled:
    159 * Returns: true if KVM allows any length io eventfd.
    160 */
    161#define kvm_ioeventfd_any_length_enabled() (kvm_ioeventfd_any_length_allowed)
    162
    163/**
    164 * kvm_msi_devid_required:
    165 * Returns: true if KVM requires a device id to be provided while
    166 * defining an MSI routing entry.
    167 */
    168#define kvm_msi_devid_required() (kvm_msi_use_devid)
    169
    170#else
    171
    172#define kvm_enabled()           (0)
    173#define kvm_irqchip_in_kernel() (false)
    174#define kvm_irqchip_is_split() (false)
    175#define kvm_async_interrupts_enabled() (false)
    176#define kvm_halt_in_kernel() (false)
    177#define kvm_eventfds_enabled() (false)
    178#define kvm_irqfds_enabled() (false)
    179#define kvm_resamplefds_enabled() (false)
    180#define kvm_msi_via_irqfd_enabled() (false)
    181#define kvm_gsi_routing_allowed() (false)
    182#define kvm_gsi_direct_mapping() (false)
    183#define kvm_readonly_mem_enabled() (false)
    184#define kvm_direct_msi_enabled() (false)
    185#define kvm_ioeventfd_any_length_enabled() (false)
    186#define kvm_msi_devid_required() (false)
    187
    188#endif  /* CONFIG_KVM_IS_POSSIBLE */
    189
    190struct kvm_run;
    191struct kvm_lapic_state;
    192struct kvm_irq_routing_entry;
    193
    194typedef struct KVMCapabilityInfo {
    195    const char *name;
    196    int value;
    197} KVMCapabilityInfo;
    198
    199#define KVM_CAP_INFO(CAP) { "KVM_CAP_" stringify(CAP), KVM_CAP_##CAP }
    200#define KVM_CAP_LAST_INFO { NULL, 0 }
    201
    202struct KVMState;
    203
    204#define TYPE_KVM_ACCEL ACCEL_CLASS_NAME("kvm")
    205typedef struct KVMState KVMState;
    206DECLARE_INSTANCE_CHECKER(KVMState, KVM_STATE,
    207                         TYPE_KVM_ACCEL)
    208
    209extern KVMState *kvm_state;
    210typedef struct Notifier Notifier;
    211
    212/* external API */
    213
    214bool kvm_has_free_slot(MachineState *ms);
    215bool kvm_has_sync_mmu(void);
    216int kvm_has_vcpu_events(void);
    217int kvm_has_robust_singlestep(void);
    218int kvm_has_debugregs(void);
    219int kvm_max_nested_state_length(void);
    220int kvm_has_pit_state2(void);
    221int kvm_has_many_ioeventfds(void);
    222int kvm_has_gsi_routing(void);
    223int kvm_has_intx_set_mask(void);
    224
    225/**
    226 * kvm_arm_supports_user_irq
    227 *
    228 * Not all KVM implementations support notifications for kernel generated
    229 * interrupt events to user space. This function indicates whether the current
    230 * KVM implementation does support them.
    231 *
    232 * Returns: true if KVM supports using kernel generated IRQs from user space
    233 */
    234bool kvm_arm_supports_user_irq(void);
    235
    236
    237#ifdef NEED_CPU_H
    238#include "cpu.h"
    239
    240void kvm_flush_coalesced_mmio_buffer(void);
    241
    242int kvm_insert_breakpoint(CPUState *cpu, target_ulong addr,
    243                          target_ulong len, int type);
    244int kvm_remove_breakpoint(CPUState *cpu, target_ulong addr,
    245                          target_ulong len, int type);
    246void kvm_remove_all_breakpoints(CPUState *cpu);
    247int kvm_update_guest_debug(CPUState *cpu, unsigned long reinject_trap);
    248
    249int kvm_on_sigbus_vcpu(CPUState *cpu, int code, void *addr);
    250int kvm_on_sigbus(int code, void *addr);
    251
    252/* internal API */
    253
    254int kvm_ioctl(KVMState *s, int type, ...);
    255
    256int kvm_vm_ioctl(KVMState *s, int type, ...);
    257
    258int kvm_vcpu_ioctl(CPUState *cpu, int type, ...);
    259
    260/**
    261 * kvm_device_ioctl - call an ioctl on a kvm device
    262 * @fd: The KVM device file descriptor as returned from KVM_CREATE_DEVICE
    263 * @type: The device-ctrl ioctl number
    264 *
    265 * Returns: -errno on error, nonnegative on success
    266 */
    267int kvm_device_ioctl(int fd, int type, ...);
    268
    269/**
    270 * kvm_vm_check_attr - check for existence of a specific vm attribute
    271 * @s: The KVMState pointer
    272 * @group: the group
    273 * @attr: the attribute of that group to query for
    274 *
    275 * Returns: 1 if the attribute exists
    276 *          0 if the attribute either does not exist or if the vm device
    277 *            interface is unavailable
    278 */
    279int kvm_vm_check_attr(KVMState *s, uint32_t group, uint64_t attr);
    280
    281/**
    282 * kvm_device_check_attr - check for existence of a specific device attribute
    283 * @fd: The device file descriptor
    284 * @group: the group
    285 * @attr: the attribute of that group to query for
    286 *
    287 * Returns: 1 if the attribute exists
    288 *          0 if the attribute either does not exist or if the vm device
    289 *            interface is unavailable
    290 */
    291int kvm_device_check_attr(int fd, uint32_t group, uint64_t attr);
    292
    293/**
    294 * kvm_device_access - set or get value of a specific device attribute
    295 * @fd: The device file descriptor
    296 * @group: the group
    297 * @attr: the attribute of that group to set or get
    298 * @val: pointer to a storage area for the value
    299 * @write: true for set and false for get operation
    300 * @errp: error object handle
    301 *
    302 * Returns: 0 on success
    303 *          < 0 on error
    304 * Use kvm_device_check_attr() in order to check for the availability
    305 * of optional attributes.
    306 */
    307int kvm_device_access(int fd, int group, uint64_t attr,
    308                      void *val, bool write, Error **errp);
    309
    310/**
    311 * kvm_create_device - create a KVM device for the device control API
    312 * @KVMState: The KVMState pointer
    313 * @type: The KVM device type (see Documentation/virtual/kvm/devices in the
    314 *        kernel source)
    315 * @test: If true, only test if device can be created, but don't actually
    316 *        create the device.
    317 *
    318 * Returns: -errno on error, nonnegative on success: @test ? 0 : device fd;
    319 */
    320int kvm_create_device(KVMState *s, uint64_t type, bool test);
    321
    322/**
    323 * kvm_device_supported - probe whether KVM supports specific device
    324 *
    325 * @vmfd: The fd handler for VM
    326 * @type: type of device
    327 *
    328 * @return: true if supported, otherwise false.
    329 */
    330bool kvm_device_supported(int vmfd, uint64_t type);
    331
    332/* Arch specific hooks */
    333
    334extern const KVMCapabilityInfo kvm_arch_required_capabilities[];
    335
    336void kvm_arch_pre_run(CPUState *cpu, struct kvm_run *run);
    337MemTxAttrs kvm_arch_post_run(CPUState *cpu, struct kvm_run *run);
    338
    339int kvm_arch_handle_exit(CPUState *cpu, struct kvm_run *run);
    340
    341int kvm_arch_process_async_events(CPUState *cpu);
    342
    343int kvm_arch_get_registers(CPUState *cpu);
    344
    345/* state subset only touched by the VCPU itself during runtime */
    346#define KVM_PUT_RUNTIME_STATE   1
    347/* state subset modified during VCPU reset */
    348#define KVM_PUT_RESET_STATE     2
    349/* full state set, modified during initialization or on vmload */
    350#define KVM_PUT_FULL_STATE      3
    351
    352int kvm_arch_put_registers(CPUState *cpu, int level);
    353
    354int kvm_arch_init(MachineState *ms, KVMState *s);
    355
    356int kvm_arch_init_vcpu(CPUState *cpu);
    357int kvm_arch_destroy_vcpu(CPUState *cpu);
    358
    359bool kvm_vcpu_id_is_valid(int vcpu_id);
    360
    361/* Returns VCPU ID to be used on KVM_CREATE_VCPU ioctl() */
    362unsigned long kvm_arch_vcpu_id(CPUState *cpu);
    363
    364#ifdef KVM_HAVE_MCE_INJECTION
    365void kvm_arch_on_sigbus_vcpu(CPUState *cpu, int code, void *addr);
    366#endif
    367
    368void kvm_arch_init_irq_routing(KVMState *s);
    369
    370int kvm_arch_fixup_msi_route(struct kvm_irq_routing_entry *route,
    371                             uint64_t address, uint32_t data, PCIDevice *dev);
    372
    373/* Notify arch about newly added MSI routes */
    374int kvm_arch_add_msi_route_post(struct kvm_irq_routing_entry *route,
    375                                int vector, PCIDevice *dev);
    376/* Notify arch about released MSI routes */
    377int kvm_arch_release_virq_post(int virq);
    378
    379int kvm_arch_msi_data_to_gsi(uint32_t data);
    380
    381int kvm_set_irq(KVMState *s, int irq, int level);
    382int kvm_irqchip_send_msi(KVMState *s, MSIMessage msg);
    383
    384void kvm_irqchip_add_irq_route(KVMState *s, int gsi, int irqchip, int pin);
    385
    386void kvm_irqchip_add_change_notifier(Notifier *n);
    387void kvm_irqchip_remove_change_notifier(Notifier *n);
    388void kvm_irqchip_change_notify(void);
    389
    390void kvm_get_apic_state(DeviceState *d, struct kvm_lapic_state *kapic);
    391
    392struct kvm_guest_debug;
    393struct kvm_debug_exit_arch;
    394
    395struct kvm_sw_breakpoint {
    396    target_ulong pc;
    397    target_ulong saved_insn;
    398    int use_count;
    399    QTAILQ_ENTRY(kvm_sw_breakpoint) entry;
    400};
    401
    402struct kvm_sw_breakpoint *kvm_find_sw_breakpoint(CPUState *cpu,
    403                                                 target_ulong pc);
    404
    405int kvm_sw_breakpoints_active(CPUState *cpu);
    406
    407int kvm_arch_insert_sw_breakpoint(CPUState *cpu,
    408                                  struct kvm_sw_breakpoint *bp);
    409int kvm_arch_remove_sw_breakpoint(CPUState *cpu,
    410                                  struct kvm_sw_breakpoint *bp);
    411int kvm_arch_insert_hw_breakpoint(target_ulong addr,
    412                                  target_ulong len, int type);
    413int kvm_arch_remove_hw_breakpoint(target_ulong addr,
    414                                  target_ulong len, int type);
    415void kvm_arch_remove_all_hw_breakpoints(void);
    416
    417void kvm_arch_update_guest_debug(CPUState *cpu, struct kvm_guest_debug *dbg);
    418
    419bool kvm_arch_stop_on_emulation_error(CPUState *cpu);
    420
    421int kvm_check_extension(KVMState *s, unsigned int extension);
    422
    423int kvm_vm_check_extension(KVMState *s, unsigned int extension);
    424
    425#define kvm_vm_enable_cap(s, capability, cap_flags, ...)             \
    426    ({                                                               \
    427        struct kvm_enable_cap cap = {                                \
    428            .cap = capability,                                       \
    429            .flags = cap_flags,                                      \
    430        };                                                           \
    431        uint64_t args_tmp[] = { __VA_ARGS__ };                       \
    432        size_t n = MIN(ARRAY_SIZE(args_tmp), ARRAY_SIZE(cap.args));  \
    433        memcpy(cap.args, args_tmp, n * sizeof(cap.args[0]));         \
    434        kvm_vm_ioctl(s, KVM_ENABLE_CAP, &cap);                       \
    435    })
    436
    437#define kvm_vcpu_enable_cap(cpu, capability, cap_flags, ...)         \
    438    ({                                                               \
    439        struct kvm_enable_cap cap = {                                \
    440            .cap = capability,                                       \
    441            .flags = cap_flags,                                      \
    442        };                                                           \
    443        uint64_t args_tmp[] = { __VA_ARGS__ };                       \
    444        size_t n = MIN(ARRAY_SIZE(args_tmp), ARRAY_SIZE(cap.args));  \
    445        memcpy(cap.args, args_tmp, n * sizeof(cap.args[0]));         \
    446        kvm_vcpu_ioctl(cpu, KVM_ENABLE_CAP, &cap);                   \
    447    })
    448
    449uint32_t kvm_arch_get_supported_cpuid(KVMState *env, uint32_t function,
    450                                      uint32_t index, int reg);
    451uint64_t kvm_arch_get_supported_msr_feature(KVMState *s, uint32_t index);
    452
    453
    454void kvm_set_sigmask_len(KVMState *s, unsigned int sigmask_len);
    455
    456#if !defined(CONFIG_USER_ONLY)
    457int kvm_physical_memory_addr_from_host(KVMState *s, void *ram_addr,
    458                                       hwaddr *phys_addr);
    459#endif
    460
    461#endif /* NEED_CPU_H */
    462
    463void kvm_cpu_synchronize_state(CPUState *cpu);
    464
    465void kvm_init_cpu_signals(CPUState *cpu);
    466
    467/**
    468 * kvm_irqchip_add_msi_route - Add MSI route for specific vector
    469 * @s:      KVM state
    470 * @vector: which vector to add. This can be either MSI/MSIX
    471 *          vector. The function will automatically detect whether
    472 *          MSI/MSIX is enabled, and fetch corresponding MSI
    473 *          message.
    474 * @dev:    Owner PCI device to add the route. If @dev is specified
    475 *          as @NULL, an empty MSI message will be inited.
    476 * @return: virq (>=0) when success, errno (<0) when failed.
    477 */
    478int kvm_irqchip_add_msi_route(KVMState *s, int vector, PCIDevice *dev);
    479int kvm_irqchip_update_msi_route(KVMState *s, int virq, MSIMessage msg,
    480                                 PCIDevice *dev);
    481void kvm_irqchip_commit_routes(KVMState *s);
    482void kvm_irqchip_release_virq(KVMState *s, int virq);
    483
    484int kvm_irqchip_add_adapter_route(KVMState *s, AdapterInfo *adapter);
    485int kvm_irqchip_add_hv_sint_route(KVMState *s, uint32_t vcpu, uint32_t sint);
    486
    487int kvm_irqchip_add_irqfd_notifier_gsi(KVMState *s, EventNotifier *n,
    488                                       EventNotifier *rn, int virq);
    489int kvm_irqchip_remove_irqfd_notifier_gsi(KVMState *s, EventNotifier *n,
    490                                          int virq);
    491int kvm_irqchip_add_irqfd_notifier(KVMState *s, EventNotifier *n,
    492                                   EventNotifier *rn, qemu_irq irq);
    493int kvm_irqchip_remove_irqfd_notifier(KVMState *s, EventNotifier *n,
    494                                      qemu_irq irq);
    495void kvm_irqchip_set_qemuirq_gsi(KVMState *s, qemu_irq irq, int gsi);
    496void kvm_pc_setup_irq_routing(bool pci_enabled);
    497void kvm_init_irq_routing(KVMState *s);
    498
    499bool kvm_kernel_irqchip_allowed(void);
    500bool kvm_kernel_irqchip_required(void);
    501bool kvm_kernel_irqchip_split(void);
    502
    503/**
    504 * kvm_arch_irqchip_create:
    505 * @KVMState: The KVMState pointer
    506 *
    507 * Allow architectures to create an in-kernel irq chip themselves.
    508 *
    509 * Returns: < 0: error
    510 *            0: irq chip was not created
    511 *          > 0: irq chip was created
    512 */
    513int kvm_arch_irqchip_create(KVMState *s);
    514
    515/**
    516 * kvm_set_one_reg - set a register value in KVM via KVM_SET_ONE_REG ioctl
    517 * @id: The register ID
    518 * @source: The pointer to the value to be set. It must point to a variable
    519 *          of the correct type/size for the register being accessed.
    520 *
    521 * Returns: 0 on success, or a negative errno on failure.
    522 */
    523int kvm_set_one_reg(CPUState *cs, uint64_t id, void *source);
    524
    525/**
    526 * kvm_get_one_reg - get a register value from KVM via KVM_GET_ONE_REG ioctl
    527 * @id: The register ID
    528 * @target: The pointer where the value is to be stored. It must point to a
    529 *          variable of the correct type/size for the register being accessed.
    530 *
    531 * Returns: 0 on success, or a negative errno on failure.
    532 */
    533int kvm_get_one_reg(CPUState *cs, uint64_t id, void *target);
    534struct ppc_radix_page_info *kvm_get_radix_page_info(void);
    535int kvm_get_max_memslots(void);
    536
    537/* Notify resamplefd for EOI of specific interrupts. */
    538void kvm_resample_fd_notify(int gsi);
    539
    540/**
    541 * kvm_cpu_check_are_resettable - return whether CPUs can be reset
    542 *
    543 * Returns: true: CPUs are resettable
    544 *          false: CPUs are not resettable
    545 */
    546bool kvm_cpu_check_are_resettable(void);
    547
    548bool kvm_arch_cpu_check_are_resettable(void);
    549
    550#endif