From 42baf14321ab20e41f84f94815432eeb57be196b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20Lov=C3=A9n?= Date: Thu, 22 Feb 2018 12:38:25 +0100 Subject: [PATCH] A bit of cleanup --- src/kernel/cpu/cpu.c | 8 ++++---- src/kernel/cpu/gdt.c | 29 ++++++++++++++--------------- src/kernel/include/cpu.h | 8 ++++++-- src/kernel/proc/process.c | 2 +- 4 files changed, 25 insertions(+), 22 deletions(-) diff --git a/src/kernel/cpu/cpu.c b/src/kernel/cpu/cpu.c index da598c5..222d14c 100644 --- a/src/kernel/cpu/cpu.c +++ b/src/kernel/cpu/cpu.c @@ -1,12 +1,12 @@ #include #include -uint64_t gdt[6]; -uint8_t tss[104]; -void gdt_init(uint64_t *, void *); +uint64_t global_gdt[6]; +uint8_t global_tss[104]; +void gdt_init(); void cpu_init() { interrupt_init(); - gdt_init(gdt, tss); + gdt_init(); } diff --git a/src/kernel/cpu/gdt.c b/src/kernel/cpu/gdt.c index 7962337..a1b49e6 100644 --- a/src/kernel/cpu/gdt.c +++ b/src/kernel/cpu/gdt.c @@ -2,11 +2,12 @@ #include #include -#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_PRESENT (1<<15) #define GDT_LONG (1<<21) -#define GDT_TSS (9<<8) struct gdt { @@ -44,31 +45,29 @@ struct gdt BootGDT[] = { {0, 0}, {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) | (1<<12) | (1<<9)}, + {0, GDT_PRESENT | GDT_DPL(3) | GDT_DATA}, {0, 0}, {0, 0}, }; struct gdtp GDTp = {2*8-1, BootGDT}; - -void gdt_init(uint64_t *_gdt, void *_tss) +void gdt_init() { - struct gdt *gdt = (struct gdt *)_gdt; + struct gdt *gdt = GDT(); memcpy(gdt, BootGDT, sizeof(BootGDT)); - struct tss *tss = _tss; + struct tss *tss = TSS(); tss->io_mba = 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 |= (((tss_base >> 24) & 0xFF) << 24); - gdt[4].flags |= ((tss_base >> 16) & 0xFF); - gdt[4].flags |= (((tss_limit >> 16) & 0xF) << 16); + gdt[4].flags |= ((tss_base >> 24) & 0xFF) << 24; + gdt[4].flags |= (tss_base >> 16) & 0xFF; + gdt[4].flags |= ((tss_limit >> 16) & 0xF) << 16; 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.gdt = gdt; @@ -76,8 +75,8 @@ void gdt_init(uint64_t *_gdt, void *_tss) 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; } diff --git a/src/kernel/include/cpu.h b/src/kernel/include/cpu.h index beba505..5ffb426 100644 --- a/src/kernel/include/cpu.h +++ b/src/kernel/include/cpu.h @@ -3,8 +3,12 @@ void cpu_init(); -extern uint8_t tss[]; -void set_tss_rsp0(void *tss, void *rsp0); +extern uint64_t global_gdt[]; +extern uint8_t global_tss[]; +#define GDT() ((void *)global_gdt) +#define TSS() ((void *)global_tss) + +void interrupt_stack(void *rsp0); void load_idt(void *); diff --git a/src/kernel/proc/process.c b/src/kernel/proc/process.c index a52ea18..9dee224 100644 --- a/src/kernel/proc/process.c +++ b/src/kernel/proc/process.c @@ -62,7 +62,7 @@ void scheduler() _proc = new; 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); ready(_proc);