c - Explanation of __do_IRQ function -
i'm preparing presentation on how linux kernel handles interrupts based on book understanding linux kernel ny bovet & cesati. cover says covers version 2.6. however, can't quite figure out how given __do_irq() function supposed work. although i've done (basic) c programming, can't understand of instructions.
spin_lock(&(irq_desc[irq].lock)); irq_desc[irq].handler->ack(irq); irq_desc[irq].status &= ~(irq_replay | irq_waiting); irq_desc[irq].status |= irq_pending; if (!(irq_desc[irq].status & (irq_disabled | irq_inprogress)) && irq_desc[irq].action){ irq_desc[irq].status |= irq_inprogress; do{ irq_desc[irq].status &= ~irq_pending; spin_unlock(&(irq_desc[irq].lock)); handle_irq_event(irq,regs,irq_desc[irq].action); spin_lock(&(irq_desc[irq].lock)); }while (irq_desc[irq].status & irq_pending); irq_desc[irq].status &= ~irq_inprogress; } irq_desc[irq].handler->end(irq); spin_unlock(&(irq_desc[irq].lock)); my questions following:
how assignment of .status work? book says set of flags. flags uppercase variables, how accessed in scenario? shouldn't .status.irq_something or that?
what single "&" mean in condition of if expression?
i'm going answer in reverse order.
the & "bitwise and" operator; | "bitwise or" operator. given integer variable x, expression:
x |= (1u << n); sets bit n of x 1. conversely:
x &= ~(1u << n); clears bit n of x, setting 0.
given understanding of operator, can see how .status field works - integer field, , various flags turned on , off using operators mentioned above. flags checked using & operator:
irq_desc[irq].status & (irq_disabled | irq_inprogress) yields true result when either of irq_disabled or irq_inprogress bits set in .status field.
Comments
Post a Comment