Rev 2071 | Rev 2222 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2071 | Rev 2219 | ||
---|---|---|---|
Line 70... | Line 70... | ||
70 | multiboot_meeting_point: |
70 | multiboot_meeting_point: |
71 | 71 | ||
72 | movl %eax, grub_eax # save parameters from GRUB |
72 | movl %eax, grub_eax # save parameters from GRUB |
73 | movl %ebx, grub_ebx |
73 | movl %ebx, grub_ebx |
74 | 74 | ||
- | 75 | # Protected 32-bit. We want to reuse the code-seg descriptor, |
|
- | 76 | # the Default operand size must not be 1 when entering long mode |
|
- | 77 | ||
- | 78 | movl $0x80000000, %eax |
|
- | 79 | cpuid |
|
- | 80 | cmp $0x80000000, %eax # any function > 80000000h? |
|
- | 81 | jbe long_mode_unsupported |
|
- | 82 | movl $(AMD_CPUID_EXTENDED), %eax # Extended function code 80000001 |
|
- | 83 | cpuid |
|
- | 84 | bt $29, %edx # Test if long mode is supported. |
|
- | 85 | jc long_mode_supported |
|
- | 86 | ||
- | 87 | long_mode_unsupported: |
|
- | 88 | movl $long_mode_msg, %esi |
|
- | 89 | jmp error_halt |
|
- | 90 | ||
- | 91 | long_mode_supported: |
|
- | 92 | ||
75 | #ifdef CONFIG_FB |
93 | #ifdef CONFIG_FB |
76 | mov $vesa_init, %esi; |
94 | mov $vesa_init, %esi |
77 | mov $VESA_INIT_SEGMENT << 4, %edi |
95 | mov $VESA_INIT_SEGMENT << 4, %edi |
78 | mov $e_vesa_init - vesa_init, %ecx |
96 | mov $e_vesa_init - vesa_init, %ecx |
79 | cld |
97 | cld |
80 | rep movsb |
98 | rep movsb |
81 | 99 | ||
Line 90... | Line 108... | ||
90 | mov %di, KA2PA(vesa_width) |
108 | mov %di, KA2PA(vesa_width) |
91 | mov %bx, KA2PA(vesa_scanline) |
109 | mov %bx, KA2PA(vesa_scanline) |
92 | shr $16, %ebx |
110 | shr $16, %ebx |
93 | mov %bx, KA2PA(vesa_bpp) |
111 | mov %bx, KA2PA(vesa_bpp) |
94 | #endif |
112 | #endif |
95 | - | ||
96 | # Protected 32-bit. We want to reuse the code-seg descriptor, |
- | |
97 | # the Default operand size must not be 1 when entering long mode |
- | |
98 | - | ||
99 | movl $0x80000000, %eax |
- | |
100 | cpuid |
- | |
101 | cmp $0x80000000, %eax # any function > 80000000h? |
- | |
102 | jbe long_mode_unsupported |
- | |
103 | movl $(AMD_CPUID_EXTENDED), %eax # Extended function code 80000001 |
- | |
104 | cpuid |
- | |
105 | bt $29, %edx # Test if long mode is supported. |
- | |
106 | jc long_mode_supported |
- | |
107 | - | ||
108 | long_mode_unsupported: |
- | |
109 | cli |
- | |
110 | hlt |
- | |
111 | - | ||
112 | long_mode_supported: |
- | |
113 | 113 | ||
114 | # Enable 64-bit page transaltion entries - CR4.PAE = 1. |
114 | # Enable 64-bit page transaltion entries - CR4.PAE = 1. |
115 | # Paging is not enabled until after long mode is enabled |
115 | # Paging is not enabled until after long mode is enabled |
116 | 116 | ||
117 | movl %cr4, %eax |
117 | movl %cr4, %eax |
Line 443... | Line 443... | ||
443 | 443 | ||
444 | jmpl $gdtselector(KTEXT32_DES), $vesa_meeting_point |
444 | jmpl $gdtselector(KTEXT32_DES), $vesa_meeting_point |
445 | 445 | ||
446 | .align 4 |
446 | .align 4 |
447 | e_vesa_init: |
447 | e_vesa_init: |
448 | #endif |
448 | #endif |
- | 449 | ||
- | 450 | # Print string from %esi to EGA display (in red) and halt |
|
- | 451 | error_halt: |
|
- | 452 | movl $0xb8000, %edi # base of EGA text mode memory |
|
- | 453 | xorl %eax, %eax |
|
- | 454 | ||
- | 455 | movw $0x3d4, %dx # read bits 8 - 15 of the cursor address |
|
- | 456 | movb $0xe, %al |
|
- | 457 | outb %al, %dx |
|
- | 458 | ||
- | 459 | movw $0x3d5, %dx |
|
- | 460 | inb %dx, %al |
|
- | 461 | shl $8, %ax |
|
- | 462 | ||
- | 463 | movw $0x3d4, %dx # read bits 0 - 7 of the cursor address |
|
- | 464 | movb $0xf, %al |
|
- | 465 | outb %al, %dx |
|
- | 466 | ||
- | 467 | movw $0x3d5, %dx |
|
- | 468 | inb %dx, %al |
|
- | 469 | ||
- | 470 | cmp $1920, %ax |
|
- | 471 | jbe cursor_ok |
|
- | 472 | movw $1920, %ax # sanity check for the cursor on the last line |
|
- | 473 | cursor_ok: |
|
- | 474 | ||
- | 475 | movw %ax, %bx |
|
- | 476 | shl $1, %eax |
|
- | 477 | addl %eax, %edi |
|
- | 478 | ||
- | 479 | movw $0x0c00, %ax # black background, light red foreground |
|
- | 480 | cld |
|
- | 481 | ||
- | 482 | ploop: |
|
- | 483 | lodsb |
|
- | 484 | cmp $0, %al |
|
- | 485 | je ploop_end |
|
- | 486 | stosw |
|
- | 487 | inc %bx |
|
- | 488 | jmp ploop |
|
- | 489 | ploop_end: |
|
- | 490 | ||
- | 491 | movw $0x3d4, %dx # write bits 8 - 15 of the cursor address |
|
- | 492 | movb $0xe, %al |
|
- | 493 | outb %al, %dx |
|
- | 494 | ||
- | 495 | movw $0x3d5, %dx |
|
- | 496 | movb %bh, %al |
|
- | 497 | outb %al, %dx |
|
- | 498 | ||
- | 499 | movw $0x3d4, %dx # write bits 0 - 7 of the cursor address |
|
- | 500 | movb $0xf, %al |
|
- | 501 | outb %al, %dx |
|
- | 502 | ||
- | 503 | movw $0x3d5, %dx |
|
- | 504 | movb %bl, %al |
|
- | 505 | outb %al, %dx |
|
- | 506 | ||
- | 507 | cli |
|
- | 508 | hlt |
|
449 | 509 | ||
450 | .section K_DATA_START, "aw", @progbits |
510 | .section K_DATA_START, "aw", @progbits |
451 | .align 4096 |
511 | .align 4096 |
452 | 512 | ||
453 | # Identical mapping of first 64MB and the same of -2GB -> 0 |
513 | # Identical mapping of first 64MB and the same of -2GB -> 0 |
Line 511... | Line 571... | ||
511 | grub_eax: |
571 | grub_eax: |
512 | .long 0 |
572 | .long 0 |
513 | 573 | ||
514 | grub_ebx: |
574 | grub_ebx: |
515 | .long 0 |
575 | .long 0 |
- | 576 | ||
- | 577 | long_mode_msg: |
|
- | 578 | .ascii "64 bit long mode not supported. System halted.\0" |