void chooseThread(void) { word_t prio; word_t dom; tcb_t *thread; if (CONFIG_NUM_DOMAINS > 1) { dom = ksCurDomain; } else { dom = 0; } if (likely(ksReadyQueuesL1Bitmap[dom])) { word_t l1index = (wordBits - 1) - clzl(ksReadyQueuesL1Bitmap[dom]); word_t l2index = (wordBits - 1) - clzl(ksReadyQueuesL2Bitmap[dom][l1index]); prio = l1index_to_prio(l1index) | l2index; thread = ksReadyQueues[ready_queues_index(dom, prio)].head; assert(thread); assert(isRunnable(thread)); switchToThread(thread); } else { switchToIdleThread(); } }
interrupt_t getActiveIRQ(void) { uint32_t pending; uint32_t irq; /* Read core interrupt register */ pending = core_regs->coreIRQSource[0]; /* Mask out invalid bits */ pending &= MASK(12); /* If pending == 0 spurious interrupt */ if (pending == 0) { return irqInvalid; } /* Get IRQ number */ irq = (wordBits - 1 - clzl(pending)); if (irq != INTERRUPT_CORE_GPU) { return irq; } /* GPU interrupt */ pending = intc_regs->bfIRQBasicPending; pending &= intc_regs->bfEnableBasicIRQs; /* Mask out pending register 0 and 1 */ pending &= ~BIT(INTERRUPT_BASIC_IRQ_PENDING_REGISTER1 - BASIC_IRQ_OFFSET); pending &= ~BIT(INTERRUPT_BASIC_IRQ_PENDING_REGISTER2 - BASIC_IRQ_OFFSET); if (pending) { return (wordBits - 1 - clzl(pending)) + BASIC_IRQ_OFFSET; } pending = intc_regs->bfGPUIRQPending[1]; pending &= intc_regs->bfEnableIRQs[1]; if (pending) { return (wordBits - 1 - clzl(pending)) + 32 + NORMAL_IRQ_OFFSET; } pending = intc_regs->bfGPUIRQPending[0]; pending &= intc_regs->bfEnableIRQs[0]; if (pending) { return (wordBits - 1 - clzl(pending)) + 0 + NORMAL_IRQ_OFFSET; } return irqInvalid; }