void run_irqs(void) /* find the highest priority unmasked requested irq and run it */ { int local_pic_ilevel, ret; /* don't allow HW interrupts in force trace mode */ pic_activate(); if (!isset_IF()) { if (pic_pending()) set_VIP(); return; /* exit if ints are disabled */ } clear_VIP(); /* check for and find any requested irqs. Having found one, we atomic-ly * clear it and verify it was there when we cleared it. If it wasn't, we * look for the next request. There are two in_service bits for pic1 irqs. * This is needed, because irq 8-15 must do 2 outb20s, which, if the dos * irq code actually runs, will reset the bits. We also reset them here, * since dos code won't necessarily run. */ while((local_pic_ilevel = pic_get_ilevel()) != -1) { /* while something to do*/ pic_print(1, "Running irq lvl ", local_pic_ilevel, ""); clear_bit(local_pic_ilevel, &pic_irr); /* pic_isr bit is set in do_irq() */ ret = (pic_iinfo[local_pic_ilevel].func ? pic_iinfo[local_pic_ilevel].func(local_pic_ilevel) : 1); /* run the function */ if (ret) { do_irq(local_pic_ilevel); } } }
void do_irq_mask(unsigned long mask, struct irq_region *region, struct pt_regs *regs) { unsigned long bit; int irq; int cpu = smp_processor_id(); #ifdef DEBUG_IRQ if (mask != (1L << MAX_CPU_IRQ)) printk("do_irq_mask %08lx %p %p\n", mask, region, regs); #endif for(bit=(1L<<MAX_CPU_IRQ), irq = 0; mask && bit; bit>>=1, irq++) { int irq_num; if(!(bit&mask)) continue; irq_num = region->data.irqbase + irq; ++kstat.irqs[cpu][IRQ_FROM_REGION(CPU_IRQ_REGION) | irq]; if (IRQ_REGION(irq_num) != CPU_IRQ_REGION) ++kstat.irqs[cpu][irq_num]; mask_irq(irq_num); do_irq(®ion->action[irq], irq_num, regs); unmask_irq(irq_num); } }
/* * When the irq is requested HandleIRQ() starts. * It invoke DoIRQ to enable other irqs, * run IRQ handler. * IF the handler is over, * it enable the irq which are disabled by DoIRQ() at EndIRQ(). */ void handle_irq(int irq) { #ifdef DEBUG caos_printf("IRQ[%d] occured..\n", irq); #endif do_irq(irq); irqhandler[irq](); end_irq(irq); }
static void do_service(config_t *cpe, config_t *config, struct rs_config *rs_config) { struct rs_start *rs_start = &rs_config->rs_start; config_t *cp; /* At this point we expect one sublist that contains the varios * resource allocations */ if (!(cpe->flags & CFG_SUBLIST)) { fatal("do_service: expected list at %s:%d", cpe->file, cpe->line); } if (cpe->next != NULL) { cpe= cpe->next; fatal("do_service: expected end of list at %s:%d", cpe->file, cpe->line); } cpe= cpe->list; /* Process the list */ for (cp= cpe; cp; cp= cp->next) { if (!(cp->flags & CFG_SUBLIST)) { fatal("do_service: expected list at %s:%d", cp->file, cp->line); } cpe= cp->list; if ((cpe->flags & CFG_STRING) || (cpe->flags & CFG_SUBLIST)) { fatal("do_service: expected word at %s:%d", cpe->file, cpe->line); } if (strcmp(cpe->word, KW_CLASS) == 0) { do_class(cpe->next, config, rs_config); continue; } if (strcmp(cpe->word, KW_UID) == 0) { do_uid(cpe->next, rs_start); continue; } if (strcmp(cpe->word, KW_SIGMGR) == 0) { do_sigmgr(cpe->next, rs_start); continue; } if (strcmp(cpe->word, KW_TYPE) == 0) { do_type(cpe->next, rs_config); continue; } if (strcmp(cpe->word, KW_DESCR) == 0) { do_descr(cpe->next, rs_config); continue; } if (strcmp(cpe->word, KW_SCHEDULER) == 0) { do_scheduler(cpe->next, rs_start); continue; } if (strcmp(cpe->word, KW_PRIORITY) == 0) { do_priority(cpe->next, rs_start); continue; } if (strcmp(cpe->word, KW_QUANTUM) == 0) { do_quantum(cpe->next, rs_start); continue; } if (strcmp(cpe->word, KW_CPU) == 0) { do_cpu(cpe->next, rs_start); continue; } if (strcmp(cpe->word, KW_IRQ) == 0) { do_irq(cpe->next, rs_start); continue; } if (strcmp(cpe->word, KW_IO) == 0) { do_io(cpe->next, rs_start); continue; } if (strcmp(cpe->word, KW_PCI) == 0) { do_pci(cpe->next, rs_start); continue; } if (strcmp(cpe->word, KW_SYSTEM) == 0) { do_system(cpe->next, rs_start); continue; } if (strcmp(cpe->word, KW_IPC) == 0) { do_ipc(cpe->next, rs_start); continue; } if (strcmp(cpe->word, KW_VM) == 0) { do_vm(cpe->next, rs_start); continue; } if (strcmp(cpe->word, KW_CONTROL) == 0) { do_control(cpe->next, rs_start); continue; } } }