Ignore:
File:
1 edited

Legend:

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

    r873c681 rbac86377  
    1 /*
    2  * Copyright (c) 2001 Jakub Jermar
    3  * Copyright (c) 2005 Martin Decky
    4  * All rights reserved.
    5  *
    6  * Redistribution and use in source and binary forms, with or without
    7  * modification, are permitted provided that the following conditions
    8  * are met:
    9  *
    10  * - Redistributions of source code must retain the above copyright
    11  *   notice, this list of conditions and the following disclaimer.
    12  * - Redistributions in binary form must reproduce the above copyright
    13  *   notice, this list of conditions and the following disclaimer in the
    14  *   documentation and/or other materials provided with the distribution.
    15  * - The name of the author may not be used to endorse or promote products
    16  *   derived from this software without specific prior written permission.
    17  *
    18  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
    19  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
    20  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
    21  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
    22  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
    23  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
    24  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
    25  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
    26  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
    27  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    28  */
     1#
     2# Copyright (c) 2001-2004 Jakub Jermar
     3# Copyright (c) 2005-2006 Martin Decky
     4# All rights reserved.
     5#
     6# Redistribution and use in source and binary forms, with or without
     7# modification, are permitted provided that the following conditions
     8# are met:
     9#
     10# - Redistributions of source code must retain the above copyright
     11#   notice, this list of conditions and the following disclaimer.
     12# - Redistributions in binary form must reproduce the above copyright
     13#   notice, this list of conditions and the following disclaimer in the
     14#   documentation and/or other materials provided with the distribution.
     15# - The name of the author may not be used to endorse or promote products
     16#   derived from this software without specific prior written permission.
     17#
     18# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     19# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     20# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     21# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     22# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     23# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     24# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     25# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     26# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     27# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     28#
    2929
    3030#include <arch/boot/boot.h>
     
    3434#include <arch/cpuid.h>
    3535
    36 #define START_STACK  (BOOT_OFFSET - BOOT_STACK_SIZE)
     36#define START_STACK (BOOT_OFFSET - BOOT_STACK_SIZE)
    3737
    3838.section K_TEXT_START, "ax"
    3939
    4040.code32
    41 
    42 .macro pm_error msg
    43         movl \msg, %esi
    44         jmp pm_error_halt
    45 .endm
    46 
    47 .macro pm_status msg
    48 #ifdef CONFIG_EGA
    49         pushl %esi
    50         movl \msg, %esi
    51         call pm_early_puts
    52         popl %esi
    53 #endif
    54 .endm
    55 
    56 .macro pm2_status msg
    57         pushl \msg
    58         call early_puts
    59 .endm
    60 
    6141.align 4
    6242.global multiboot_image_start
     
    6444        .long MULTIBOOT_HEADER_MAGIC
    6545        .long MULTIBOOT_HEADER_FLAGS
    66         .long -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)  /* checksum */
     46        .long -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)  # checksum
    6747        .long multiboot_header
    6848        .long unmapped_ktext_start
     
    7353multiboot_image_start:
    7454        cld
    75        
    76         /* Initialize stack pointer */
    77         movl $START_STACK, %esp
    78        
    79         /* Initialize Global Descriptor Table register */
    80         lgdtl KA2PA(bootstrap_gdtr)
    81        
    82         /* Kernel data + stack */
     55        movl $START_STACK, %esp     # initialize stack pointer
     56        lgdt KA2PA(bootstrap_gdtr)  # initialize Global Descriptor Table register
     57       
    8358        movw $gdtselector(KDATA_DES), %cx
    8459        movw %cx, %es
    8560        movw %cx, %fs
    8661        movw %cx, %gs
    87         movw %cx, %ds
     62        movw %cx, %ds               # kernel data + stack
    8863        movw %cx, %ss
    8964       
     
    9166        multiboot_meeting_point:
    9267       
    93         /* Save GRUB arguments */
    94         movl %eax, grub_eax
     68        movl %eax, grub_eax         # save parameters from GRUB
    9569        movl %ebx, grub_ebx
    96        
    97         pm_status $status_prot
    9870       
    9971        movl $(INTEL_CPUID_LEVEL), %eax
    10072        cpuid
    101         cmp $0x0, %eax  /* any function > 0? */
     73        cmp $0x0, %eax              # any function > 0?
    10274        jbe pse_unsupported
    10375       
     
    10880       
    10981        pse_unsupported:
    110                
    111                 pm_error $err_pse
     82                movl $pse_msg, %esi
     83                jmp error_halt
    11284       
    11385        pse_supported:
    11486       
    11587#include "vesa_prot.inc"
    116        
    117         /* Map kernel and turn paging on */
     88
     89        # map kernel and turn paging on
    11890        call map_kernel
    11991       
    120         /* Create the first stack frame */
    121         pushl $0
    122         movl %esp, %ebp
    123        
    124         pm2_status $status_prot2
    125        
    126         /* Call arch_pre_main(grub_eax, grub_ebx) */
     92        # call arch_pre_main(grub_eax, grub_ebx)
    12793        pushl grub_ebx
    12894        pushl grub_eax
    12995        call arch_pre_main
    130        
    131         pm2_status $status_main
    132        
    133         /* Call main_bsp() */
     96
     97        # Create the first stack frame
     98        pushl $0
     99        movl %esp, %ebp
     100       
    134101        call main_bsp
    135102       
    136         /* Not reached */
     103        # not reached
    137104        cli
    138105        hlt0:
     
    140107                jmp hlt0
    141108
    142 /** Setup mapping for the kernel.
    143  *
    144  * Setup mapping for both the unmapped and mapped sections
    145  * of the kernel. For simplicity, we map the entire 4G space.
    146  *
    147  */
    148109.global map_kernel
    149110map_kernel:
     111        #
     112        # Here we setup mapping for both the unmapped and mapped sections of the kernel.
     113        # For simplicity, we map the entire 4G space.
     114        #
    150115        movl %cr4, %ecx
    151         orl $(1 << 4), %ecx      /* PSE on */
    152         andl $(~(1 << 5)), %ecx  /* PAE off */
     116        orl $(1 << 4), %ecx                 # turn PSE on
     117        andl $(~(1 << 5)), %ecx             # turn PAE off
    153118        movl %ecx, %cr4
    154119       
     
    161126                movl $((1 << 7) | (1 << 1) | (1 << 0)), %eax
    162127                orl %ebx, %eax
    163                 /* Mapping 0x00000000 + %ecx * 4M => 0x00000000 + %ecx * 4M */
    164                 movl %eax, (%esi, %ecx, 4)
    165                 /* Mapping 0x80000000 + %ecx * 4M => 0x00000000 + %ecx * 4M */
    166                 movl %eax, (%edi, %ecx, 4)
     128                movl %eax, (%esi, %ecx, 4)      # mapping 0x00000000 + %ecx * 4M => 0x00000000 + %ecx * 4M
     129                movl %eax, (%edi, %ecx, 4)      # mapping 0x80000000 + %ecx * 4M => 0x00000000 + %ecx * 4M
    167130                addl $(4 * 1024 * 1024), %ebx
    168131               
     
    174137       
    175138        movl %cr0, %ebx
    176         orl $(1 << 31), %ebx  /* paging on */
     139        orl $(1 << 31), %ebx                # turn paging on
    177140        movl %ebx, %cr0
    178141        ret
    179142
    180 /** Print string to EGA display (in light red) and halt.
    181  *
    182  * Should be executed from 32 bit protected mode with paging
    183  * turned off. Stack is not required. This routine is used even
    184  * if CONFIG_EGA is not enabled. Since we are going to halt the
    185  * CPU anyway, it is always better to at least try to print
    186  * some hints.
    187  *
    188  * @param %esi NULL-terminated string to print.
    189  *
    190  */
    191 pm_error_halt:
    192         movl $0xb8000, %edi  /* base of EGA text mode memory */
     143# Print string from %esi to EGA display (in red) and halt
     144error_halt:
     145        movl $0xb8000, %edi         # base of EGA text mode memory
    193146        xorl %eax, %eax
    194147       
    195         /* Read bits 8 - 15 of the cursor address */
    196         movw $0x3d4, %dx
     148        movw $0x3d4, %dx            # read bits 8 - 15 of the cursor address
    197149        movb $0xe, %al
    198150        outb %al, %dx
     
    202154        shl $8, %ax
    203155       
    204         /* Read bits 0 - 7 of the cursor address */
    205         movw $0x3d4, %dx
     156        movw $0x3d4, %dx            # read bits 0 - 7 of the cursor address
    206157        movb $0xf, %al
    207158        outb %al, %dx
     
    210161        inb %dx, %al
    211162       
    212         /* Sanity check for the cursor on screen */
    213         cmp $2000, %ax
    214         jb err_cursor_ok
    215        
    216                 movw $1998, %ax
    217        
    218         err_cursor_ok:
     163        cmp $1920, %ax
     164        jbe cursor_ok
     165       
     166                movw $1920, %ax         # sanity check for the cursor on the last line
     167       
     168        cursor_ok:
    219169       
    220170        movw %ax, %bx
     
    222172        addl %eax, %edi
    223173       
    224         err_ploop:
     174        movw $0x0c00, %ax           # black background, light red foreground
     175       
     176        ploop:
    225177                lodsb
    226                
    227178                cmp $0, %al
    228                 je err_ploop_end
    229                
    230                 movb $0x0c, %ah  /* black background, light red foreground */
     179                je ploop_end
    231180                stosw
    232                
    233                 /* Sanity check for the cursor on the last line */
    234181                inc %bx
    235                 cmp $2000, %bx
    236                 jb err_ploop
    237                
    238                 /* Scroll the screen (24 rows) */
    239                 movl %esi, %edx
    240                 movl $0xb80a0, %esi
    241                 movl $0xb8000, %edi
    242                 movl $1920, %ecx
    243                 rep movsw
    244                
    245                 /* Clear the 24th row */
    246                 xorl %eax, %eax
    247                 movl $80, %ecx
    248                 rep stosw
    249                
    250                 /* Go to row 24 */
    251                 movl %edx, %esi
    252                 movl $0xb8f00, %edi
    253                 movw $1920, %bx
    254                
    255                 jmp err_ploop
    256         err_ploop_end:
    257        
    258         /* Write bits 8 - 15 of the cursor address */
    259         movw $0x3d4, %dx
     182                jmp ploop
     183        ploop_end:
     184       
     185        movw $0x3d4, %dx            # write bits 8 - 15 of the cursor address
    260186        movb $0xe, %al
    261187        outb %al, %dx
     
    265191        outb %al, %dx
    266192       
    267         /* Write bits 0 - 7 of the cursor address */
    268         movw $0x3d4, %dx
     193        movw $0x3d4, %dx            # write bits 0 - 7 of the cursor address
    269194        movb $0xf, %al
    270195        outb %al, %dx
     
    279204                jmp hlt1
    280205
    281 /** Print string to EGA display (in light green).
    282  *
    283  * Should be called from 32 bit protected mode with paging
    284  * turned off. A stack space of at least 24 bytes is required,
    285  * but the function does not establish a stack frame.
    286  *
    287  * Macros such as pm_status take care that this function
    288  * is used only when CONFIG_EGA is enabled.
    289  *
    290  * @param %esi NULL-terminated string to print.
    291  *
    292  */
    293 pm_early_puts:
    294         pushl %eax
    295         pushl %ebx
    296         pushl %ecx
    297         pushl %edx
    298         pushl %edi
    299        
    300         movl $0xb8000, %edi  /* base of EGA text mode memory */
    301         xorl %eax, %eax
    302        
    303         /* Read bits 8 - 15 of the cursor address */
    304         movw $0x3d4, %dx
    305         movb $0xe, %al
    306         outb %al, %dx
    307        
    308         movw $0x3d5, %dx
    309         inb %dx, %al
    310         shl $8, %ax
    311        
    312         /* Read bits 0 - 7 of the cursor address */
    313         movw $0x3d4, %dx
    314         movb $0xf, %al
    315         outb %al, %dx
    316        
    317         movw $0x3d5, %dx
    318         inb %dx, %al
    319        
    320         /* Sanity check for the cursor on screen */
    321         cmp $2000, %ax
    322         jb pm_puts_cursor_ok
    323        
    324                 movw $1998, %ax
    325        
    326         pm_puts_cursor_ok:
    327        
    328         movw %ax, %bx
    329         shl $1, %eax
    330         addl %eax, %edi
    331        
    332         pm_puts_ploop:
    333                 lodsb
    334                
    335                 cmp $0, %al
    336                 je pm_puts_ploop_end
    337                
    338                 movb $0x0a, %ah  /* black background, light green foreground */
    339                 stosw
    340                
    341                 /* Sanity check for the cursor on the last line */
    342                 inc %bx
    343                 cmp $2000, %bx
    344                 jb pm_puts_ploop
    345                
    346                 /* Scroll the screen (24 rows) */
    347                 movl %esi, %edx
    348                 movl $0xb80a0, %esi
    349                 movl $0xb8000, %edi
    350                 movl $1920, %ecx
    351                 rep movsw
    352                
    353                 /* Clear the 24th row */
    354                 xorl %eax, %eax
    355                 movl $80, %ecx
    356                 rep stosw
    357                
    358                 /* Go to row 24 */
    359                 movl %edx, %esi
    360                 movl $0xb8f00, %edi
    361                 movw $1920, %bx
    362                
    363                 jmp pm_puts_ploop
    364         pm_puts_ploop_end:
    365        
    366         /* Write bits 8 - 15 of the cursor address */
    367         movw $0x3d4, %dx
    368         movb $0xe, %al
    369         outb %al, %dx
    370        
    371         movw $0x3d5, %dx
    372         movb %bh, %al
    373         outb %al, %dx
    374        
    375         /* Write bits 0 - 7 of the cursor address */
    376         movw $0x3d4, %dx
    377         movb $0xf, %al
    378         outb %al, %dx
    379        
    380         movw $0x3d5, %dx
    381         movb %bl, %al
    382         outb %al, %dx
    383        
    384         popl %edi
    385         popl %edx
    386         popl %ecx
    387         popl %ebx
    388         popl %eax
    389        
    390         ret
    391 
    392 /** Print string to EGA display.
    393  *
    394  * Should be called from 32 bit protected mode (with paging
    395  * enabled and stack established). This function is ABI compliant.
    396  *
    397  * If CONFIG_EGA is undefined or CONFIG_FB is defined
    398  * then this function does nothing.
    399  *
    400  * @param %ebp+0x08 NULL-terminated string to print.
    401  *
    402  */
    403 early_puts:
    404        
    405 #if ((defined(CONFIG_EGA)) && (!defined(CONFIG_FB)))
    406        
    407         /* Prologue, save preserved registers */
    408         pushl %ebp
    409         movl %esp, %ebp
    410         pushl %ebx
    411         pushl %esi
    412         pushl %edi
    413        
    414         movl 0x08(%ebp), %esi
    415         movl $(PA2KA(0xb8000)), %edi  /* base of EGA text mode memory */
    416         xorl %eax, %eax
    417        
    418         /* Read bits 8 - 15 of the cursor address */
    419         movw $0x3d4, %dx
    420         movb $0xe, %al
    421         outb %al, %dx
    422        
    423         movw $0x3d5, %dx
    424         inb %dx, %al
    425         shl $8, %ax
    426        
    427         /* Read bits 0 - 7 of the cursor address */
    428         movw $0x3d4, %dx
    429         movb $0xf, %al
    430         outb %al, %dx
    431        
    432         movw $0x3d5, %dx
    433         inb %dx, %al
    434        
    435         /* Sanity check for the cursor on screen */
    436         cmp $2000, %ax
    437         jb early_puts_cursor_ok
    438        
    439                 movw $1998, %ax
    440        
    441         early_puts_cursor_ok:
    442        
    443         movw %ax, %bx
    444         shl $1, %eax
    445         addl %eax, %edi
    446        
    447         early_puts_ploop:
    448                 lodsb
    449                
    450                 cmp $0, %al
    451                 je early_puts_ploop_end
    452                
    453                 movb $0x0e, %ah  /* black background, yellow foreground */
    454                 stosw
    455                
    456                 /* Sanity check for the cursor on the last line */
    457                 inc %bx
    458                 cmp $2000, %bx
    459                 jb early_puts_ploop
    460                
    461                 /* Scroll the screen (24 rows) */
    462                 movl %esi, %edx
    463                 movl $(PA2KA(0xb80a0)), %esi
    464                 movl $(PA2KA(0xb8000)), %edi
    465                 movl $1920, %ecx
    466                 rep movsw
    467                
    468                 /* Clear the 24th row */
    469                 xorl %eax, %eax
    470                 movl $80, %ecx
    471                 rep stosw
    472                
    473                 /* Go to row 24 */
    474                 movl %edx, %esi
    475                 movl $(PA2KA(0xb8f00)), %edi
    476                 movw $1920, %bx
    477                
    478                 jmp early_puts_ploop
    479         early_puts_ploop_end:
    480        
    481         /* Write bits 8 - 15 of the cursor address */
    482         movw $0x3d4, %dx
    483         movb $0xe, %al
    484         outb %al, %dx
    485        
    486         movw $0x3d5, %dx
    487         movb %bh, %al
    488         outb %al, %dx
    489        
    490         /* Write bits 0 - 7 of the cursor address */
    491         movw $0x3d4, %dx
    492         movb $0xf, %al
    493         outb %al, %dx
    494        
    495         movw $0x3d5, %dx
    496         movb %bl, %al
    497         outb %al, %dx
    498        
    499         /* Epilogue, restore preserved registers */
    500         popl %edi
    501         popl %esi
    502         popl %ebx
    503         leave
    504        
    505 #endif
    506        
    507         ret
    508 
    509206#include "vesa_real.inc"
    510207
     
    521218        .long 0
    522219
    523 err_pse:
     220pse_msg:
    524221        .asciz "Page Size Extension not supported. System halted."
    525222
    526 status_prot:
    527         .asciz "[prot] "
    528 status_vesa_copy:
    529         .asciz "[vesa_copy] "
    530 status_grub_cmdline:
    531         .asciz "[grub_cmdline] "
    532 status_vesa_real:
    533         .asciz "[vesa_real] "
    534 status_prot2:
    535         .asciz "[prot2] "
    536 status_main:
    537         .asciz "[main] "
Note: See TracChangeset for help on using the changeset viewer.