Changeset 19077a5 in mainline
- Timestamp:
- 2008-01-25T16:45:42Z (17 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 9415601
- Parents:
- a7df23c
- Location:
- kernel/arch/amd64
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/amd64/_link.ld.in
ra7df23c r19077a5 20 20 unmapped_kdata_start = .; 21 21 *(K_DATA_START); 22 *(K_INI_PTLS); 22 23 unmapped_kdata_end = .; 23 24 } -
kernel/arch/amd64/src/boot/boot.S
ra7df23c r19077a5 2 2 # Copyright (c) 2005 Ondrej Palkovsky 3 3 # Copyright (c) 2006 Martin Decky 4 # Copyright (c) 2008 Jakub Jermar 4 5 # All rights reserved. 5 6 # … … 55 56 multiboot_image_start: 56 57 movl $START_STACK, %esp # initialize stack pointer 57 lgdt bootstrap_gdtr# initialize Global Descriptor Table register58 lgdtl bootstrap_gdtr # initialize Global Descriptor Table register 58 59 59 60 movw $gdtselector(KDATA_DES), %cx … … 70 71 multiboot_meeting_point: 71 72 72 movl %eax, grub_eax 73 movl %eax, grub_eax # save parameters from GRUB 73 74 movl %ebx, grub_ebx 74 75 … … 157 158 # Enable long mode 158 159 159 movl $EFER_MSR_NUM, %ecx # EFER MSR number160 movl $EFER_MSR_NUM, %ecx # EFER MSR number 160 161 rdmsr # Read EFER 161 btsl $AMD_LME_FLAG, %eax # Set LME = 1162 btsl $AMD_LME_FLAG, %eax # Set LME = 1 162 163 wrmsr # Write EFER 163 164 … … 178 179 movl grub_ebx, %ebx 179 180 180 cmpl $MULTIBOOT_LOADER_MAGIC, %eax 181 cmpl $MULTIBOOT_LOADER_MAGIC, %eax # compare GRUB signature 181 182 je valid_boot 182 183 183 xorl %ecx, %ecx 184 xorl %ecx, %ecx # no memory size or map available 184 185 movl %ecx, e801memorysize 185 186 movl %ecx, e820counter … … 189 190 valid_boot: 190 191 191 movl (%ebx), %eax 192 193 bt $0, %eax 192 movl (%ebx), %eax # ebx = physical address of struct multiboot_info 193 194 bt $0, %eax # mbi->flags[0] (mem_lower, mem_upper valid) 194 195 jc mem_valid 195 196 … … 198 199 199 200 mem_valid: 200 movl 4(%ebx), %ecx 201 addl 8(%ebx), %ecx 201 movl 4(%ebx), %ecx # mbi->mem_lower 202 addl 8(%ebx), %ecx # mbi->mem_upper 202 203 203 204 mem_invalid: 204 205 movl %ecx, e801memorysize 205 206 206 bt $3, %eax 207 bt $3, %eax # mbi->flags[3] (mods_count, mods_addr valid) 207 208 jc mods_valid 208 209 … … 214 215 215 216 xorq %rcx, %rcx 216 movl 20(%ebx), %ecx 217 movl 20(%ebx), %ecx # mbi->mods_count 217 218 movq %rcx, init 218 219 … … 220 221 je mods_end 221 222 222 movl 24(%ebx), %esi 223 movl 24(%ebx), %esi # mbi->mods_addr 223 224 movq $init, %rdi 224 225 … … 226 227 227 228 xorq %rdx, %rdx 228 movl 0(%esi), %edx 229 movl 0(%esi), %edx # mods->mod_start 229 230 movq $0xffff800000000000, %r10 230 231 addq %r10, %rdx … … 233 234 xorq %rdx, %rdx 234 235 movl 4(%esi), %edx 235 subl 0(%esi), %edx 236 subl 0(%esi), %edx # mods->mod_end - mods->mod_start 236 237 movq %rdx, 16(%rdi) 237 238 … … 243 244 mods_end: 244 245 245 bt $6, %eax 246 bt $6, %eax # mbi->flags[6] (mmap_length, mmap_addr valid) 246 247 jc mmap_valid 247 248 … … 250 251 251 252 mmap_valid: 252 movl 44(%ebx), %ecx 253 movl 48(%ebx), %esi 253 movl 44(%ebx), %ecx # mbi->mmap_length 254 movl 48(%ebx), %esi # mbi->mmap_addr 254 255 movq $e820table, %rdi 255 256 xorl %edx, %edx … … 259 260 jle mmap_end 260 261 261 movl 4(%esi), %eax 262 movl 4(%esi), %eax # mmap->base_addr_low 262 263 movl %eax, (%rdi) 263 264 264 movl 8(%esi), %eax 265 movl 8(%esi), %eax # mmap->base_addr_high 265 266 movl %eax, 4(%rdi) 266 267 267 movl 12(%esi), %eax 268 movl 12(%esi), %eax # mmap->length_low 268 269 movl %eax, 8(%rdi) 269 270 270 movl 16(%esi), %eax 271 movl 16(%esi), %eax # mmap->length_high 271 272 movl %eax, 12(%rdi) 272 273 273 movl 20(%esi), %eax 274 movl 20(%esi), %eax # mmap->type 274 275 movl %eax, 16(%rdi) 275 276 276 movl (%esi), %eax 277 movl (%esi), %eax # mmap->size 277 278 addl $0x4, %eax 278 279 addl %eax, %esi … … 432 433 mov $0x100, %ecx 433 434 434 bt $5, %ax 435 bt $5, %ax # Test if VGA compatible registers are present 435 436 jnc vga_compat 436 437 … … 448 449 # Try VGA registers to set palette 449 450 450 movw $0x3c6, %dx 451 movw $0x3c6, %dx # Set palette mask 451 452 movb $0xff, %al 452 453 outb %al, %dx 453 454 454 movw $0x3c8, %dx 455 movw $0x3c8, %dx # First index to set 455 456 xor %al, %al 456 457 outb %al, %dx 457 458 458 movw $0x3c9, %dx 459 movw $0x3c9, %dx # Data port 459 460 vga_loop: 460 461 movb %es:2(%di), %al … … 513 514 mov $0x0003, %ax 514 515 int $0x10 515 mov $0xffffffff, %edi # EGA text mode used, because of problems with VESA516 mov $0xffffffff, %edi # EGA text mode used, because of problems with VESA 516 517 xor %ax, %ax 517 518 jz 8b # Force relative jump … … 524 525 movw $gdtselector(KDATA_DES), %cx 525 526 movw %cx, %es 526 movw %cx, %ds 527 movw %cx, %ds # kernel data + stack 527 528 movw %cx, %ss 528 529 # Simics seems to remove hidden part of GS on entering user mode … … 532 533 movw %cx, %gs 533 534 534 movl $START_STACK, %esp # initialize stack pointer535 movl $START_STACK, %esp # initialize stack pointer 535 536 536 537 jmpl $gdtselector(KTEXT32_DES), $vesa_meeting_point … … 542 543 # Print string from %esi to EGA display (in red) and halt 543 544 error_halt: 544 movl $0xb8000, %edi 545 movl $0xb8000, %edi # base of EGA text mode memory 545 546 xorl %eax, %eax 546 547 547 movw $0x3d4, %dx 548 movw $0x3d4, %dx # read bits 8 - 15 of the cursor address 548 549 movb $0xe, %al 549 550 outb %al, %dx … … 553 554 shl $8, %ax 554 555 555 movw $0x3d4, %dx 556 movw $0x3d4, %dx # read bits 0 - 7 of the cursor address 556 557 movb $0xf, %al 557 558 outb %al, %dx … … 562 563 cmp $1920, %ax 563 564 jbe cursor_ok 564 movw $1920, %ax 565 movw $1920, %ax # sanity check for the cursor on the last line 565 566 cursor_ok: 566 567 … … 569 570 addl %eax, %edi 570 571 571 movw $0x0c00, %ax 572 movw $0x0c00, %ax # black background, light red foreground 572 573 cld 573 574 … … 581 582 ploop_end: 582 583 583 movw $0x3d4, %dx 584 movw $0x3d4, %dx # write bits 8 - 15 of the cursor address 584 585 movb $0xe, %al 585 586 outb %al, %dx … … 589 590 outb %al, %dx 590 591 591 movw $0x3d4, %dx 592 movw $0x3d4, %dx # write bits 0 - 7 of the cursor address 592 593 movb $0xf, %al 593 594 outb %al, %dx … … 600 601 hlt 601 602 602 .section K_DATA_START, "aw", @progbits 603 604 .section K_INI_PTLS, "aw", @progbits 605 606 # 607 # Macro for generating initial page table contents. 608 # @param cnt Number of entries to generat. Must be multiple of 8. 609 # @param g Number of GB that will be added to the mapping. 610 # 611 .macro ptl2gen cnt g 612 .if \cnt 613 ptl2gen "\cnt - 8" \g 614 .quad ((\cnt - 8) * 0x200000) + (\g * 1024 * 1024 * 1024) | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE) 615 .quad ((\cnt - 7) * 0x200000) + (\g * 1024 * 1024 * 1024) | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE) 616 .quad ((\cnt - 6) * 0x200000) + (\g * 1024 * 1024 * 1024) | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE) 617 .quad ((\cnt - 5) * 0x200000) + (\g * 1024 * 1024 * 1024) | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE) 618 .quad ((\cnt - 4) * 0x200000) + (\g * 1024 * 1024 * 1024) | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE) 619 .quad ((\cnt - 3) * 0x200000) + (\g * 1024 * 1024 * 1024) | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE) 620 .quad ((\cnt - 2) * 0x200000) + (\g * 1024 * 1024 * 1024) | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE) 621 .quad ((\cnt - 1) * 0x200000) + (\g * 1024 * 1024 * 1024) | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE) 622 .endif 623 .endm 624 625 # Page table for pages in the first gigabyte. 603 626 .align 4096 604 605 # Identical mapping of first 64MB and the same of -2GB -> 0 606 .global ptl_2 607 ptl_2: 608 .quad 0x0 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE) 609 .quad 0x200000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE) 610 .quad 0x400000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE) 611 .quad 0x600000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE) 612 .quad 0x800000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE) 613 .quad 0xa00000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE) 614 .quad 0xc00000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE) 615 .quad 0xe00000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE) 616 .quad 0x1000000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE) 617 .quad 0x1200000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE) 618 .quad 0x1400000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE) 619 .quad 0x1600000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE) 620 .quad 0x1800000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE) 621 .quad 0x1a00000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE) 622 .quad 0x1c00000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE) 623 .quad 0x1e00000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE) 624 .quad 0x2000000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE) 625 .quad 0x2200000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE) 626 .quad 0x2400000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE) 627 .quad 0x2600000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE) 628 .quad 0x2800000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE) 629 .quad 0x2a00000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE) 630 .quad 0x2c00000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE) 631 .quad 0x2e00000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE) 632 .quad 0x3000000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE) 633 .quad 0x3200000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE) 634 .quad 0x3400000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE) 635 .quad 0x3600000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE) 636 .quad 0x3800000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE) 637 .quad 0x3a00000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE) 638 .quad 0x3c00000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE) 639 .quad 0x3e00000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE) 640 627 .global ptl_2_0g 628 ptl_2_0g: 629 ptl2gen 512 0 630 631 # Page table for pages in the second gigabyte. 632 .align 4096 633 .global ptl_2_1g 634 ptl_2_1g: 635 ptl2gen 512 1 636 637 # Page table for pages in the third gigabyte. 638 .align 4096 639 .global ptl_2_2g 640 ptl_2_2g: 641 ptl2gen 512 2 642 643 # Page table for pages in the fourth gigabyte. 644 .align 4096 645 .global ptl_2_3g 646 ptl_2_3g: 647 ptl2gen 512 3 648 641 649 .align 4096 642 650 .global ptl_1 643 651 ptl_1: 644 .quad ptl_2 + (PTL_WRITABLE | PTL_PRESENT) 645 .fill 509,8,0 646 .quad ptl_2 + (PTL_WRITABLE | PTL_PRESENT) 647 .fill 1,8,0 652 # Identity mapping for [0; 4G) 653 .quad ptl_2_0g + (PTL_WRITABLE | PTL_PRESENT) 654 .quad ptl_2_1g + (PTL_WRITABLE | PTL_PRESENT) 655 .quad ptl_2_2g + (PTL_WRITABLE | PTL_PRESENT) 656 .quad ptl_2_3g + (PTL_WRITABLE | PTL_PRESENT) 657 .fill 506, 8, 0 658 # Mapping of [0; 1G) at -2G 659 .quad ptl_2_0g + (PTL_WRITABLE | PTL_PRESENT) 660 .fill 1, 8, 0 648 661 649 662 .align 4096 … … 655 668 .fill 254,8,0 656 669 .quad ptl_1 + (PTL_WRITABLE | PTL_PRESENT) 670 671 .section K_DATA_START, "aw", @progbits 657 672 658 673 .global bootstrap_gdtr -
kernel/arch/amd64/src/smp/ap.S
ra7df23c r19077a5 1 1 # 2 # Copyright (c) 200 1-2004Jakub Jermar2 # Copyright (c) 2008 Jakub Jermar 3 3 # Copyright (c) 2005-2006 Martin Decky 4 4 # All rights reserved. … … 46 46 47 47 # This piece of code is real-mode and is meant to be alligned at 4K boundary. 48 # The requirement for such an alignment comes from MP Specification's STARTUP IPI49 # requirements.48 # The requirement for such an alignment comes from MP Specification's STARTUP 49 # IPI requirements. 50 50 51 51 .align 4096 … … 60 60 movl %cr0, %eax 61 61 orl $1, %eax 62 movl %eax, %cr0 62 movl %eax, %cr0 # switch to protected mode 63 63 jmpl $gdtselector(KTEXT32_DES), $jump_to_kernel - BOOT_OFFSET + AP_BOOT_OFFSET 64 64 … … 83 83 84 84 # Enable long mode 85 movl $EFER_MSR_NUM, %ecx 86 rdmsr 87 btsl $AMD_LME_FLAG, %eax 88 wrmsr 85 movl $EFER_MSR_NUM, %ecx # EFER MSR number 86 rdmsr # Read EFER 87 btsl $AMD_LME_FLAG, %eax # Set LME=1 88 wrmsr # Write EFER 89 89 90 90 # Enable paging to activate long mode (set CR0.PG=1) … … 108 108 109 109 .global unmapped_ap_gdtr 110 111 110 unmapped_ap_gdtr: 112 111 .word 0
Note:
See TracChangeset
for help on using the changeset viewer.