Nucleus
Barry Kernel threads + threads share address space 6217f0d (3 years, 1 month ago)
diff --git a/kernel/gdt.c b/kernel/gdt.c
index 7e8a1a4..fbdfb82 100644
--- a/kernel/gdt.c
+++ b/kernel/gdt.c
@@ -33,7 +33,7 @@ static struct GDTEntry {
uint8_t baseMiddle, access, gran, baseHigher;
} __attribute__((packed)) *gdt[MAX_CPUS]; /* Per CPU */
-#define GDT_OFFSET(i) (i * sizeof(struct GDTEntry))
+#define GDT_OFFSET(i) ((i) * sizeof(struct GDTEntry))
/* Structure for a TSS Entry */
static struct TSSEntry {
@@ -83,6 +83,7 @@ cpu_load_gdt(void)
memset(gdt[CPUID], 0, size);
+ /* Create gate entries */
gdt_set_gate(GDT_NULL, 0x00000000, 0x00000000, 0x00, 0x00);
gdt_set_gate(GDT_KERN_CODE, 0x00000000, 0xFFFFFFFF, 0x9A, 0xCF);
gdt_set_gate(GDT_KERN_DATA, 0x00000000, 0xFFFFFFFF, 0x92, 0xCF);
@@ -91,20 +92,22 @@ cpu_load_gdt(void)
gdt_set_gate(GDT_FS, 0x00000000, 0xFFFFFFFF, 0xF2, 0xCF);
gdt_set_gate(GDT_GS, 0x00000000, 0xFFFFFFFF, 0xF2, 0xCF);
+ /* Create TSS entry */
uint32_t addr = (uint32_t) (gdt[CPUID] + (GDT_TSS + 1));
gdt_set_gate(GDT_TSS, addr, sizeof(struct TSSEntry) - 1, 0xE9, 0);
+ /* TSS */
tss[CPUID] = (void *) addr;
tss[CPUID]->ss0 = 0x10;
- tss[CPUID]->esp0 = 0xF0800000 - sizeof(uintptr_t);
tss[CPUID]->cs = GDT_OFFSET(GDT_KERN_CODE) | 0;
tss[CPUID]->ds = GDT_OFFSET(GDT_KERN_DATA) | 0;
tss[CPUID]->es = tss[CPUID]->ss = tss[CPUID]->ds;
tss[CPUID]->fs = tss[CPUID]->gs = GDT_OFFSET(GDT_FS) | 3;
tss[CPUID]->iomapBase = sizeof(struct TSSEntry);
+ /* Load table */
struct DescRecord ptr = {
- .limit = sizeof(struct GDTEntry) * (GDT_TSS + 1),
+ .limit = GDT_OFFSET(GDT_TSS + 1),
.base = (uintptr_t) gdt[CPUID],
};
asm volatile("lgdt %0" :: "m" (ptr));
@@ -132,3 +135,11 @@ set_gs_base(uintptr_t base)
gs->baseHigher = (base >> 24) & 0xFF;
asm volatile("mov %0, %%gs" :: "r" (GDT_OFFSET(GDT_GS) | 3));
}
+
+/* Set the used kernel stack */
+void
+set_kernel_stack(uintptr_t top)
+{
+ ASSERT((top & 0xF) == 0);
+ tss[cpu->id]->esp0 = top;
+}