diff options
author | Marvin Borner | 2020-08-07 20:04:17 +0200 |
---|---|---|
committer | Marvin Borner | 2020-08-07 20:04:17 +0200 |
commit | 5e4374f938d259903fa21cb62b3f3b77b126198b (patch) | |
tree | 00eb7ba9f505f6f89c469a3d992373874d4ea29e /src/entry.asm | |
parent | 14a9af005593b1056d681723df764e3b4ef807e2 (diff) |
Finished bootloader TSS/GDT update
Diffstat (limited to 'src/entry.asm')
-rw-r--r-- | src/entry.asm | 73 |
1 files changed, 37 insertions, 36 deletions
diff --git a/src/entry.asm b/src/entry.asm index 00b5874..67b5ffd 100644 --- a/src/entry.asm +++ b/src/entry.asm @@ -77,8 +77,8 @@ %define GDT_EXECUTABLE 0b00001000 ; Can be executed %define GDT_READWRITE 0b00000010 ; Read/write access for code/data %define GDT_ACCESSED 0b00000001 ; Whether segment is accessed -%define GDT_GRANULARITY (0x80 | 0x0f) ; Page granularity (4KiB) -%define GDT_SIZE (0x40 | 0x0f) ; Use 32 bit selectors +%define GDT_GRANULARITY (0x80 | 0x00) ; Page granularity (4KiB) +%define GDT_SIZE (0x40 | 0x00) ; Use 32 bit selectors %define GDT_DATA_OFFSET 0x10 ; Offset to GDT data segment ; Kernel constants @@ -371,15 +371,13 @@ protected_mode_enter: mov gs, ax lgdt [gdt_desc] ; Load GDT - mov ax, 0x28 - ltr ax ; Set protected mode via cr0 mov eax, cr0 or eax, 1 ; Set bit 0 mov cr0, eax - jmp 08h:protected_mode ; JUMP! + jmp (gdt_code - gdt):protected_mode ; JUMP! bits 32 ; Woah, so big! protected_mode: @@ -392,6 +390,9 @@ protected_mode: mov esp, STACK_POINTER ; Move stack pointer + mov ax, gdt_tss - gdt ; Load TSS + ltr ax + mov eax, vid_info ; Pass VBE struct to kernel push eax ; Push as second kernel parameter @@ -399,37 +400,6 @@ protected_mode: lea eax, [edx] call eax -; TSS -tss_entry: - dd 0 ; Previous TSS - dd STACK_POINTER ; esp0 - dd GDT_DATA_OFFSET ; ss0 - dd 0 ; esp1 - dd 0 ; ss1 - dd 0 ; esp2 - dd 0 ; ss2 - dd 0 ; cr3 - dd 0 ; eip - dd 0 ; eflags - dd 0 ; eax - dd 0 ; ecx - dd 0 ; edx - dd 0 ; ebx - dd 0 ; esp - dd 0 ; ebp - dd 0 ; esi - dd 0 ; edi - dd 0x13 ; es - dd 0x0b ; cs - dd 0x13 ; ss - dd 0x13 ; ds - dd 0x13 ; fs - dd 0x13 ; gs - dd 0 ; ldt - dw 0 ; trap - dw 0 ; iomap base -tss_entry_end: - ; GDT align 32 gdt: ; GDTs start @@ -476,6 +446,37 @@ gdt_desc: dw gdt_end - gdt - 1 dd gdt +; TSS +tss_entry: + dd 0 ; Previous TSS + dd STACK_POINTER ; esp0 + dd gdt_data - gdt ; ss0 (data offset) + dd 0 ; esp1 + dd 0 ; ss1 + dd 0 ; esp2 + dd 0 ; ss2 + dd 0 ; cr3 + dd 0 ; eip + dd 0 ; eflags + dd 0 ; eax + dd 0 ; ecx + dd 0 ; edx + dd 0 ; ebx + dd 0 ; esp + dd 0 ; ebp + dd 0 ; esi + dd 0 ; edi + dd 0 ; es + dd 0 ; cs + dd 0 ; ss + dd 0 ; ds + dd 0 ; fs + dd 0 ; gs + dd 0 ; ldt + dw 0 ; trap + dw 0 ; iomap base +tss_entry_end: + times 1024 - ($ - $$) db 0 ; Start at LBA 2 |