feat(kernel): load tss
This commit is contained in:
parent
40d3009b1a
commit
4b8036b192
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -87,6 +87,7 @@ struc TSS {
|
|||
.trap dw ?
|
||||
.iomap dw ?
|
||||
}
|
||||
DEFN TSS
|
||||
|
||||
struc GDTGate {
|
||||
|
||||
|
|
Loading…
Reference in a new issue