Lines Matching refs:vpic

38                         arch.hvm_domain.vpic[!vpic->is_master]))
40 vpic[!(v)->is_master])->irq_lock
44 #define vpic_elcr_mask(v) (vpic->is_master ? (uint8_t)0xf8 : (uint8_t)0xde);
48 static int vpic_get_priority(struct hvm_hw_vpic *vpic, uint8_t mask) in vpic_get_priority() argument
52 ASSERT(vpic_is_locked(vpic)); in vpic_get_priority()
59 : "=r" (prio) : "q" ((uint32_t)mask), "c" (vpic->priority_add) ); in vpic_get_priority()
64 static int vpic_get_highest_priority_irq(struct hvm_hw_vpic *vpic) in vpic_get_highest_priority_irq() argument
69 ASSERT(vpic_is_locked(vpic)); in vpic_get_highest_priority_irq()
71 mask = vpic->irr & ~vpic->imr; in vpic_get_highest_priority_irq()
72 priority = vpic_get_priority(vpic, mask); in vpic_get_highest_priority_irq()
76 irq = (priority + vpic->priority_add) & 7; in vpic_get_highest_priority_irq()
84 mask = vpic->isr; in vpic_get_highest_priority_irq()
85 if ( vpic->special_fully_nested_mode && vpic->is_master && (irq == 2) ) in vpic_get_highest_priority_irq()
87 if ( vpic->special_mask_mode ) in vpic_get_highest_priority_irq()
88 mask &= ~vpic->imr; in vpic_get_highest_priority_irq()
89 cur_priority = vpic_get_priority(vpic, mask); in vpic_get_highest_priority_irq()
95 static void vpic_update_int_output(struct hvm_hw_vpic *vpic) in vpic_update_int_output() argument
99 ASSERT(vpic_is_locked(vpic)); in vpic_update_int_output()
101 irq = vpic_get_highest_priority_irq(vpic); in vpic_update_int_output()
102 TRACE_3D(TRC_HVM_EMUL_PIC_INT_OUTPUT, vpic->int_output, vpic->is_master, in vpic_update_int_output()
104 if ( vpic->int_output == (irq >= 0) ) in vpic_update_int_output()
108 vpic->int_output = !vpic->int_output; in vpic_update_int_output()
110 if ( vpic->int_output ) in vpic_update_int_output()
112 if ( vpic->is_master ) in vpic_update_int_output()
115 struct vcpu *v = vpic_domain(vpic)->arch.hvm_domain.i8259_target; in vpic_update_int_output()
125 (--vpic)->irr |= 1 << 2; in vpic_update_int_output()
126 vpic_update_int_output(vpic); in vpic_update_int_output()
129 else if ( !vpic->is_master ) in vpic_update_int_output()
132 (--vpic)->irr &= ~(1 << 2); in vpic_update_int_output()
133 vpic_update_int_output(vpic); in vpic_update_int_output()
137 static void __vpic_intack(struct hvm_hw_vpic *vpic, int irq) in __vpic_intack() argument
141 ASSERT(vpic_is_locked(vpic)); in __vpic_intack()
143 TRACE_2D(TRC_HVM_EMUL_PIC_INTACK, vpic->is_master, irq); in __vpic_intack()
145 if ( !(vpic->elcr & mask) ) in __vpic_intack()
146 vpic->irr &= ~mask; in __vpic_intack()
148 if ( !vpic->auto_eoi ) in __vpic_intack()
149 vpic->isr |= mask; in __vpic_intack()
150 else if ( vpic->rotate_on_auto_eoi ) in __vpic_intack()
151 vpic->priority_add = (irq + 1) & 7; in __vpic_intack()
153 vpic_update_int_output(vpic); in __vpic_intack()
156 static int vpic_intack(struct hvm_hw_vpic *vpic) in vpic_intack() argument
160 vpic_lock(vpic); in vpic_intack()
162 if ( !vpic->int_output ) in vpic_intack()
165 irq = vpic_get_highest_priority_irq(vpic); in vpic_intack()
167 __vpic_intack(vpic, irq); in vpic_intack()
169 if ( (irq == 2) && vpic->is_master ) in vpic_intack()
171 vpic++; /* Slave PIC */ in vpic_intack()
172 irq = vpic_get_highest_priority_irq(vpic); in vpic_intack()
174 __vpic_intack(vpic, irq); in vpic_intack()
179 vpic_unlock(vpic); in vpic_intack()
184 struct hvm_hw_vpic *vpic, uint32_t addr, uint32_t val) in vpic_ioport_write() argument
189 vpic_lock(vpic); in vpic_ioport_write()
197 vpic->irr &= vpic->elcr; in vpic_ioport_write()
199 unmasked = vpic->imr; in vpic_ioport_write()
201 vpic->imr = vpic->isr = 0; in vpic_ioport_write()
204 vpic->priority_add = 0; in vpic_ioport_write()
205 vpic->rotate_on_auto_eoi = 0; in vpic_ioport_write()
207 vpic->special_mask_mode = 0; in vpic_ioport_write()
208 vpic->readsel_isr = 0; in vpic_ioport_write()
209 vpic->poll = 0; in vpic_ioport_write()
214 vpic->auto_eoi = 0; in vpic_ioport_write()
215 vpic->special_fully_nested_mode = 0; in vpic_ioport_write()
218 vpic->init_state = ((val & 3) << 2) | 1; in vpic_ioport_write()
224 vpic->poll = 1; in vpic_ioport_write()
226 vpic->readsel_isr = val & 1; in vpic_ioport_write()
228 vpic->special_mask_mode = (val >> 5) & 1; in vpic_ioport_write()
238 vpic->rotate_on_auto_eoi = cmd >> 2; in vpic_ioport_write()
242 mask = vpic->isr; in vpic_ioport_write()
243 if ( vpic->special_mask_mode ) in vpic_ioport_write()
244 mask &= ~vpic->imr; /* SMM: ignore masked IRs. */ in vpic_ioport_write()
245 priority = vpic_get_priority(vpic, mask); in vpic_ioport_write()
248 irq = (priority + vpic->priority_add) & 7; in vpic_ioport_write()
249 vpic->isr &= ~(1 << irq); in vpic_ioport_write()
251 vpic->priority_add = (irq + 1) & 7; in vpic_ioport_write()
256 vpic->isr &= ~(1 << irq); in vpic_ioport_write()
258 vpic->priority_add = (irq + 1) & 7; in vpic_ioport_write()
260 vpic_update_int_output(vpic); in vpic_ioport_write()
261 vpic_unlock(vpic); in vpic_ioport_write()
267 vpic->priority_add = (val + 1) & 7; in vpic_ioport_write()
274 switch ( vpic->init_state & 3 ) in vpic_ioport_write()
278 unmasked = vpic->imr & (~val); in vpic_ioport_write()
279 vpic->imr = val; in vpic_ioport_write()
283 vpic->irq_base = val & 0xf8; in vpic_ioport_write()
284 vpic->init_state++; in vpic_ioport_write()
285 if ( !(vpic->init_state & 8) ) in vpic_ioport_write()
290 vpic->init_state++; in vpic_ioport_write()
291 if ( !(vpic->init_state & 4) ) in vpic_ioport_write()
292 vpic->init_state = 0; /* No ICW4: init done */ in vpic_ioport_write()
296 vpic->special_fully_nested_mode = (val >> 4) & 1; in vpic_ioport_write()
297 vpic->auto_eoi = (val >> 1) & 1; in vpic_ioport_write()
298 vpic->init_state = 0; in vpic_ioport_write()
303 vpic_update_int_output(vpic); in vpic_ioport_write()
305 vpic_unlock(vpic); in vpic_ioport_write()
308 pt_may_unmask_irq(vpic_domain(vpic), NULL); in vpic_ioport_write()
311 static uint32_t vpic_ioport_read(struct hvm_hw_vpic *vpic, uint32_t addr) in vpic_ioport_read() argument
313 if ( vpic->poll ) in vpic_ioport_read()
315 vpic->poll = 0; in vpic_ioport_read()
316 return vpic_intack(vpic); in vpic_ioport_read()
320 return (vpic->readsel_isr ? vpic->isr : vpic->irr); in vpic_ioport_read()
322 return vpic->imr; in vpic_ioport_read()
328 struct hvm_hw_vpic *vpic; in vpic_intercept_pic_io() local
337 vpic = &current->domain->arch.hvm_domain.vpic[port >> 7]; in vpic_intercept_pic_io()
340 vpic_ioport_write(vpic, port, (uint8_t)*val); in vpic_intercept_pic_io()
342 *val = (uint8_t)vpic_ioport_read(vpic, port); in vpic_intercept_pic_io()
350 struct hvm_hw_vpic *vpic; in vpic_intercept_elcr_io() local
355 vpic = &current->domain->arch.hvm_domain.vpic[port & 1]; in vpic_intercept_elcr_io()
360 data = *val & vpic_elcr_mask(vpic); in vpic_intercept_elcr_io()
361 if ( vpic->is_master ) in vpic_intercept_elcr_io()
363 vpic->elcr = data; in vpic_intercept_elcr_io()
368 *val = vpic->elcr & vpic_elcr_mask(vpic); in vpic_intercept_elcr_io()
385 s = &d->arch.hvm_domain.vpic[i]; in vpic_save()
405 s = &d->arch.hvm_domain.vpic[inst]; in vpic_load()
418 struct hvm_hw_vpic *vpic; in vpic_reset() local
424 vpic = &d->arch.hvm_domain.vpic[0]; in vpic_reset()
425 memset(vpic, 0, sizeof(*vpic)); in vpic_reset()
426 vpic->is_master = 1; in vpic_reset()
427 vpic->elcr = 1 << 2; in vpic_reset()
430 vpic++; in vpic_reset()
431 memset(vpic, 0, sizeof(*vpic)); in vpic_reset()
450 struct hvm_hw_vpic *vpic = &d->arch.hvm_domain.vpic[irq >> 3]; in vpic_irq_positive_edge() local
455 ASSERT(vpic_is_locked(vpic)); in vpic_irq_positive_edge()
461 vpic->irr |= mask; in vpic_irq_positive_edge()
462 if ( !(vpic->imr & mask) ) in vpic_irq_positive_edge()
463 vpic_update_int_output(vpic); in vpic_irq_positive_edge()
468 struct hvm_hw_vpic *vpic = &d->arch.hvm_domain.vpic[irq >> 3]; in vpic_irq_negative_edge() local
473 ASSERT(vpic_is_locked(vpic)); in vpic_irq_negative_edge()
479 vpic->irr &= ~mask; in vpic_irq_negative_edge()
480 if ( !(vpic->imr & mask) ) in vpic_irq_negative_edge()
481 vpic_update_int_output(vpic); in vpic_irq_negative_edge()
487 struct hvm_hw_vpic *vpic = &v->domain->arch.hvm_domain.vpic[0]; in vpic_ack_pending_irq() local
492 vpic->int_output); in vpic_ack_pending_irq()
493 if ( !vlapic_accept_pic_intr(v) || !vpic->int_output ) in vpic_ack_pending_irq()
496 irq = vpic_intack(vpic); in vpic_ack_pending_irq()
500 vector = vpic[irq >> 3].irq_base + (irq & 7); in vpic_ack_pending_irq()