KVM
|
#include <linux/bits.h>
#include <linux/kvm.h>
#include <linux/irqreturn.h>
#include <linux/kref.h>
#include <linux/mutex.h>
#include <linux/spinlock.h>
#include <linux/static_key.h>
#include <linux/types.h>
#include <kvm/iodev.h>
#include <linux/list.h>
#include <linux/jump_label.h>
#include <linux/irqchip/arm-gic-v4.h>
Go to the source code of this file.
Classes | |
struct | vgic_global |
struct | irq_ops |
struct | vgic_irq |
struct | vgic_io_device |
struct | vgic_its |
struct | vgic_redist_region |
struct | vgic_dist |
struct | vgic_v2_cpu_if |
struct | vgic_v3_cpu_if |
struct | vgic_cpu |
Macros | |
#define | VGIC_V3_MAX_CPUS 512 |
#define | VGIC_V2_MAX_CPUS 8 |
#define | VGIC_NR_IRQS_LEGACY 256 |
#define | VGIC_NR_SGIS 16 |
#define | VGIC_NR_PPIS 16 |
#define | VGIC_NR_PRIVATE_IRQS (VGIC_NR_SGIS + VGIC_NR_PPIS) |
#define | VGIC_MAX_PRIVATE (VGIC_NR_PRIVATE_IRQS - 1) |
#define | VGIC_MAX_SPI 1019 |
#define | VGIC_MAX_RESERVED 1023 |
#define | VGIC_MIN_LPI 8192 |
#define | KVM_IRQCHIP_NUM_PINS (1020 - 32) |
#define | irq_is_ppi(irq) ((irq) >= VGIC_NR_SGIS && (irq) < VGIC_NR_PRIVATE_IRQS) |
#define | irq_is_spi(irq) |
#define | VGIC_V2_MAX_LRS (1 << 6) |
#define | VGIC_V3_MAX_LRS 16 |
#define | VGIC_V3_LR_INDEX(lr) (VGIC_V3_MAX_LRS - 1 - lr) |
#define | VGIC_IRQ_SW_RESAMPLE BIT(0) /* Clear the active state for resampling */ |
#define | KVM_VGIC_IMP_REV_2 2 /* GICv2 restorable groups */ |
#define | KVM_VGIC_IMP_REV_3 3 /* GICv3 GICR_CTLR.{IW,CES,RWP} */ |
#define | KVM_VGIC_IMP_REV_LATEST KVM_VGIC_IMP_REV_3 |
#define | irqchip_in_kernel(k) (!!((k)->arch.vgic.in_kernel)) |
#define | vgic_initialized(k) ((k)->arch.vgic.initialized) |
#define | vgic_ready(k) ((k)->arch.vgic.ready) |
#define | vgic_valid_spi(k, i) |
Enumerations | |
enum | vgic_type { VGIC_V2 , VGIC_V3 } |
enum | vgic_irq_config { VGIC_CONFIG_EDGE = 0 , VGIC_CONFIG_LEVEL } |
enum | iodev_type { IODEV_CPUIF , IODEV_DIST , IODEV_REDIST , IODEV_ITS } |
Functions | |
static bool | vgic_irq_needs_resampling (struct vgic_irq *irq) |
int | kvm_set_legacy_vgic_v2_addr (struct kvm *kvm, struct kvm_arm_device_addr *dev_addr) |
void | kvm_vgic_early_init (struct kvm *kvm) |
int | kvm_vgic_vcpu_init (struct kvm_vcpu *vcpu) |
int | kvm_vgic_create (struct kvm *kvm, u32 type) |
void | kvm_vgic_destroy (struct kvm *kvm) |
void | kvm_vgic_vcpu_destroy (struct kvm_vcpu *vcpu) |
int | kvm_vgic_map_resources (struct kvm *kvm) |
int | kvm_vgic_hyp_init (void) |
void | kvm_vgic_init_cpu_hardware (void) |
int | kvm_vgic_inject_irq (struct kvm *kvm, struct kvm_vcpu *vcpu, unsigned int intid, bool level, void *owner) |
int | kvm_vgic_map_phys_irq (struct kvm_vcpu *vcpu, unsigned int host_irq, u32 vintid, struct irq_ops *ops) |
int | kvm_vgic_unmap_phys_irq (struct kvm_vcpu *vcpu, unsigned int vintid) |
int | kvm_vgic_get_map (struct kvm_vcpu *vcpu, unsigned int vintid) |
bool | kvm_vgic_map_is_active (struct kvm_vcpu *vcpu, unsigned int vintid) |
int | kvm_vgic_vcpu_pending_irq (struct kvm_vcpu *vcpu) |
void | kvm_vgic_load (struct kvm_vcpu *vcpu) |
void | kvm_vgic_put (struct kvm_vcpu *vcpu) |
void | kvm_vgic_vmcr_sync (struct kvm_vcpu *vcpu) |
bool | kvm_vcpu_has_pending_irqs (struct kvm_vcpu *vcpu) |
void | kvm_vgic_sync_hwstate (struct kvm_vcpu *vcpu) |
void | kvm_vgic_flush_hwstate (struct kvm_vcpu *vcpu) |
void | kvm_vgic_reset_mapped_irq (struct kvm_vcpu *vcpu, u32 vintid) |
void | vgic_v3_dispatch_sgi (struct kvm_vcpu *vcpu, u64 reg, bool allow_group1) |
static int | kvm_vgic_get_max_vcpus (void) |
int | kvm_vgic_setup_default_irq_routing (struct kvm *kvm) |
int | kvm_vgic_set_owner (struct kvm_vcpu *vcpu, unsigned int intid, void *owner) |
int | kvm_vgic_v4_set_forwarding (struct kvm *kvm, int irq, struct kvm_kernel_irq_routing_entry *irq_entry) |
int | kvm_vgic_v4_unset_forwarding (struct kvm *kvm, int irq, struct kvm_kernel_irq_routing_entry *irq_entry) |
int | vgic_v4_load (struct kvm_vcpu *vcpu) |
void | vgic_v4_commit (struct kvm_vcpu *vcpu) |
int | vgic_v4_put (struct kvm_vcpu *vcpu) |
void | kvm_vgic_cpu_up (void) |
void | kvm_vgic_cpu_down (void) |
Variables | |
struct vgic_global | kvm_vgic_global_state |
struct static_key_false | vgic_v2_cpuif_trap |
struct static_key_false | vgic_v3_cpuif_trap |
#define irq_is_ppi | ( | irq | ) | ((irq) >= VGIC_NR_SGIS && (irq) < VGIC_NR_PRIVATE_IRQS) |
Definition at line 34 of file arm_vgic.h.
#define irq_is_spi | ( | irq | ) |
Definition at line 35 of file arm_vgic.h.
#define irqchip_in_kernel | ( | k | ) | (!!((k)->arch.vgic.in_kernel)) |
Definition at line 392 of file arm_vgic.h.
#define KVM_IRQCHIP_NUM_PINS (1020 - 32) |
Definition at line 32 of file arm_vgic.h.
#define KVM_VGIC_IMP_REV_2 2 /* GICv2 restorable groups */ |
Definition at line 234 of file arm_vgic.h.
#define KVM_VGIC_IMP_REV_3 3 /* GICv3 GICR_CTLR.{IW,CES,RWP} */ |
Definition at line 235 of file arm_vgic.h.
#define KVM_VGIC_IMP_REV_LATEST KVM_VGIC_IMP_REV_3 |
Definition at line 236 of file arm_vgic.h.
#define vgic_initialized | ( | k | ) | ((k)->arch.vgic.initialized) |
Definition at line 393 of file arm_vgic.h.
#define VGIC_IRQ_SW_RESAMPLE BIT(0) /* Clear the active state for resampling */ |
Definition at line 107 of file arm_vgic.h.
#define VGIC_MAX_PRIVATE (VGIC_NR_PRIVATE_IRQS - 1) |
Definition at line 28 of file arm_vgic.h.
#define VGIC_MAX_RESERVED 1023 |
Definition at line 30 of file arm_vgic.h.
#define VGIC_MAX_SPI 1019 |
Definition at line 29 of file arm_vgic.h.
#define VGIC_MIN_LPI 8192 |
Definition at line 31 of file arm_vgic.h.
#define VGIC_NR_IRQS_LEGACY 256 |
Definition at line 24 of file arm_vgic.h.
#define VGIC_NR_PPIS 16 |
Definition at line 26 of file arm_vgic.h.
#define VGIC_NR_PRIVATE_IRQS (VGIC_NR_SGIS + VGIC_NR_PPIS) |
Definition at line 27 of file arm_vgic.h.
#define VGIC_NR_SGIS 16 |
Definition at line 25 of file arm_vgic.h.
#define vgic_ready | ( | k | ) | ((k)->arch.vgic.ready) |
Definition at line 394 of file arm_vgic.h.
#define VGIC_V2_MAX_CPUS 8 |
Definition at line 23 of file arm_vgic.h.
#define VGIC_V2_MAX_LRS (1 << 6) |
Definition at line 88 of file arm_vgic.h.
#define VGIC_V3_LR_INDEX | ( | lr | ) | (VGIC_V3_MAX_LRS - 1 - lr) |
Definition at line 90 of file arm_vgic.h.
#define VGIC_V3_MAX_CPUS 512 |
Definition at line 22 of file arm_vgic.h.
#define VGIC_V3_MAX_LRS 16 |
Definition at line 89 of file arm_vgic.h.
#define vgic_valid_spi | ( | k, | |
i | |||
) |
Definition at line 395 of file arm_vgic.h.
enum iodev_type |
enum vgic_irq_config |
enum vgic_type |
int kvm_set_legacy_vgic_v2_addr | ( | struct kvm * | kvm, |
struct kvm_arm_device_addr * | dev_addr | ||
) |
Definition at line 45 of file vgic-kvm-device.c.
bool kvm_vcpu_has_pending_irqs | ( | struct kvm_vcpu * | vcpu | ) |
void kvm_vgic_cpu_down | ( | void | ) |
Definition at line 513 of file vgic-init.c.
void kvm_vgic_cpu_up | ( | void | ) |
int kvm_vgic_create | ( | struct kvm * | kvm, |
u32 | type | ||
) |
kvm_vgic_create: triggered by the instantiation of the VGIC device by user space, either through the legacy KVM_CREATE_IRQCHIP ioctl (v2 only) or through the generic KVM_CREATE_DEVICE API ioctl. irqchip_in_kernel() tells you if this function succeeded or not. @kvm: kvm struct pointer @type: KVM_DEV_TYPE_ARM_VGIC_V[23]
Definition at line 71 of file vgic-init.c.
void kvm_vgic_destroy | ( | struct kvm * | kvm | ) |
Definition at line 397 of file vgic-init.c.
void kvm_vgic_early_init | ( | struct kvm * | kvm | ) |
kvm_vgic_early_init() - Initialize static VGIC VCPU data structures @kvm: The VM whose VGIC districutor should be initialized
Only do initialization of static structures that don't require any allocation or sizing information from userspace. vgic_init() called kvm_vgic_dist_init() which takes care of the rest.
Definition at line 52 of file vgic-init.c.
void kvm_vgic_flush_hwstate | ( | struct kvm_vcpu * | vcpu | ) |
Definition at line 905 of file vgic.c.
int kvm_vgic_get_map | ( | struct kvm_vcpu * | vcpu, |
unsigned int | vintid | ||
) |
Definition at line 576 of file vgic.c.
|
inlinestatic |
kvm_vgic_get_max_vcpus - Get the maximum number of VCPUs allowed by HW
The host's GIC naturally limits the maximum amount of VCPUs a guest can use.
Definition at line 411 of file arm_vgic.h.
int kvm_vgic_hyp_init | ( | void | ) |
kvm_vgic_hyp_init: populates the kvm_vgic_global_state variable according to the host GIC model. Accordingly calls either vgic_v2/v3_probe which registers the KVM_DEVICE that can be instantiated by a guest later on .
Definition at line 564 of file vgic-init.c.
void kvm_vgic_init_cpu_hardware | ( | void | ) |
kvm_vgic_init_cpu_hardware - initialize the GIC VE hardware
For a specific CPU, initialize the GIC VE hardware.
Definition at line 544 of file vgic-init.c.
int kvm_vgic_inject_irq | ( | struct kvm * | kvm, |
struct kvm_vcpu * | vcpu, | ||
unsigned int | intid, | ||
bool | level, | ||
void * | owner | ||
) |
kvm_vgic_inject_irq - Inject an IRQ from a device to the vgic @kvm: The VM structure pointer @vcpu: The CPU for PPIs or NULL for global interrupts @intid: The INTID to inject a new state to. @level: Edge-triggered: true: to trigger the interrupt false: to ignore the call Level-sensitive true: raise the input signal false: lower the input signal @owner: The opaque pointer to the owner of the IRQ being raised to verify that the caller is allowed to inject this IRQ. Userspace injections will have owner == NULL.
The VGIC is not concerned with devices being active-LOW or active-HIGH for level-sensitive interrupts. You can think of the level parameter as 1 being HIGH and 0 being LOW and all devices being active-HIGH.
Definition at line 439 of file vgic.c.
void kvm_vgic_load | ( | struct kvm_vcpu * | vcpu | ) |
bool kvm_vgic_map_is_active | ( | struct kvm_vcpu * | vcpu, |
unsigned int | vintid | ||
) |
int kvm_vgic_map_phys_irq | ( | struct kvm_vcpu * | vcpu, |
unsigned int | host_irq, | ||
u32 | vintid, | ||
struct irq_ops * | ops | ||
) |
Definition at line 514 of file vgic.c.
int kvm_vgic_map_resources | ( | struct kvm * | kvm | ) |
Map the MMIO regions depending on the VGIC model exposed to the guest called on the first VCPU run. Also map the virtual CPU interface into the VM. v2 calls vgic_init() if not already done. v3 and derivatives return an error if the VGIC is not initialized. vgic_ready() returns true if this function has succeeded. @kvm: kvm struct pointer
Definition at line 456 of file vgic-init.c.
void kvm_vgic_put | ( | struct kvm_vcpu * | vcpu | ) |
void kvm_vgic_reset_mapped_irq | ( | struct kvm_vcpu * | vcpu, |
u32 | vintid | ||
) |
kvm_vgic_reset_mapped_irq - Reset a mapped IRQ @vcpu: The VCPU pointer @vintid: The INTID of the interrupt
Reset the active and pending states of a mapped interrupt. Kernel subsystems injecting mapped interrupts should reset their interrupt lines when we are doing a reset of the VM.
Definition at line 540 of file vgic.c.
int kvm_vgic_set_owner | ( | struct kvm_vcpu * | vcpu, |
unsigned int | intid, | ||
void * | owner | ||
) |
kvm_vgic_set_owner - Set the owner of an interrupt for a VM
@vcpu: Pointer to the VCPU (used for PPIs) @intid: The virtual INTID identifying the interrupt (PPI or SPI) @owner: Opaque pointer to the owner
Returns 0 if intid is not already used by another in-kernel device and the owner is set, otherwise returns an error code.
Definition at line 601 of file vgic.c.
int kvm_vgic_setup_default_irq_routing | ( | struct kvm * | kvm | ) |
kvm_vgic_setup_default_irq_routing: Setup a default flat gsi routing table mapping all SPIs
Definition at line 135 of file vgic-irqfd.c.
void kvm_vgic_sync_hwstate | ( | struct kvm_vcpu * | vcpu | ) |
int kvm_vgic_unmap_phys_irq | ( | struct kvm_vcpu * | vcpu, |
unsigned int | vintid | ||
) |
int kvm_vgic_v4_set_forwarding | ( | struct kvm * | kvm, |
int | irq, | ||
struct kvm_kernel_irq_routing_entry * | irq_entry | ||
) |
Definition at line 411 of file vgic-v4.c.
int kvm_vgic_v4_unset_forwarding | ( | struct kvm * | kvm, |
int | irq, | ||
struct kvm_kernel_irq_routing_entry * | irq_entry | ||
) |
void kvm_vgic_vcpu_destroy | ( | struct kvm_vcpu * | vcpu | ) |
Definition at line 388 of file vgic-init.c.
int kvm_vgic_vcpu_init | ( | struct kvm_vcpu * | vcpu | ) |
kvm_vgic_vcpu_init() - Initialize static VGIC VCPU data structures and register VCPU-specific KVM iodevs
@vcpu: pointer to the VCPU being created and initialized
Only do initialization, but do not actually enable the VGIC CPU interface
Definition at line 194 of file vgic-init.c.
int kvm_vgic_vcpu_pending_irq | ( | struct kvm_vcpu * | vcpu | ) |
Definition at line 971 of file vgic.c.
void kvm_vgic_vmcr_sync | ( | struct kvm_vcpu * | vcpu | ) |
|
inlinestatic |
void vgic_v3_dispatch_sgi | ( | struct kvm_vcpu * | vcpu, |
u64 | reg, | ||
bool | allow_group1 | ||
) |
vgic_v3_dispatch_sgi - handle SGI requests from VCPUs @vcpu: The VCPU requesting a SGI @reg: The value written into ICC_{ASGI1,SGI0,SGI1}R by that VCPU @allow_group1: Does the sysreg access allow generation of G1 SGIs
With GICv3 (and ARE=1) CPUs trigger SGIs by writing to a system register. This will trap in sys_regs.c and call this function. This ICC_SGI1R_EL1 register contains the upper three affinity levels of the target processors as well as a bitmask of 16 Aff0 CPUs.
If the interrupt routing mode bit is not set, we iterate over the Aff0 bits and signal the VCPUs matching the provided Aff{3,2,1}.
If this bit is set, we signal all, but not the calling VCPU.
Definition at line 1058 of file vgic-mmio-v3.c.
void vgic_v4_commit | ( | struct kvm_vcpu * | vcpu | ) |
int vgic_v4_load | ( | struct kvm_vcpu * | vcpu | ) |
int vgic_v4_put | ( | struct kvm_vcpu * | vcpu | ) |
|
extern |
|
extern |
|
extern |