Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/amd64/src/boot/boot.S

    r1d3d2cf r304342e  
    1 /*
    2  * Copyright (c) 2005 Ondrej Palkovsky
    3  * Copyright (c) 2006 Martin Decky
    4  * Copyright (c) 2008 Jakub Jermar
    5  * All rights reserved.
    6  *
    7  * Redistribution and use in source and binary forms, with or without
    8  * modification, are permitted provided that the following conditions
    9  * are met:
    10  *
    11  * - Redistributions of source code must retain the above copyright
    12  *   notice, this list of conditions and the following disclaimer.
    13  * - Redistributions in binary form must reproduce the above copyright
    14  *   notice, this list of conditions and the following disclaimer in the
    15  *   documentation and/or other materials provided with the distribution.
    16  * - The name of the author may not be used to endorse or promote products
    17  *   derived from this software without specific prior written permission.
    18  *
    19  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
    20  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
    21  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
    22  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
    23  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
    24  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
    25  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
    26  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
    27  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
    28  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    29  */
     1#
     2# Copyright (c) 2005 Ondrej Palkovsky
     3# Copyright (c) 2006 Martin Decky
     4# Copyright (c) 2008 Jakub Jermar
     5# All rights reserved.
     6#
     7# Redistribution and use in source and binary forms, with or without
     8# modification, are permitted provided that the following conditions
     9# are met:
     10#
     11# - Redistributions of source code must retain the above copyright
     12#   notice, this list of conditions and the following disclaimer.
     13# - Redistributions in binary form must reproduce the above copyright
     14#   notice, this list of conditions and the following disclaimer in the
     15#   documentation and/or other materials provided with the distribution.
     16# - The name of the author may not be used to endorse or promote products
     17#   derived from this software without specific prior written permission.
     18#
     19# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     20# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     21# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     22# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     23# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     24# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     25# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     26# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     27# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     28# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     29#
    3030
    3131#include <arch/boot/boot.h>
    3232#include <arch/boot/memmap.h>
    33 #include <arch/mm/page.h>
     33#include <arch/mm/page.h>       
    3434#include <arch/mm/ptl.h>
    3535#include <arch/pm.h>
     
    3737#include <arch/cpuid.h>
    3838
    39 #define START_STACK  (BOOT_OFFSET - BOOT_STACK_SIZE)
     39#define START_STACK     (BOOT_OFFSET - BOOT_STACK_SIZE)
    4040
    4141.section K_TEXT_START, "ax"
    4242
    4343.code32
    44 
    45 .macro pm_error msg
    46         movl \msg, %esi
    47         jmp pm_error_halt
    48 .endm
    49 
    50 .macro pm_status msg
    51 #ifdef CONFIG_EGA
    52         pushl %esi
    53         movl \msg, %esi
    54         call pm_early_puts
    55         popl %esi
    56 #endif
    57 .endm
    58 
    59 .macro pm2_status msg
    60 #ifndef CONFIG_FB
    61         pm_status \msg
    62 #endif
    63 .endm
    64 
    6544.align 4
    6645.global multiboot_image_start
     
    6847        .long MULTIBOOT_HEADER_MAGIC
    6948        .long MULTIBOOT_HEADER_FLAGS
    70         .long -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)  /* checksum */
     49        .long -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)  # checksum
    7150        .long multiboot_header
    7251        .long unmapped_ktext_start
     
    7756multiboot_image_start:
    7857        cld
    79        
    80         /* Initialize stack pointer */
    81         movl $START_STACK, %esp
    82        
    83         /* Initialize Global Descriptor Table register */
    84         lgdtl bootstrap_gdtr
    85        
    86         /* Kernel data + stack */
    87         movw $GDT_SELECTOR(KDATA_DES), %cx
     58        movl $START_STACK, %esp             # initialize stack pointer
     59        lgdtl bootstrap_gdtr                # initialize Global Descriptor Table register
     60       
     61        movw $gdtselector(KDATA_DES), %cx
    8862        movw %cx, %es
    89         movw %cx, %ds
     63        movw %cx, %ds                       # kernel data + stack
    9064        movw %cx, %ss
    9165       
    92         /*
    93          * Simics seems to remove hidden part of GS on entering user mode
    94          * when _visible_ part of GS does not point to user-mode segment.
    95          */
    96         movw $GDT_SELECTOR(UDATA_DES), %cx
     66        #
     67        # Simics seems to remove hidden part of GS on entering user mode
     68        # when _visible_ part of GS does not point to user-mode segment.
     69        #
     70       
     71        movw $gdtselector(UDATA_DES), %cx
    9772        movw %cx, %fs
    9873        movw %cx, %gs
    9974       
    100         jmpl $GDT_SELECTOR(KTEXT32_DES), $multiboot_meeting_point
     75        jmpl $gdtselector(KTEXT32_DES), $multiboot_meeting_point
    10176        multiboot_meeting_point:
    10277       
    103         /* Save GRUB arguments */
    104         movl %eax, grub_eax
     78        movl %eax, grub_eax                 # save parameters from GRUB
    10579        movl %ebx, grub_ebx
    10680       
    107         pm_status $status_prot
     81        #
     82        # Protected 32-bit. We want to reuse the code-seg descriptor,
     83        # the Default operand size must not be 1 when entering long mode.
     84        #
    10885       
    10986        movl $(INTEL_CPUID_EXTENDED), %eax
     
    11289        ja extended_cpuid_supported
    11390       
    114                 pm_error $err_extended_cpuid
     91                movl $extended_cpuid_msg, %esi
     92                jmp error_halt
    11593       
    11694        extended_cpuid_supported:
     
    12199        jc long_mode_supported
    122100       
    123                 pm_error $err_long_mode
     101                movl $long_mode_msg, %esi
     102                jmp error_halt
    124103       
    125104        long_mode_supported:
     
    128107        jc noexecute_supported
    129108       
    130                 pm_error $err_noexecute
     109                movl $noexecute_msg, %esi
     110                jmp error_halt
    131111       
    132112        noexecute_supported:
     
    137117        jc fx_supported
    138118       
    139                 pm_error $err_fx
     119                movl $fx_msg, %esi
     120                jmp error_halt
    140121       
    141122        fx_supported:
     
    144125        jc sse2_supported
    145126       
    146                 pm_error $err_sse2
     127                movl $sse2_msg, %esi
     128                jmp error_halt
    147129       
    148130        sse2_supported:
    149        
     131
    150132#include "vesa_prot.inc"
    151        
    152         /*
    153          * Protected 32-bit. We want to reuse the code-seg descriptor,
    154          * the Default operand size must not be 1 when entering long mode.
    155          */
    156        
    157         pm2_status $status_prot2
    158        
    159         /*
    160          * Enable 64-bit page translation entries - CR4.PAE = 1.
    161          * Paging is not enabled until after long mode is enabled.
    162          */
     133
     134        #
     135        # Enable 64-bit page translation entries - CR4.PAE = 1.
     136        # Paging is not enabled until after long mode is enabled.
     137        #
    163138       
    164139        movl %cr4, %eax
     
    166141        movl %eax, %cr4
    167142       
    168         /* Set up paging tables */
     143        # set up paging tables
     144       
    169145        leal ptl_0, %eax
    170146        movl %eax, %cr3
    171147       
    172         /* Enable long mode */
    173         movl $EFER_MSR_NUM, %ecx
    174         rdmsr                     /* read EFER */
    175         btsl $AMD_LME_FLAG, %eax  /* set LME = 1 */
    176         wrmsr
    177        
    178         /* Enable paging to activate long mode (set CR0.PG = 1) */
     148        # enable long mode
     149       
     150        movl $EFER_MSR_NUM, %ecx            # EFER MSR number
     151        rdmsr                               # read EFER
     152        btsl $AMD_LME_FLAG, %eax            # set LME = 1
     153        wrmsr                               # write EFER
     154       
     155        # enable paging to activate long mode (set CR0.PG = 1)
     156       
    179157        movl %cr0, %eax
    180158        btsl $31, %eax
    181159        movl %eax, %cr0
    182160       
    183         /* At this point we are in compatibility mode */
    184         jmpl $GDT_SELECTOR(KTEXT_DES), $start64
    185 
    186 /** Print string to EGA display (in light red) and halt.
    187  *
    188  * Should be executed from 32 bit protected mode with paging
    189  * turned off. Stack is not required. This routine is used even
    190  * if CONFIG_EGA is not enabled. Since we are going to halt the
    191  * CPU anyway, it is always better to at least try to print
    192  * some hints.
    193  *
    194  * @param %esi Pointer to the NULL-terminated string
    195  *             to be print.
    196  *
    197  */
    198 pm_error_halt:
    199         movl $0xb8000, %edi  /* base of EGA text mode memory */
     161        # at this point we are in compatibility mode
     162       
     163        jmpl $gdtselector(KTEXT_DES), $start64
     164
     165.code64
     166start64:
     167        movq $(PA2KA(START_STACK)), %rsp
     168       
     169        # call arch_pre_main(grub_eax, grub_ebx)
     170        xorq %rdi, %rdi
     171        movl grub_eax, %edi
     172        xorq %rsi, %rsi
     173        movl grub_ebx, %esi
     174        call arch_pre_main
     175       
     176        # create the first stack frame
     177        pushq $0
     178        movq %rsp, %rbp
     179
     180        call main_bsp
     181       
     182        # not reached
     183       
     184        cli
     185        hlt0:
     186                hlt
     187                jmp hlt0
     188
     189# Print string from %esi to EGA display (in red) and halt
     190error_halt:
     191        movl $0xb8000, %edi       # base of EGA text mode memory
    200192        xorl %eax, %eax
    201193       
    202         /* Read bits 8 - 15 of the cursor address */
    203         movw $0x3d4, %dx
     194        movw $0x3d4, %dx          # read bits 8 - 15 of the cursor address
    204195        movb $0xe, %al
    205196        outb %al, %dx
     
    209200        shl $8, %ax
    210201       
    211         /* Read bits 0 - 7 of the cursor address */
    212         movw $0x3d4, %dx
     202        movw $0x3d4, %dx          # read bits 0 - 7 of the cursor address
    213203        movb $0xf, %al
    214204        outb %al, %dx
     
    217207        inb %dx, %al
    218208       
    219         /* Sanity check for the cursor on screen */
    220         cmp $2000, %ax
    221         jb err_cursor_ok
    222        
    223                 movw $1998, %ax
    224        
    225         err_cursor_ok:
     209        cmp $1920, %ax
     210        jbe cursor_ok
     211       
     212                movw $1920, %ax       # sanity check for the cursor on the last line
     213       
     214        cursor_ok:
    226215       
    227216        movw %ax, %bx
     
    229218        addl %eax, %edi
    230219       
    231         err_ploop:
     220        movw $0x0c00, %ax         # black background, light red foreground
     221       
     222        ploop:
    232223                lodsb
    233                
    234224                cmp $0, %al
    235                 je err_ploop_end
    236                
    237                 movb $0x0c, %ah  /* black background, light red foreground */
     225                je ploop_end
    238226                stosw
    239                
    240                 /* Sanity check for the cursor on the last line */
    241227                inc %bx
    242                 cmp $2000, %bx
    243                 jb err_ploop
    244                
    245                 /* Scroll the screen (24 rows) */
    246                 movl %esi, %edx
    247                 movl $0xb80a0, %esi
    248                 movl $0xb8000, %edi
    249                 movl $960, %ecx
    250                 rep movsl
    251                
    252                 /* Clear the 24th row */
    253                 xorl %eax, %eax
    254                 movl $40, %ecx
    255                 rep stosl
    256                
    257                 /* Go to row 24 */
    258                 movl %edx, %esi
    259                 movl $0xb8f00, %edi
    260                 movw $1920, %bx
    261                
    262                 jmp err_ploop
    263         err_ploop_end:
    264        
    265         /* Write bits 8 - 15 of the cursor address */
    266         movw $0x3d4, %dx
     228                jmp ploop
     229        ploop_end:
     230       
     231        movw $0x3d4, %dx          # write bits 8 - 15 of the cursor address
    267232        movb $0xe, %al
    268233        outb %al, %dx
     
    272237        outb %al, %dx
    273238       
    274         /* Write bits 0 - 7 of the cursor address */
    275         movw $0x3d4, %dx
     239        movw $0x3d4, %dx          # write bits 0 - 7 of the cursor address
    276240        movb $0xf, %al
    277241        outb %al, %dx
     
    286250                jmp hlt1
    287251
    288 /** Print string to EGA display (in light green).
    289  *
    290  * Should be called from 32 bit protected mode with paging
    291  * turned off. A stack space of at least 24 bytes is required,
    292  * but the function does not establish a stack frame.
    293  *
    294  * Macros such as pm_status and pm2_status take care that
    295  * this function is used only when CONFIG_EGA is enabled
    296  * and CONFIG_FB is disabled.
    297  *
    298  * @param %esi Pointer to the NULL-terminated string
    299  *             to be print.
    300  *
    301  */
    302 pm_early_puts:
    303         pushl %eax
    304         pushl %ebx
    305         pushl %ecx
    306         pushl %edx
    307         pushl %edi
    308        
    309         movl $0xb8000, %edi  /* base of EGA text mode memory */
    310         xorl %eax, %eax
    311        
    312         /* Read bits 8 - 15 of the cursor address */
    313         movw $0x3d4, %dx
    314         movb $0xe, %al
    315         outb %al, %dx
    316        
    317         movw $0x3d5, %dx
    318         inb %dx, %al
    319         shl $8, %ax
    320        
    321         /* Read bits 0 - 7 of the cursor address */
    322         movw $0x3d4, %dx
    323         movb $0xf, %al
    324         outb %al, %dx
    325        
    326         movw $0x3d5, %dx
    327         inb %dx, %al
    328        
    329         /* Sanity check for the cursor on screen */
    330         cmp $2000, %ax
    331         jb pm_puts_cursor_ok
    332        
    333                 movw $1998, %ax
    334        
    335         pm_puts_cursor_ok:
    336        
    337         movw %ax, %bx
    338         shl $1, %eax
    339         addl %eax, %edi
    340        
    341         pm_puts_ploop:
    342                 lodsb
    343                
    344                 cmp $0, %al
    345                 je pm_puts_ploop_end
    346                
    347                 movb $0x0a, %ah  /* black background, light green foreground */
    348                 stosw
    349                
    350                 /* Sanity check for the cursor on the last line */
    351                 inc %bx
    352                 cmp $2000, %bx
    353                 jb pm_puts_ploop
    354                
    355                 /* Scroll the screen (24 rows) */
    356                 movl %esi, %edx
    357                 movl $0xb80a0, %esi
    358                 movl $0xb8000, %edi
    359                 movl $960, %ecx
    360                 rep movsl
    361                
    362                 /* Clear the 24th row */
    363                 xorl %eax, %eax
    364                 movl $40, %ecx
    365                 rep stosl
    366                
    367                 /* Go to row 24 */
    368                 movl %edx, %esi
    369                 movl $0xb8f00, %edi
    370                 movw $1920, %bx
    371                
    372                 jmp pm_puts_ploop
    373         pm_puts_ploop_end:
    374        
    375         /* Write bits 8 - 15 of the cursor address */
    376         movw $0x3d4, %dx
    377         movb $0xe, %al
    378         outb %al, %dx
    379        
    380         movw $0x3d5, %dx
    381         movb %bh, %al
    382         outb %al, %dx
    383        
    384         /* Write bits 0 - 7 of the cursor address */
    385         movw $0x3d4, %dx
    386         movb $0xf, %al
    387         outb %al, %dx
    388        
    389         movw $0x3d5, %dx
    390         movb %bl, %al
    391         outb %al, %dx
    392        
    393         popl %edi
    394         popl %edx
    395         popl %ecx
    396         popl %ebx
    397         popl %eax
    398        
    399         ret
    400 
    401 .code64
    402 
    403 .macro long_status msg
    404         pushq %rdi
    405         movq \msg, %rdi
    406         call early_puts
    407         popq %rdi
     252#include "vesa_real.inc"
     253
     254.section K_INI_PTLS, "aw", @progbits
     255
     256#
     257# Macro for generating initial page table contents.
     258# @param cnt Number of entries to generat. Must be multiple of 8.
     259# @param g   Number of GB that will be added to the mapping.
     260#
     261.macro ptl2gen cnt g
     262.if \cnt
     263        ptl2gen "\cnt - 8" \g
     264        .quad ((\cnt - 8) * 0x200000) + (\g * 1024 * 1024 * 1024) | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
     265        .quad ((\cnt - 7) * 0x200000) + (\g * 1024 * 1024 * 1024) | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
     266        .quad ((\cnt - 6) * 0x200000) + (\g * 1024 * 1024 * 1024) | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
     267        .quad ((\cnt - 5) * 0x200000) + (\g * 1024 * 1024 * 1024) | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
     268        .quad ((\cnt - 4) * 0x200000) + (\g * 1024 * 1024 * 1024) | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
     269        .quad ((\cnt - 3) * 0x200000) + (\g * 1024 * 1024 * 1024) | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
     270        .quad ((\cnt - 2) * 0x200000) + (\g * 1024 * 1024 * 1024) | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
     271        .quad ((\cnt - 1) * 0x200000) + (\g * 1024 * 1024 * 1024) | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
     272.endif
    408273.endm
    409274
    410 start64:
    411        
    412         /*
    413          * Long mode.
    414          */
    415        
    416         movq $(PA2KA(START_STACK)), %rsp
    417        
    418         /* Create the first stack frame */
    419         pushq $0
    420         movq %rsp, %rbp
    421        
    422         long_status $status_long
    423        
    424         /* Call arch_pre_main(grub_eax, grub_ebx) */
    425         xorq %rdi, %rdi
    426         movl grub_eax, %edi
    427         xorq %rsi, %rsi
    428         movl grub_ebx, %esi
    429        
    430         movabsq $arch_pre_main, %rax
    431         callq *%rax
    432        
    433         long_status $status_main
    434        
    435         /* Call main_bsp() */
    436         movabsq $main_bsp, %rax
    437         call *%rax
    438        
    439         /* Not reached */
    440         cli
    441         hlt0:
    442                 hlt
    443                 jmp hlt0
    444 
    445 /** Print string to EGA display.
    446  *
    447  * Should be called from long mode (with paging enabled
    448  * and stack established). This function is ABI compliant
    449  * (without red-zone).
    450  *
    451  * If CONFIG_EGA is undefined or CONFIG_FB is defined
    452  * then this function does nothing.
    453  *
    454  * @param %rdi Pointer to the NULL-terminated string
    455  *             to be printed.
    456  *
    457  */
    458 early_puts:
    459        
    460 #if ((defined(CONFIG_EGA)) && (!defined(CONFIG_FB)))
    461        
    462         /* Prologue, save preserved registers */
    463         pushq %rbp
    464         movq %rsp, %rbp
    465         pushq %rbx
    466        
    467         movq %rdi, %rsi
    468         movq $(PA2KA(0xb8000)), %rdi  /* base of EGA text mode memory */
    469         xorq %rax, %rax
    470        
    471         /* Read bits 8 - 15 of the cursor address */
    472         movw $0x3d4, %dx
    473         movb $0xe, %al
    474         outb %al, %dx
    475        
    476         movw $0x3d5, %dx
    477         inb %dx, %al
    478         shl $8, %ax
    479        
    480         /* Read bits 0 - 7 of the cursor address */
    481         movw $0x3d4, %dx
    482         movb $0xf, %al
    483         outb %al, %dx
    484        
    485         movw $0x3d5, %dx
    486         inb %dx, %al
    487        
    488         /* Sanity check for the cursor on screen */
    489         cmp $2000, %ax
    490         jb early_puts_cursor_ok
    491        
    492                 movw $1998, %ax
    493        
    494         early_puts_cursor_ok:
    495        
    496         movw %ax, %bx
    497         shl $1, %rax
    498         addq %rax, %rdi
    499        
    500         early_puts_ploop:
    501                 lodsb
    502                
    503                 cmp $0, %al
    504                 je early_puts_ploop_end
    505                
    506                 movb $0x0e, %ah  /* black background, yellow foreground */
    507                 stosw
    508                
    509                 /* Sanity check for the cursor on the last line */
    510                 inc %bx
    511                 cmp $2000, %bx
    512                 jb early_puts_ploop
    513                
    514                 /* Scroll the screen (24 rows) */
    515                 movq %rsi, %rdx
    516                 movq $(PA2KA(0xb80a0)), %rsi
    517                 movq $(PA2KA(0xb8000)), %rdi
    518                 movq $480, %rcx
    519                 rep movsq
    520                
    521                 /* Clear the 24th row */
    522                 xorq %rax, %rax
    523                 movq $20, %rcx
    524                 rep stosq
    525                
    526                 /* Go to row 24 */
    527                 movq %rdx, %rsi
    528                 movq $(PA2KA(0xb8f00)), %rdi
    529                 movw $1920, %bx
    530                
    531                 jmp early_puts_ploop
    532         early_puts_ploop_end:
    533        
    534         /* Write bits 8 - 15 of the cursor address */
    535         movw $0x3d4, %dx
    536         movb $0xe, %al
    537         outb %al, %dx
    538        
    539         movw $0x3d5, %dx
    540         movb %bh, %al
    541         outb %al, %dx
    542        
    543         /* Write bits 0 - 7 of the cursor address */
    544         movw $0x3d4, %dx
    545         movb $0xf, %al
    546         outb %al, %dx
    547        
    548         movw $0x3d5, %dx
    549         movb %bl, %al
    550         outb %al, %dx
    551        
    552         /* Epilogue, restore preserved registers */
    553         popq %rbx
    554         leave
    555        
    556 #endif
    557        
    558         ret
    559 
    560 #include "vesa_real.inc"
    561 
    562 .section K_INI_PTLS, "aw", @progbits
    563 
    564 /** Generate initial page table contents.
    565  *
    566  * @param cnt Number of entries to generate. Must be multiple of 8.
    567  * @param g   Number of GB that will be added to the mapping.
    568  *
    569  */
    570 .macro ptl2gen cnt g
    571         .if \cnt
    572                 ptl2gen "\cnt - 8" \g
    573                 .quad ((\cnt - 8) * 0x200000) + (\g * 1024 * 1024 * 1024) | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
    574                 .quad ((\cnt - 7) * 0x200000) + (\g * 1024 * 1024 * 1024) | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
    575                 .quad ((\cnt - 6) * 0x200000) + (\g * 1024 * 1024 * 1024) | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
    576                 .quad ((\cnt - 5) * 0x200000) + (\g * 1024 * 1024 * 1024) | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
    577                 .quad ((\cnt - 4) * 0x200000) + (\g * 1024 * 1024 * 1024) | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
    578                 .quad ((\cnt - 3) * 0x200000) + (\g * 1024 * 1024 * 1024) | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
    579                 .quad ((\cnt - 2) * 0x200000) + (\g * 1024 * 1024 * 1024) | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
    580                 .quad ((\cnt - 1) * 0x200000) + (\g * 1024 * 1024 * 1024) | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
    581         .endif
    582 .endm
    583 
    584 /* Page table for pages in the 1st gigabyte. */
    585 .align 4096
    586 ptl_2_0g:
     275# Page table for pages in the first gigabyte.
     276.align 4096
     277.global ptl_2_0g
     278ptl_2_0g:       
    587279        ptl2gen 512 0
    588280
    589 /* Page table for pages in the 2nd gigabyte. */
    590 .align 4096
     281# Page table for pages in the second gigabyte.
     282.align 4096
     283.global ptl_2_1g
    591284ptl_2_1g:
    592285        ptl2gen 512 1
    593286
    594 /* Page table for pages in the 3rd gigabyte. */
    595 .align 4096
     287# Page table for pages in the third gigabyte.
     288.align 4096
     289.global ptl_2_2g
    596290ptl_2_2g:
    597291        ptl2gen 512 2
    598292
    599 /* Page table for pages in the 4th gigabyte. */
    600 .align 4096
     293# Page table for pages in the fourth gigabyte.
     294.align 4096
     295.global ptl_2_3g
    601296ptl_2_3g:
    602297        ptl2gen 512 3
    603298
    604 /* Page table for pages in the 5th gigabyte. */
    605 .align 4096
    606 ptl_2_4g:
    607         ptl2gen 512 4
    608 
    609 /* Page table for pages in the 6th gigabyte. */
    610 .align 4096
    611 ptl_2_5g:
    612         ptl2gen 512 5
    613 
    614 /* Page table for pages in the 7th gigabyte. */
    615 .align 4096
    616 ptl_2_6g:
    617         ptl2gen 512 6
    618 
    619 /* Page table for pages in the 8th gigabyte. */
    620 .align 4096
    621 ptl_2_7g:
    622         ptl2gen 512 7
    623 
    624 .align 4096
     299.align 4096
     300.global ptl_1
    625301ptl_1:
    626         /* Identity mapping for [0; 8G) */
     302        # Identity mapping for [0; 4G)
    627303        .quad ptl_2_0g + (PTL_WRITABLE | PTL_PRESENT)
    628         .quad ptl_2_1g + (PTL_WRITABLE | PTL_PRESENT)
     304        .quad ptl_2_1g + (PTL_WRITABLE | PTL_PRESENT) 
    629305        .quad ptl_2_2g + (PTL_WRITABLE | PTL_PRESENT)
    630306        .quad ptl_2_3g + (PTL_WRITABLE | PTL_PRESENT)
    631         .quad ptl_2_4g + (PTL_WRITABLE | PTL_PRESENT)
    632         .quad ptl_2_5g + (PTL_WRITABLE | PTL_PRESENT)
    633         .quad ptl_2_6g + (PTL_WRITABLE | PTL_PRESENT)
    634         .quad ptl_2_7g + (PTL_WRITABLE | PTL_PRESENT)
    635         .fill 504, 8, 0
     307        .fill 506, 8, 0
     308        # Mapping of [0; 1G) at -2G
     309        .quad ptl_2_0g + (PTL_WRITABLE | PTL_PRESENT)
     310        .fill 1, 8, 0
    636311
    637312.align 4096
     
    639314ptl_0:
    640315        .quad ptl_1 + (PTL_WRITABLE | PTL_PRESENT)
    641         .fill 255, 8, 0
     316        .fill 255,8,0
    642317        .quad ptl_1 + (PTL_WRITABLE | PTL_PRESENT)
    643         .fill 255, 8, 0
     318        .fill 254,8,0
     319        .quad ptl_1 + (PTL_WRITABLE | PTL_PRESENT)
    644320
    645321.section K_DATA_START, "aw", @progbits
    646322
     323.global bootstrap_gdtr
    647324bootstrap_gdtr:
    648         .word GDT_SELECTOR(GDT_ITEMS)
     325        .word gdtselector(GDT_ITEMS)
    649326        .long KA2PA(gdt)
    650327
     
    655332        .long 0
    656333
    657 err_extended_cpuid:
    658         .asciz "Error: Extended CPUID not supported -- CPU is not 64-bit. System halted."
    659 err_long_mode:
    660         .asciz "Error: 64-bit long mode not supported. System halted."
    661 err_noexecute:
    662         .asciz "Error: No-execute pages not supported. System halted."
    663 err_fx:
    664         .asciz "Error: FXSAVE/FXRESTORE instructions not supported. System halted."
    665 err_sse2:
    666         .asciz "Error: SSE2 instructions not supported. System halted."
    667 
    668 status_prot:
    669         .asciz "[prot] "
    670 status_vesa_copy:
    671         .asciz "[vesa_copy] "
    672 status_grub_cmdline:
    673         .asciz "[grub_cmdline] "
    674 status_vesa_real:
    675         .asciz "[vesa_real] "
    676 status_prot2:
    677         .asciz "[prot2] "
    678 status_long:
    679         .asciz "[long] "
    680 status_main:
    681         .asciz "[main] "
     334extended_cpuid_msg:
     335        .asciz "Extended CPUID not supported. System halted."
     336long_mode_msg:
     337        .asciz "64 bit long mode not supported. System halted."
     338noexecute_msg:
     339        .asciz "No-execute pages not supported. System halted."
     340fx_msg:
     341        .asciz "FXSAVE/FXRESTORE instructions not supported. System halted."
     342sse2_msg:
     343        .asciz "SSE2 instructions not supported. System halted."
Note: See TracChangeset for help on using the changeset viewer.