Files
2025-02-25 01:14:52 +00:00

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