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 "string.h"
typedef struct{
uint16_t limit;
uint32_t base;
}__attribute__((packed)) gdtr;
static gdt_desc _gdt [MAX_GDT_DESC];
static gdtr _gdtr;
uint16_t gdt_limit;
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)
return;
memset ((void*)&_gdt[i], 0, sizeof (gdt_desc));
......@@ -32,14 +36,14 @@ gdt_desc* gdt_get_desc (int i) {
return &_gdt[i];
}
int gdt_init() {
_gdtr.limit = (sizeof (gdt_desc) * MAX_GDT_DESC)-1;
_gdtr.base = (uint32_t)&_gdt[0];
gdt_limit = (sizeof (gdt_desc) * MAX_GDT_DESC)-1;
gdt_base = (uint32_t)&_gdt[0];
//null
gdt_set_desc(0, 0, 0, 0, 0);
//code
gdt_set_desc(1,0,0xffffffff, GDT_RW|GDT_EXE|GDT_CDT|GDT_MEM, GDT_GR_PG|GDT_GR_32|GDT_GR_HI);
//data
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;
}
#include "idt.h"
#include "string.h"
typedef struct{
uint16_t limit;
uint32_t base;
} __attribute__((packed)) idtr;
#include "serial.h"
uint16_t idt_limit;
uint32_t idt_base;
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 () {
//DEBUG OUTPUT MAYBE?
serial_writestring("int caught\n");
for(;;);
}
......@@ -24,7 +33,7 @@ int install_ir (uint32_t i, uint16_t flags, uint16_t code_sel, IRQ_HANDLER irq)
return 0;
if (!irq)
return 0;
uint64_t uiBase = (uint64_t)&(*irq);
uint64_t uiBase = (uintptr_t)(&(*irq));
_idt[i].low_base = (uint16_t)(uiBase & 0xffff);
_idt[i].high_base = (uint16_t)((uiBase >> 16) & 0xffff);
_idt[i].reserved = 0;
......@@ -33,11 +42,11 @@ int install_ir (uint32_t i, uint16_t flags, uint16_t code_sel, IRQ_HANDLER irq)
return 0;
}
int idt_init (uint16_t code_sel) {
_idtr.limit = sizeof (idt_desc) * MAX_IDT_INT -1;
_idtr.base = (uint32_t)&_idt[0];
idt_limit = sizeof (idt_desc) * MAX_IDT_INT -1;
idt_base = (uint32_t)&_idt[0];
memset ((void*)&_idt[0], 0, sizeof (idt_desc) * MAX_IDT_INT-1);
for (int i=0; i<MAX_IDT_INT; i++)
install_ir (i, IDT_PR|IDT_32,code_sel,(IRQ_HANDLER)default_handler);
idt_install (_idtr);
idt_install ();
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