#ifndef _NUCLEUS_CPU_H #define _NUCLEUS_CPU_H #include /* Structure for an Interrupt Frame */ struct InterruptFrame { uint32_t eip, cs, eflags; }; typedef void (*exc_handler_t)(struct InterruptFrame *, uint32_t); typedef void (*int_handler_t)(struct InterruptFrame *); extern uintptr_t lapicPtr, ioapicPtr; #define LAPIC(off) (*((uint32_t *) ((uint32_t) lapicPtr + (off)))) #define IOAPIC(off) (*((uint32_t *) ((uint32_t) ioapicPtr + (off)))) extern uint8_t lapicNums[]; #define CPUID lapicNums[(uint8_t) (LAPIC(0x20) >> 24)] #define MAX_CPUS 2 /* Push/pop interrupts */ static inline uintptr_t irq_disable(void) { uintptr_t flags; asm volatile("pushf; cli; pop %0" : "=r" (flags) :: "memory"); return flags; } static inline void irq_restore(uintptr_t flags) { asm volatile("push %0; popf" :: "rm" (flags) : "memory","cc"); } void register_exception(int num, exc_handler_t addr); void register_interrupt(int num, int_handler_t addr); #endif