summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--stage2/elf.asm65
-rw-r--r--stage2/main.asm67
2 files changed, 68 insertions, 64 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"
diff --git a/stage2/main.asm b/stage2/main.asm
index 5027546..fae8d5a 100644
--- a/stage2/main.asm
+++ b/stage2/main.asm
@@ -35,6 +35,8 @@ setup:
[bits 64]
+%include "stage2/elf.asm"
+
long_mode:
; setup segment registers
mov ax, 0x0010
@@ -44,69 +46,6 @@ long_mode:
mov gs, ax
mov ss, ax
- 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"
+ call load_kernel_elf
kernel_elf: