393 lines
22 KiB
Plaintext
393 lines
22 KiB
Plaintext
1
|
|
2 %include "bootdef.inc"
|
|
3 <1>
|
|
4 <1> %define VERSION "0.1.2" ;HOS version
|
|
5 <1>
|
|
6 <1> %define BOOT_FAT_SEG 0x07E0 ;right after boot sector
|
|
7 <1> %define BOOT_ROOT_SEG 0x0900 ;right after FAT
|
|
8 <1> %define BOOT_KERNEL_SEG 0x0AC0 ;right after ROOT_DIR
|
|
9 <1> %define BOOT_STAGE2_SEG 0x0B00 ;right after KERNEL_SEG
|
|
10 <1> %define BOOT_STAGE2_ADD 0xB000 ;address of stage2 to jump to, org at
|
|
11 <1> %define BOOT_KERNEL_ADD 0x100000 ;final pmode kernel destination - physical
|
|
12 <1> %define BOOT_RD_ADD 0x200000 ;2mb for ram disk
|
|
13 <1>
|
|
14 <1> %define BOOT_DATA_SEG 0x9000 ;data gathered by stage2 loader goes here
|
|
15 <1>
|
|
16 <1> %define BOOT_HASRD 0x0000 ;1
|
|
17 <1> %define BOOT_VESA 0x0002 ;2 - 0 for console, otherwise VESA mode
|
|
18 <1> %define BOOT_VESA_OEM 0x0004 ;258 - null-terminated OEM identification string
|
|
19 <1> %define BOOT_VESA_VBE 0x0106 ;512 - copy of VESA VBEInfoBlock
|
|
20 <1> %define BOOT_VESA_INFO 0x0306 ;256 - copy of VESA ModeInfoBlock for selected mode
|
|
21 <1> %define BOOT_MEMENTRIES 0x040A ;4 - dword = number of memmap entries
|
|
22 <1> %define BOOT_MEMMAP 0x2000 ;? - memory map information
|
|
23 <1>
|
|
24 <1>
|
|
25 <1>
|
|
26 <1> %define BOOT_DRIVE 0x7C24 ;1 - boot drive
|
|
27 <1>
|
|
28 <1>
|
|
29
|
|
30 %define GDT 0x140000
|
|
31 %define IDT 0x150000
|
|
32
|
|
33 [global start]
|
|
34 [extern _isr]
|
|
35 [extern _k_init]
|
|
36
|
|
37 bits 32
|
|
38
|
|
39 start:
|
|
40 00000000 FA cli ;if they weren't already off
|
|
41 00000001 BF00001400 mov edi, GDT
|
|
42 00000006 BE[7F000000] mov esi, gdt
|
|
43 0000000B B948000000 mov ecx, gdt_end-gdt
|
|
44 copy_gdt:
|
|
45 00000010 AC lodsb
|
|
46 00000011 AA stosb
|
|
47 00000012 E2FC loop copy_gdt
|
|
48
|
|
49 00000014 BF00001500 mov edi, IDT ;destination
|
|
50 00000019 BE[CD000000] mov esi, isr_0 ;address of isr0
|
|
51 0000001E BA0A000000 mov edx, isr_1-isr_0 ;distance between isr labels
|
|
52 00000023 B932000000 mov ecx, 50 ;number of isrlabels
|
|
53 fill_idt:
|
|
54 00000028 89F3 mov ebx, esi
|
|
55 0000002A 6689F0 mov ax, si
|
|
56 0000002D 66AB stosw ;0 offset 15:0
|
|
57 0000002F 66B80800 mov ax, KERNEL_CODE
|
|
58 00000033 66AB stosw ;2 selector 15:0
|
|
59 00000035 66B8008E mov ax, 0x8E00
|
|
60 00000039 66AB stosw ;4 [P][DPL][0][TYPE][0][0][0][0][0][0][0][0]
|
|
61 0000003B C1EE10 shr esi, 16
|
|
62 0000003E 6689F0 mov ax, si
|
|
63 00000041 66AB stosw ;6 offset 31:16
|
|
64 00000043 89DE mov esi, ebx
|
|
65 00000045 01D6 add esi, edx
|
|
66 00000047 E2DF loop fill_idt
|
|
67
|
|
68 00000049 0F0115[79000000] lgdt [gdtr] ;load gdt
|
|
69 00000050 EA[57000000]0800 jmp KERNEL_CODE:newgdtcontinue
|
|
70 newgdtcontinue:
|
|
71 00000057 66B81000 mov ax, KERNEL_DATA
|
|
72 0000005B 8EC0 mov es, ax
|
|
73 0000005D 8ED8 mov ds, ax
|
|
74 0000005F 8EE8 mov gs, ax
|
|
75 00000061 8EE0 mov fs, ax
|
|
76 00000063 8ED0 mov ss, ax
|
|
77 00000065 BCFCFF1F00 mov esp, 0x1ffffc ;stack just under 2mb, moves downward
|
|
78 0000006A 0F011D[C7000000] lidt [idtr] ;load idt
|
|
79
|
|
80 00000071 E8(00000000) call _k_init
|
|
81 00000076 F4 hlt ;halt processor when k_init is done
|
|
82 00000077 EBFE jmp $ ;shouldn't get here...
|
|
83
|
|
84 %include "gdt.inc"
|
|
85 <1>
|
|
86 <1>
|
|
87 <1> gdtr:
|
|
88 00000079 4700 <1> dw gdt_end-gdt-1
|
|
89 0000007B 00001400 <1> dd GDT
|
|
90 <1> gdt:
|
|
91 0000007F 00000000 <1> dd 0
|
|
92 00000083 00000000 <1> dd 0
|
|
93 <1> KERNEL_CODE equ $-gdt
|
|
94 00000087 FFFF <1> dw 0xffff ;limit 15:0
|
|
95 00000089 0000 <1> dw 0x0000 ;base 15:0
|
|
96 0000008B 00 <1> db 0x00 ;base 23:16
|
|
97 0000008C 9A <1> db 0x9A ;access ([P][DPL][1][Executable][Direction/Conforming][Writable/Readable][A])
|
|
98 0000008D CF <1> db 0xCF ;flags ([G][D/B][0][0]) / limit 19:16
|
|
99 0000008E 00 <1> db 0x00 ;base 31:24
|
|
100 <1> KERNEL_DATA equ $-gdt
|
|
101 0000008F FFFF <1> dw 0xffff ;limit 15:0
|
|
102 00000091 0000 <1> dw 0x0000 ;base 15:0
|
|
103 00000093 00 <1> db 0x00 ;base 23:16
|
|
104 00000094 92 <1> db 0x92 ;access ([P][DPL][1][Executable][Direction/Conforming][Writable/Readable][A])
|
|
105 00000095 CF <1> db 0xCF ;flags ([G][D/B][0][0]) / limit 19:16
|
|
106 00000096 00 <1> db 0x00 ;base 31:24
|
|
107 <1> VESA_CODE equ $-gdt
|
|
108 00000097 FFFF <1> dw 0xffff ;limit 15:0
|
|
109 00000099 0000 <1> dw 0x0000 ;base 15:0
|
|
110 0000009B 00 <1> db 0x00 ;base 23:16
|
|
111 0000009C 9A <1> db 0x9A ;access ([P][DPL][1][Executable][Direction/Conforming][Writable/Readable][A])
|
|
112 0000009D 40 <1> db 0x40 ;flags ([G][D/B][0][0]) / limit 19:16
|
|
113 0000009E 00 <1> db 0x00 ;base 31:24
|
|
114 <1> VESA_DATA equ $-gdt
|
|
115 0000009F FFFF <1> dw 0xffff ;limit 15:0
|
|
116 000000A1 0000 <1> dw 0x0000 ;base 15:0
|
|
117 000000A3 00 <1> db 0x00 ;base 23:16
|
|
118 000000A4 92 <1> db 0x92 ;access ([P][DPL][1][Executable][Direction/Conforming][Writable/Readable][A])
|
|
119 000000A5 40 <1> db 0x40 ;flags ([G][D/B][0][0]) / limit 19:16
|
|
120 000000A6 00 <1> db 0x00 ;base 31:24
|
|
121 <1> VIDEO_TEXT equ $-gdt
|
|
122 000000A7 FF7F <1> dw 0x7FFF ;limit 15:0
|
|
123 000000A9 0080 <1> dw 0x8000 ;base 15:0
|
|
124 000000AB 0B <1> db 0x0B ;base 23:16
|
|
125 000000AC 92 <1> db 0x92 ;access ([P][DPL][1][Executable][Direction/Conforming][Writable/Readable][A])
|
|
126 000000AD 40 <1> db 0x40 ;flags ([G][D/B][0][0]) / limit 19:16
|
|
127 000000AE 00 <1> db 0x00 ;base 31:24
|
|
128 <1> VIDEO_GRAPHICS equ $-gdt
|
|
129 000000AF FFFF <1> dw 0xFFFF ;limit 15:0
|
|
130 000000B1 0000 <1> dw 0x0000 ;base 15:0
|
|
131 000000B3 0A <1> db 0x0A ;base 23:16
|
|
132 000000B4 92 <1> db 0x92 ;access ([P][DPL][1][Executable][Direction/Conforming][Writable/Readable][A])
|
|
133 000000B5 40 <1> db 0x40 ;flags ([G][D/B][0][0]) / limit 19:16
|
|
134 000000B6 00 <1> db 0x00 ;base 31:24
|
|
135 <1> USER_CODE equ $-gdt
|
|
136 000000B7 FFFF <1> dw 0xffff ;limit 15:0
|
|
137 000000B9 0000 <1> dw 0x0000 ;base 15:0
|
|
138 000000BB 00 <1> db 0x00 ;base 23:16
|
|
139 000000BC FA <1> db 0xFA ;access ([P][DPL][1][Executable][Direction/Conforming][Writable/Readable][A])
|
|
140 000000BD CF <1> db 0xCF ;flags ([G][D/B][0][0]) / limit 19:16
|
|
141 000000BE 00 <1> db 0x00 ;base 31:24
|
|
142 <1> USER_DATA equ $-gdt
|
|
143 000000BF FFFF <1> dw 0xffff ;limit 15:0
|
|
144 000000C1 0000 <1> dw 0x0000 ;base 15:0
|
|
145 000000C3 00 <1> db 0x00 ;base 23:16
|
|
146 000000C4 F2 <1> db 0xF2 ;access ([P][DPL][1][Executable][Direction/Conforming][Writable/Readable][A])
|
|
147 000000C5 CF <1> db 0xCF ;flags ([G][D/B][0][0]) / limit 19:16
|
|
148 000000C6 00 <1> db 0x00 ;base 31:24
|
|
149 <1> gdt_end:
|
|
150 <1>
|
|
151 <1>
|
|
152 <1>
|
|
153 %include "idt.inc"
|
|
154 <1>
|
|
155 <1> idtr:
|
|
156 000000C7 8F01 <1> dw 50*8-1 ;size of idt
|
|
157 000000C9 00001500 <1> dd IDT ;address of idt
|
|
158 <1>
|
|
159 <1>
|
|
160 <1> %macro isr_label 1
|
|
161 <1> isr_%1:
|
|
162 <1> mov eax, %1
|
|
163 <1> jmp isr_main
|
|
164 <1> %endmacro
|
|
165 <1>
|
|
166 <1> isr_label 0
|
|
167 <2> isr_%1:
|
|
168 000000CD B800000000 <2> mov eax, %1
|
|
169 000000D2 E9EA010000 <2> jmp isr_main
|
|
170 <1> isr_label 1
|
|
171 <2> isr_%1:
|
|
172 000000D7 B801000000 <2> mov eax, %1
|
|
173 000000DC E9E0010000 <2> jmp isr_main
|
|
174 <1> isr_label 2
|
|
175 <2> isr_%1:
|
|
176 000000E1 B802000000 <2> mov eax, %1
|
|
177 000000E6 E9D6010000 <2> jmp isr_main
|
|
178 <1> isr_label 3
|
|
179 <2> isr_%1:
|
|
180 000000EB B803000000 <2> mov eax, %1
|
|
181 000000F0 E9CC010000 <2> jmp isr_main
|
|
182 <1> isr_label 4
|
|
183 <2> isr_%1:
|
|
184 000000F5 B804000000 <2> mov eax, %1
|
|
185 000000FA E9C2010000 <2> jmp isr_main
|
|
186 <1> isr_label 5
|
|
187 <2> isr_%1:
|
|
188 000000FF B805000000 <2> mov eax, %1
|
|
189 00000104 E9B8010000 <2> jmp isr_main
|
|
190 <1> isr_label 6
|
|
191 <2> isr_%1:
|
|
192 00000109 B806000000 <2> mov eax, %1
|
|
193 0000010E E9AE010000 <2> jmp isr_main
|
|
194 <1> isr_label 7
|
|
195 <2> isr_%1:
|
|
196 00000113 B807000000 <2> mov eax, %1
|
|
197 00000118 E9A4010000 <2> jmp isr_main
|
|
198 <1> isr_label 8
|
|
199 <2> isr_%1:
|
|
200 0000011D B808000000 <2> mov eax, %1
|
|
201 00000122 E99A010000 <2> jmp isr_main
|
|
202 <1> isr_label 9
|
|
203 <2> isr_%1:
|
|
204 00000127 B809000000 <2> mov eax, %1
|
|
205 0000012C E990010000 <2> jmp isr_main
|
|
206 <1> isr_label 10
|
|
207 <2> isr_%1:
|
|
208 00000131 B80A000000 <2> mov eax, %1
|
|
209 00000136 E986010000 <2> jmp isr_main
|
|
210 <1> isr_label 11
|
|
211 <2> isr_%1:
|
|
212 0000013B B80B000000 <2> mov eax, %1
|
|
213 00000140 E97C010000 <2> jmp isr_main
|
|
214 <1> isr_label 12
|
|
215 <2> isr_%1:
|
|
216 00000145 B80C000000 <2> mov eax, %1
|
|
217 0000014A E972010000 <2> jmp isr_main
|
|
218 <1> isr_label 13
|
|
219 <2> isr_%1:
|
|
220 0000014F B80D000000 <2> mov eax, %1
|
|
221 00000154 E968010000 <2> jmp isr_main
|
|
222 <1> isr_label 14
|
|
223 <2> isr_%1:
|
|
224 00000159 B80E000000 <2> mov eax, %1
|
|
225 0000015E E95E010000 <2> jmp isr_main
|
|
226 <1> isr_label 15
|
|
227 <2> isr_%1:
|
|
228 00000163 B80F000000 <2> mov eax, %1
|
|
229 00000168 E954010000 <2> jmp isr_main
|
|
230 <1> isr_label 16
|
|
231 <2> isr_%1:
|
|
232 0000016D B810000000 <2> mov eax, %1
|
|
233 00000172 E94A010000 <2> jmp isr_main
|
|
234 <1> isr_label 17
|
|
235 <2> isr_%1:
|
|
236 00000177 B811000000 <2> mov eax, %1
|
|
237 0000017C E940010000 <2> jmp isr_main
|
|
238 <1> isr_label 18
|
|
239 <2> isr_%1:
|
|
240 00000181 B812000000 <2> mov eax, %1
|
|
241 00000186 E936010000 <2> jmp isr_main
|
|
242 <1> isr_label 19
|
|
243 <2> isr_%1:
|
|
244 0000018B B813000000 <2> mov eax, %1
|
|
245 00000190 E92C010000 <2> jmp isr_main
|
|
246 <1> isr_label 20
|
|
247 <2> isr_%1:
|
|
248 00000195 B814000000 <2> mov eax, %1
|
|
249 0000019A E922010000 <2> jmp isr_main
|
|
250 <1> isr_label 21
|
|
251 <2> isr_%1:
|
|
252 0000019F B815000000 <2> mov eax, %1
|
|
253 000001A4 E918010000 <2> jmp isr_main
|
|
254 <1> isr_label 22
|
|
255 <2> isr_%1:
|
|
256 000001A9 B816000000 <2> mov eax, %1
|
|
257 000001AE E90E010000 <2> jmp isr_main
|
|
258 <1> isr_label 23
|
|
259 <2> isr_%1:
|
|
260 000001B3 B817000000 <2> mov eax, %1
|
|
261 000001B8 E904010000 <2> jmp isr_main
|
|
262 <1> isr_label 24
|
|
263 <2> isr_%1:
|
|
264 000001BD B818000000 <2> mov eax, %1
|
|
265 000001C2 E9FA000000 <2> jmp isr_main
|
|
266 <1> isr_label 25
|
|
267 <2> isr_%1:
|
|
268 000001C7 B819000000 <2> mov eax, %1
|
|
269 000001CC E9F0000000 <2> jmp isr_main
|
|
270 <1> isr_label 26
|
|
271 <2> isr_%1:
|
|
272 000001D1 B81A000000 <2> mov eax, %1
|
|
273 000001D6 E9E6000000 <2> jmp isr_main
|
|
274 <1> isr_label 27
|
|
275 <2> isr_%1:
|
|
276 000001DB B81B000000 <2> mov eax, %1
|
|
277 000001E0 E9DC000000 <2> jmp isr_main
|
|
278 <1> isr_label 28
|
|
279 <2> isr_%1:
|
|
280 000001E5 B81C000000 <2> mov eax, %1
|
|
281 000001EA E9D2000000 <2> jmp isr_main
|
|
282 <1> isr_label 29
|
|
283 <2> isr_%1:
|
|
284 000001EF B81D000000 <2> mov eax, %1
|
|
285 000001F4 E9C8000000 <2> jmp isr_main
|
|
286 <1> isr_label 30
|
|
287 <2> isr_%1:
|
|
288 000001F9 B81E000000 <2> mov eax, %1
|
|
289 000001FE E9BE000000 <2> jmp isr_main
|
|
290 <1> isr_label 31
|
|
291 <2> isr_%1:
|
|
292 00000203 B81F000000 <2> mov eax, %1
|
|
293 00000208 E9B4000000 <2> jmp isr_main
|
|
294 <1> isr_label 32
|
|
295 <2> isr_%1:
|
|
296 0000020D B820000000 <2> mov eax, %1
|
|
297 00000212 E9AA000000 <2> jmp isr_main
|
|
298 <1> isr_label 33
|
|
299 <2> isr_%1:
|
|
300 00000217 B821000000 <2> mov eax, %1
|
|
301 0000021C E9A0000000 <2> jmp isr_main
|
|
302 <1> isr_label 34
|
|
303 <2> isr_%1:
|
|
304 00000221 B822000000 <2> mov eax, %1
|
|
305 00000226 E996000000 <2> jmp isr_main
|
|
306 <1> isr_label 35
|
|
307 <2> isr_%1:
|
|
308 0000022B B823000000 <2> mov eax, %1
|
|
309 00000230 E98C000000 <2> jmp isr_main
|
|
310 <1> isr_label 36
|
|
311 <2> isr_%1:
|
|
312 00000235 B824000000 <2> mov eax, %1
|
|
313 0000023A E982000000 <2> jmp isr_main
|
|
314 <1> isr_label 37
|
|
315 <2> isr_%1:
|
|
316 0000023F B825000000 <2> mov eax, %1
|
|
317 00000244 E978000000 <2> jmp isr_main
|
|
318 <1> isr_label 38
|
|
319 <2> isr_%1:
|
|
320 00000249 B826000000 <2> mov eax, %1
|
|
321 0000024E E96E000000 <2> jmp isr_main
|
|
322 <1> isr_label 39
|
|
323 <2> isr_%1:
|
|
324 00000253 B827000000 <2> mov eax, %1
|
|
325 00000258 E964000000 <2> jmp isr_main
|
|
326 <1> isr_label 40
|
|
327 <2> isr_%1:
|
|
328 0000025D B828000000 <2> mov eax, %1
|
|
329 00000262 E95A000000 <2> jmp isr_main
|
|
330 <1> isr_label 41
|
|
331 <2> isr_%1:
|
|
332 00000267 B829000000 <2> mov eax, %1
|
|
333 0000026C E950000000 <2> jmp isr_main
|
|
334 <1> isr_label 42
|
|
335 <2> isr_%1:
|
|
336 00000271 B82A000000 <2> mov eax, %1
|
|
337 00000276 E946000000 <2> jmp isr_main
|
|
338 <1> isr_label 43
|
|
339 <2> isr_%1:
|
|
340 0000027B B82B000000 <2> mov eax, %1
|
|
341 00000280 E93C000000 <2> jmp isr_main
|
|
342 <1> isr_label 44
|
|
343 <2> isr_%1:
|
|
344 00000285 B82C000000 <2> mov eax, %1
|
|
345 0000028A E932000000 <2> jmp isr_main
|
|
346 <1> isr_label 45
|
|
347 <2> isr_%1:
|
|
348 0000028F B82D000000 <2> mov eax, %1
|
|
349 00000294 E928000000 <2> jmp isr_main
|
|
350 <1> isr_label 46
|
|
351 <2> isr_%1:
|
|
352 00000299 B82E000000 <2> mov eax, %1
|
|
353 0000029E E91E000000 <2> jmp isr_main
|
|
354 <1> isr_label 47
|
|
355 <2> isr_%1:
|
|
356 000002A3 B82F000000 <2> mov eax, %1
|
|
357 000002A8 E914000000 <2> jmp isr_main
|
|
358 <1> isr_label 48
|
|
359 <2> isr_%1:
|
|
360 000002AD B830000000 <2> mov eax, %1
|
|
361 000002B2 E90A000000 <2> jmp isr_main
|
|
362 <1> isr_label 49
|
|
363 <2> isr_%1:
|
|
364 000002B7 B831000000 <2> mov eax, %1
|
|
365 000002BC E900000000 <2> jmp isr_main
|
|
366 <1>
|
|
367 <1> isr_main:
|
|
368 000002C1 60 <1> pusha
|
|
369 000002C2 1E <1> push ds
|
|
370 000002C3 06 <1> push es
|
|
371 <1>
|
|
372 000002C4 50 <1> push eax
|
|
373 <1>
|
|
374 000002C5 E8(00000000) <1> call _isr
|
|
375 <1>
|
|
376 000002CA 58 <1> pop eax
|
|
377 <1>
|
|
378 000002CB 07 <1> pop es
|
|
379 000002CC 1F <1> pop ds
|
|
380 000002CD 61 <1> popa
|
|
381 <1>
|
|
382 000002CE CF <1> iret
|
|
383 <1>
|
|
384 <1>
|
|
385 <1>
|
|
386 <1>
|
|
387 <1>
|
|
388 <1>
|
|
389 <1>
|
|
390
|
|
391
|
|
392
|