Ejemplo n.º 1
0
static int ioapic_handler(struct int_context *context, struct kernel_dispatch_info *kdi)
{
//     kprintf("IO APIC Interrupt Vector %d, IRQ %d\n", context->vector, vector_map[context->vector].irq);
    
    u32 result = 1;
    int irq = vector_map[context->vector].irq;
    
    // Disable IRQ
    ioapic_disable_irq(irq);
    
    // Dispatch
    kdi->dispatch_type = kdisp_interrupt;
    kdi->interrupt.irq = irq;
    kdi->interrupt.vector = context->vector;
    
    switch (irq) {
    case 0:
        //result = hal_interrupt_handler_global_timer();
        break;
    case 1:
        result = keyboard_interrupt_handler(context, kdi);
        break;
    default:
        break;
    }
    
    // Enable IRQ
    lapic_eoi();
    ioapic_enable_irq(irq);
    
    return result;
}
Ejemplo n.º 2
0
extern void
interrupt_dispatcher(const unsigned long interrupt_number)
{
 /* Select a handler based on interrupt source. */
 switch(interrupt_number)
 {
  case 32:
  {
   timer_interrupt_handler();
   break;
  }

  case 33:
  {
   keyboard_interrupt_handler();
   break;
  }

  case 39:
  {
   /* Spurious interrupt occurred. This could happen if we spend too long 
      time with interrupts disabled. */
   break;
  }

  default:
  {
   kprints("Unknown interrupt. Vector:");
   kprinthex(interrupt_number);
   kprints("\n");
   while(1)
   {
    outw(0x8a00, 0x8a00);
    outw(0x8a00, 0x8ae0);
   }
  }
 }
 
 /* Acknowledge interrupt so that new interrupts can be sent to the CPU. */
 if (interrupt_number < 48)
 {
  if (interrupt_number >= 40)
  {
   outb(0xa0, 0x20);
  }
  outb(0x20, 0x20);
 }
}