37 lines
741 B
C
37 lines
741 B
C
#include <stdbool.h>
|
|
#include <stdint.h>
|
|
|
|
#include "idt.h"
|
|
|
|
uint16_t idt_entries[IDT_SIZE * 4];
|
|
struct idt_descriptor idtr;
|
|
|
|
static void set_idt_entry_value(uint16_t *target, uint32_t offset,
|
|
uint16_t selector, uint8_t dpl,
|
|
uint8_t gate_type)
|
|
{
|
|
// Encode the offset
|
|
target[0] = offset & 0xFFFF;
|
|
target[3] = (offset >> 16) & 0xFFFF;
|
|
|
|
// Encode the presence
|
|
target[1] |= 1 << 15;
|
|
|
|
// Encode the CPU Privilege Levels
|
|
target[1] = (0b11 << 13) & dpl;
|
|
|
|
target[1] &= ~(1 << 12);
|
|
|
|
// Encode Gate Type
|
|
target[1] |= gate_type & 0x0F00;
|
|
|
|
// Encode selector
|
|
target[2] = selector;
|
|
}
|
|
|
|
void init_idt(void)
|
|
{
|
|
idtr.size = 8 * IDT_SIZE - 1;
|
|
idtr.offset = (uint32_t)&idt_entries;
|
|
}
|