]> git.lizzy.rs Git - nyax.git/blob - boot.asm
Redesign kernel/stack/pagetable layout
[nyax.git] / boot.asm
1 [org 0x7C00]
2
3 %define PAGETABLE 0x1000
4 %define KERNEL 0xD000
5 %define STACK 0x7E00
6
7 boot:
8         xor ax, ax
9         mov ds, ax
10         mov es, ax
11         mov fs, ax
12         mov gs, ax
13         mov ss, ax
14
15         mov bp, STACK
16         mov sp, bp
17
18         mov ax, booting_msg
19         call print_str
20
21         mov bx, KERNEL
22         mov cl, 2
23         mov al, (MAIN_SIZE + 511) / 512
24         call load_disk
25
26         mov di, PAGETABLE+0x0000
27 .clr_buf:
28         mov byte[di], 0
29         inc di
30         cmp di, PAGETABLE+0x4000
31         jne .clr_buf
32
33         mov dword[PAGETABLE+0x0000], PAGETABLE+0x1003
34         mov dword[PAGETABLE+0x1000], PAGETABLE+0x2003
35         mov dword[PAGETABLE+0x2000], PAGETABLE+0x3003
36
37         mov eax, 3
38         mov di, PAGETABLE+0x3000
39 .build_pt:
40         mov [di], eax
41         add eax, 0x1000
42         add di, 8
43         cmp eax, 0x100000
44         jb .build_pt
45
46         mov di, PAGETABLE
47
48         mov al, 0xFF
49         out 0xA1, al
50         out 0x21, al
51
52         nop
53         nop
54
55         lidt [IDT]
56
57         mov eax, 0b10100000
58         mov cr4, eax
59
60         mov edx, edi
61         mov cr3, edx
62
63         mov ecx, 0xC0000080
64         rdmsr
65
66         or eax, 0x00000100
67         wrmsr
68
69         mov ebx, cr0
70         or ebx, 0x80000001
71         mov cr0, ebx
72
73         lgdt [GDT.pointer]
74
75         jmp 0x0008:long_mode
76
77 load_disk:
78         push ax
79         mov ah, 0x02
80         xor ch, ch
81         xor dh, dh
82         int 0x13
83         jc disk_error
84         pop cx
85         cmp al, cl
86         jne disk_error
87         ret
88
89 disk_error:
90         mov ax, disk_error_msg
91         call print_str
92         jmp $
93
94 print_str:
95         push ax
96         push bx
97         mov bx, ax
98         mov ah, 0x0E
99 .print:
100         mov al, [bx]
101         cmp al, 0
102         je .return
103         int 0x10
104         inc bx
105         jmp .print
106 .return:
107         pop bx
108         pop ax
109         ret
110
111 booting_msg: db 10, 13, "Loading NyaX...", 10, 10, 13, 0
112 disk_error_msg: db "Disk is bwoken, cant boot ;-;", 10, 13, 0
113
114 GDT:
115         dq 0
116         dq 0x00209A0000000000
117         dq 0x0000920000000000
118         dw 0
119 .pointer:
120         dw $ - GDT - 1
121         dd GDT
122
123 IDT:
124         dw 0
125         dd 0
126
127 [bits 64]
128
129 long_mode:
130         mov ax, 0x0010
131         mov ds, ax
132         mov es, ax
133         mov fs, ax
134         mov gs, ax
135         mov ss, ax
136
137         jmp KERNEL
138
139 times 510-($-$$) db 0
140 dw 0xAA55