diff options
author | Lizzy Fleckenstein <lizzy@vlhl.dev> | 2024-01-09 22:13:20 +0100 |
---|---|---|
committer | Lizzy Fleckenstein <lizzy@vlhl.dev> | 2024-01-09 22:13:20 +0100 |
commit | d9b8af151fb92fa89042dfdeaa60c854a3e8af31 (patch) | |
tree | b30e7176d5612c1e8a2e4035e26925c7a6f0b77d /stage2/elf.asm | |
parent | 697634653c2253239ab983fe2e28010c431e0915 (diff) | |
download | cuddles-d9b8af151fb92fa89042dfdeaa60c854a3e8af31.tar.xz |
stage2: move kernel loading code to separate file
Diffstat (limited to 'stage2/elf.asm')
-rw-r--r-- | stage2/elf.asm | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/stage2/elf.asm b/stage2/elf.asm new file mode 100644 index 0000000..01759b3 --- /dev/null +++ b/stage2/elf.asm @@ -0,0 +1,65 @@ +load_kernel_elf: + mov eax, [kernel_elf] + cmp eax, [.elf] + jne .fail + + 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" |