Changeset 19077a5 in mainline


Ignore:
Timestamp:
2008-01-25T16:45:42Z (16 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
9415601
Parents:
a7df23c
Message:

Grow the initial identity mapping from 64M to 4G.
We should not allocate GDT's from above 4G or the amd64 will occassionally
triple-fault again.

Location:
kernel/arch/amd64
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/amd64/_link.ld.in

    ra7df23c r19077a5  
    2020                unmapped_kdata_start = .;
    2121                *(K_DATA_START);
     22                *(K_INI_PTLS);
    2223                unmapped_kdata_end = .;
    2324        }
  • kernel/arch/amd64/src/boot/boot.S

    ra7df23c r19077a5  
    22# Copyright (c) 2005 Ondrej Palkovsky
    33# Copyright (c) 2006 Martin Decky
     4# Copyright (c) 2008 Jakub Jermar
    45# All rights reserved.
    56#
     
    5556multiboot_image_start:
    5657        movl $START_STACK, %esp                 # initialize stack pointer
    57         lgdt bootstrap_gdtr                             # initialize Global Descriptor Table register
     58        lgdtl bootstrap_gdtr                    # initialize Global Descriptor Table register
    5859
    5960        movw $gdtselector(KDATA_DES), %cx
     
    7071        multiboot_meeting_point:
    7172       
    72         movl %eax, grub_eax                                                     # save parameters from GRUB
     73        movl %eax, grub_eax                                             # save parameters from GRUB
    7374        movl %ebx, grub_ebx
    7475       
     
    157158        # Enable long mode
    158159       
    159         movl $EFER_MSR_NUM, %ecx        # EFER MSR number
     160        movl $EFER_MSR_NUM, %ecx                        # EFER MSR number
    160161        rdmsr                                           # Read EFER
    161         btsl $AMD_LME_FLAG, %eax        # Set LME = 1
     162        btsl $AMD_LME_FLAG, %eax                        # Set LME = 1
    162163        wrmsr                                           # Write EFER
    163164       
     
    178179        movl grub_ebx, %ebx
    179180       
    180         cmpl $MULTIBOOT_LOADER_MAGIC, %eax                              # compare GRUB signature
     181        cmpl $MULTIBOOT_LOADER_MAGIC, %eax                      # compare GRUB signature
    181182        je valid_boot
    182183               
    183                 xorl %ecx, %ecx                                                 # no memory size or map available
     184                xorl %ecx, %ecx                                 # no memory size or map available
    184185                movl %ecx, e801memorysize
    185186                movl %ecx, e820counter
     
    189190        valid_boot:
    190191               
    191                 movl (%ebx), %eax                                               # ebx = physical address of struct multiboot_info
    192                
    193                 bt $0, %eax                                                             # mbi->flags[0] (mem_lower, mem_upper valid)
     192                movl (%ebx), %eax                               # ebx = physical address of struct multiboot_info
     193               
     194                bt $0, %eax                                     # mbi->flags[0] (mem_lower, mem_upper valid)
    194195                jc mem_valid
    195196                       
     
    198199                       
    199200                mem_valid:
    200                 movl 4(%ebx), %ecx                                              # mbi->mem_lower
    201                 addl 8(%ebx), %ecx                                              # mbi->mem_upper
     201                movl 4(%ebx), %ecx                              # mbi->mem_lower
     202                addl 8(%ebx), %ecx                              # mbi->mem_upper
    202203               
    203204                mem_invalid:
    204205                movl %ecx, e801memorysize
    205206               
    206                 bt $3, %eax                                                             # mbi->flags[3] (mods_count, mods_addr valid)
     207                bt $3, %eax                                     # mbi->flags[3] (mods_count, mods_addr valid)
    207208                jc mods_valid
    208209                       
     
    214215               
    215216                xorq %rcx, %rcx
    216                 movl 20(%ebx), %ecx                                             # mbi->mods_count
     217                movl 20(%ebx), %ecx                             # mbi->mods_count
    217218                movq %rcx, init
    218219               
     
    220221                je mods_end
    221222               
    222                 movl 24(%ebx), %esi                                             # mbi->mods_addr
     223                movl 24(%ebx), %esi                             # mbi->mods_addr
    223224                movq $init, %rdi
    224225               
     
    226227                       
    227228                        xorq %rdx, %rdx
    228                         movl 0(%esi), %edx                                      # mods->mod_start
     229                        movl 0(%esi), %edx                      # mods->mod_start
    229230                        movq $0xffff800000000000, %r10
    230231                        addq %r10, %rdx
     
    233234                        xorq %rdx, %rdx
    234235                        movl 4(%esi), %edx
    235                         subl 0(%esi), %edx                                      # mods->mod_end - mods->mod_start
     236                        subl 0(%esi), %edx                      # mods->mod_end - mods->mod_start
    236237                        movq %rdx, 16(%rdi)
    237238                       
     
    243244                mods_end:
    244245               
    245                 bt $6, %eax                                                             # mbi->flags[6] (mmap_length, mmap_addr valid) 
     246                bt $6, %eax                                     # mbi->flags[6] (mmap_length, mmap_addr valid) 
    246247                jc mmap_valid
    247248                       
     
    250251                       
    251252                mmap_valid:
    252                 movl 44(%ebx), %ecx                                             # mbi->mmap_length
    253                 movl 48(%ebx), %esi                                             # mbi->mmap_addr
     253                movl 44(%ebx), %ecx                             # mbi->mmap_length
     254                movl 48(%ebx), %esi                             # mbi->mmap_addr
    254255                movq $e820table, %rdi
    255256                xorl %edx, %edx
     
    259260                        jle mmap_end
    260261                       
    261                         movl 4(%esi), %eax                                      # mmap->base_addr_low
     262                        movl 4(%esi), %eax                      # mmap->base_addr_low
    262263                        movl %eax, (%rdi)
    263264                       
    264                         movl 8(%esi), %eax                                      # mmap->base_addr_high
     265                        movl 8(%esi), %eax                      # mmap->base_addr_high
    265266                        movl %eax, 4(%rdi)
    266267                       
    267                         movl 12(%esi), %eax                                     # mmap->length_low
     268                        movl 12(%esi), %eax                     # mmap->length_low
    268269                        movl %eax, 8(%rdi)
    269270                       
    270                         movl 16(%esi), %eax                                     # mmap->length_high
     271                        movl 16(%esi), %eax                     # mmap->length_high
    271272                        movl %eax, 12(%rdi)
    272273                       
    273                         movl 20(%esi), %eax                                     # mmap->type
     274                        movl 20(%esi), %eax                     # mmap->type
    274275                        movl %eax, 16(%rdi)
    275276                       
    276                         movl (%esi), %eax                                       # mmap->size
     277                        movl (%esi), %eax                       # mmap->size
    277278                        addl $0x4, %eax
    278279                        addl %eax, %esi
     
    432433        mov $0x100, %ecx
    433434       
    434         bt $5, %ax                                                      # Test if VGA compatible registers are present
     435        bt $5, %ax                                              # Test if VGA compatible registers are present
    435436        jnc vga_compat
    436437               
     
    448449                # Try VGA registers to set palette
    449450               
    450                 movw $0x3c6, %dx                                                # Set palette mask
     451                movw $0x3c6, %dx                                # Set palette mask
    451452                movb $0xff, %al
    452453                outb %al, %dx
    453454               
    454                 movw $0x3c8, %dx                                                # First index to set
     455                movw $0x3c8, %dx                                # First index to set
    455456                xor %al, %al
    456457                outb %al, %dx
    457458               
    458                 movw $0x3c9, %dx                                                # Data port
     459                movw $0x3c9, %dx                                # Data port
    459460                vga_loop:
    460461                        movb %es:2(%di), %al
     
    513514        mov $0x0003, %ax
    514515        int $0x10
    515         mov $0xffffffff, %edi           # EGA text mode used, because of problems with VESA
     516        mov $0xffffffff, %edi                           # EGA text mode used, because of problems with VESA
    516517        xor %ax, %ax
    517518        jz 8b                                           # Force relative jump
     
    524525        movw $gdtselector(KDATA_DES), %cx
    525526        movw %cx, %es
    526         movw %cx, %ds                                                   # kernel data + stack
     527        movw %cx, %ds                                   # kernel data + stack
    527528        movw %cx, %ss
    528529        # Simics seems to remove hidden part of GS on entering user mode
     
    532533        movw %cx, %gs
    533534       
    534         movl $START_STACK, %esp                 # initialize stack pointer
     535        movl $START_STACK, %esp                         # initialize stack pointer
    535536       
    536537        jmpl $gdtselector(KTEXT32_DES), $vesa_meeting_point
     
    542543# Print string from %esi to EGA display (in red) and halt
    543544error_halt:
    544         movl $0xb8000, %edi                                             # base of EGA text mode memory
     545        movl $0xb8000, %edi                             # base of EGA text mode memory
    545546        xorl %eax, %eax
    546547       
    547         movw $0x3d4, %dx                                                # read bits 8 - 15 of the cursor address
     548        movw $0x3d4, %dx                                # read bits 8 - 15 of the cursor address
    548549        movb $0xe, %al
    549550        outb %al, %dx
     
    553554        shl $8, %ax
    554555       
    555         movw $0x3d4, %dx                                                # read bits 0 - 7 of the cursor address
     556        movw $0x3d4, %dx                                # read bits 0 - 7 of the cursor address
    556557        movb $0xf, %al
    557558        outb %al, %dx
     
    562563        cmp $1920, %ax
    563564        jbe cursor_ok
    564                 movw $1920, %ax                                         # sanity check for the cursor on the last line
     565                movw $1920, %ax                         # sanity check for the cursor on the last line
    565566        cursor_ok:
    566567       
     
    569570        addl %eax, %edi
    570571       
    571         movw $0x0c00, %ax                                               # black background, light red foreground
     572        movw $0x0c00, %ax                               # black background, light red foreground
    572573        cld
    573574       
     
    581582        ploop_end:
    582583       
    583         movw $0x3d4, %dx                                                # write bits 8 - 15 of the cursor address
     584        movw $0x3d4, %dx                                # write bits 8 - 15 of the cursor address
    584585        movb $0xe, %al
    585586        outb %al, %dx
     
    589590        outb %al, %dx
    590591       
    591         movw $0x3d4, %dx                                                # write bits 0 - 7 of the cursor address
     592        movw $0x3d4, %dx                                # write bits 0 - 7 of the cursor address
    592593        movb $0xf, %al
    593594        outb %al, %dx
     
    600601        hlt
    601602                               
    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.
    603626.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
     628ptl_2_0g:       
     629        ptl2gen 512 0
     630
     631# Page table for pages in the second gigabyte.
     632.align 4096
     633.global ptl_2_1g
     634ptl_2_1g:
     635        ptl2gen 512 1
     636
     637# Page table for pages in the third gigabyte.
     638.align 4096
     639.global ptl_2_2g
     640ptl_2_2g:
     641        ptl2gen 512 2
     642
     643# Page table for pages in the fourth gigabyte.
     644.align 4096
     645.global ptl_2_3g
     646ptl_2_3g:
     647        ptl2gen 512 3
     648
    641649.align 4096
    642650.global ptl_1
    643651ptl_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
    648661       
    649662.align 4096
     
    655668        .fill 254,8,0
    656669        .quad ptl_1 + (PTL_WRITABLE | PTL_PRESENT)
     670
     671.section K_DATA_START, "aw", @progbits
    657672
    658673.global bootstrap_gdtr
  • kernel/arch/amd64/src/smp/ap.S

    ra7df23c r19077a5  
    11#
    2 # Copyright (c) 2001-2004 Jakub Jermar
     2# Copyright (c) 2008 Jakub Jermar
    33# Copyright (c) 2005-2006 Martin Decky
    44# All rights reserved.
     
    4646
    4747# 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 IPI
    49 # requirements.
     48# The requirement for such an alignment comes from MP Specification's STARTUP
     49# IPI requirements.
    5050
    5151.align 4096
     
    6060        movl %cr0, %eax
    6161        orl $1, %eax
    62         movl %eax, %cr0                         # switch to protected mode
     62        movl %eax, %cr0         # switch to protected mode
    6363        jmpl $gdtselector(KTEXT32_DES), $jump_to_kernel - BOOT_OFFSET + AP_BOOT_OFFSET
    6464       
     
    8383       
    8484        # Enable long mode
    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
     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
    8989       
    9090        # Enable paging to activate long mode (set CR0.PG=1)
     
    108108
    109109.global unmapped_ap_gdtr
    110 
    111110unmapped_ap_gdtr:
    112111        .word 0
Note: See TracChangeset for help on using the changeset viewer.