aboutsummaryrefslogtreecommitdiff
path: root/arch/x86_64/src/boot/entry64.s
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86_64/src/boot/entry64.s')
-rw-r--r--arch/x86_64/src/boot/entry64.s60
1 files changed, 60 insertions, 0 deletions
diff --git a/arch/x86_64/src/boot/entry64.s b/arch/x86_64/src/boot/entry64.s
new file mode 100644
index 0000000..657b0a8
--- /dev/null
+++ b/arch/x86_64/src/boot/entry64.s
@@ -0,0 +1,60 @@
+.section .bss, "aw", @nobits
+
+//! A structure containing information gathered during the bootstrap process.
+//! Expected layout (as described by teachos::boot::information):
+//!
+//! struct
+//! {
+//! multiboot2::information_view const * mbi;
+//! std::size_t vga_buffer_index;
+//! }
+.global bootstrap_information
+bootstrap_information: .skip 16
+
+.align 16
+.global stack_top
+stack_bottom: .skip 1 << 20
+stack_top:
+stack_size = stack_top - stack_bottom
+
+.section .boot_text, "ax", @progbits
+.code64
+
+.global _entry64
+_entry64:
+ mov $global_descriptor_table_data, %rax
+ mov %rax, %ss
+ mov %rax, %ds
+ mov %rax, %es
+ mov %rax, %fs
+ mov %rax, %gs
+
+ mov $stack_top, %rsp
+ mov %rsp, %rbp
+
+ mov multiboot_information_pointer, %rax
+ or $TEACHOS_VMA, %rax
+ mov vga_buffer_pointer, %rdx
+ sub $0xb8000, %rdx
+ mov %rax, (bootstrap_information)
+ mov %rdx, (bootstrap_information + 8)
+
+ 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:
+ hlt
+ jmp 1b