37 lines
652 B
C
37 lines
652 B
C
#pragma once
|
|
#include <stdint.h>
|
|
|
|
#define IDT_SIZE 256
|
|
#define IDT_INTERRUPTS 256
|
|
|
|
struct IdtEntry {
|
|
uint16_t isr_low;
|
|
uint16_t kernel_cs;
|
|
uint8_t _reserved;
|
|
uint8_t attributes;
|
|
uint16_t isr_high;
|
|
} __attribute__((packed));
|
|
|
|
struct Idtr {
|
|
uint16_t limit;
|
|
uint32_t base;
|
|
} __attribute__((packed));
|
|
|
|
typedef enum {
|
|
IDT_FLAG_GATE_TASK = 0x5,
|
|
IDT_FLAG_GATE_16BIT_INT = 0x6,
|
|
IDT_FLAG_GATE_16BIT_TRAP = 0x7,
|
|
IDT_FLAG_GATE_32BIT_INT = 0xE,
|
|
IDT_FLAG_GATE_32BIT_TRAP = 0xF,
|
|
|
|
IDT_FLAG_RING0 = (0 << 5),
|
|
IDT_FLAG_RING1 = (1 << 5),
|
|
IDT_FLAG_RING2 = (2 << 5),
|
|
IDT_FLAG_RING3 = (3 << 5),
|
|
|
|
IDT_FLAG_PRESENT = 0x80,
|
|
|
|
} IDTFlags;
|
|
|
|
void idt_init(void);
|