boucane/src/boot/boot.S

150 lines
2.7 KiB
ArmAsm
Raw Normal View History

2021-04-19 19:06:28 +02:00
.globl _start
.globl MB_INFO
.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: # Will contains the Multiboot2 information data structure address
.long 0x0
2021-04-19 19:06:28 +02:00
_start:
mov %ebx, (MB_INFO)
2021-04-21 12:23:54 +02:00
# Zeroing the .bss section
mov $_bss_start, %eax
mov $_bss_end, %ebx
start_zeroing:
movb $0x0, (%eax)
cmp %eax, %ebx
je end_zeroing
inc %eax
jmp start_zeroing
end_zeroing:
2021-04-19 19:06:28 +02:00
# ----- 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:
2021-04-21 18:54:50 +02:00
# Pay attention here!
# You are in long mode here
# Thus if you want to add any instructions
# You should use .code64 before
.code64
2021-04-21 12:23:54 +02:00
mov $0x10, %ax
mov %ax, %ds
mov %ax, %es
mov %ax, %fs
mov %ax, %gs
mov %ax, %ss
2021-04-21 18:54:50 +02:00
mov $STACK_LOCATION, %esp
2021-04-21 12:23:54 +02:00
2021-04-19 19:06:28 +02:00
# 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
2021-04-21 12:23:54 +02:00
.byte 0b10010010
2021-04-19 19:06:28 +02:00
.word 0
gdtr:
.word . - gdt64 - 1
2021-04-21 12:23:54 +02:00
.quad gdt64