summaryrefslogtreecommitdiff
path: root/kernel/src/start.asm
blob: c01cbaa1f738b034cad35e9ceadd2267983c9e7a (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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
global start
extern kernel_boot
extern kernel_main
extern kernel_start
extern kernel_end
bits 32

; base, limit, access, flags
%macro gdt_entry 4
	db %2 & 0xff
	db (%2 >> 8) & 0xff
	db %1 & 0xff
	db (%1 >> 8) & 0xff
	db (%1 >> 16) & 0xff
	db %3
	db ((%2 >> 16) & 0x0f) | (%4 << 4)
	db (%1 >> 24) & 0xff
%endmacro

MAGIC    equ  0xe85250d6
FLAGS    equ  0
LENGTH   equ  mb_end - mb_start
CHECKSUM equ  -(MAGIC + LENGTH)

VGABUF   equ  0x000B8000
KRNMAP   equ  0xC0000000

section .multiboot.data
align 8
mb_start:
dd MAGIC
dd FLAGS
dd LENGTH
dd CHECKSUM
dw 0
dw 0
dd 8
mb_end:
 
section .rodata
align 16
gdt_start:
gdt_entry 0, 0, 0, 0
gdt_entry 0, 0xFFFFF, 0x9A, 0xC
gdt_entry 0, 0xFFFFF, 0x92, 0xC
gdt_end:
gdt_descriptor:
	dw gdt_end - gdt_start - 1
	dd gdt_start

section .bootstrap_stack
align 16
stack_start:
resb 16384 ; 16 KiB
stack_end:

section .bss
align 4096
page_directory:
resb 4096
page_table1:
resb 4096

section .multiboot.text
align 8
start:

    ; push ebx
    ; call kernel_boot
    ; pop eax

    mov edi, page_table1 - KRNMAP
    mov esi, 0
    mov ecx, 1023

paging_cmp:
    cmp esi, kernel_start
    jl paging_add
    cmp esi, kernel_end - KRNMAP
    jge paging_map

    mov edx, esi
    or edx, 0x003
    mov [edi], edx

paging_add:
    add esi, 4096
    add edi, 4
    loop paging_cmp

paging_map:
    mov dword [page_table1 - KRNMAP + 1023 * 4], VGABUF | 0x003
    mov dword [page_directory - KRNMAP + 0], page_table1 - KRNMAP + 0x003
    mov dword [page_directory - KRNMAP + 768 * 4], page_table1 - KRNMAP + 0x003 

    mov ecx, page_directory - KRNMAP
    mov cr3, ecx

    mov ecx, cr0
    or ecx, 0x80010000
    mov cr0, ecx

    lea ecx, load_gdt
    jmp near ecx

section .text
align 8
load_gdt:
	cli
	lgdt [gdt_descriptor]
    mov eax, cr0
    or al, 1
    mov cr0, eax
	jmp 0x08:load_kernel

load_kernel:

    mov dword [page_directory], 0
    mov ecx, cr3
    mov cr3, ecx

	mov ax, 0x10
	mov ds, ax
	mov ss, ax
	mov es, ax
	mov fs, ax
	mov gs, ax
	mov esp, stack_end
	mov ebp, stack_end
	sti
	call kernel_main
	cli
halt:
	hlt
	jmp halt