summaryrefslogtreecommitdiff
path: root/kernel/entry.S
diff options
context:
space:
mode:
authorFreya Murphy <freya@freyacat.org>2025-04-19 19:45:36 -0400
committerFreya Murphy <freya@freyacat.org>2025-04-19 19:45:36 -0400
commitb1ff1e082a9a80f1ea22380dd81a114a737184d0 (patch)
tree8dba6a34725400cab35adf633e2f8a95f2ca8df9 /kernel/entry.S
parentrollback mem_map_memory (diff)
downloadcomus-b1ff1e082a9a80f1ea22380dd81a114a737184d0.tar.gz
comus-b1ff1e082a9a80f1ea22380dd81a114a737184d0.tar.bz2
comus-b1ff1e082a9a80f1ea22380dd81a114a737184d0.zip
fix code segment (retfq) on long mode edge case (kvm)
Diffstat (limited to '')
-rw-r--r--kernel/entry.S34
1 files changed, 13 insertions, 21 deletions
diff --git a/kernel/entry.S b/kernel/entry.S
index d16370d..85cb350 100644
--- a/kernel/entry.S
+++ b/kernel/entry.S
@@ -218,20 +218,6 @@ _start.SetEntry:
ljmp $GDT.Code, $code64
.code64
-code64:
-
- movw $GDT.Data, %dx # set segment registers
- movw %dx, %ds
- movw %dx, %ss
-
- xorq %rbp, %rbp # set ebp to 0 so we know where to end stack traces
-
- pop %rdi # pop possible multiboot header
- pop %rsi
-
- call main
- jmp halt
-
_start_efi:
# disable interrupts
cli
@@ -240,24 +226,30 @@ _start_efi:
movq $kern_stack_end, %rsp
movq $kern_stack_end, %rbp
+ # save multiboot
+ pushq %rbx
+ pushq %rax
+
# load gdt
lgdt GDT.Pointer
+ pushq $GDT.Code
+ pushq $code64
+ retfq
+code64:
# set segment registers
- movw $GDT.Code, %dx
- movw %dx, %cs
- movw %dx, %es
movw $GDT.Data, %dx
movw %dx, %ds
movw %dx, %ss
- xorq %rbp, %rbp # set ebp to 0 so we know where to end stack traces
+ # set ebp to 0 so we know where to end stack traces
+ xorq %rbp, %rbp
- movq %rax, %rdi
- movq %rbx, %rsi
+ # pop multiboot header
+ pop %rdi
+ pop %rsi
call main
- jmp halt
halt:
cli