• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /netgear-R7000-V1.0.7.12_1.2.5/components/opensource/linux/linux-2.6.36/virt/kvm/

Lines Matching defs:ioapic

43 #include "ioapic.h"
50 static unsigned long ioapic_read_indirect(struct kvm_ioapic *ioapic,
56 switch (ioapic->ioregsel) {
64 result = ((ioapic->id & 0xf) << 24);
69 u32 redir_index = (ioapic->ioregsel - 0x10) >> 1;
74 redir_content = ioapic->redirtbl[redir_index].bits;
75 result = (ioapic->ioregsel & 0x1) ?
85 static int ioapic_service(struct kvm_ioapic *ioapic, unsigned int idx)
90 pent = &ioapic->redirtbl[idx];
93 injected = ioapic_deliver(ioapic, idx);
101 static void update_handled_vectors(struct kvm_ioapic *ioapic)
108 __set_bit(ioapic->redirtbl[i].fields.vector, handled_vectors);
109 memcpy(ioapic->handled_vectors, handled_vectors,
114 static void ioapic_write_indirect(struct kvm_ioapic *ioapic, u32 val)
120 switch (ioapic->ioregsel) {
126 ioapic->id = (val >> 24) & 0xf;
133 index = (ioapic->ioregsel - 0x10) >> 1;
138 e = &ioapic->redirtbl[index];
140 if (ioapic->ioregsel & 1) {
148 update_handled_vectors(ioapic);
151 kvm_fire_mask_notifiers(ioapic->kvm, KVM_IRQCHIP_IOAPIC, index, mask_after);
153 && ioapic->irr & (1 << index))
154 ioapic_service(ioapic, index);
159 static int ioapic_deliver(struct kvm_ioapic *ioapic, int irq)
161 union kvm_ioapic_redirect_entry *entry = &ioapic->redirtbl[irq];
184 irqe.dest_id = ioapic->kvm->bsp_vcpu->vcpu_id;
187 return kvm_irq_delivery_to_apic(ioapic->kvm, NULL, &irqe);
190 int kvm_ioapic_set_irq(struct kvm_ioapic *ioapic, int irq, int level)
197 spin_lock(&ioapic->lock);
198 old_irr = ioapic->irr;
200 entry = ioapic->redirtbl[irq];
203 ioapic->irr &= ~mask;
206 ioapic->irr |= mask;
207 if ((edge && old_irr != ioapic->irr) ||
209 ret = ioapic_service(ioapic, irq);
215 spin_unlock(&ioapic->lock);
220 static void __kvm_ioapic_update_eoi(struct kvm_ioapic *ioapic, int vector,
226 union kvm_ioapic_redirect_entry *ent = &ioapic->redirtbl[i];
239 spin_unlock(&ioapic->lock);
240 kvm_notify_acked_irq(ioapic->kvm, KVM_IRQCHIP_IOAPIC, i);
241 spin_lock(&ioapic->lock);
248 if (!ent->fields.mask && (ioapic->irr & (1 << i)))
249 ioapic_service(ioapic, i);
255 struct kvm_ioapic *ioapic = kvm->arch.vioapic;
258 if (!test_bit(vector, ioapic->handled_vectors))
260 spin_lock(&ioapic->lock);
261 __kvm_ioapic_update_eoi(ioapic, vector, trigger_mode);
262 spin_unlock(&ioapic->lock);
270 static inline int ioapic_in_range(struct kvm_ioapic *ioapic, gpa_t addr)
272 return ((addr >= ioapic->base_address &&
273 (addr < ioapic->base_address + IOAPIC_MEM_LENGTH)));
279 struct kvm_ioapic *ioapic = to_ioapic(this);
281 if (!ioapic_in_range(ioapic, addr))
288 spin_lock(&ioapic->lock);
291 result = ioapic->ioregsel;
295 result = ioapic_read_indirect(ioapic, addr, len);
302 spin_unlock(&ioapic->lock);
314 printk(KERN_WARNING "ioapic: wrong length %d\n", len);
322 struct kvm_ioapic *ioapic = to_ioapic(this);
324 if (!ioapic_in_range(ioapic, addr))
334 printk(KERN_WARNING "ioapic: Unsupported size %d\n", len);
339 spin_lock(&ioapic->lock);
342 ioapic->ioregsel = data;
346 ioapic_write_indirect(ioapic, data);
350 __kvm_ioapic_update_eoi(ioapic, data, IOAPIC_LEVEL_TRIG);
357 spin_unlock(&ioapic->lock);
361 void kvm_ioapic_reset(struct kvm_ioapic *ioapic)
366 ioapic->redirtbl[i].fields.mask = 1;
367 ioapic->base_address = IOAPIC_DEFAULT_BASE_ADDRESS;
368 ioapic->ioregsel = 0;
369 ioapic->irr = 0;
370 ioapic->id = 0;
371 update_handled_vectors(ioapic);
381 struct kvm_ioapic *ioapic;
384 ioapic = kzalloc(sizeof(struct kvm_ioapic), GFP_KERNEL);
385 if (!ioapic)
387 spin_lock_init(&ioapic->lock);
388 kvm->arch.vioapic = ioapic;
389 kvm_ioapic_reset(ioapic);
390 kvm_iodevice_init(&ioapic->dev, &ioapic_mmio_ops);
391 ioapic->kvm = kvm;
393 ret = kvm_io_bus_register_dev(kvm, KVM_MMIO_BUS, &ioapic->dev);
397 kfree(ioapic);
405 struct kvm_ioapic *ioapic = kvm->arch.vioapic;
407 if (ioapic) {
408 kvm_io_bus_unregister_dev(kvm, KVM_MMIO_BUS, &ioapic->dev);
410 kfree(ioapic);
416 struct kvm_ioapic *ioapic = ioapic_irqchip(kvm);
417 if (!ioapic)
420 spin_lock(&ioapic->lock);
421 memcpy(state, ioapic, sizeof(struct kvm_ioapic_state));
422 spin_unlock(&ioapic->lock);
428 struct kvm_ioapic *ioapic = ioapic_irqchip(kvm);
429 if (!ioapic)
432 spin_lock(&ioapic->lock);
433 memcpy(ioapic, state, sizeof(struct kvm_ioapic_state));
434 update_handled_vectors(ioapic);
435 spin_unlock(&ioapic->lock);