summaryrefslogtreecommitdiff
path: root/stage2/main.asm
diff options
context:
space:
mode:
authorLizzy Fleckenstein <lizzy@vlhl.dev>2024-01-09 20:56:07 +0100
committerLizzy Fleckenstein <lizzy@vlhl.dev>2024-01-09 21:00:24 +0100
commit59f22bc7ce5bbadf62722f3db5c93b45e86e4cca (patch)
treec5771b21f6c12f3e58cbb6c6dda8df3bc4b23798 /stage2/main.asm
parent33bb4187103c49c81fbf7c6f18ebcfd4c4d66fd2 (diff)
downloadcuddles-59f22bc7ce5bbadf62722f3db5c93b45e86e4cca.tar.xz
use ELF for kernel
Diffstat (limited to 'stage2/main.asm')
-rw-r--r--stage2/main.asm69
1 files changed, 65 insertions, 4 deletions
diff --git a/stage2/main.asm b/stage2/main.asm
index 3cfb5d2..5027546 100644
--- a/stage2/main.asm
+++ b/stage2/main.asm
@@ -44,8 +44,69 @@ long_mode:
mov gs, ax
mov ss, ax
- ; align stack
- and rsp, ~(0x0f)
- sub rsp, 8
+ mov eax, [kernel_elf]
+ cmp eax, [.elf]
+ jne .fail
- ; kernel begins here
+ mov r8, [kernel_elf+32] ; program header pos
+ add r8, kernel_elf
+
+ movzx rbx, word[kernel_elf+54] ; program header size
+ movzx rdx, word[kernel_elf+56] ; num of program headers
+
+.header:
+ cmp rdx, 0
+ je .start
+
+ mov edi, [r8] ; type
+ cmp edi, 0
+ je .next
+
+ cmp edi, 1
+ je .load
+
+ cmp edi, 2
+ je .fail
+
+ cmp edi, 3
+ je .fail
+
+ jmp .next
+
+.load:
+ ; zero out the segment
+ mov al, 0
+ mov rdi, [r8+16]
+ mov rcx, [r8+40]
+ rep stosb
+
+ ; load from file
+ mov rdi, [r8+16]
+ mov rsi, [r8+8]
+ add rsi, kernel_elf
+ mov rcx, [r8+32]
+ rep movsb
+
+.next:
+
+ add r8, rbx
+ dec rdx
+ jmp .header
+
+.start:
+ ; more stack space
+ mov rsp, 0x80000
+ xor rbp, rbp
+
+ ; ELF entry point
+ mov rax, [kernel_elf+24]
+ call rax
+
+.fail:
+ cli
+ hlt
+ jmp $
+
+.elf: db 0x7f, "ELF"
+
+kernel_elf: