wrote a basic bootloader
This commit is contained in:
@@ -0,0 +1,83 @@
|
||||
.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
|
||||
Reference in New Issue
Block a user