mirror of https://github.com/acidanthera/audk.git
184 lines
5.1 KiB
NASM
184 lines
5.1 KiB
NASM
;; @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
|