hos/lst/kernel.lst

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