Home | History | Annotate | Download | only in Ia32
      1 ;; @file
      2 ;  This is the code that goes from real-mode to protected mode.
      3 ;  It consumes the reset vector, configures the stack.
      4 ;
      5 ; Copyright (c) 2015 - 2016, Intel Corporation. All rights reserved.<BR>
      6 ; This program and the accompanying materials
      7 ; are licensed and made available under the terms and conditions of the BSD License
      8 ; which accompanies this distribution.  The full text of the license may be found at
      9 ; http://opensource.org/licenses/bsd-license.php.
     10 ;
     11 ; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     12 ; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     13 ;;
     14 
     15 ;
     16 ; Define assembler characteristics
     17 ;
     18 
     19 extern   ASM_PFX(TempRamInitApi)
     20 
     21 SECTION .text
     22 
     23 %macro RET_ESI  0
     24 
     25   movd    esi, mm7                      ; restore ESP from MM7
     26   jmp     esi
     27 
     28 %endmacro
     29 
     30 ;
     31 ; Perform early platform initialization
     32 ;
     33 global ASM_PFX(SecPlatformInit)
     34 ASM_PFX(SecPlatformInit):
     35 
     36   RET_ESI
     37 
     38 ;
     39 ; Protected mode portion initializes stack, configures cache, and calls C entry point
     40 ;
     41 
     42 ;----------------------------------------------------------------------------
     43 ;
     44 ; Procedure:    ProtectedModeEntryPoint
     45 ;
     46 ; Input:        Executing in 32 Bit Protected (flat) mode
     47 ;               cs: 0-4GB
     48 ;               ds: 0-4GB
     49 ;               es: 0-4GB
     50 ;               fs: 0-4GB
     51 ;               gs: 0-4GB
     52 ;               ss: 0-4GB
     53 ;
     54 ; Output:       This function never returns
     55 ;
     56 ; Destroys:
     57 ;               ecx
     58 ;               edi
     59 ;               esi
     60 ;               esp
     61 ;
     62 ; Description:
     63 ;               Perform any essential early platform initilaisation
     64 ;               Setup a stack
     65 ;
     66 ;----------------------------------------------------------------------------
     67 global ASM_PFX(ProtectedModeEntryPoint)
     68 ASM_PFX(ProtectedModeEntryPoint):
     69   ;
     70   ; Dummy function. Consume 2 API to make sure they can be linked.
     71   ;
     72   mov  eax, ASM_PFX(TempRamInitApi)
     73 
     74   ; Should never return
     75   jmp  $
     76 
     77 ;
     78 ; ROM-based Global-Descriptor Table for the PEI Phase
     79 ;
     80 align 16
     81 global  ASM_PFX(BootGdtTable)
     82 
     83 ;
     84 ; GDT[0]: 0x00: Null entry, never used.
     85 ;
     86 NULL_SEL        equ     $ - GDT_BASE        ; Selector [0]
     87 GDT_BASE:
     88 ASM_PFX(BootGdtTable):    DD      0
     89                           DD      0
     90 ;
     91 ; Linear code segment descriptor
     92 ;
     93 LINEAR_CODE_SEL equ     $ - GDT_BASE        ; Selector [0x8]
     94         DW      0FFFFh                      ; limit 0xFFFF
     95         DW      0                           ; base 0
     96         DB      0
     97         DB      09Bh                        ; present, ring 0, data, expand-up, not-writable
     98         DB      0CFh                        ; page-granular, 32-bit
     99         DB      0
    100 ;
    101 ; System data segment descriptor
    102 ;
    103 SYS_DATA_SEL    equ     $ - GDT_BASE        ; Selector [0x10]
    104         DW      0FFFFh                      ; limit 0xFFFF
    105         DW      0                           ; base 0
    106         DB      0
    107         DB      093h                        ; present, ring 0, data, expand-up, not-writable
    108         DB      0CFh                        ; page-granular, 32-bit
    109         DB      0
    110 
    111 GDT_SIZE        EQU     $ - GDT_BASE        ; Size, in bytes
    112 
    113 ;
    114 ; GDT Descriptor
    115 ;
    116 GdtDesc:                                    ; GDT descriptor
    117         DW      GDT_SIZE - 1                ; GDT limit
    118         DD      GDT_BASE                    ; GDT base address
    119 
    120 global ASM_PFX(ProtectedModeEntryLinearAddress)
    121 global ASM_PFX(ProtectedModeEntryLinearOffset)
    122 
    123 ASM_PFX(ProtectedModeEntryLinearAddress):
    124 ASM_PFX(ProtectedModeEntryLinearOffset):
    125   DD      ASM_PFX(ProtectedModeEntryPoint)  ; Offset of our 32 bit code
    126   DW      LINEAR_CODE_SEL
    127   
    128