84 lines
1.6 KiB
ArmAsm
84 lines
1.6 KiB
ArmAsm
.section .efi.text, "ax"
|
|
.global _start
|
|
.code64 // UEFI is already in 64-bit protected mode
|
|
|
|
_start:
|
|
// Save UEFI parameters
|
|
mov %rcx, uefi_image_handle
|
|
mov %rdx, uefi_system_table
|
|
|
|
// Get memory map
|
|
call get_memory_map
|
|
|
|
// Exit boot services
|
|
mov uefi_image_handle, %rcx
|
|
mov memory_map_key, %rdx
|
|
call exit_boot_services
|
|
|
|
// Disable interrupts
|
|
cli
|
|
|
|
// Load GDT for long mode
|
|
lgdt gdt64_pointer(%rip)
|
|
|
|
// Setup page tables (identity map first 2MB + map kernel to higher half)
|
|
call setup_page_tables
|
|
|
|
// Enable PAE
|
|
mov %cr4, %rax
|
|
or $(1 << 5), %rax
|
|
mov %rax, %cr4
|
|
|
|
// Set long mode bit
|
|
mov $0xC0000080, %ecx
|
|
rdmsr
|
|
or $(1 << 8), %eax
|
|
wrmsr
|
|
|
|
// Enable paging
|
|
mov %cr0, %rax
|
|
or $0x80000000, %rax
|
|
mov %rax, %cr0
|
|
|
|
// Long jump to higher half kernel
|
|
lea higher_half(%rip), %rax
|
|
jmp *%rax
|
|
|
|
.align 8
|
|
higher_half:
|
|
// Now in long mode at higher half
|
|
// Setup stack and jump to Rust code
|
|
mov $kernel_stack_top, %rsp
|
|
call kmain
|
|
|
|
// GDT for long mode
|
|
.align 16
|
|
gdt64:
|
|
.quad 0 // Null descriptor
|
|
.quad 0x00AF9A000000FFFF // Code segment
|
|
.quad 0x00CF92000000FFFF // Data segment
|
|
|
|
gdt64_pointer:
|
|
.word gdt64_pointer - gdt64 - 1
|
|
.quad gdt64
|
|
|
|
.section .efi.data, "aw"
|
|
uefi_image_handle: .quad 0
|
|
uefi_system_table: .quad 0
|
|
memory_map_key: .quad 0
|
|
|
|
.section .bss
|
|
.align 4096
|
|
kernel_stack_bottom:
|
|
.skip 16384 // 16 KB stack
|
|
kernel_stack_top:
|
|
|
|
// Page tables
|
|
.align 4096
|
|
pml4_table:
|
|
.skip 4096
|
|
pdpt_table:
|
|
.skip 4096
|
|
pd_table:
|
|
.skip 4096
|