Add first C user program
This commit is contained in:
@@ -0,0 +1,40 @@
|
||||
#include "src/kernel/idt.h"
|
||||
|
||||
struct idt_entry {
|
||||
uint16_t offset_low;
|
||||
uint16_t selector;
|
||||
uint8_t ist;
|
||||
uint8_t flags;
|
||||
uint16_t offset_mid;
|
||||
uint32_t offset_high;
|
||||
uint32_t zero;
|
||||
} __attribute__((packed));
|
||||
|
||||
struct idt_descriptor {
|
||||
uint16_t size;
|
||||
uint64_t offset;
|
||||
} __attribute__((packed));
|
||||
|
||||
static struct idt_entry idt[256];
|
||||
static struct idt_descriptor idt_desc;
|
||||
|
||||
static void idt_load() {
|
||||
idt_desc.size = sizeof(idt) - 1;
|
||||
idt_desc.offset = (uint64_t)&idt;
|
||||
__asm__ volatile("lidt %0" : : "m"(idt_desc));
|
||||
}
|
||||
|
||||
inline void idt_init() {
|
||||
idt_load();
|
||||
}
|
||||
|
||||
void idt_set_entry(int vector, void (*handler)(struct interrupt_frame *), uint8_t flags) {
|
||||
uint64_t addr = (uint64_t)handler;
|
||||
idt[vector].offset_low = addr & 0xFFFF;
|
||||
idt[vector].selector = 0x0010;
|
||||
idt[vector].ist = 0;
|
||||
idt[vector].flags = flags;
|
||||
idt[vector].offset_mid = (addr >> 16) & 0xFFFF;
|
||||
idt[vector].offset_high = (addr >> 32) & 0xFFFFFFFF;
|
||||
idt[vector].zero = 0;
|
||||
}
|
||||
Reference in New Issue
Block a user