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