aboutsummaryrefslogtreecommitdiff
path: root/src/boot
diff options
context:
space:
mode:
authorLoic Guegan <manzerbredes@mailbox.org>2021-04-19 19:06:28 +0200
committerLoic Guegan <manzerbredes@mailbox.org>2021-04-19 19:06:28 +0200
commitca1e725b0dc9b10997897dd2ac6d44028601d9bb (patch)
tree0eb7bd087a2382d1d1a660ceda1eae01d1b8b3ca /src/boot
parentf5146ca9c987ed5e6ea69a0c67b7ed03444be30c (diff)
Init sources
Diffstat (limited to 'src/boot')
-rw-r--r--src/boot/boot.S128
1 files changed, 128 insertions, 0 deletions
diff --git a/src/boot/boot.S b/src/boot/boot.S
new file mode 100644
index 0000000..676ace7
--- /dev/null
+++ b/src/boot/boot.S
@@ -0,0 +1,128 @@
+.globl _start
+.globl MB_INFO
+.extern boucane
+.extern _bss_start
+.extern _bss_end
+.extern boucane
+
+.set STACK_LOCATION, 0x1FFFFF
+
+.section .multiboot
+
+.set MB_MAGIC, 0xE85250D6
+.set MB_ARCH, 0x00000000
+.set MB_HEADER_LENGTH, (mb_header_end-mb_header_start)
+.set MB_CHECKSUM, -(MB_MAGIC+MB_ARCH+MB_HEADER_LENGTH)
+
+mb_header_start:
+.align 8
+.int MB_MAGIC
+.int MB_ARCH
+.int MB_HEADER_LENGTH
+.int MB_CHECKSUM
+# ----------- Address tag
+.align 8
+.short 2
+.short 0 # Not optional
+.int 24 # Size
+.int mb_header_start # header_addr
+.int mb_header_start # load_addr
+.int 0x0 # load_end_addr
+.int 0x0 # bss_end_addr
+# ----------- Addr tag
+.align 8
+.short 0x3
+.short 0
+.int 12
+.int _start
+# ----------- End tag
+.align 8
+.int 0x0
+.int 0x8
+mb_header_end:
+
+.section .text
+.code32 # Require since grub do not enable long mode
+
+MB_INFO:
+ .int 0xABCDEF # Will contains the Multiboot2 information data structure address
+
+_start:
+mov %ebx,(MB_INFO)
+
+# ----- Setup PAE Paging (identity on the first 10MB)
+mov $8192, %ecx # 8*4096/4 (8 tables of 4096 byte each divide by 4 because of movl)
+mov $0, %eax
+zeroing_paging:
+movl $0, (%eax)
+add $4, %eax
+loop zeroing_paging
+# Setup PML4 Table (Address 0x0)
+mov $0x0, %edi
+mov %edi, %cr3 # Setup PML4 location
+movl $0x1003, (%edi) # Setup PDPT location
+# Setup PDPT
+mov $0x1000, %edi
+movl $0x2003, (%edi) # Setup PDPT location
+# Setup PDT (5 PT = 10MB)
+mov $0x2000, %edi
+mov $0x3003, %eax
+mov $5, %ecx
+pdt_fill:
+movl %eax, (%edi) # Setup PDPT location
+add $8, %edi # Goto next entry
+add $0x1000, %eax # Next PT
+loop pdt_fill
+# Setup the 5 PT
+mov $0x3000, %edi
+mov $0x3, %ebx # First map to 0
+mov $2560, %ecx # 512*5
+pt_fill:
+mov %ebx, (%edi)
+add $8, %edi # Next entry
+add $0x1000, %ebx # Next Page
+loop pt_fill
+
+# ----- Switch to compatibility mode
+# Set CR4.PAE
+mov %cr4, %eax
+bts $5, %eax
+mov %eax, %cr4
+# Set EFER.LME
+mov $0xC0000080, %ecx
+rdmsr
+bts $8, %eax
+wrmsr
+# Set CR0.PG
+mov %cr0, %eax
+bts $31, %eax
+mov %eax, %cr0
+
+# Now we are in Compatibility mode
+# Now we need to set CS.L=1 (setting up a 64 bit GDT)
+lgdt (gdtr)
+jmp $0x08, $new_cs
+new_cs:
+
+# Run boucane
+jmp boucane
+
+# GDT
+gdt64:
+ gdt64_null:
+ .long 0
+ .long 0
+ gdt64_cs:
+ .long 0
+ .byte 0
+ .byte 0b10011100
+ .byte 0b00100000
+ .byte 0
+ gdt64_ds:
+ .long 0
+ .byte 0
+ .byte 0b10000000
+ .word 0
+gdtr:
+ .word . - gdt64 - 1
+ .quad gdt64 \ No newline at end of file