static void icp_irq(XICSState *icp, int server, int nr, uint8_t priority) { ICPState *ss = icp->ss + server; trace_xics_icp_irq(server, nr, priority); if ((priority >= CPPR(ss)) || (XISR(ss) && (ss->pending_priority <= priority))) { ics_reject(icp->ics, nr); } else { if (XISR(ss)) { ics_reject(icp->ics, XISR(ss)); } ss->xirr = (ss->xirr & ~XISR_MASK) | (nr & XISR_MASK); ss->pending_priority = priority; trace_xics_icp_raise(ss->xirr, ss->pending_priority); qemu_irq_raise(ss->output); } }
static void icp_irq(ICSState *ics, int server, int nr, uint8_t priority) { ICPState *icp = xics_icp_get(ics->xics, server); trace_xics_icp_irq(server, nr, priority); if ((priority >= CPPR(icp)) || (XISR(icp) && (icp->pending_priority <= priority))) { ics_reject(ics, nr); } else { if (XISR(icp) && icp->xirr_owner) { ics_reject(icp->xirr_owner, XISR(icp)); icp->xirr_owner = NULL; } icp->xirr = (icp->xirr & ~XISR_MASK) | (nr & XISR_MASK); icp->xirr_owner = ics; icp->pending_priority = priority; trace_xics_icp_raise(icp->xirr, icp->pending_priority); qemu_irq_raise(icp->output); } }