Commit 8ca1326f by malcolm

moved installs to c files

parent b9a5b815
Showing with 35 additions and 34 deletions
section .text
global idt_install
idt_install:
mov eax, [esp+4]
lidt [eax]
ret
global gdt_install
gdt_install:
mov eax, [esp+4]
lgdt [eax]
ret
#include "gdt.h" #include "gdt.h"
#include "string.h" #include "string.h"
typedef struct{
uint16_t limit;
uint32_t base;
}__attribute__((packed)) gdtr;
static gdt_desc _gdt [MAX_GDT_DESC]; uint16_t gdt_limit;
static gdtr _gdtr; uint32_t gdt_base;
extern void gdt_install(gdtr _gdtr); static gdt_desc _gdt [MAX_GDT_DESC];
void gdt_set_desc(uint32_t i, uint64_t base, uint64_t limit, uint8_t access, uint8_t gran) static void gdt_install(){
{ struct{
uint16_t limit;
uint32_t base;
}__attribute__((packed)) gdtr;
gdtr.limit = gdt_limit;
gdtr.base = gdt_base;
asm volatile ("lgdt (%0)": :"r"(&gdtr));
}
void gdt_set_desc(uint32_t i, uint64_t base, uint64_t limit, uint8_t access, uint8_t gran){
if (i > MAX_GDT_DESC) if (i > MAX_GDT_DESC)
return; return;
memset ((void*)&_gdt[i], 0, sizeof (gdt_desc)); memset ((void*)&_gdt[i], 0, sizeof (gdt_desc));
...@@ -32,14 +36,14 @@ gdt_desc* gdt_get_desc (int i) { ...@@ -32,14 +36,14 @@ gdt_desc* gdt_get_desc (int i) {
return &_gdt[i]; return &_gdt[i];
} }
int gdt_init() { int gdt_init() {
_gdtr.limit = (sizeof (gdt_desc) * MAX_GDT_DESC)-1; gdt_limit = (sizeof (gdt_desc) * MAX_GDT_DESC)-1;
_gdtr.base = (uint32_t)&_gdt[0]; gdt_base = (uint32_t)&_gdt[0];
//null //null
gdt_set_desc(0, 0, 0, 0, 0); gdt_set_desc(0, 0, 0, 0, 0);
//code //code
gdt_set_desc(1,0,0xffffffff, GDT_RW|GDT_EXE|GDT_CDT|GDT_MEM, GDT_GR_PG|GDT_GR_32|GDT_GR_HI); gdt_set_desc(1,0,0xffffffff, GDT_RW|GDT_EXE|GDT_CDT|GDT_MEM, GDT_GR_PG|GDT_GR_32|GDT_GR_HI);
//data //data
gdt_set_desc(2,0,0xffffffff, GDT_RW|GDT_CDT|GDT_MEM, GDT_GR_PG|GDT_GR_32|GDT_GR_HI); gdt_set_desc(2,0,0xffffffff, GDT_RW|GDT_CDT|GDT_MEM, GDT_GR_PG|GDT_GR_32|GDT_GR_HI);
gdt_install(_gdtr); gdt_install();
return 0; return 0;
} }
#include "idt.h" #include "idt.h"
#include "string.h" #include "string.h"
typedef struct{ #include "serial.h"
uint16_t limit;
uint32_t base; uint16_t idt_limit;
} __attribute__((packed)) idtr; uint32_t idt_base;
static idt_desc _idt [MAX_IDT_INT]; static idt_desc _idt [MAX_IDT_INT];
static idtr _idtr;
extern void idt_install(idtr _idtr); static void idt_install(){
struct{
uint16_t limit;
uint32_t base;
} __attribute__((packed)) idtr;
idtr.limit = idt_limit;
idtr.base = idt_base;
asm volatile ("lidt (%0)": :"r"(&idtr));
}
static void default_handler () { static void default_handler () {
//DEBUG OUTPUT MAYBE? //DEBUG OUTPUT MAYBE?
serial_writestring("int caught\n");
for(;;); for(;;);
} }
...@@ -24,7 +33,7 @@ int install_ir (uint32_t i, uint16_t flags, uint16_t code_sel, IRQ_HANDLER irq) ...@@ -24,7 +33,7 @@ int install_ir (uint32_t i, uint16_t flags, uint16_t code_sel, IRQ_HANDLER irq)
return 0; return 0;
if (!irq) if (!irq)
return 0; return 0;
uint64_t uiBase = (uint64_t)&(*irq); uint64_t uiBase = (uintptr_t)(&(*irq));
_idt[i].low_base = (uint16_t)(uiBase & 0xffff); _idt[i].low_base = (uint16_t)(uiBase & 0xffff);
_idt[i].high_base = (uint16_t)((uiBase >> 16) & 0xffff); _idt[i].high_base = (uint16_t)((uiBase >> 16) & 0xffff);
_idt[i].reserved = 0; _idt[i].reserved = 0;
...@@ -33,11 +42,11 @@ int install_ir (uint32_t i, uint16_t flags, uint16_t code_sel, IRQ_HANDLER irq) ...@@ -33,11 +42,11 @@ int install_ir (uint32_t i, uint16_t flags, uint16_t code_sel, IRQ_HANDLER irq)
return 0; return 0;
} }
int idt_init (uint16_t code_sel) { int idt_init (uint16_t code_sel) {
_idtr.limit = sizeof (idt_desc) * MAX_IDT_INT -1; idt_limit = sizeof (idt_desc) * MAX_IDT_INT -1;
_idtr.base = (uint32_t)&_idt[0]; idt_base = (uint32_t)&_idt[0];
memset ((void*)&_idt[0], 0, sizeof (idt_desc) * MAX_IDT_INT-1); memset ((void*)&_idt[0], 0, sizeof (idt_desc) * MAX_IDT_INT-1);
for (int i=0; i<MAX_IDT_INT; i++) for (int i=0; i<MAX_IDT_INT; i++)
install_ir (i, IDT_PR|IDT_32,code_sel,(IRQ_HANDLER)default_handler); install_ir (i, IDT_PR|IDT_32,code_sel,(IRQ_HANDLER)default_handler);
idt_install (_idtr); idt_install ();
return 0; return 0;
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment