mirror of
				https://git.proxmox.com/git/mirror_edk2
				synced 2025-10-31 15:06:49 +00:00 
			
		
		
		
	 9da591867c
			
		
	
	
		9da591867c
		
	
	
	
	
		
			
			-- Add BootLoaderTolumSize support -- Extend FspApiCallingCheck with ApiParam for BootLoaderTolumSize -- Rename all Bootloader to BootLoader as official name -- Rename Ucode to Microcode -- Remove FspSelfCheck API, because it is merged into SecPlatformInit -- Add GetFspVpdDataPointer() in FspCommonLib.h -- Document FspSecPlatformLib.h -- Reorg FSP_PLAT_DATA data structure to let it match FSP spec. -- Move helper function in FspSecCore to reduce platform enabling effort -- Fix LibraryClasses declaration in DEC file. -- Enhance PatchFv to check if it is valid FSP bin. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: "Yao, Jiewen" <Jiewen.Yao@intel.com> Reviewed-by: "Ma, Maurice" <maurice.ma@intel.com> Reviewed-by: "Rangarajan, Ravi P" <ravi.p.rangarajan@intel.com> Reviewed-by: "Mudusuru, Giri P" <giri.p.mudusuru@intel.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@17196 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			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
 |