-;; @file\r
-; This is the code that goes from real-mode to protected mode.\r
-; It consumes the reset vector, configures the stack.\r
-;\r
-; Copyright (c) 2015 - 2016, Intel Corporation. All rights reserved.<BR>\r
-; This program and the accompanying materials\r
-; are licensed and made available under the terms and conditions of the BSD License\r
-; which accompanies this distribution. The full text of the license may be found at\r
-; http://opensource.org/licenses/bsd-license.php.\r
-;\r
-; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-;;\r
-\r
-;\r
-; Define assembler characteristics\r
-;\r
-.586p\r
-.xmm\r
-.model flat, c\r
-\r
-EXTRN TempRamInitApi:NEAR\r
-\r
-.code \r
-\r
-RET_ESI MACRO\r
-\r
- movd esi, mm7 ; restore ESP from MM7\r
- jmp esi\r
-\r
-ENDM\r
-\r
-;\r
-; Perform early platform initialization\r
-;\r
-SecPlatformInit PROC NEAR PUBLIC\r
-\r
- RET_ESI\r
-\r
-SecPlatformInit ENDP\r
-\r
-;\r
-; Protected mode portion initializes stack, configures cache, and calls C entry point\r
-;\r
-\r
-;----------------------------------------------------------------------------\r
-;\r
-; Procedure: ProtectedModeEntryPoint\r
-;\r
-; Input: Executing in 32 Bit Protected (flat) mode\r
-; cs: 0-4GB\r
-; ds: 0-4GB\r
-; es: 0-4GB\r
-; fs: 0-4GB\r
-; gs: 0-4GB\r
-; ss: 0-4GB\r
-;\r
-; Output: This function never returns\r
-;\r
-; Destroys:\r
-; ecx\r
-; edi\r
-; esi\r
-; esp\r
-;\r
-; Description:\r
-; Perform any essential early platform initilaisation\r
-; Setup a stack\r
-;\r
-;----------------------------------------------------------------------------\r
-\r
-ProtectedModeEntryPoint PROC NEAR C PUBLIC\r
- ;\r
- ; Dummy function. Consume 2 API to make sure they can be linked.\r
- ;\r
- mov eax, TempRamInitApi\r
-\r
- ; Should never return\r
- jmp $\r
-\r
-ProtectedModeEntryPoint ENDP\r
-\r
-;\r
-; ROM-based Global-Descriptor Table for the PEI Phase\r
-;\r
-align 16\r
-PUBLIC BootGdtTable\r
-\r
-;\r
-; GDT[0]: 0x00: Null entry, never used.\r
-;\r
-NULL_SEL equ $ - GDT_BASE ; Selector [0]\r
-GDT_BASE:\r
-BootGdtTable DD 0\r
- DD 0\r
-;\r
-; Linear code segment descriptor\r
-;\r
-LINEAR_CODE_SEL equ $ - GDT_BASE ; Selector [0x8]\r
- DW 0FFFFh ; limit 0xFFFF\r
- DW 0 ; base 0\r
- DB 0\r
- DB 09Bh ; present, ring 0, data, expand-up, not-writable\r
- DB 0CFh ; page-granular, 32-bit\r
- DB 0\r
-;\r
-; System data segment descriptor\r
-;\r
-SYS_DATA_SEL equ $ - GDT_BASE ; Selector [0x10]\r
- DW 0FFFFh ; limit 0xFFFF\r
- DW 0 ; base 0\r
- DB 0\r
- DB 093h ; present, ring 0, data, expand-up, not-writable\r
- DB 0CFh ; page-granular, 32-bit\r
- DB 0\r
-\r
-GDT_SIZE EQU $ - BootGDTtable ; Size, in bytes\r
-\r
-;\r
-; GDT Descriptor\r
-;\r
-GdtDesc: ; GDT descriptor\r
- DW GDT_SIZE - 1 ; GDT limit\r
- DD OFFSET BootGdtTable ; GDT base address\r
-\r
-ProtectedModeEntryLinearAddress LABEL FWORD\r
-ProtectedModeEntryLinearOffset LABEL DWORD\r
- DD OFFSET ProtectedModeEntryPoint ; Offset of our 32 bit code\r
- DW LINEAR_CODE_SEL\r
- \r
-END\r