#include <stddef.h>
#include <stdint.h>
#include <stdarg.h>
#include <stdbool.h>
#include "Idt.h"

void AsmDefaultInt(void);
void AsmExcGp(void);
void AsmExcFp(void);
void Irq0(void);
void Irq1(void);
void AsmSyscalls(void);

struct idtr kidtr;
struct IdtDescriptor kidt[IDTSIZE];

void InitIdtDescriptor(uint16_t select, uint32_t offset, uint16_t type, struct IdtDescriptor *desc)
{
	desc->offset0_15 = (offset & 0xffff);
	desc->select = select;
	desc->type = type;
	desc->offset16_31 = (offset & 0xffff0000) >> 16;
	return;
}

void InitIdt(void)
{
	int i;

	for (i = 0; i < IDTSIZE; i++) 
		InitIdtDescriptor(0x08, (uint32_t) AsmDefaultInt, INTGATE, &kidt[i]);

	InitIdtDescriptor(0x08, (uint32_t) AsmExcGp, INTGATE, &kidt[13]);	/* #GP */
	InitIdtDescriptor(0x08, (uint32_t) AsmExcFp, INTGATE, &kidt[14]);
	InitIdtDescriptor(0x08, (uint32_t) Irq0, INTGATE, &kidt[32]);	/* horloge */
	InitIdtDescriptor(0x08, (uint32_t) Irq1, INTGATE, &kidt[33]);	/* clavier */
	InitIdtDescriptor(0x08, (uint32_t) AsmSyscalls, TRAPGATE, &kidt[48]);

	kidtr.limite = IDTSIZE * 8;
	kidtr.base = IDTBASE;

	memcpy((char *) kidtr.base, (char *) kidt, kidtr.limite);

	asm("lidtl (kidtr)");
}