A bit of cleanup

This commit is contained in:
Thomas Lovén 2018-02-22 12:38:25 +01:00
parent 68ec6fa575
commit 42baf14321
4 changed files with 25 additions and 22 deletions

View File

@ -1,12 +1,12 @@
#include <cpu.h> #include <cpu.h>
#include <interrupts.h> #include <interrupts.h>
uint64_t gdt[6]; uint64_t global_gdt[6];
uint8_t tss[104]; uint8_t global_tss[104];
void gdt_init(uint64_t *, void *); void gdt_init();
void cpu_init() void cpu_init()
{ {
interrupt_init(); interrupt_init();
gdt_init(gdt, tss); gdt_init();
} }

View File

@ -2,11 +2,12 @@
#include <cpu.h> #include <cpu.h>
#include <memory.h> #include <memory.h>
#define GDT_CODE (3<<11) #define GDT_CODE (0x18<<8)
#define GDT_DATA (0x12<<8)
#define GDT_TSS (0x09<<8)
#define GDT_DPL(lvl) ((lvl)<<13) #define GDT_DPL(lvl) ((lvl)<<13)
#define GDT_PRESENT (1<<15) #define GDT_PRESENT (1<<15)
#define GDT_LONG (1<<21) #define GDT_LONG (1<<21)
#define GDT_TSS (9<<8)
struct gdt struct gdt
{ {
@ -44,31 +45,29 @@ struct gdt BootGDT[] = {
{0, 0}, {0, 0},
{0, GDT_PRESENT | GDT_DPL(0) | GDT_CODE | GDT_LONG}, {0, GDT_PRESENT | GDT_DPL(0) | GDT_CODE | GDT_LONG},
{0, GDT_PRESENT | GDT_DPL(3) | GDT_CODE | GDT_LONG}, {0, GDT_PRESENT | GDT_DPL(3) | GDT_CODE | GDT_LONG},
{0, GDT_PRESENT | GDT_DPL(3) | (1<<12) | (1<<9)}, {0, GDT_PRESENT | GDT_DPL(3) | GDT_DATA},
{0, 0}, {0, 0},
{0, 0}, {0, 0},
}; };
struct gdtp GDTp = {2*8-1, BootGDT}; struct gdtp GDTp = {2*8-1, BootGDT};
void gdt_init()
void gdt_init(uint64_t *_gdt, void *_tss)
{ {
struct gdt *gdt = (struct gdt *)_gdt; struct gdt *gdt = GDT();
memcpy(gdt, BootGDT, sizeof(BootGDT)); memcpy(gdt, BootGDT, sizeof(BootGDT));
struct tss *tss = _tss; struct tss *tss = TSS();
tss->io_mba = sizeof(struct tss); tss->io_mba = sizeof(struct tss);
uint32_t tss_limit = sizeof(struct tss); uint32_t tss_limit = sizeof(struct tss);
uint64_t tss_base = (uint64_t)_tss; uint64_t tss_base = (uint64_t)tss;
gdt[4].flags = GDT_PRESENT | GDT_TSS; gdt[4].flags = GDT_PRESENT | GDT_TSS;
gdt[4].flags |= (((tss_base >> 24) & 0xFF) << 24); gdt[4].flags |= ((tss_base >> 24) & 0xFF) << 24;
gdt[4].flags |= ((tss_base >> 16) & 0xFF); gdt[4].flags |= (tss_base >> 16) & 0xFF;
gdt[4].flags |= (((tss_limit >> 16) & 0xF) << 16); gdt[4].flags |= ((tss_limit >> 16) & 0xF) << 16;
gdt[4].addr = ((tss_base & 0xFFFF) << 16) | (tss_limit & 0xFFFF); gdt[4].addr = ((tss_base & 0xFFFF) << 16) | (tss_limit & 0xFFFF);
gdt[5].flags = 0; gdt[5].addr = (tss_base >> 32) & 0xFFFFFFFF;
gdt[5].addr = ((tss_base >> 32) & 0xFFFFFFFF);
GDTp.len = 6*8 - 1; GDTp.len = 6*8 - 1;
GDTp.gdt = gdt; GDTp.gdt = gdt;
@ -76,8 +75,8 @@ void gdt_init(uint64_t *_gdt, void *_tss)
load_gdt(&GDTp); load_gdt(&GDTp);
} }
void set_tss_rsp0(void *_tss, void *rsp0) void interrupt_stack(void *rsp0)
{ {
struct tss *tss = _tss; struct tss *tss = TSS();
tss->rsp0 = (uint64_t)rsp0; tss->rsp0 = (uint64_t)rsp0;
} }

View File

@ -3,8 +3,12 @@
void cpu_init(); void cpu_init();
extern uint8_t tss[]; extern uint64_t global_gdt[];
void set_tss_rsp0(void *tss, void *rsp0); extern uint8_t global_tss[];
#define GDT() ((void *)global_gdt)
#define TSS() ((void *)global_tss)
void interrupt_stack(void *rsp0);
void load_idt(void *); void load_idt(void *);

View File

@ -62,7 +62,7 @@ void scheduler()
_proc = new; _proc = new;
write_cr3(new->P4); write_cr3(new->P4);
set_tss_rsp0(tss, new + PAGE_SIZE); interrupt_stack(new + PAGE_SIZE);
switch_stack(&sched_proc->stack_ptr, &new->stack_ptr); switch_stack(&sched_proc->stack_ptr, &new->stack_ptr);
ready(_proc); ready(_proc);