Changeset 421c833 in mainline for kernel/arch/ia32/src/boot/boot.S
- Timestamp:
- 2009-03-13T12:58:43Z (15 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- b6dfc32
- Parents:
- 99d6fd0
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/ia32/src/boot/boot.S
r99d6fd0 r421c833 43 43 .long MULTIBOOT_HEADER_MAGIC 44 44 .long MULTIBOOT_HEADER_FLAGS 45 .long -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS) 45 .long -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS) # checksum 46 46 .long multiboot_header 47 47 .long unmapped_ktext_start … … 49 49 .long 0 50 50 .long multiboot_image_start 51 51 52 52 multiboot_image_start: 53 53 cld 54 movl $START_STACK, %esp 55 lgdt KA2PA(bootstrap_gdtr) 56 57 movw $ selector(KDATA_DES), %cx54 movl $START_STACK, %esp # initialize stack pointer 55 lgdt KA2PA(bootstrap_gdtr) # initialize Global Descriptor Table register 56 57 movw $gdtselector(KDATA_DES), %cx 58 58 movw %cx, %es 59 59 movw %cx, %fs 60 60 movw %cx, %gs 61 movw %cx, %ds 61 movw %cx, %ds # kernel data + stack 62 62 movw %cx, %ss 63 63 64 jmpl $ selector(KTEXT_DES), $multiboot_meeting_point64 jmpl $gdtselector(KTEXT_DES), $multiboot_meeting_point 65 65 multiboot_meeting_point: 66 66 67 movl %eax, grub_eax 67 movl %eax, grub_eax # save parameters from GRUB 68 68 movl %ebx, grub_ebx 69 69 70 xorl %eax, %eax 71 72 cmp $0x0, %eax# any function > 0?70 xorl %eax, %eax 71 cpuid 72 cmp $0x0, %eax # any function > 0? 73 73 jbe pse_unsupported 74 movl $0x1, %eax # Basic function code 174 movl $0x1, %eax # basic function code 1 75 75 cpuid 76 bt $3, %edx # Test if PSE is supported76 bt $3, %edx # test if PSE is supported 77 77 jc pse_supported 78 78 79 79 pse_unsupported: 80 80 movl $pse_msg, %esi … … 82 82 83 83 pse_supported: 84 85 #ifdef CONFIG_FB 86 mov $vesa_init, %esi 87 mov $VESA_INIT_SEGMENT << 4, %edi 88 mov $e_vesa_init - vesa_init, %ecx 89 rep movsb 90 91 mov $VESA_INIT_SEGMENT << 4, %edi 92 jmpl *%edi 93 94 vesa_meeting_point: 95 96 mov %esi, KA2PA(vesa_ph_addr) 97 mov %di, KA2PA(vesa_height) 98 shr $16, %edi 99 mov %di, KA2PA(vesa_width) 100 mov %bx, KA2PA(vesa_scanline) 101 shr $16, %ebx 102 mov %bx, KA2PA(vesa_bpp) 103 #endif 104 105 call map_kernel # map kernel and turn paging on 106 107 # arch_pre_main(grub_eax, grub_ebx) 84 85 #include "vesa_prot.inc" 86 87 # map kernel and turn paging on 88 call map_kernel 89 90 # call arch_pre_main(grub_eax, grub_ebx) 108 91 pushl grub_ebx 109 92 pushl grub_eax … … 112 95 call main_bsp 113 96 114 # Not reached. 115 97 # not reached 116 98 cli 117 hlt 99 hlt0: 100 hlt 101 jmp hlt0 118 102 119 103 .global map_kernel … … 124 108 # 125 109 movl %cr4, %ecx 126 orl $(1 << 4), %ecx 127 andl $(~(1 << 5)), %ecx 110 orl $(1 << 4), %ecx # turn PSE on 111 andl $(~(1 << 5)), %ecx # turn PAE off 128 112 movl %ecx, %cr4 129 113 … … 132 116 xorl %ecx, %ecx 133 117 xorl %ebx, %ebx 134 0: 135 movl $((1 << 7) | (1 << 1) | (1 << 0)), %eax 136 orl %ebx, %eax 137 movl %eax, (%esi, %ecx, 4) # mapping 0x00000000 + %ecx * 4M => 0x00000000 + %ecx * 4M 138 movl %eax, (%edi, %ecx, 4) # mapping 0x80000000 + %ecx * 4M => 0x00000000 + %ecx * 4M 139 addl $(4 * 1024 * 1024), %ebx 140 141 incl %ecx 142 cmpl $512, %ecx 143 jl 0b 144 118 119 floop: 120 movl $((1 << 7) | (1 << 1) | (1 << 0)), %eax 121 orl %ebx, %eax 122 movl %eax, (%esi, %ecx, 4) # mapping 0x00000000 + %ecx * 4M => 0x00000000 + %ecx * 4M 123 movl %eax, (%edi, %ecx, 4) # mapping 0x80000000 + %ecx * 4M => 0x00000000 + %ecx * 4M 124 addl $(4 * 1024 * 1024), %ebx 125 126 incl %ecx 127 cmpl $512, %ecx 128 jl floop 129 145 130 movl %esi, %cr3 146 131 147 132 movl %cr0, %ebx 148 orl $(1 << 31), %ebx 133 orl $(1 << 31), %ebx # turn paging on 149 134 movl %ebx, %cr0 150 135 ret … … 152 137 # Print string from %esi to EGA display (in red) and halt 153 138 error_halt: 154 movl $0xb8000, %edi 139 movl $0xb8000, %edi # base of EGA text mode memory 155 140 xorl %eax, %eax 156 141 157 movw $0x3d4, %dx 142 movw $0x3d4, %dx # read bits 8 - 15 of the cursor address 158 143 movb $0xe, %al 159 144 outb %al, %dx … … 163 148 shl $8, %ax 164 149 165 movw $0x3d4, %dx 150 movw $0x3d4, %dx # read bits 0 - 7 of the cursor address 166 151 movb $0xf, %al 167 152 outb %al, %dx … … 172 157 cmp $1920, %ax 173 158 jbe cursor_ok 174 movw $1920, %ax # sanity check for the cursor on the last line 159 160 movw $1920, %ax # sanity check for the cursor on the last line 161 175 162 cursor_ok: 176 163 … … 179 166 addl %eax, %edi 180 167 181 movw $0x0c00, %ax 168 movw $0x0c00, %ax # black background, light red foreground 182 169 183 170 ploop: … … 186 173 je ploop_end 187 174 stosw 188 inc %bx 175 inc %bx 189 176 jmp ploop 190 177 ploop_end: 191 178 192 movw $0x3d4, %dx 179 movw $0x3d4, %dx # write bits 8 - 15 of the cursor address 193 180 movb $0xe, %al 194 181 outb %al, %dx … … 198 185 outb %al, %dx 199 186 200 movw $0x3d4, %dx 187 movw $0x3d4, %dx # write bits 0 - 7 of the cursor address 201 188 movb $0xf, %al 202 189 outb %al, %dx … … 205 192 movb %bl, %al 206 193 outb %al, %dx 207 194 208 195 cli 209 hlt 210 211 #ifdef CONFIG_FB 212 vesa_init: 213 jmp $selector(VESA_INIT_DES), $vesa_init_real - vesa_init 214 215 .code16 216 vesa_init_real: 217 218 mov %cr0, %eax 219 and $~1, %eax 220 mov %eax, %cr0 221 222 jmp $VESA_INIT_SEGMENT, $vesa_init_real2 - vesa_init 223 224 vesa_init_real2: 225 226 mov $VESA_INIT_SEGMENT, %bx 227 228 mov %bx, %es 229 mov %bx, %fs 230 mov %bx, %gs 231 mov %bx, %ds 232 mov %bx, %ss 233 234 movl %esp, %eax 235 movl $0x0000fffc, %esp 236 movl $0x0000fffc, %ebp 237 pushl %eax 238 239 #define VESA_INFO_SIZE 1024 240 241 #define VESA_MODE_ATTRIBUTES_OFFSET 0 242 #define VESA_MODE_LIST_PTR_OFFSET 14 243 #define VESA_MODE_SCANLINE_OFFSET 16 244 #define VESA_MODE_WIDTH_OFFSET 18 245 #define VESA_MODE_HEIGHT_OFFSET 20 246 #define VESA_MODE_BPP_OFFSET 25 247 #define VESA_MODE_PHADDR_OFFSET 40 248 249 #define VESA_END_OF_MODES 0xffff 250 251 #define VESA_OK 0x4f 252 253 #define VESA_GET_INFO 0x4f00 254 #define VESA_GET_MODE_INFO 0x4f01 255 #define VESA_SET_MODE 0x4f02 256 #define VESA_SET_PALETTE 0x4f09 257 258 #if CONFIG_VESA_BPP == 24 259 #define CONFIG_VESA_BPP_VARIANT 32 260 #endif 261 262 mov $VESA_GET_INFO, %ax 263 mov $e_vesa_init - vesa_init, %di 264 push %di 265 int $0x10 266 267 pop %di 268 cmp $VESA_OK, %al 269 jnz 0f 270 271 mov 2 + VESA_MODE_LIST_PTR_OFFSET(%di), %si 272 mov %si, %gs 273 mov VESA_MODE_LIST_PTR_OFFSET(%di), %si 274 275 add $VESA_INFO_SIZE, %di 276 277 1:# Try next mode 278 mov %gs:(%si), %cx 279 cmp $VESA_END_OF_MODES, %cx 280 jz 0f 281 282 inc %si 283 inc %si 284 push %cx 285 push %di 286 push %si 287 mov $VESA_GET_MODE_INFO, %ax 288 int $0x10 289 290 pop %si 291 pop %di 292 pop %cx 293 cmp $VESA_OK, %al 294 jnz 0f 295 296 mov $CONFIG_VESA_WIDTH, %ax 297 cmp VESA_MODE_WIDTH_OFFSET(%di), %ax 298 jnz 1b 299 300 mov $CONFIG_VESA_HEIGHT, %ax 301 cmp VESA_MODE_HEIGHT_OFFSET(%di), %ax 302 jnz 1b 303 304 mov $CONFIG_VESA_BPP, %al 305 cmp VESA_MODE_BPP_OFFSET(%di), %al 306 307 #ifdef CONFIG_VESA_BPP_VARIANT 308 jz 2f 309 310 mov $CONFIG_VESA_BPP_VARIANT, %al 311 cmp VESA_MODE_BPP_OFFSET(%di), %al 312 #endif 313 jnz 1b 314 315 2: 316 317 mov %cx, %bx 318 or $0xc000, %bx 319 push %di 320 mov $VESA_SET_MODE, %ax 321 int $0x10 322 323 pop %di 324 cmp $VESA_OK, %al 325 jnz 0f 326 327 #if CONFIG_VESA_BPP == 8 328 329 # Set 3:2:3 VGA palette 330 331 mov VESA_MODE_ATTRIBUTES_OFFSET(%di), %ax 332 push %di 333 mov $vga323 - vesa_init, %di 334 mov $0x100, %ecx 335 336 bt $5, %ax # Test if VGA compatible registers are present 337 jnc vga_compat 338 339 # Try VESA routine to set palette 340 341 mov $VESA_SET_PALETTE, %ax 342 xor %bl, %bl 343 xor %dx, %dx 344 int $0x10 345 346 cmp $0x00, %ah 347 je vga_not_compat 348 349 vga_compat: 350 351 # Try VGA registers to set palette 352 353 movw $0x3c6, %dx # Set palette mask 354 movb $0xff, %al 355 outb %al, %dx 356 357 movw $0x3c8, %dx # First index to set 358 xor %al, %al 359 outb %al, %dx 360 361 movw $0x3c9, %dx # Data port 362 vga_loop: 363 movb %es:2(%di), %al 364 outb %al, %dx 365 366 movb %es:1(%di), %al 367 outb %al, %dx 368 369 movb %es:(%di), %al 370 outb %al, %dx 371 372 addw $4, %di 373 loop vga_loop 374 375 vga_not_compat: 376 377 pop %di 378 379 #endif 380 381 mov VESA_MODE_PHADDR_OFFSET(%di), %esi 382 mov VESA_MODE_WIDTH_OFFSET(%di), %ax 383 shl $16, %eax 384 mov VESA_MODE_HEIGHT_OFFSET(%di), %ax 385 mov VESA_MODE_BPP_OFFSET(%di), %bl 386 xor %bh, %bh 387 shl $16, %ebx 388 mov VESA_MODE_SCANLINE_OFFSET(%di), %bx 389 mov %eax, %edi 390 391 8: 392 393 mov %cr0, %eax 394 or $1, %eax 395 mov %eax, %cr0 396 397 jmp 9f 398 9: 399 400 ljmpl $selector(KTEXT_DES), $(vesa_init_protect - vesa_init + VESA_INIT_SEGMENT << 4) 401 402 0:# No prefered mode found 403 mov $0x111, %cx 404 push %di 405 push %cx 406 mov $VESA_GET_MODE_INFO, %ax 407 int $0x10 408 409 pop %cx 410 pop %di 411 cmp $VESA_OK, %al 412 jnz 1f 413 jz 2b # Force relative jump 414 415 1: 416 mov $0x0003, %ax 417 int $0x10 418 mov $0xffffffff, %edi # EGA text mode used, because of problems with VESA 419 xor %ax, %ax 420 jz 8b # Force relative jump 421 422 vga323: 423 #include "vga323.pal" 424 425 .code32 426 vesa_init_protect: 427 movw $selector(KDATA_DES), %cx 428 movw %cx, %es 429 movw %cx, %fs 430 movw %cx, %gs 431 movw %cx, %ds # kernel data + stack 432 movw %cx, %ss 433 434 movl $START_STACK, %esp # initialize stack pointer 435 436 jmpl $selector(KTEXT_DES), $vesa_meeting_point 437 438 .align 4 439 e_vesa_init: 440 #endif 196 hlt1: 197 hlt 198 jmp hlt1 199 200 #include "vesa_real.inc" 441 201 442 202 .section K_DATA_START, "aw", @progbits
Note:
See TracChangeset
for help on using the changeset viewer.