Lines Matching refs:vioapic

57 struct vioapic {  struct
68 #define VIOAPIC_LOCK(vioapic) mtx_lock_spin(&((vioapic)->mtx)) argument
69 #define VIOAPIC_UNLOCK(vioapic) mtx_unlock_spin(&((vioapic)->mtx)) argument
70 #define VIOAPIC_LOCKED(vioapic) mtx_owned(&((vioapic)->mtx)) argument
74 #define VIOAPIC_CTR1(vioapic, fmt, a1) \ argument
75 VM_CTR1((vioapic)->vm, fmt, a1)
77 #define VIOAPIC_CTR2(vioapic, fmt, a1, a2) \ argument
78 VM_CTR2((vioapic)->vm, fmt, a1, a2)
80 #define VIOAPIC_CTR3(vioapic, fmt, a1, a2, a3) \ argument
81 VM_CTR3((vioapic)->vm, fmt, a1, a2, a3)
83 #define VIOAPIC_CTR4(vioapic, fmt, a1, a2, a3, a4) \ argument
84 VM_CTR4((vioapic)->vm, fmt, a1, a2, a3, a4)
99 vioapic_send_intr(struct vioapic *vioapic, int pin) in vioapic_send_intr() argument
108 KASSERT(VIOAPIC_LOCKED(vioapic), in vioapic_send_intr()
111 low = vioapic->rtbl[pin].reg; in vioapic_send_intr()
112 high = vioapic->rtbl[pin].reg >> 32; in vioapic_send_intr()
115 VIOAPIC_CTR1(vioapic, "ioapic pin%d: masked", pin); in vioapic_send_intr()
124 VIOAPIC_CTR1(vioapic, "ioapic pin%d: irr pending", in vioapic_send_intr()
128 vioapic->rtbl[pin].reg |= IOART_REM_IRR; in vioapic_send_intr()
133 vlapic_deliver_intr(vioapic->vm, level, dest, phys, delmode, vector); in vioapic_send_intr()
137 vioapic_set_pinstate(struct vioapic *vioapic, int pin, bool newstate) in vioapic_set_pinstate() argument
145 KASSERT(VIOAPIC_LOCKED(vioapic), in vioapic_set_pinstate()
148 oldcnt = vioapic->rtbl[pin].acnt; in vioapic_set_pinstate()
150 vioapic->rtbl[pin].acnt++; in vioapic_set_pinstate()
152 vioapic->rtbl[pin].acnt--; in vioapic_set_pinstate()
153 newcnt = vioapic->rtbl[pin].acnt; in vioapic_set_pinstate()
156 VIOAPIC_CTR2(vioapic, "ioapic pin%d: bad acnt %d", in vioapic_set_pinstate()
163 VIOAPIC_CTR1(vioapic, "ioapic pin%d: asserted", pin); in vioapic_set_pinstate()
165 VIOAPIC_CTR1(vioapic, "ioapic pin%d: deasserted", pin); in vioapic_set_pinstate()
167 VIOAPIC_CTR3(vioapic, "ioapic pin%d: %s, ignored, acnt %d", in vioapic_set_pinstate()
172 vioapic_send_intr(vioapic, pin); in vioapic_set_pinstate()
184 struct vioapic *vioapic; in vioapic_set_irqstate() local
189 vioapic = vm_ioapic(vm); in vioapic_set_irqstate()
191 VIOAPIC_LOCK(vioapic); in vioapic_set_irqstate()
194 vioapic_set_pinstate(vioapic, irq, true); in vioapic_set_irqstate()
197 vioapic_set_pinstate(vioapic, irq, false); in vioapic_set_irqstate()
200 vioapic_set_pinstate(vioapic, irq, true); in vioapic_set_irqstate()
201 vioapic_set_pinstate(vioapic, irq, false); in vioapic_set_irqstate()
206 VIOAPIC_UNLOCK(vioapic); in vioapic_set_irqstate()
239 struct vioapic *vioapic; in vioapic_update_tmr() local
246 vioapic = vm_ioapic(vcpu_vm(vcpu)); in vioapic_update_tmr()
248 VIOAPIC_LOCK(vioapic); in vioapic_update_tmr()
254 low = vioapic->rtbl[pin].reg; in vioapic_update_tmr()
255 high = vioapic->rtbl[pin].reg >> 32; in vioapic_update_tmr()
273 VIOAPIC_UNLOCK(vioapic); in vioapic_update_tmr()
277 vioapic_read(struct vioapic *vioapic, struct vcpu *vcpu, uint32_t addr) in vioapic_read() argument
284 return (vioapic->id); in vioapic_read()
290 return (vioapic->id); in vioapic_read()
305 return (vioapic->rtbl[pin].reg >> rshift); in vioapic_read()
312 vioapic_write(struct vioapic *vioapic, struct vcpu *vcpu, uint32_t addr, in vioapic_write() argument
323 vioapic->id = data & APIC_ID_MASK; in vioapic_write()
342 last = vioapic->rtbl[pin].reg; in vioapic_write()
346 vioapic->rtbl[pin].reg &= ~mask64 | RTBL_RO_BITS; in vioapic_write()
347 vioapic->rtbl[pin].reg |= data64 & ~RTBL_RO_BITS; in vioapic_write()
355 if ((vioapic->rtbl[pin].reg & IOART_TRGRMOD) == IOART_TRGREDG && in vioapic_write()
356 (vioapic->rtbl[pin].reg & IOART_REM_IRR) != 0) in vioapic_write()
357 vioapic->rtbl[pin].reg &= ~IOART_REM_IRR; in vioapic_write()
359 VIOAPIC_CTR2(vioapic, "ioapic pin%d: redir table entry %#lx", in vioapic_write()
360 pin, vioapic->rtbl[pin].reg); in vioapic_write()
367 changed = last ^ vioapic->rtbl[pin].reg; in vioapic_write()
369 VIOAPIC_CTR1(vioapic, "ioapic pin%d: recalculate " in vioapic_write()
371 VIOAPIC_UNLOCK(vioapic); in vioapic_write()
372 allvcpus = vm_active_cpus(vioapic->vm); in vioapic_write()
375 VIOAPIC_LOCK(vioapic); in vioapic_write()
383 if ((vioapic->rtbl[pin].reg & IOART_TRGRMOD) == IOART_TRGRLVL && in vioapic_write()
384 (vioapic->rtbl[pin].acnt > 0)) { in vioapic_write()
385 VIOAPIC_CTR2(vioapic, "ioapic pin%d: asserted at rtbl " in vioapic_write()
386 "write, acnt %d", pin, vioapic->rtbl[pin].acnt); in vioapic_write()
387 vioapic_send_intr(vioapic, pin); in vioapic_write()
393 vioapic_mmio_rw(struct vioapic *vioapic, struct vcpu *vcpu, uint64_t gpa, in vioapic_mmio_rw() argument
410 VIOAPIC_LOCK(vioapic); in vioapic_mmio_rw()
413 *data = vioapic->ioregsel; in vioapic_mmio_rw()
415 vioapic->ioregsel = *data; in vioapic_mmio_rw()
418 *data = vioapic_read(vioapic, vcpu, in vioapic_mmio_rw()
419 vioapic->ioregsel); in vioapic_mmio_rw()
421 vioapic_write(vioapic, vcpu, vioapic->ioregsel, in vioapic_mmio_rw()
425 VIOAPIC_UNLOCK(vioapic); in vioapic_mmio_rw()
435 struct vioapic *vioapic; in vioapic_mmio_read() local
437 vioapic = vm_ioapic(vcpu_vm(vcpu)); in vioapic_mmio_read()
438 error = vioapic_mmio_rw(vioapic, vcpu, gpa, rval, size, true); in vioapic_mmio_read()
447 struct vioapic *vioapic; in vioapic_mmio_write() local
449 vioapic = vm_ioapic(vcpu_vm(vcpu)); in vioapic_mmio_write()
450 error = vioapic_mmio_rw(vioapic, vcpu, gpa, &wval, size, false); in vioapic_mmio_write()
457 struct vioapic *vioapic; in vioapic_process_eoi() local
463 vioapic = vm_ioapic(vm); in vioapic_process_eoi()
464 VIOAPIC_CTR1(vioapic, "ioapic processing eoi for vector %d", vector); in vioapic_process_eoi()
470 VIOAPIC_LOCK(vioapic); in vioapic_process_eoi()
472 if ((vioapic->rtbl[pin].reg & IOART_REM_IRR) == 0) in vioapic_process_eoi()
474 if ((vioapic->rtbl[pin].reg & IOART_INTVEC) != vector) in vioapic_process_eoi()
476 vioapic->rtbl[pin].reg &= ~IOART_REM_IRR; in vioapic_process_eoi()
477 if (vioapic->rtbl[pin].acnt > 0) { in vioapic_process_eoi()
478 VIOAPIC_CTR2(vioapic, "ioapic pin%d: asserted at eoi, " in vioapic_process_eoi()
479 "acnt %d", pin, vioapic->rtbl[pin].acnt); in vioapic_process_eoi()
480 vioapic_send_intr(vioapic, pin); in vioapic_process_eoi()
483 VIOAPIC_UNLOCK(vioapic); in vioapic_process_eoi()
486 struct vioapic *
490 struct vioapic *vioapic; in vioapic_init() local
492 vioapic = malloc(sizeof(struct vioapic), M_VIOAPIC, M_WAITOK | M_ZERO); in vioapic_init()
494 vioapic->vm = vm; in vioapic_init()
495 mtx_init(&vioapic->mtx, "vioapic lock", NULL, MTX_SPIN); in vioapic_init()
499 vioapic->rtbl[i].reg = 0x0001000000010000UL; in vioapic_init()
501 return (vioapic); in vioapic_init()
505 vioapic_cleanup(struct vioapic *vioapic) in vioapic_cleanup() argument
508 mtx_destroy(&vioapic->mtx); in vioapic_cleanup()
509 free(vioapic, M_VIOAPIC); in vioapic_cleanup()
521 vioapic_snapshot(struct vioapic *vioapic, struct vm_snapshot_meta *meta) in vioapic_snapshot() argument
526 SNAPSHOT_VAR_OR_LEAVE(vioapic->ioregsel, meta, ret, done); in vioapic_snapshot()
528 for (i = 0; i < nitems(vioapic->rtbl); i++) { in vioapic_snapshot()
529 SNAPSHOT_VAR_OR_LEAVE(vioapic->rtbl[i].reg, meta, ret, done); in vioapic_snapshot()
530 SNAPSHOT_VAR_OR_LEAVE(vioapic->rtbl[i].acnt, meta, ret, done); in vioapic_snapshot()