more userlaand stuff
This commit is contained in:
12
kernel/idt.c
12
kernel/idt.c
@@ -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();
|
||||
}
|
||||
Reference in New Issue
Block a user