#pragma once #include enum { IRQ0 = 32, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7, IRQ8, IRQ9, IRQ10, IRQ11, IRQ12, IRQ13, IRQ14, IRQ15, }; /* Struct which aggregates many registers. * It matches exactly the pushes on interrupt.asm. From the bottom: * - Pushed by the processor automatically * - `push byte`s on the isr-specific code: error code, then int number * - All the registers by pusha * - `push eax` whose lower 16-bits contain DS */ typedef struct { uint32_t edi, esi, ebp, esp, ebx, edx, ecx, eax; /* Pushed by pusha. */ uint32_t gs, fs, es, ds; /* Data segment selector */ uint32_t int_no, err_code; /* Interrupt number and error code (if applicable) */ uint32_t eip, cs, eflags, useresp, ss; /* Pushed by the processor automatically */ } registers_t; void isr_install(); void isr_handler(registers_t *r); typedef void (*isr_t)(registers_t *); void register_interrupt_handler(uint8_t n, isr_t handler); void load_idt(); void cli(); void sti();