;; @file | |
; This is the code that goes from real-mode to protected mode. | |
; It consumes the reset vector, configures the stack. | |
; | |
; Copyright (c) 2015, Intel Corporation. All rights reserved.<BR> | |
; This program and the accompanying materials | |
; are licensed and made available under the terms and conditions of the BSD License | |
; which accompanies this distribution. The full text of the license may be found at | |
; http://opensource.org/licenses/bsd-license.php. | |
; | |
; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | |
; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | |
;; | |
; | |
; Define assembler characteristics | |
; | |
.586p | |
.xmm | |
.model flat, c | |
EXTRN TempRamInitApi:NEAR | |
EXTRN FspInitApi:NEAR | |
; | |
; Contrary to the name, this file contains 16 bit code as well. | |
; | |
_TEXT_REALMODE SEGMENT PARA PUBLIC USE16 'CODE' | |
ASSUME CS:_TEXT_REALMODE, DS:_TEXT_REALMODE | |
;---------------------------------------------------------------------------- | |
; | |
; Procedure: _ModuleEntryPoint | |
; | |
; Input: None | |
; | |
; Output: None | |
; | |
; Destroys: Assume all registers | |
; | |
; Description: | |
; | |
; Transition to non-paged flat-model protected mode from a | |
; hard-coded GDT that provides exactly two descriptors. | |
; This is a bare bones transition to protected mode only | |
; used for a while in PEI and possibly DXE. | |
; | |
; After enabling protected mode, a far jump is executed to | |
; transfer to PEI using the newly loaded GDT. | |
; | |
; Return: None | |
; | |
;---------------------------------------------------------------------------- | |
align 16 | |
_ModuleEntryPoint PROC C PUBLIC | |
; | |
; Load the GDT table in GdtDesc | |
; | |
mov esi, OFFSET GdtDesc | |
db 66h | |
lgdt fword ptr cs:[si] | |
; | |
; Transition to 16 bit protected mode | |
; | |
mov eax, cr0 ; Get control register 0 | |
or eax, 00000003h ; Set PE bit (bit #0) & MP bit (bit #1) | |
mov cr0, eax ; Activate protected mode | |
; | |
; Now we're in 16 bit protected mode | |
; Set up the selectors for 32 bit protected mode entry | |
; | |
mov ax, SYS_DATA_SEL | |
mov ds, ax | |
mov es, ax | |
mov fs, ax | |
mov gs, ax | |
mov ss, ax | |
; | |
; Transition to Flat 32 bit protected mode | |
; The jump to a far pointer causes the transition to 32 bit mode | |
; | |
mov esi, offset ProtectedModeEntryLinearAddress | |
jmp fword ptr cs:[si] | |
_ModuleEntryPoint ENDP | |
_TEXT_REALMODE ENDS | |
.code | |
; | |
; Protected mode portion initializes stack, configures cache, and calls C entry point | |
; | |
;---------------------------------------------------------------------------- | |
; | |
; Procedure: ProtectedModeEntryPoint | |
; | |
; Input: Executing in 32 Bit Protected (flat) mode | |
; cs: 0-4GB | |
; ds: 0-4GB | |
; es: 0-4GB | |
; fs: 0-4GB | |
; gs: 0-4GB | |
; ss: 0-4GB | |
; | |
; Output: This function never returns | |
; | |
; Destroys: | |
; ecx | |
; edi | |
; esi | |
; esp | |
; | |
; Description: | |
; Perform any essential early platform initilaisation | |
; Setup a stack | |
; | |
;---------------------------------------------------------------------------- | |
ProtectedModeEntryPoint PROC NEAR C PUBLIC | |
; | |
; Dummy function. Consume 2 API to make sure they can be linked. | |
; | |
mov eax, TempRamInitApi | |
mov eax, FspInitApi | |
; Should never return | |
jmp $ | |
ProtectedModeEntryPoint ENDP | |
; | |
; ROM-based Global-Descriptor Table for the PEI Phase | |
; | |
align 16 | |
PUBLIC BootGdtTable | |
; | |
; GDT[0]: 0x00: Null entry, never used. | |
; | |
NULL_SEL equ $ - GDT_BASE ; Selector [0] | |
GDT_BASE: | |
BootGdtTable DD 0 | |
DD 0 | |
; | |
; Linear code segment descriptor | |
; | |
LINEAR_CODE_SEL equ $ - GDT_BASE ; Selector [0x8] | |
DW 0FFFFh ; limit 0xFFFF | |
DW 0 ; base 0 | |
DB 0 | |
DB 09Bh ; present, ring 0, data, expand-up, not-writable | |
DB 0CFh ; page-granular, 32-bit | |
DB 0 | |
; | |
; System data segment descriptor | |
; | |
SYS_DATA_SEL equ $ - GDT_BASE ; Selector [0x10] | |
DW 0FFFFh ; limit 0xFFFF | |
DW 0 ; base 0 | |
DB 0 | |
DB 093h ; present, ring 0, data, expand-up, not-writable | |
DB 0CFh ; page-granular, 32-bit | |
DB 0 | |
GDT_SIZE EQU $ - BootGDTtable ; Size, in bytes | |
; | |
; GDT Descriptor | |
; | |
GdtDesc: ; GDT descriptor | |
DW GDT_SIZE - 1 ; GDT limit | |
DD OFFSET BootGdtTable ; GDT base address | |
ProtectedModeEntryLinearAddress LABEL FWORD | |
ProtectedModeEntryLinearOffset LABEL DWORD | |
DD OFFSET ProtectedModeEntryPoint ; Offset of our 32 bit code | |
DW LINEAR_CODE_SEL | |
END |