aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFelix Morgner <felix.morgner@ost.ch>2025-07-24 13:52:42 +0000
committerFelix Morgner <felix.morgner@ost.ch>2025-07-24 13:52:42 +0000
commitef907825e861b63726952bb34b425a98f34ed412 (patch)
treea2dc43bbc9362942f740652b990ee582880f2e3d
parent187788deaf81a0ef6709aea8f3c4d906f1669762 (diff)
downloadteachos-ef907825e861b63726952bb34b425a98f34ed412.tar.xz
teachos-ef907825e861b63726952bb34b425a98f34ed412.zip
x86_64: provide a clean slate on entry to long mode
-rw-r--r--arch/x86_64/src/boot/boot32.S4
-rw-r--r--arch/x86_64/src/boot/entry64.s14
2 files changed, 16 insertions, 2 deletions
diff --git a/arch/x86_64/src/boot/boot32.S b/arch/x86_64/src/boot/boot32.S
index 3039f38..27eed4d 100644
--- a/arch/x86_64/src/boot/boot32.S
+++ b/arch/x86_64/src/boot/boot32.S
@@ -27,8 +27,12 @@ page_maps_size = page_maps_end - page_maps_start
.section .boot_stack, "aw", @nobits
.align 16
+.global stack_size
+.global stack_bottom
+
stack_bottom: .skip 1 << 20
stack_top:
+stack_size = stack_top - stack_bottom
/**
* @brief Constants for the bootstrapping process.
diff --git a/arch/x86_64/src/boot/entry64.s b/arch/x86_64/src/boot/entry64.s
index 110ced8..c5df5db 100644
--- a/arch/x86_64/src/boot/entry64.s
+++ b/arch/x86_64/src/boot/entry64.s
@@ -10,10 +10,20 @@ _entry64:
mov %rax, %fs
mov %rax, %gs
- xor %rax, %rax
-
call invoke_global_constructors
+ xor %rax, %rax
+ mov %rax, %rbp
+ mov %rax, %rdx
+ mov %rax, %rsi
+
+ mov $stack_size, %rcx
+ shr $3, %rcx
+ lea (stack_bottom), %rdi
+ rep stosq
+
+ mov %rax, %rdi
+
call main
1: