8 #include <linux/debugfs.h>
9 #include <linux/interrupt.h>
10 #include <linux/kvm_host.h>
11 #include <linux/seq_file.h>
13 #include <asm/kvm_mmu.h>
58 int nr_cpus = atomic_read(&kvm->online_vcpus);
60 memset(iter, 0,
sizeof(*iter));
63 iter->
nr_spis = kvm->arch.vgic.nr_spis;
64 if (kvm->arch.vgic.vgic_model == KVM_DEV_TYPE_ARM_VGIC_V3) {
85 struct kvm *kvm = s->private;
88 mutex_lock(&kvm->arch.config_lock);
89 iter = kvm->arch.vgic.iter;
91 iter = ERR_PTR(-EBUSY);
95 iter = kmalloc(
sizeof(*iter), GFP_KERNEL);
97 iter = ERR_PTR(-ENOMEM);
102 kvm->arch.vgic.iter = iter;
107 mutex_unlock(&kvm->arch.config_lock);
113 struct kvm *kvm = s->private;
125 struct kvm *kvm = s->private;
135 mutex_lock(&kvm->arch.config_lock);
136 iter = kvm->arch.vgic.iter;
139 kvm->arch.vgic.iter = NULL;
140 mutex_unlock(&kvm->arch.config_lock);
145 bool v3 = dist->
vgic_model == KVM_DEV_TYPE_ARM_VGIC_V3;
147 seq_printf(s,
"Distributor\n");
148 seq_printf(s,
"===========\n");
149 seq_printf(s,
"vgic_model:\t%s\n", v3 ?
"GICv3" :
"GICv2");
150 seq_printf(s,
"nr_spis:\t%d\n", dist->
nr_spis);
153 seq_printf(s,
"enabled:\t%d\n", dist->
enabled);
156 seq_printf(s,
"P=pending_latch, L=line_level, A=active\n");
157 seq_printf(s,
"E=enabled, H=hw, C=config (level=1, edge=0)\n");
158 seq_printf(s,
"G=group\n");
162 struct kvm_vcpu *vcpu)
173 seq_printf(s,
"%s%2d TYP ID TGT_ID PLAEHCG HWID TARGET SRC PRI VCPU_ID\n", hdr,
id);
174 seq_printf(s,
"----------------------------------------------------------------\n");
178 struct kvm_vcpu *vcpu)
199 err = irq_get_irqchip_state(irq->
host_irq,
200 IRQCHIP_STATE_PENDING,
205 seq_printf(s,
" %s %4d "
227 (irq->
vcpu) ? irq->
vcpu->vcpu_idx : -1);
232 struct kvm *kvm = s->private;
235 struct kvm_vcpu *vcpu = NULL;
243 if (!kvm->arch.vgic.initialized)
247 vcpu = kvm_get_vcpu(kvm, iter->
vcpu_id);
251 seq_printf(s,
" LPI %4d freed\n", iter->
intid);
255 raw_spin_lock_irqsave(&irq->
irq_lock, flags);
257 raw_spin_unlock_irqrestore(&irq->
irq_lock, flags);
274 debugfs_create_file(
"vgic-state", 0444, kvm->debugfs_dentry, kvm,
#define VGIC_NR_PRIVATE_IRQS
struct kvm_vcpu * target_vcpu
enum vgic_irq_config config
void vgic_debug_destroy(struct kvm *kvm)
static void * vgic_debug_next(struct seq_file *s, void *v, loff_t *pos)
static void print_header(struct seq_file *s, struct vgic_irq *irq, struct kvm_vcpu *vcpu)
void vgic_debug_init(struct kvm *kvm)
static const struct seq_operations vgic_debug_sops
static void vgic_debug_stop(struct seq_file *s, void *v)
static void * vgic_debug_start(struct seq_file *s, loff_t *pos)
static int vgic_debug_show(struct seq_file *s, void *v)
static void print_irq_state(struct seq_file *s, struct vgic_irq *irq, struct kvm_vcpu *vcpu)
static bool end_of_vgic(struct vgic_state_iter *iter)
static void iter_init(struct kvm *kvm, struct vgic_state_iter *iter, loff_t pos)
static void print_dist_state(struct seq_file *s, struct vgic_dist *dist)
static void iter_next(struct vgic_state_iter *iter)
DEFINE_SEQ_ATTRIBUTE(vgic_debug)
int vgic_copy_lpi_list(struct kvm *kvm, struct kvm_vcpu *vcpu, u32 **intid_ptr)
struct vgic_irq * vgic_get_irq(struct kvm *kvm, struct kvm_vcpu *vcpu, u32 intid)
void vgic_put_irq(struct kvm *kvm, struct vgic_irq *irq)
#define vgic_irq_is_sgi(intid)