summaryrefslogtreecommitdiff
path: root/stage2/elf.asm
blob: 01759b3080e2487c224e256b51fbc1bc0733a1df (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
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"