diff options
author | Freya Murphy <freya@freyacat.org> | 2025-04-19 19:45:36 -0400 |
---|---|---|
committer | Freya Murphy <freya@freyacat.org> | 2025-04-19 19:45:36 -0400 |
commit | b1ff1e082a9a80f1ea22380dd81a114a737184d0 (patch) | |
tree | 8dba6a34725400cab35adf633e2f8a95f2ca8df9 /kernel | |
parent | rollback mem_map_memory (diff) | |
download | comus-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.S | 34 |
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 |