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_arm.h (13900B)


      1/*
      2 * QEMU KVM support -- ARM specific functions.
      3 *
      4 * Copyright (c) 2012 Linaro Limited
      5 *
      6 * This work is licensed under the terms of the GNU GPL, version 2 or later.
      7 * See the COPYING file in the top-level directory.
      8 *
      9 */
     10
     11#ifndef QEMU_KVM_ARM_H
     12#define QEMU_KVM_ARM_H
     13
     14#include "sysemu/kvm.h"
     15#include "exec/memory.h"
     16#include "qemu/error-report.h"
     17
     18#define KVM_ARM_VGIC_V2   (1 << 0)
     19#define KVM_ARM_VGIC_V3   (1 << 1)
     20
     21/**
     22 * kvm_arm_vcpu_init:
     23 * @cs: CPUState
     24 *
     25 * Initialize (or reinitialize) the VCPU by invoking the
     26 * KVM_ARM_VCPU_INIT ioctl with the CPU type and feature
     27 * bitmask specified in the CPUState.
     28 *
     29 * Returns: 0 if success else < 0 error code
     30 */
     31int kvm_arm_vcpu_init(CPUState *cs);
     32
     33/**
     34 * kvm_arm_vcpu_finalize:
     35 * @cs: CPUState
     36 * @feature: feature to finalize
     37 *
     38 * Finalizes the configuration of the specified VCPU feature by
     39 * invoking the KVM_ARM_VCPU_FINALIZE ioctl. Features requiring
     40 * this are documented in the "KVM_ARM_VCPU_FINALIZE" section of
     41 * KVM's API documentation.
     42 *
     43 * Returns: 0 if success else < 0 error code
     44 */
     45int kvm_arm_vcpu_finalize(CPUState *cs, int feature);
     46
     47/**
     48 * kvm_arm_register_device:
     49 * @mr: memory region for this device
     50 * @devid: the KVM device ID
     51 * @group: device control API group for setting addresses
     52 * @attr: device control API address type
     53 * @dev_fd: device control device file descriptor (or -1 if not supported)
     54 * @addr_ormask: value to be OR'ed with resolved address
     55 *
     56 * Remember the memory region @mr, and when it is mapped by the
     57 * machine model, tell the kernel that base address using the
     58 * KVM_ARM_SET_DEVICE_ADDRESS ioctl or the newer device control API.  @devid
     59 * should be the ID of the device as defined by KVM_ARM_SET_DEVICE_ADDRESS or
     60 * the arm-vgic device in the device control API.
     61 * The machine model may map
     62 * and unmap the device multiple times; the kernel will only be told the final
     63 * address at the point where machine init is complete.
     64 */
     65void kvm_arm_register_device(MemoryRegion *mr, uint64_t devid, uint64_t group,
     66                             uint64_t attr, int dev_fd, uint64_t addr_ormask);
     67
     68/**
     69 * kvm_arm_init_cpreg_list:
     70 * @cpu: ARMCPU
     71 *
     72 * Initialize the ARMCPU cpreg list according to the kernel's
     73 * definition of what CPU registers it knows about (and throw away
     74 * the previous TCG-created cpreg list).
     75 *
     76 * Returns: 0 if success, else < 0 error code
     77 */
     78int kvm_arm_init_cpreg_list(ARMCPU *cpu);
     79
     80/**
     81 * kvm_arm_reg_syncs_via_cpreg_list:
     82 * @regidx: KVM register index
     83 *
     84 * Return true if this KVM register should be synchronized via the
     85 * cpreg list of arbitrary system registers, false if it is synchronized
     86 * by hand using code in kvm_arch_get/put_registers().
     87 */
     88bool kvm_arm_reg_syncs_via_cpreg_list(uint64_t regidx);
     89
     90/**
     91 * kvm_arm_cpreg_level:
     92 * @regidx: KVM register index
     93 *
     94 * Return the level of this coprocessor/system register.  Return value is
     95 * either KVM_PUT_RUNTIME_STATE, KVM_PUT_RESET_STATE, or KVM_PUT_FULL_STATE.
     96 */
     97int kvm_arm_cpreg_level(uint64_t regidx);
     98
     99/**
    100 * write_list_to_kvmstate:
    101 * @cpu: ARMCPU
    102 * @level: the state level to sync
    103 *
    104 * For each register listed in the ARMCPU cpreg_indexes list, write
    105 * its value from the cpreg_values list into the kernel (via ioctl).
    106 * This updates KVM's working data structures from TCG data or
    107 * from incoming migration state.
    108 *
    109 * Returns: true if all register values were updated correctly,
    110 * false if some register was unknown to the kernel or could not
    111 * be written (eg constant register with the wrong value).
    112 * Note that we do not stop early on failure -- we will attempt
    113 * writing all registers in the list.
    114 */
    115bool write_list_to_kvmstate(ARMCPU *cpu, int level);
    116
    117/**
    118 * write_kvmstate_to_list:
    119 * @cpu: ARMCPU
    120 *
    121 * For each register listed in the ARMCPU cpreg_indexes list, write
    122 * its value from the kernel into the cpreg_values list. This is used to
    123 * copy info from KVM's working data structures into TCG or
    124 * for outbound migration.
    125 *
    126 * Returns: true if all register values were read correctly,
    127 * false if some register was unknown or could not be read.
    128 * Note that we do not stop early on failure -- we will attempt
    129 * reading all registers in the list.
    130 */
    131bool write_kvmstate_to_list(ARMCPU *cpu);
    132
    133/**
    134 * kvm_arm_cpu_pre_save:
    135 * @cpu: ARMCPU
    136 *
    137 * Called after write_kvmstate_to_list() from cpu_pre_save() to update
    138 * the cpreg list with KVM CPU state.
    139 */
    140void kvm_arm_cpu_pre_save(ARMCPU *cpu);
    141
    142/**
    143 * kvm_arm_cpu_post_load:
    144 * @cpu: ARMCPU
    145 *
    146 * Called from cpu_post_load() to update KVM CPU state from the cpreg list.
    147 */
    148void kvm_arm_cpu_post_load(ARMCPU *cpu);
    149
    150/**
    151 * kvm_arm_reset_vcpu:
    152 * @cpu: ARMCPU
    153 *
    154 * Called at reset time to kernel registers to their initial values.
    155 */
    156void kvm_arm_reset_vcpu(ARMCPU *cpu);
    157
    158/**
    159 * kvm_arm_init_serror_injection:
    160 * @cs: CPUState
    161 *
    162 * Check whether KVM can set guest SError syndrome.
    163 */
    164void kvm_arm_init_serror_injection(CPUState *cs);
    165
    166/**
    167 * kvm_get_vcpu_events:
    168 * @cpu: ARMCPU
    169 *
    170 * Get VCPU related state from kvm.
    171 *
    172 * Returns: 0 if success else < 0 error code
    173 */
    174int kvm_get_vcpu_events(ARMCPU *cpu);
    175
    176/**
    177 * kvm_put_vcpu_events:
    178 * @cpu: ARMCPU
    179 *
    180 * Put VCPU related state to kvm.
    181 *
    182 * Returns: 0 if success else < 0 error code
    183 */
    184int kvm_put_vcpu_events(ARMCPU *cpu);
    185
    186#ifdef CONFIG_KVM
    187/**
    188 * kvm_arm_create_scratch_host_vcpu:
    189 * @cpus_to_try: array of QEMU_KVM_ARM_TARGET_* values (terminated with
    190 * QEMU_KVM_ARM_TARGET_NONE) to try as fallback if the kernel does not
    191 * know the PREFERRED_TARGET ioctl. Passing NULL is the same as passing
    192 * an empty array.
    193 * @fdarray: filled in with kvmfd, vmfd, cpufd file descriptors in that order
    194 * @init: filled in with the necessary values for creating a host
    195 * vcpu. If NULL is provided, will not init the vCPU (though the cpufd
    196 * will still be set up).
    197 *
    198 * Create a scratch vcpu in its own VM of the type preferred by the host
    199 * kernel (as would be used for '-cpu host'), for purposes of probing it
    200 * for capabilities.
    201 *
    202 * Returns: true on success (and fdarray and init are filled in),
    203 * false on failure (and fdarray and init are not valid).
    204 */
    205bool kvm_arm_create_scratch_host_vcpu(const uint32_t *cpus_to_try,
    206                                      int *fdarray,
    207                                      struct kvm_vcpu_init *init);
    208
    209/**
    210 * kvm_arm_destroy_scratch_host_vcpu:
    211 * @fdarray: array of fds as set up by kvm_arm_create_scratch_host_vcpu
    212 *
    213 * Tear down the scratch vcpu created by kvm_arm_create_scratch_host_vcpu.
    214 */
    215void kvm_arm_destroy_scratch_host_vcpu(int *fdarray);
    216
    217/**
    218 * ARMHostCPUFeatures: information about the host CPU (identified
    219 * by asking the host kernel)
    220 */
    221typedef struct ARMHostCPUFeatures {
    222    ARMISARegisters isar;
    223    uint64_t features;
    224    uint32_t target;
    225    const char *dtb_compatible;
    226} ARMHostCPUFeatures;
    227
    228/**
    229 * kvm_arm_get_host_cpu_features:
    230 * @ahcf: ARMHostCPUClass to fill in
    231 *
    232 * Probe the capabilities of the host kernel's preferred CPU and fill
    233 * in the ARMHostCPUClass struct accordingly.
    234 *
    235 * Returns true on success and false otherwise.
    236 */
    237bool kvm_arm_get_host_cpu_features(ARMHostCPUFeatures *ahcf);
    238
    239/**
    240 * kvm_arm_sve_get_vls:
    241 * @cs: CPUState
    242 * @map: bitmap to fill in
    243 *
    244 * Get all the SVE vector lengths supported by the KVM host, setting
    245 * the bits corresponding to their length in quadwords minus one
    246 * (vq - 1) in @map up to ARM_MAX_VQ.
    247 */
    248void kvm_arm_sve_get_vls(CPUState *cs, unsigned long *map);
    249
    250/**
    251 * kvm_arm_set_cpu_features_from_host:
    252 * @cpu: ARMCPU to set the features for
    253 *
    254 * Set up the ARMCPU struct fields up to match the information probed
    255 * from the host CPU.
    256 */
    257void kvm_arm_set_cpu_features_from_host(ARMCPU *cpu);
    258
    259/**
    260 * kvm_arm_add_vcpu_properties:
    261 * @obj: The CPU object to add the properties to
    262 *
    263 * Add all KVM specific CPU properties to the CPU object. These
    264 * are the CPU properties with "kvm-" prefixed names.
    265 */
    266void kvm_arm_add_vcpu_properties(Object *obj);
    267
    268/**
    269 * kvm_arm_steal_time_finalize:
    270 * @cpu: ARMCPU for which to finalize kvm-steal-time
    271 * @errp: Pointer to Error* for error propagation
    272 *
    273 * Validate the kvm-steal-time property selection and set its default
    274 * based on KVM support and guest configuration.
    275 */
    276void kvm_arm_steal_time_finalize(ARMCPU *cpu, Error **errp);
    277
    278/**
    279 * kvm_arm_steal_time_supported:
    280 *
    281 * Returns: true if KVM can enable steal time reporting
    282 * and false otherwise.
    283 */
    284bool kvm_arm_steal_time_supported(void);
    285
    286/**
    287 * kvm_arm_aarch32_supported:
    288 *
    289 * Returns: true if KVM can enable AArch32 mode
    290 * and false otherwise.
    291 */
    292bool kvm_arm_aarch32_supported(void);
    293
    294/**
    295 * kvm_arm_pmu_supported:
    296 *
    297 * Returns: true if KVM can enable the PMU
    298 * and false otherwise.
    299 */
    300bool kvm_arm_pmu_supported(void);
    301
    302/**
    303 * kvm_arm_sve_supported:
    304 *
    305 * Returns true if KVM can enable SVE and false otherwise.
    306 */
    307bool kvm_arm_sve_supported(void);
    308
    309/**
    310 * kvm_arm_get_max_vm_ipa_size:
    311 * @ms: Machine state handle
    312 * @fixed_ipa: True when the IPA limit is fixed at 40. This is the case
    313 * for legacy KVM.
    314 *
    315 * Returns the number of bits in the IPA address space supported by KVM
    316 */
    317int kvm_arm_get_max_vm_ipa_size(MachineState *ms, bool *fixed_ipa);
    318
    319/**
    320 * kvm_arm_sync_mpstate_to_kvm:
    321 * @cpu: ARMCPU
    322 *
    323 * If supported set the KVM MP_STATE based on QEMU's model.
    324 *
    325 * Returns 0 on success and -1 on failure.
    326 */
    327int kvm_arm_sync_mpstate_to_kvm(ARMCPU *cpu);
    328
    329/**
    330 * kvm_arm_sync_mpstate_to_qemu:
    331 * @cpu: ARMCPU
    332 *
    333 * If supported get the MP_STATE from KVM and store in QEMU's model.
    334 *
    335 * Returns 0 on success and aborts on failure.
    336 */
    337int kvm_arm_sync_mpstate_to_qemu(ARMCPU *cpu);
    338
    339/**
    340 * kvm_arm_get_virtual_time:
    341 * @cs: CPUState
    342 *
    343 * Gets the VCPU's virtual counter and stores it in the KVM CPU state.
    344 */
    345void kvm_arm_get_virtual_time(CPUState *cs);
    346
    347/**
    348 * kvm_arm_put_virtual_time:
    349 * @cs: CPUState
    350 *
    351 * Sets the VCPU's virtual counter to the value stored in the KVM CPU state.
    352 */
    353void kvm_arm_put_virtual_time(CPUState *cs);
    354
    355void kvm_arm_vm_state_change(void *opaque, bool running, RunState state);
    356
    357int kvm_arm_vgic_probe(void);
    358
    359void kvm_arm_pmu_set_irq(CPUState *cs, int irq);
    360void kvm_arm_pmu_init(CPUState *cs);
    361
    362/**
    363 * kvm_arm_pvtime_init:
    364 * @cs: CPUState
    365 * @ipa: Per-vcpu guest physical base address of the pvtime structures
    366 *
    367 * Initializes PVTIME for the VCPU, setting the PVTIME IPA to @ipa.
    368 */
    369void kvm_arm_pvtime_init(CPUState *cs, uint64_t ipa);
    370
    371int kvm_arm_set_irq(int cpu, int irqtype, int irq, int level);
    372
    373#else
    374
    375/*
    376 * It's safe to call these functions without KVM support.
    377 * They should either do nothing or return "not supported".
    378 */
    379static inline bool kvm_arm_aarch32_supported(void)
    380{
    381    return false;
    382}
    383
    384static inline bool kvm_arm_pmu_supported(void)
    385{
    386    return false;
    387}
    388
    389static inline bool kvm_arm_sve_supported(void)
    390{
    391    return false;
    392}
    393
    394static inline bool kvm_arm_steal_time_supported(void)
    395{
    396    return false;
    397}
    398
    399/*
    400 * These functions should never actually be called without KVM support.
    401 */
    402static inline void kvm_arm_set_cpu_features_from_host(ARMCPU *cpu)
    403{
    404    g_assert_not_reached();
    405}
    406
    407static inline void kvm_arm_add_vcpu_properties(Object *obj)
    408{
    409    g_assert_not_reached();
    410}
    411
    412static inline int kvm_arm_get_max_vm_ipa_size(MachineState *ms, bool *fixed_ipa)
    413{
    414    g_assert_not_reached();
    415}
    416
    417static inline int kvm_arm_vgic_probe(void)
    418{
    419    g_assert_not_reached();
    420}
    421
    422static inline void kvm_arm_pmu_set_irq(CPUState *cs, int irq)
    423{
    424    g_assert_not_reached();
    425}
    426
    427static inline void kvm_arm_pmu_init(CPUState *cs)
    428{
    429    g_assert_not_reached();
    430}
    431
    432static inline void kvm_arm_pvtime_init(CPUState *cs, uint64_t ipa)
    433{
    434    g_assert_not_reached();
    435}
    436
    437static inline void kvm_arm_steal_time_finalize(ARMCPU *cpu, Error **errp)
    438{
    439    g_assert_not_reached();
    440}
    441
    442static inline void kvm_arm_sve_get_vls(CPUState *cs, unsigned long *map)
    443{
    444    g_assert_not_reached();
    445}
    446
    447#endif
    448
    449static inline const char *gic_class_name(void)
    450{
    451    return kvm_irqchip_in_kernel() ? "kvm-arm-gic" : "arm_gic";
    452}
    453
    454/**
    455 * gicv3_class_name
    456 *
    457 * Return name of GICv3 class to use depending on whether KVM acceleration is
    458 * in use. May throw an error if the chosen implementation is not available.
    459 *
    460 * Returns: class name to use
    461 */
    462static inline const char *gicv3_class_name(void)
    463{
    464    if (kvm_irqchip_in_kernel()) {
    465        return "kvm-arm-gicv3";
    466    } else {
    467        if (kvm_enabled()) {
    468            error_report("Userspace GICv3 is not supported with KVM");
    469            exit(1);
    470        }
    471        return "arm-gicv3";
    472    }
    473}
    474
    475/**
    476 * kvm_arm_handle_debug:
    477 * @cs: CPUState
    478 * @debug_exit: debug part of the KVM exit structure
    479 *
    480 * Returns: TRUE if the debug exception was handled.
    481 */
    482bool kvm_arm_handle_debug(CPUState *cs, struct kvm_debug_exit_arch *debug_exit);
    483
    484/**
    485 * kvm_arm_hw_debug_active:
    486 * @cs: CPU State
    487 *
    488 * Return: TRUE if any hardware breakpoints in use.
    489 */
    490bool kvm_arm_hw_debug_active(CPUState *cs);
    491
    492/**
    493 * kvm_arm_copy_hw_debug_data:
    494 * @ptr: kvm_guest_debug_arch structure
    495 *
    496 * Copy the architecture specific debug registers into the
    497 * kvm_guest_debug ioctl structure.
    498 */
    499struct kvm_guest_debug_arch;
    500void kvm_arm_copy_hw_debug_data(struct kvm_guest_debug_arch *ptr);
    501
    502/**
    503 * kvm_arm_verify_ext_dabt_pending:
    504 * @cs: CPUState
    505 *
    506 * Verify the fault status code wrt the Ext DABT injection
    507 *
    508 * Returns: true if the fault status code is as expected, false otherwise
    509 */
    510bool kvm_arm_verify_ext_dabt_pending(CPUState *cs);
    511
    512/**
    513 * its_class_name:
    514 *
    515 * Return the ITS class name to use depending on whether KVM acceleration
    516 * and KVM CAP_SIGNAL_MSI are supported
    517 *
    518 * Returns: class name to use or NULL
    519 */
    520static inline const char *its_class_name(void)
    521{
    522    if (kvm_irqchip_in_kernel()) {
    523        /* KVM implementation requires this capability */
    524        return kvm_direct_msi_enabled() ? "arm-its-kvm" : NULL;
    525    } else {
    526        /* Software emulation based model */
    527        return "arm-gicv3-its";
    528    }
    529}
    530
    531#endif