summaryrefslogtreecommitdiff
path: root/stage2/main.asm
blob: 5027546f3564092b2dff1f50988e74100ee54c19 (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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
[org 0x7E00]

%define PAGETABLE 0x1000
%define VESAINFO  0x0500
%define VESAMODE VESAINFO+512
%define OWNMODE  VESAMODE+256
%define GFXINFO PAGETABLE-10
;%define MEMMAPCNT GFXINFO-2
%define MEMMAP 0x500

setup:
	; print message
	mov ebx, .msg
	call print_str

	; setup VESA
	call vesa

	; get extended memory map
	call mmap

	; build page table
	call paging

	; jump into long mode
	jmp 0x0008:long_mode

.msg:
	db 10, 13, "cuddles stage2", 10, 13, 0

%include "stage2/vesa.asm"
%include "stage2/mmap.asm"
%include "stage2/paging.asm"
%include "stage1/print.asm"

[bits 64]

long_mode:
	; setup segment registers
	mov ax, 0x0010
	mov ds, ax
	mov es, ax
	mov fs, ax
	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"

kernel_elf: