6 #include <linux/interrupt.h>
9 #include <linux/kvm_host.h>
10 #include <linux/list_sort.h>
11 #include <linux/nospec.h>
13 #include <asm/kvm_hyp.h>
17 #define CREATE_TRACE_POINTS
98 return &
vcpu->arch.vgic_cpu.private_irqs[
intid];
128 struct vgic_dist *dist = &kvm->arch.vgic;
141 struct vgic_dist *dist = &kvm->arch.vgic;
175 WARN_ON(irq_set_irqchip_state(irq->
host_irq,
176 IRQCHIP_STATE_PENDING,
189 WARN_ON(irq_get_irqchip_state(irq->
host_irq,
190 IRQCHIP_STATE_PENDING,
200 WARN_ON(irq_set_irqchip_state(irq->
host_irq,
201 IRQCHIP_STATE_ACTIVE,
218 lockdep_assert_held(&irq->
irq_lock);
260 const struct list_head *b)
271 if (unlikely(irqa == irqb))
275 raw_spin_lock_nested(&irqb->
irq_lock, SINGLE_DEPTH_NESTING);
285 if (!penda || !pendb) {
286 ret = (int)pendb - (
int)penda;
315 if (irq->
owner != owner)
339 struct kvm_vcpu *vcpu;
341 lockdep_assert_held(&irq->
irq_lock);
345 if (irq->
vcpu || !vcpu) {
355 raw_spin_unlock_irqrestore(&irq->
irq_lock, flags);
367 kvm_make_request(KVM_REQ_IRQ_PENDING, vcpu);
377 raw_spin_unlock_irqrestore(&irq->
irq_lock, flags);
381 raw_spin_lock_irqsave(&vcpu->arch.vgic_cpu.ap_list_lock, flags);
398 raw_spin_unlock_irqrestore(&vcpu->arch.vgic_cpu.ap_list_lock,
401 raw_spin_lock_irqsave(&irq->
irq_lock, flags);
410 list_add_tail(&irq->
ap_list, &vcpu->arch.vgic_cpu.ap_list_head);
414 raw_spin_unlock_irqrestore(&vcpu->arch.vgic_cpu.ap_list_lock, flags);
416 kvm_make_request(KVM_REQ_IRQ_PENDING, vcpu);
440 unsigned int intid,
bool level,
void *owner)
453 trace_vgic_update_irq_pending(
vcpu ?
vcpu->vcpu_idx : 0,
intid, level);
459 raw_spin_lock_irqsave(&irq->
irq_lock, flags);
463 raw_spin_unlock_irqrestore(&irq->
irq_lock, flags);
484 struct irq_desc *desc;
485 struct irq_data *data;
490 desc = irq_to_desc(host_irq);
492 kvm_err(
"%s: no interrupt descriptor\n", __func__);
495 data = irq_desc_get_irq_data(desc);
496 while (data->parent_data)
497 data = data->parent_data;
515 u32 vintid,
struct irq_ops *ops)
523 raw_spin_lock_irqsave(&irq->
irq_lock, flags);
525 raw_spin_unlock_irqrestore(&irq->
irq_lock, flags);
548 raw_spin_lock_irqsave(&irq->
irq_lock, flags);
552 raw_spin_unlock_irqrestore(&irq->
irq_lock, flags);
568 raw_spin_lock_irqsave(&irq->
irq_lock, flags);
570 raw_spin_unlock_irqrestore(&irq->
irq_lock, flags);
582 raw_spin_lock_irqsave(&irq->
irq_lock, flags);
585 raw_spin_unlock_irqrestore(&irq->
irq_lock, flags);
615 raw_spin_lock_irqsave(&irq->
irq_lock, flags);
620 raw_spin_unlock_irqrestore(&irq->
irq_lock, flags);
644 struct kvm_vcpu *target_vcpu, *vcpuA, *vcpuB;
645 bool target_vcpu_needs_kick =
false;
649 BUG_ON(vcpu != irq->
vcpu);
673 if (target_vcpu == vcpu) {
688 if (vcpu->vcpu_id < target_vcpu->vcpu_id) {
696 raw_spin_lock(&vcpuA->arch.vgic_cpu.ap_list_lock);
697 raw_spin_lock_nested(&vcpuB->arch.vgic_cpu.ap_list_lock,
698 SINGLE_DEPTH_NESTING);
711 struct vgic_cpu *new_cpu = &target_vcpu->arch.vgic_cpu;
714 irq->
vcpu = target_vcpu;
716 target_vcpu_needs_kick =
true;
720 raw_spin_unlock(&vcpuB->arch.vgic_cpu.ap_list_lock);
721 raw_spin_unlock(&vcpuA->arch.vgic_cpu.ap_list_lock);
723 if (target_vcpu_needs_kick) {
724 kvm_make_request(KVM_REQ_IRQ_PENDING, target_vcpu);
746 lockdep_assert_held(&irq->
irq_lock);
791 *multi_sgi |= (w > 1);
824 if (multi_sgi && irq->
priority > prio) {
839 if (!list_is_last(&irq->
ap_list,
851 vcpu->arch.vgic_cpu.vgic_v2.used_lrs = count;
853 vcpu->arch.vgic_cpu.vgic_v3.used_lrs = count;
880 if (list_empty(&
vcpu->arch.vgic_cpu.ap_list_head))
887 used_lrs =
vcpu->arch.vgic_cpu.vgic_v2.used_lrs;
889 used_lrs =
vcpu->arch.vgic_cpu.vgic_v3.used_lrs;
919 if (list_empty(&
vcpu->arch.vgic_cpu.ap_list_head) &&
925 if (!list_empty(&
vcpu->arch.vgic_cpu.ap_list_head)) {
926 raw_spin_lock(&
vcpu->arch.vgic_cpu.ap_list_lock);
928 raw_spin_unlock(&
vcpu->arch.vgic_cpu.ap_list_lock);
975 bool pending =
false;
979 if (!vcpu->kvm->arch.vgic.enabled)
982 if (vcpu->arch.vgic_cpu.vgic_v3.its_vpe.pending_last)
1007 struct kvm_vcpu *vcpu;
1014 kvm_for_each_vcpu(c, vcpu, kvm) {
1016 kvm_make_request(KVM_REQ_IRQ_PENDING, vcpu);
1026 unsigned long flags;
1032 raw_spin_lock_irqsave(&irq->
irq_lock, flags);
1033 map_is_active = irq->
hw && irq->
active;
1034 raw_spin_unlock_irqrestore(&irq->
irq_lock, flags);
1037 return map_is_active;
1061 bool lr_deactivated,
bool lr_pending)
1064 bool resample =
false;
1068 }
else if (lr_pending || (lr_deactivated && irq->
line_level)) {
#define irqchip_in_kernel(k)
struct vgic_global kvm_vgic_global_state
#define vgic_initialized(k)
static bool vgic_irq_needs_resampling(struct vgic_irq *irq)
#define vgic_valid_spi(k, i)
#define VGIC_NR_PRIVATE_IRQS
void kvm_vcpu_kick(struct kvm_vcpu *vcpu)
bool(* get_input_level)(int vintid)
raw_spinlock_t ap_list_lock
struct list_head ap_list_head
struct list_head lpi_list_head
raw_spinlock_t lpi_list_lock
struct static_key_false gicv3_cpuif
struct list_head lpi_list
struct kvm_vcpu * target_vcpu
enum vgic_irq_config config
int vgic_lazy_init(struct kvm *kvm)
bool vgic_supports_direct_msis(struct kvm *kvm)
void vgic_get_vmcr(struct kvm_vcpu *vcpu, struct vgic_vmcr *vmcr)
void vgic_v2_set_underflow(struct kvm_vcpu *vcpu)
void vgic_v2_clear_lr(struct kvm_vcpu *vcpu, int lr)
void vgic_v2_fold_lr_state(struct kvm_vcpu *vcpu)
void vgic_v2_put(struct kvm_vcpu *vcpu)
void vgic_v2_load(struct kvm_vcpu *vcpu)
void vgic_v2_populate_lr(struct kvm_vcpu *vcpu, struct vgic_irq *irq, int lr)
void vgic_v2_vmcr_sync(struct kvm_vcpu *vcpu)
void vgic_v2_restore_state(struct kvm_vcpu *vcpu)
void vgic_v2_save_state(struct kvm_vcpu *vcpu)
void __vgic_v3_restore_state(struct vgic_v3_cpu_if *cpu_if)
void __vgic_v3_save_state(struct vgic_v3_cpu_if *cpu_if)
void vgic_v3_clear_lr(struct kvm_vcpu *vcpu, int lr)
void vgic_v3_fold_lr_state(struct kvm_vcpu *vcpu)
void vgic_v3_put(struct kvm_vcpu *vcpu)
void vgic_v3_vmcr_sync(struct kvm_vcpu *vcpu)
void vgic_v3_populate_lr(struct kvm_vcpu *vcpu, struct vgic_irq *irq, int lr)
void vgic_v3_load(struct kvm_vcpu *vcpu)
void vgic_v3_set_underflow(struct kvm_vcpu *vcpu)
void vgic_v4_commit(struct kvm_vcpu *vcpu)
struct vgic_global kvm_vgic_global_state __ro_after_init
int kvm_vgic_get_map(struct kvm_vcpu *vcpu, unsigned int vintid)
static struct kvm_vcpu * vgic_target_oracle(struct vgic_irq *irq)
bool kvm_vgic_map_is_active(struct kvm_vcpu *vcpu, unsigned int vintid)
void vgic_irq_handle_resampling(struct vgic_irq *irq, bool lr_deactivated, bool lr_pending)
static bool vgic_validate_injection(struct vgic_irq *irq, bool level, void *owner)
void vgic_irq_set_phys_pending(struct vgic_irq *irq, bool pending)
static void vgic_populate_lr(struct kvm_vcpu *vcpu, struct vgic_irq *irq, int lr)
bool vgic_queue_irq_unlock(struct kvm *kvm, struct vgic_irq *irq, unsigned long flags)
static void vgic_restore_state(struct kvm_vcpu *vcpu)
int kvm_vgic_vcpu_pending_irq(struct kvm_vcpu *vcpu)
static void vgic_sort_ap_list(struct kvm_vcpu *vcpu)
void kvm_vgic_reset_mapped_irq(struct kvm_vcpu *vcpu, u32 vintid)
int kvm_vgic_unmap_phys_irq(struct kvm_vcpu *vcpu, unsigned int vintid)
bool vgic_get_phys_line_level(struct vgic_irq *irq)
static void vgic_save_state(struct kvm_vcpu *vcpu)
static void vgic_flush_lr_state(struct kvm_vcpu *vcpu)
void kvm_vgic_load(struct kvm_vcpu *vcpu)
void vgic_flush_pending_lpis(struct kvm_vcpu *vcpu)
static int compute_ap_list_depth(struct kvm_vcpu *vcpu, bool *multi_sgi)
void kvm_vgic_flush_hwstate(struct kvm_vcpu *vcpu)
void vgic_irq_set_phys_active(struct vgic_irq *irq, bool active)
static int kvm_vgic_map_irq(struct kvm_vcpu *vcpu, struct vgic_irq *irq, unsigned int host_irq, struct irq_ops *ops)
static int vgic_irq_cmp(void *priv, const struct list_head *a, const struct list_head *b)
void kvm_vgic_vmcr_sync(struct kvm_vcpu *vcpu)
void kvm_vgic_sync_hwstate(struct kvm_vcpu *vcpu)
static void vgic_irq_release(struct kref *ref)
struct vgic_irq * vgic_get_irq(struct kvm *kvm, struct kvm_vcpu *vcpu, u32 intid)
static bool can_access_vgic_from_kernel(void)
int kvm_vgic_inject_irq(struct kvm *kvm, struct kvm_vcpu *vcpu, unsigned int intid, bool level, void *owner)
static void vgic_set_underflow(struct kvm_vcpu *vcpu)
void kvm_vgic_put(struct kvm_vcpu *vcpu)
int kvm_vgic_set_owner(struct kvm_vcpu *vcpu, unsigned int intid, void *owner)
int kvm_vgic_map_phys_irq(struct kvm_vcpu *vcpu, unsigned int host_irq, u32 vintid, struct irq_ops *ops)
void vgic_put_irq(struct kvm *kvm, struct vgic_irq *irq)
static void vgic_fold_lr_state(struct kvm_vcpu *vcpu)
static void vgic_prune_ap_list(struct kvm_vcpu *vcpu)
static void vgic_clear_lr(struct kvm_vcpu *vcpu, int lr)
static void kvm_vgic_unmap_irq(struct vgic_irq *irq)
void vgic_kick_vcpus(struct kvm *kvm)
static struct vgic_irq * vgic_get_lpi(struct kvm *kvm, u32 intid)
void __vgic_put_lpi_locked(struct kvm *kvm, struct vgic_irq *irq)
#define DEBUG_SPINLOCK_BUG_ON(p)
static bool irq_is_pending(struct vgic_irq *irq)
static void vgic_get_irq_kref(struct vgic_irq *irq)
static int vgic_irq_get_lr_count(struct vgic_irq *irq)
static bool vgic_irq_is_mapped_level(struct vgic_irq *irq)