123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177 |
- ;; @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>
- ; 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
|