A bit of cleanup
This commit is contained in:
parent
68ec6fa575
commit
42baf14321
@ -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();
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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 *);
|
||||||
|
@ -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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user