qemu

FORK: QEMU emulator
git clone https://git.neptards.moe/neptards/qemu.git
Log | Files | Refs | Submodules | LICENSE

kvm_arm.h (13860B)


      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  */
     31 int 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  */
     45 int 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  */
     65 void 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  */
     78 int 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  */
     88 bool 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  */
     97 int 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  */
    115 bool 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  */
    131 bool 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  */
    140 void 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  */
    148 void 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  */
    156 void 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  */
    164 void 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  */
    174 int 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  */
    184 int 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  */
    205 bool 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  */
    215 void 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  */
    221 typedef 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  */
    237 bool kvm_arm_get_host_cpu_features(ARMHostCPUFeatures *ahcf);
    238 
    239 /**
    240  * kvm_arm_sve_get_vls:
    241  * @cs: CPUState
    242  *
    243  * Get all the SVE vector lengths supported by the KVM host, setting
    244  * the bits corresponding to their length in quadwords minus one
    245  * (vq - 1) up to ARM_MAX_VQ.  Return the resulting map.
    246  */
    247 uint32_t kvm_arm_sve_get_vls(CPUState *cs);
    248 
    249 /**
    250  * kvm_arm_set_cpu_features_from_host:
    251  * @cpu: ARMCPU to set the features for
    252  *
    253  * Set up the ARMCPU struct fields up to match the information probed
    254  * from the host CPU.
    255  */
    256 void kvm_arm_set_cpu_features_from_host(ARMCPU *cpu);
    257 
    258 /**
    259  * kvm_arm_add_vcpu_properties:
    260  * @obj: The CPU object to add the properties to
    261  *
    262  * Add all KVM specific CPU properties to the CPU object. These
    263  * are the CPU properties with "kvm-" prefixed names.
    264  */
    265 void kvm_arm_add_vcpu_properties(Object *obj);
    266 
    267 /**
    268  * kvm_arm_steal_time_finalize:
    269  * @cpu: ARMCPU for which to finalize kvm-steal-time
    270  * @errp: Pointer to Error* for error propagation
    271  *
    272  * Validate the kvm-steal-time property selection and set its default
    273  * based on KVM support and guest configuration.
    274  */
    275 void kvm_arm_steal_time_finalize(ARMCPU *cpu, Error **errp);
    276 
    277 /**
    278  * kvm_arm_steal_time_supported:
    279  *
    280  * Returns: true if KVM can enable steal time reporting
    281  * and false otherwise.
    282  */
    283 bool kvm_arm_steal_time_supported(void);
    284 
    285 /**
    286  * kvm_arm_aarch32_supported:
    287  *
    288  * Returns: true if KVM can enable AArch32 mode
    289  * and false otherwise.
    290  */
    291 bool kvm_arm_aarch32_supported(void);
    292 
    293 /**
    294  * kvm_arm_pmu_supported:
    295  *
    296  * Returns: true if KVM can enable the PMU
    297  * and false otherwise.
    298  */
    299 bool kvm_arm_pmu_supported(void);
    300 
    301 /**
    302  * kvm_arm_sve_supported:
    303  *
    304  * Returns true if KVM can enable SVE and false otherwise.
    305  */
    306 bool kvm_arm_sve_supported(void);
    307 
    308 /**
    309  * kvm_arm_get_max_vm_ipa_size:
    310  * @ms: Machine state handle
    311  * @fixed_ipa: True when the IPA limit is fixed at 40. This is the case
    312  * for legacy KVM.
    313  *
    314  * Returns the number of bits in the IPA address space supported by KVM
    315  */
    316 int kvm_arm_get_max_vm_ipa_size(MachineState *ms, bool *fixed_ipa);
    317 
    318 /**
    319  * kvm_arm_sync_mpstate_to_kvm:
    320  * @cpu: ARMCPU
    321  *
    322  * If supported set the KVM MP_STATE based on QEMU's model.
    323  *
    324  * Returns 0 on success and -1 on failure.
    325  */
    326 int kvm_arm_sync_mpstate_to_kvm(ARMCPU *cpu);
    327 
    328 /**
    329  * kvm_arm_sync_mpstate_to_qemu:
    330  * @cpu: ARMCPU
    331  *
    332  * If supported get the MP_STATE from KVM and store in QEMU's model.
    333  *
    334  * Returns 0 on success and aborts on failure.
    335  */
    336 int kvm_arm_sync_mpstate_to_qemu(ARMCPU *cpu);
    337 
    338 /**
    339  * kvm_arm_get_virtual_time:
    340  * @cs: CPUState
    341  *
    342  * Gets the VCPU's virtual counter and stores it in the KVM CPU state.
    343  */
    344 void kvm_arm_get_virtual_time(CPUState *cs);
    345 
    346 /**
    347  * kvm_arm_put_virtual_time:
    348  * @cs: CPUState
    349  *
    350  * Sets the VCPU's virtual counter to the value stored in the KVM CPU state.
    351  */
    352 void kvm_arm_put_virtual_time(CPUState *cs);
    353 
    354 void kvm_arm_vm_state_change(void *opaque, bool running, RunState state);
    355 
    356 int kvm_arm_vgic_probe(void);
    357 
    358 void kvm_arm_pmu_set_irq(CPUState *cs, int irq);
    359 void kvm_arm_pmu_init(CPUState *cs);
    360 
    361 /**
    362  * kvm_arm_pvtime_init:
    363  * @cs: CPUState
    364  * @ipa: Per-vcpu guest physical base address of the pvtime structures
    365  *
    366  * Initializes PVTIME for the VCPU, setting the PVTIME IPA to @ipa.
    367  */
    368 void kvm_arm_pvtime_init(CPUState *cs, uint64_t ipa);
    369 
    370 int kvm_arm_set_irq(int cpu, int irqtype, int irq, int level);
    371 
    372 #else
    373 
    374 /*
    375  * It's safe to call these functions without KVM support.
    376  * They should either do nothing or return "not supported".
    377  */
    378 static inline bool kvm_arm_aarch32_supported(void)
    379 {
    380     return false;
    381 }
    382 
    383 static inline bool kvm_arm_pmu_supported(void)
    384 {
    385     return false;
    386 }
    387 
    388 static inline bool kvm_arm_sve_supported(void)
    389 {
    390     return false;
    391 }
    392 
    393 static inline bool kvm_arm_steal_time_supported(void)
    394 {
    395     return false;
    396 }
    397 
    398 /*
    399  * These functions should never actually be called without KVM support.
    400  */
    401 static inline void kvm_arm_set_cpu_features_from_host(ARMCPU *cpu)
    402 {
    403     g_assert_not_reached();
    404 }
    405 
    406 static inline void kvm_arm_add_vcpu_properties(Object *obj)
    407 {
    408     g_assert_not_reached();
    409 }
    410 
    411 static inline int kvm_arm_get_max_vm_ipa_size(MachineState *ms, bool *fixed_ipa)
    412 {
    413     g_assert_not_reached();
    414 }
    415 
    416 static inline int kvm_arm_vgic_probe(void)
    417 {
    418     g_assert_not_reached();
    419 }
    420 
    421 static inline void kvm_arm_pmu_set_irq(CPUState *cs, int irq)
    422 {
    423     g_assert_not_reached();
    424 }
    425 
    426 static inline void kvm_arm_pmu_init(CPUState *cs)
    427 {
    428     g_assert_not_reached();
    429 }
    430 
    431 static inline void kvm_arm_pvtime_init(CPUState *cs, uint64_t ipa)
    432 {
    433     g_assert_not_reached();
    434 }
    435 
    436 static inline void kvm_arm_steal_time_finalize(ARMCPU *cpu, Error **errp)
    437 {
    438     g_assert_not_reached();
    439 }
    440 
    441 static inline uint32_t kvm_arm_sve_get_vls(CPUState *cs)
    442 {
    443     g_assert_not_reached();
    444 }
    445 
    446 #endif
    447 
    448 static inline const char *gic_class_name(void)
    449 {
    450     return kvm_irqchip_in_kernel() ? "kvm-arm-gic" : "arm_gic";
    451 }
    452 
    453 /**
    454  * gicv3_class_name
    455  *
    456  * Return name of GICv3 class to use depending on whether KVM acceleration is
    457  * in use. May throw an error if the chosen implementation is not available.
    458  *
    459  * Returns: class name to use
    460  */
    461 static inline const char *gicv3_class_name(void)
    462 {
    463     if (kvm_irqchip_in_kernel()) {
    464         return "kvm-arm-gicv3";
    465     } else {
    466         if (kvm_enabled()) {
    467             error_report("Userspace GICv3 is not supported with KVM");
    468             exit(1);
    469         }
    470         return "arm-gicv3";
    471     }
    472 }
    473 
    474 /**
    475  * kvm_arm_handle_debug:
    476  * @cs: CPUState
    477  * @debug_exit: debug part of the KVM exit structure
    478  *
    479  * Returns: TRUE if the debug exception was handled.
    480  */
    481 bool kvm_arm_handle_debug(CPUState *cs, struct kvm_debug_exit_arch *debug_exit);
    482 
    483 /**
    484  * kvm_arm_hw_debug_active:
    485  * @cs: CPU State
    486  *
    487  * Return: TRUE if any hardware breakpoints in use.
    488  */
    489 bool kvm_arm_hw_debug_active(CPUState *cs);
    490 
    491 /**
    492  * kvm_arm_copy_hw_debug_data:
    493  * @ptr: kvm_guest_debug_arch structure
    494  *
    495  * Copy the architecture specific debug registers into the
    496  * kvm_guest_debug ioctl structure.
    497  */
    498 struct kvm_guest_debug_arch;
    499 void kvm_arm_copy_hw_debug_data(struct kvm_guest_debug_arch *ptr);
    500 
    501 /**
    502  * kvm_arm_verify_ext_dabt_pending:
    503  * @cs: CPUState
    504  *
    505  * Verify the fault status code wrt the Ext DABT injection
    506  *
    507  * Returns: true if the fault status code is as expected, false otherwise
    508  */
    509 bool kvm_arm_verify_ext_dabt_pending(CPUState *cs);
    510 
    511 /**
    512  * its_class_name:
    513  *
    514  * Return the ITS class name to use depending on whether KVM acceleration
    515  * and KVM CAP_SIGNAL_MSI are supported
    516  *
    517  * Returns: class name to use or NULL
    518  */
    519 static inline const char *its_class_name(void)
    520 {
    521     if (kvm_irqchip_in_kernel()) {
    522         /* KVM implementation requires this capability */
    523         return kvm_direct_msi_enabled() ? "arm-its-kvm" : NULL;
    524     } else {
    525         /* Software emulation based model */
    526         return "arm-gicv3-its";
    527     }
    528 }
    529 
    530 #endif