6 #include <linux/uaccess.h>
7 #include <linux/interrupt.h>
9 #include <linux/kvm_host.h>
11 #include <asm/kvm_emulate.h>
12 #include <asm/kvm_mmu.h>
73 struct kvm_vcpu *vcpu;
83 if (type == KVM_DEV_TYPE_ARM_VGIC_V2 &&
88 lockdep_assert_held(&kvm->lock);
94 mutex_lock(&kvm->arch.config_lock);
101 kvm_for_each_vcpu(i, vcpu, kvm) {
102 if (vcpu_has_run_once(vcpu))
107 if (type == KVM_DEV_TYPE_ARM_VGIC_V2)
112 if (atomic_read(&kvm->online_vcpus) > kvm->max_vcpus) {
117 kvm->arch.vgic.in_kernel =
true;
118 kvm->arch.vgic.vgic_model = type;
122 if (type == KVM_DEV_TYPE_ARM_VGIC_V2)
125 INIT_LIST_HEAD(&kvm->arch.vgic.rd_regions);
128 mutex_unlock(&kvm->arch.config_lock);
142 struct vgic_dist *dist = &kvm->arch.vgic;
143 struct kvm_vcpu *vcpu0 = kvm_get_vcpu(kvm, 0);
146 dist->
spis = kcalloc(nr_spis,
sizeof(
struct vgic_irq), GFP_KERNEL_ACCOUNT);
158 for (i = 0; i < nr_spis; i++) {
168 case KVM_DEV_TYPE_ARM_VGIC_V2:
172 case KVM_DEV_TYPE_ARM_VGIC_V3:
197 struct vgic_dist *dist = &vcpu->kvm->arch.vgic;
237 if (dist->
vgic_model == KVM_DEV_TYPE_ARM_VGIC_V3) {
238 mutex_lock(&
vcpu->kvm->slots_lock);
240 mutex_unlock(&
vcpu->kvm->slots_lock);
264 struct vgic_dist *dist = &kvm->arch.vgic;
265 struct kvm_vcpu *vcpu;
269 lockdep_assert_held(&kvm->arch.config_lock);
275 if (kvm->created_vcpus != atomic_read(&kvm->online_vcpus))
287 kvm_for_each_vcpu(idx, vcpu, kvm) {
293 case KVM_DEV_TYPE_ARM_VGIC_V3:
295 irq->
mpidr = kvm_vcpu_get_mpidr_aff(
vcpu);
297 case KVM_DEV_TYPE_ARM_VGIC_V2:
322 kvm_for_each_vcpu(idx,
vcpu, kvm)
345 struct vgic_dist *dist = &kvm->arch.vgic;
356 if (dist->
vgic_model == KVM_DEV_TYPE_ARM_VGIC_V3) {
382 if (vcpu->kvm->arch.vgic.vgic_model == KVM_DEV_TYPE_ARM_VGIC_V3) {
390 struct kvm *kvm = vcpu->kvm;
392 mutex_lock(&kvm->slots_lock);
394 mutex_unlock(&kvm->slots_lock);
399 struct kvm_vcpu *vcpu;
402 mutex_lock(&kvm->slots_lock);
406 kvm_for_each_vcpu(i, vcpu, kvm)
409 mutex_lock(&kvm->arch.config_lock);
413 mutex_unlock(&kvm->arch.config_lock);
414 mutex_unlock(&kvm->slots_lock);
434 if (kvm->arch.vgic.vgic_model != KVM_DEV_TYPE_ARM_VGIC_V2)
437 mutex_lock(&kvm->arch.config_lock);
439 mutex_unlock(&kvm->arch.config_lock);
458 struct vgic_dist *dist = &kvm->arch.vgic;
466 mutex_lock(&kvm->slots_lock);
467 mutex_lock(&kvm->arch.config_lock);
474 if (dist->
vgic_model == KVM_DEV_TYPE_ARM_VGIC_V2) {
487 mutex_unlock(&kvm->arch.config_lock);
491 kvm_err(
"Unable to register VGIC dist MMIO regions\n");
495 mutex_unlock(&kvm->arch.config_lock);
497 mutex_unlock(&kvm->slots_lock);
546 BUG_ON(preemptible());
575 kvm_err(
"No vgic maintenance irq\n");
584 kvm_info(
"Non-architectural vgic, tainting kernel\n");
585 add_taint(TAINT_CPU_OUT_OF_SPEC, LOCKDEP_STILL_OK);
597 kvm_info(
"GIC system register CPU interface enabled\n");
619 kvm_err(
"Cannot register interrupt %d\n",
bool lock_all_vcpus(struct kvm *kvm)
void unlock_all_vcpus(struct kvm *kvm)
#define VGIC_NR_IRQS_LEGACY
#define irqchip_in_kernel(k)
#define KVM_VGIC_IMP_REV_LATEST
struct vgic_global kvm_vgic_global_state
#define vgic_initialized(k)
#define VGIC_NR_PRIVATE_IRQS
struct kvm_vcpu *__percpu * kvm_get_running_vcpus(void)
struct vgic_io_device rd_iodev
struct vgic_irq private_irqs[VGIC_NR_PRIVATE_IRQS]
raw_spinlock_t ap_list_lock
struct vgic_v3_cpu_if vgic_v3
struct list_head ap_list_head
struct list_head rd_regions
struct list_head lpi_translation_cache
struct list_head lpi_list_head
raw_spinlock_t lpi_list_lock
struct static_key_false gicv3_cpuif
struct kvm_vcpu * target_vcpu
enum vgic_irq_config config
void vgic_debug_destroy(struct kvm *kvm)
void vgic_debug_init(struct kvm *kvm)
void kvm_vgic_vcpu_destroy(struct kvm_vcpu *vcpu)
static int kvm_vgic_dist_init(struct kvm *kvm, unsigned int nr_spis)
static void __kvm_vgic_vcpu_destroy(struct kvm_vcpu *vcpu)
void kvm_vgic_cpu_down(void)
static void kvm_vgic_vcpu_enable(struct kvm_vcpu *vcpu)
int vgic_init(struct kvm *kvm)
int vgic_lazy_init(struct kvm *kvm)
static irqreturn_t vgic_maintenance_handler(int irq, void *data)
int kvm_vgic_create(struct kvm *kvm, u32 type)
void kvm_vgic_cpu_up(void)
static struct gic_kvm_info * gic_kvm_info
static void kvm_vgic_dist_destroy(struct kvm *kvm)
int kvm_vgic_map_resources(struct kvm *kvm)
void kvm_vgic_early_init(struct kvm *kvm)
int kvm_vgic_hyp_init(void)
int kvm_vgic_vcpu_init(struct kvm_vcpu *vcpu)
void __init vgic_set_kvm_info(const struct gic_kvm_info *info)
void kvm_vgic_init_cpu_hardware(void)
void kvm_vgic_destroy(struct kvm *kvm)
int kvm_vgic_setup_default_irq_routing(struct kvm *kvm)
void vgic_lpi_translation_cache_destroy(struct kvm *kvm)
void vgic_lpi_translation_cache_init(struct kvm *kvm)
bool vgic_has_its(struct kvm *kvm)
void vgic_unregister_redist_iodev(struct kvm_vcpu *vcpu)
int vgic_register_redist_iodev(struct kvm_vcpu *vcpu)
bool vgic_supports_direct_msis(struct kvm *kvm)
void vgic_v3_free_redist_region(struct vgic_redist_region *rdreg)
int vgic_register_dist_iodev(struct kvm *kvm, gpa_t dist_base_address, enum vgic_type type)
void vgic_v2_init_lrs(void)
void vgic_v2_enable(struct kvm_vcpu *vcpu)
int vgic_v2_probe(const struct gic_kvm_info *info)
int vgic_v2_map_resources(struct kvm *kvm)
void __vgic_v3_init_lrs(void)
int vgic_v3_map_resources(struct kvm *kvm)
void vgic_v3_enable(struct kvm_vcpu *vcpu)
int vgic_v3_probe(const struct gic_kvm_info *info)
int vgic_v4_init(struct kvm *kvm)
void vgic_v4_teardown(struct kvm *kvm)
void vgic_flush_pending_lpis(struct kvm_vcpu *vcpu)
#define vgic_irq_is_sgi(intid)