BarryServer : Git

All the code for all my projects
// BarryServer : Git / Nucleus / blob / 88d672affcc1b9e1de646809e06bca1737f94f25 / include / nucleus / cpu.h

// Related

Nucleus

Barry Initialise ACPI later acd0915 (3 years, 3 months ago)
#ifndef _NUCLEUS_CPU_H
#define _NUCLEUS_CPU_H

#include <stdint.h>

typedef unsigned int cpu_t;

/* 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 int apic;

extern uintptr_t lapicPtr, ioapicPtr;
#define LAPIC(off)  (*((uint32_t *) ((uint32_t)  lapicPtr + (off))))
#define IOAPIC(off) (*((uint32_t *) ((uint32_t) ioapicPtr + (off))))

extern cpu_t lapicNums[];
#define CPUID (apic ? lapicNums[(cpu_t) (LAPIC(0x20) >> 24)] : 0)
#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