more userlaand stuff

This commit is contained in:
2026-06-17 18:16:47 -05:00
parent 0cb7311911
commit 7d34fbbd02
11 changed files with 116 additions and 13 deletions

View File

@@ -4,6 +4,7 @@
#define IDT_MAX_DESCRIPTORS 256
#define ATTR_KERN_32 0x8E // active(1), ring 0 (00), interrupt gate(0), 32 bit (1110)
#define ATTR_USER_32 0xEE // active, ring 3, 32bit
#define SEGMENT_KERN 0x08
@@ -31,11 +32,11 @@ void* isr_stub_table[256] = {
idt_entry idt[IDT_MAX_DESCRIPTORS];
idt_ptr idtr;
void set_idtr(uint8_t vector, void* isr, uint8_t attributes) {
void set_idtr(uint8_t vector, void* isr, uint16_t sel, uint8_t attributes) {
idt_entry* desc = &idt[vector];
desc->isr_low = (uint32_t)isr & 0xFFFF;
desc->kernel_cs = SEGMENT_KERN;
desc->selector = SEGMENT_KERN;
desc->reserved = 0;
desc->attributes = attributes;
desc->isr_high = ((uint32_t)isr >> 16) & 0xFFFF;
@@ -47,11 +48,14 @@ void init_idt() {
for (int i = 0; i < IDT_MAX_DESCRIPTORS; i++) {
if (isr_stub_table[i] != 0) {
set_idtr(i, isr_stub_table[i], ATTR_KERN_32);
set_idtr(i, isr_stub_table[i], SEGMENT_KERN, ATTR_KERN_32);
} else {
set_idtr(i, 0, 0);
set_idtr(i, 0, SEGMENT_KERN, 0);
}
}
extern void syscall_handler();
set_idtr(0x80, syscall_handler, SEGMENT_KERN, ATTR_USER_32);
load_idt();
}