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)