;; @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.
; SPDX-License-Identifier: BSD-2-Clause-Patent ;; ; ; 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