From 4b8036b1924f5514f6991bb46fe17d817a20c529 Mon Sep 17 00:00:00 2001 From: d0p1 Date: Wed, 17 Jul 2024 10:08:43 +0200 Subject: [PATCH] feat(kernel): load tss --- kernel/dev/at/cga.inc | 2 +- kernel/gdt.inc | 37 ++++++++++++++++++++++++++++++++++--- kernel/kernel.asm | 15 ++++++++++++--- kernel/sys/cpu.inc | 1 + 4 files changed, 48 insertions(+), 7 deletions(-) diff --git a/kernel/dev/at/cga.inc b/kernel/dev/at/cga.inc index 603c6cc..b8ee9ad 100644 --- a/kernel/dev/at/cga.inc +++ b/kernel/dev/at/cga.inc @@ -111,7 +111,7 @@ cga_putc: ; scroll up push esi push edi - mov ecx, CGA_COLUMNS*(CGA_LINES)*2 + mov ecx, CGA_COLUMNS*(CGA_LINES) mov edi, CGA_MEMORY mov esi, CGA_MEMORY+80*2 rep movsw diff --git a/kernel/gdt.inc b/kernel/gdt.inc index fe20f62..fc38f54 100644 --- a/kernel/gdt.inc +++ b/kernel/gdt.inc @@ -23,8 +23,12 @@ gdt: ; Tss .tss: - dw ? - dd ? + .limit dw ? + .base dw ? + .baseh0 db ? + .access db ? + .flags db ? + .baseh1 db ? .end: @@ -33,5 +37,32 @@ pGDT: dd gdt gdt_set_tss: - + mov ecx, sizeof.TSS + mov [gdt.limit], cx + mov [gdt.base], ax + + shr ecx, 16 + shr eax, 16 + + mov [gdt.baseh0], al + mov [gdt.baseh1], ah + mov al, 0x89 + mov [gdt.access], al + + and cl, 0xF + or cl, 0x40 + mov [gdt.flags], cl + ret + +gdt_flush: + ; load kernel gdt + lgdt [pGDT] + jmp 0x08:@f +@@: + mov ax, 0x10 + mov ds, ax + mov es, ax + mov fs, ax + mov gs, ax + mov ss, ax ret diff --git a/kernel/kernel.asm b/kernel/kernel.asm index e02758d..a2a8ef1 100644 --- a/kernel/kernel.asm +++ b/kernel/kernel.asm @@ -58,9 +58,18 @@ kmain: call pic_init - ; load kernel gdt - lgdt [pGDT] - ; I don't think i need to reload segment cuz their value are already correct + ; clear tss + mov ecx, sizeof.TSS + xor ax, ax + mov edi, kTSS + rep movsb + + mov cx, 0xdfff + mov eax, kTSS + mov [eax + TSS.iomap], cx + + call gdt_set_tss + call gdt_flush call idt_setup diff --git a/kernel/sys/cpu.inc b/kernel/sys/cpu.inc index 922bbf2..85a2019 100644 --- a/kernel/sys/cpu.inc +++ b/kernel/sys/cpu.inc @@ -87,6 +87,7 @@ struc TSS { .trap dw ? .iomap dw ? } +DEFN TSS struc GDTGate {