aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarvin Borner2020-08-07 20:04:17 +0200
committerMarvin Borner2020-08-07 20:04:17 +0200
commit5e4374f938d259903fa21cb62b3f3b77b126198b (patch)
tree00eb7ba9f505f6f89c469a3d992373874d4ea29e
parent14a9af005593b1056d681723df764e3b4ef807e2 (diff)
Finished bootloader TSS/GDT update
-rw-r--r--src/entry.asm73
-rw-r--r--src/inc/boot.h6
-rw-r--r--src/main.c4
3 files changed, 38 insertions, 45 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
diff --git a/src/inc/boot.h b/src/inc/boot.h
index 30ddfb7..1a41c32 100644
--- a/src/inc/boot.h
+++ b/src/inc/boot.h
@@ -8,9 +8,3 @@ struct vid_info {
u32 mode;
struct vbe *info;
};
-
-struct mem_info {
- u64 base;
- u64 len;
- u64 type;
-};
diff --git a/src/main.c b/src/main.c
index 7738e10..17d6267 100644
--- a/src/main.c
+++ b/src/main.c
@@ -17,7 +17,7 @@
u32 HEAP = 0x00200000;
u32 HEAP_START;
-void kernel_main(struct mem_info *mem_info, struct vid_info *vid_info)
+void kernel_main(struct vid_info *vid_info)
{
HEAP_START = HEAP; // For malloc function
@@ -38,8 +38,6 @@ void kernel_main(struct mem_info *mem_info, struct vid_info *vid_info)
// Enable drivers
sti();
- mem_info++; // TODO: Use the mmap (or remove)!
-
ls_root();
gui_init(FONT_PATH);