vatpic
static int vatpic_set_pinstate(struct vatpic *vatpic, int pin, bool newstate);
master_atpic(struct vatpic *vatpic, struct atpic *atpic)
if (atpic == &vatpic->atpic[0])
vatpic_notify_intr(struct vatpic *vatpic)
ASSERT(VATPIC_LOCKED(vatpic));
atpic = &vatpic->atpic[1];
if (vatpic_set_pinstate(vatpic, 2, true) == 0) {
(void) vatpic_set_pinstate(vatpic, 2, false);
atpic = &vatpic->atpic[0];
(void) lapic_set_local_intr(vatpic->vm, -1, APIC_LVT_LINT0);
(void) vioapic_pulse_irq(vatpic->vm, 0);
vatpic->stats.as_interrupts++;
vatpic_icw1(struct vatpic *vatpic, struct atpic *atpic, uint8_t val)
vatpic_icw2(struct vatpic *vatpic, struct atpic *atpic, uint8_t val)
vatpic_icw3(struct vatpic *vatpic, struct atpic *atpic, uint8_t val)
vatpic_icw4(struct vatpic *vatpic, struct atpic *atpic, uint8_t val)
if (master_atpic(vatpic, atpic)) {
vatpic_ocw1(struct vatpic *vatpic, struct atpic *atpic, uint8_t val)
vatpic_ocw2(struct vatpic *vatpic, struct atpic *atpic, uint8_t val)
vatpic_ocw3(struct vatpic *vatpic, struct atpic *atpic, uint8_t val)
vatpic_set_pinstate(struct vatpic *vatpic, int pin, bool newstate)
ASSERT(VATPIC_LOCKED(vatpic));
atpic = &vatpic->atpic[pin >> 3];
DTRACE_PROBE2(vatpic__sat_high, struct vatpic *, vatpic,
vatpic->stats.as_saturate_high++;
DTRACE_PROBE2(vatpic__sat_low, struct vatpic *, vatpic,
vatpic->stats.as_saturate_low++;
DTRACE_PROBE2(vatpic__assert, struct vatpic *, vatpic,
DTRACE_PROBE2(vatpic__deassert, struct vatpic *, vatpic,
vatpic_notify_intr(vatpic);
struct vatpic *vatpic;
vatpic = vm_atpic(vm);
atpic = &vatpic->atpic[irq >> 3];
VATPIC_LOCK(vatpic);
err = vatpic_set_pinstate(vatpic, irq, true);
err = vatpic_set_pinstate(vatpic, irq, false);
err = vatpic_set_pinstate(vatpic, irq, true);
err = vatpic_set_pinstate(vatpic, irq, false);
VATPIC_UNLOCK(vatpic);
struct vatpic *vatpic = vm_atpic(vm);
struct atpic *atpic = &vatpic->atpic[irq >> 3];
VATPIC_LOCK(vatpic);
VATPIC_UNLOCK(vatpic);
struct vatpic *vatpic;
vatpic = vm_atpic(vm);
atpic = &vatpic->atpic[0];
VATPIC_LOCK(vatpic);
atpic = &vatpic->atpic[1];
VATPIC_UNLOCK(vatpic);
struct vatpic *vatpic;
vatpic = vm_atpic(vm);
VATPIC_LOCK(vatpic);
if ((vector & IRQ_BASE_MASK) == vatpic->atpic[1].irq_base) {
vatpic_pin_accepted(&vatpic->atpic[1], pin);
vatpic_pin_accepted(&vatpic->atpic[0], 2);
vatpic_pin_accepted(&vatpic->atpic[0], pin);
vatpic_notify_intr(vatpic);
VATPIC_UNLOCK(vatpic);
vatpic_read(struct vatpic *vatpic, struct atpic *atpic, bool in, int port,
VATPIC_LOCK(vatpic);
#define VATPIC_LOCK(vatpic) mutex_enter(&((vatpic)->lock))
#define VATPIC_UNLOCK(vatpic) mutex_exit(&((vatpic)->lock))
VATPIC_UNLOCK(vatpic);
#define VATPIC_LOCKED(vatpic) MUTEX_HELD(&((vatpic)->lock))
vatpic_write(struct vatpic *vatpic, struct atpic *atpic, bool in, int port,
VATPIC_LOCK(vatpic);
error = vatpic_icw2(vatpic, atpic, val);
error = vatpic_icw3(vatpic, atpic, val);
error = vatpic_icw4(vatpic, atpic, val);
error = vatpic_ocw1(vatpic, atpic, val);
error = vatpic_icw1(vatpic, atpic, val);
error = vatpic_ocw3(vatpic, atpic, val);
error = vatpic_ocw2(vatpic, atpic, val);
vatpic_notify_intr(vatpic);
VATPIC_UNLOCK(vatpic);
struct vatpic *vatpic = arg;
struct atpic *atpic = &vatpic->atpic[0];
return (vatpic_read(vatpic, atpic, in, port, bytes, eax));
return (vatpic_write(vatpic, atpic, in, port, bytes, eax));
struct vatpic *vatpic = arg;
struct atpic *atpic = &vatpic->atpic[1];
return (vatpic_read(vatpic, atpic, in, port, bytes, eax));
return (vatpic_write(vatpic, atpic, in, port, bytes, eax));
struct vatpic *vatpic = arg;
atpic = &vatpic->atpic[0];
atpic = &vatpic->atpic[1];
VATPIC_LOCK(vatpic);
VATPIC_UNLOCK(vatpic);
struct vatpic *
struct vatpic *vatpic;
vatpic = kmem_zalloc(sizeof (struct vatpic), KM_SLEEP);
vatpic->vm = vm;
mutex_init(&vatpic->lock, NULL, MUTEX_ADAPTIVE, NULL);
return (vatpic);
vatpic_cleanup(struct vatpic *vatpic)
mutex_destroy(&vatpic->lock);
kmem_free(vatpic, sizeof (*vatpic));
struct vatpic *vatpic = datap;
VATPIC_LOCK(vatpic);
const struct atpic *src = &vatpic->atpic[i];
VATPIC_UNLOCK(vatpic);
struct vatpic *vatpic = datap;
VATPIC_LOCK(vatpic);
struct atpic *out = &vatpic->atpic[i];
VATPIC_UNLOCK(vatpic);
struct vatpic *vatpic_init(struct vm *vm);
void vatpic_cleanup(struct vatpic *vatpic);
struct vatpic *vm_atpic(struct vm *vm);
struct vatpic *vatpic; /* (i) virtual atpic */
struct vatpic *
return (vm->vatpic);
return (vm->vatpic);
vm->vatpic = vatpic_init(vm);
vatpic_cleanup(vm->vatpic);
struct vatpic *pic = vm_atpic(vm);