OvmfPkg: Move SEC/PEI Temporary RAM from 0x70000 to 0x810000

Note: The Temporary RAM memory size is being reduced from
      64KB to 32KB. This still appears to be more than
      adequate for OVMF's early PEI phase. We will be adding
      another 32KB range of RAM just above this range for
      use on S3 resume.

The range is declared as part of MEMFD, so it is easier
to identify the memory range.

We also now assign PCDs to the memory range.

The PCDs are used to set the initial SEC/PEI stack in
SEC's assembly code.

The PCDs are also used in the SEC C code to setup
the Temporary RAM PPI.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Jordan Justen <jordan.l.justen@intel.com>
Reviewed-by: Laszlo Ersek <lersek@redhat.com>

git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@15147 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
Jordan Justen 2014-01-21 19:38:43 +00:00 committed by jljusten
parent b382ede386
commit 7cb6b0e068
10 changed files with 147 additions and 119 deletions

View File

@ -80,6 +80,8 @@
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFdBaseAddress|0x0|UINT32|0xf gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFdBaseAddress|0x0|UINT32|0xf
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPageTablesBase|0x0|UINT32|0x11 gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPageTablesBase|0x0|UINT32|0x11
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPageTablesSize|0x0|UINT32|0x12 gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPageTablesSize|0x0|UINT32|0x12
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPeiTempRamBase|0x0|UINT32|0x13
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPeiTempRamSize|0x0|UINT32|0x14
[PcdsDynamic, PcdsDynamicEx] [PcdsDynamic, PcdsDynamicEx]
gUefiOvmfPkgTokenSpaceGuid.PcdEmuVariableEvent|0|UINT64|2 gUefiOvmfPkgTokenSpaceGuid.PcdEmuVariableEvent|0|UINT64|2

View File

@ -138,6 +138,9 @@ NumBlocks = 0x80
0x000000|0x006000 0x000000|0x006000
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPageTablesBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPageTablesSize gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPageTablesBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPageTablesSize
0x010000|0x008000
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPeiTempRamBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPeiTempRamSize
0x020000|0x7E0000 0x020000|0x7E0000
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvSize gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvSize
FV = MAINFV FV = MAINFV

View File

@ -138,6 +138,9 @@ NumBlocks = 0x80
0x000000|0x006000 0x000000|0x006000
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPageTablesBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPageTablesSize gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPageTablesBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPageTablesSize
0x010000|0x008000
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPeiTempRamBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPeiTempRamSize
0x020000|0x7E0000 0x020000|0x7E0000
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvSize gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvSize
FV = MAINFV FV = MAINFV

View File

@ -138,6 +138,9 @@ NumBlocks = 0x80
0x000000|0x006000 0x000000|0x006000
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPageTablesBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPageTablesSize gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPageTablesBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPageTablesSize
0x010000|0x008000
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPeiTempRamBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPeiTempRamSize
0x020000|0x7E0000 0x020000|0x7E0000
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvSize gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvSize
FV = MAINFV FV = MAINFV

View File

@ -1,55 +1,59 @@
# TITLE SecEntry.asm # TITLE SecEntry.asm
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
#* #*
#* Copyright (c) 2006 - 2009, Intel Corporation. All rights reserved.<BR> #* Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved.<BR>
#* This program and the accompanying materials #* This program and the accompanying materials
#* are licensed and made available under the terms and conditions of the BSD License #* 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 #* which accompanies this distribution. The full text of the license may be found at
#* http://opensource.org/licenses/bsd-license.php #* http://opensource.org/licenses/bsd-license.php
#* #*
#* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, #* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
#* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. #* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#* #*
#* CpuAsm.asm #* CpuAsm.asm
#* #*
#* Abstract: #* Abstract:
#* #*
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
#include <Base.h> #include <Base.h>
#EXTERN ASM_PFX(SecCoreStartupWithStack) #EXTERN ASM_PFX(SecCoreStartupWithStack)
# #
# SecCore Entry Point # SecCore Entry Point
# #
# Processor is in flat protected mode # Processor is in flat protected mode
# #
# @param[in] EAX Initial value of the EAX register (BIST: Built-in Self Test) # @param[in] EAX Initial value of the EAX register (BIST: Built-in Self Test)
# @param[in] DI 'BP': boot-strap processor, or 'AP': application processor # @param[in] DI 'BP': boot-strap processor, or 'AP': application processor
# @param[in] EBP Pointer to the start of the Boot Firmware Volume # @param[in] EBP Pointer to the start of the Boot Firmware Volume
# #
# @return None This routine does not return # @return None This routine does not return
# #
ASM_GLOBAL ASM_PFX(_ModuleEntryPoint) ASM_GLOBAL ASM_PFX(_ModuleEntryPoint)
ASM_PFX(_ModuleEntryPoint): ASM_PFX(_ModuleEntryPoint):
# #
# Load temporary stack top at very low memory. The C code # Load temporary RAM stack based on PCDs
# can reload to a better address. #
# .set SEC_TOP_OF_STACK, FixedPcdGet32 (PcdOvmfSecPeiTempRamBase) + \
movl $BASE_512KB, %eax FixedPcdGet32 (PcdOvmfSecPeiTempRamSize)
movl %eax, %esp movl $SEC_TOP_OF_STACK, %eax
nop movl %eax, %esp
nop
#
# Call into C code #
# # Setup parameters and call SecCoreStartupWithStack
pushl %eax # [esp] return address for call
pushl %ebp # [esp+4] BootFirmwareVolumePtr
call ASM_PFX(SecCoreStartupWithStack) # [esp+8] TopOfCurrentStack
#
pushl %eax
#END pushl %ebp
call ASM_PFX(SecCoreStartupWithStack)
#END

View File

@ -1,7 +1,7 @@
TITLE SecEntry.asm TITLE SecEntry.asm
;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------
;* ;*
;* Copyright (c) 2006 - 2009, Intel Corporation. All rights reserved.<BR> ;* Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved.<BR>
;* This program and the accompanying materials ;* This program and the accompanying materials
;* are licensed and made available under the terms and conditions of the BSD License ;* 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 ;* which accompanies this distribution. The full text of the license may be found at
@ -38,15 +38,19 @@ EXTERN SecCoreStartupWithStack:PROC
_ModuleEntryPoint PROC PUBLIC _ModuleEntryPoint PROC PUBLIC
; ;
; Load temporary stack top at very low memory. The C code ; Load temporary RAM stack based on PCDs
; can reload to a better address.
; ;
mov eax, BASE_512KB SEC_TOP_OF_STACK EQU (FixedPcdGet32 (PcdOvmfSecPeiTempRamBase) + \
FixedPcdGet32 (PcdOvmfSecPeiTempRamSize))
mov eax, SEC_TOP_OF_STACK
mov esp, eax mov esp, eax
nop nop
; ;
; Call into C code ; Setup parameters and call SecCoreStartupWithStack
; [esp] return address for call
; [esp+4] BootFirmwareVolumePtr
; [esp+8] TopOfCurrentStack
; ;
push eax push eax
push ebp push ebp

View File

@ -631,12 +631,16 @@ SecCoreStartupWithStack (
// |-------------| <-- SecCoreData.TemporaryRamBase // |-------------| <-- SecCoreData.TemporaryRamBase
// //
ASSERT ((UINTN) (PcdGet32 (PcdOvmfSecPeiTempRamBase) +
PcdGet32 (PcdOvmfSecPeiTempRamSize)) ==
(UINTN) TopOfCurrentStack);
// //
// Initialize SEC hand-off state // Initialize SEC hand-off state
// //
SecCoreData.DataSize = sizeof(EFI_SEC_PEI_HAND_OFF); SecCoreData.DataSize = sizeof(EFI_SEC_PEI_HAND_OFF);
SecCoreData.TemporaryRamSize = SIZE_64KB; SecCoreData.TemporaryRamSize = (UINTN) PcdGet32 (PcdOvmfSecPeiTempRamSize);
SecCoreData.TemporaryRamBase = (VOID*)((UINT8 *)TopOfCurrentStack - SecCoreData.TemporaryRamSize); SecCoreData.TemporaryRamBase = (VOID*)((UINT8 *)TopOfCurrentStack - SecCoreData.TemporaryRamSize);
SecCoreData.PeiTemporaryRamBase = SecCoreData.TemporaryRamBase; SecCoreData.PeiTemporaryRamBase = SecCoreData.TemporaryRamBase;

View File

@ -67,3 +67,5 @@
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvBase gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvBase
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvSize gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvSize
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPageTablesBase gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPageTablesBase
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPeiTempRamBase
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPeiTempRamSize

View File

@ -1,54 +1,56 @@
# TITLE SecEntry.asm # TITLE SecEntry.asm
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
#* #*
#* Copyright (c) 2006 - 2009, Intel Corporation. All rights reserved.<BR> #* Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved.<BR>
#* This program and the accompanying materials #* This program and the accompanying materials
#* are licensed and made available under the terms and conditions of the BSD License #* 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 #* which accompanies this distribution. The full text of the license may be found at
#* http://opensource.org/licenses/bsd-license.php #* http://opensource.org/licenses/bsd-license.php
#* #*
#* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, #* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
#* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. #* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#* #*
#* CpuAsm.asm #* CpuAsm.asm
#* #*
#* Abstract: #* Abstract:
#* #*
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
#include <Base.h> #include <Base.h>
#EXTERN ASM_PFX(SecCoreStartupWithStack) #EXTERN ASM_PFX(SecCoreStartupWithStack)
# #
# SecCore Entry Point # SecCore Entry Point
# #
# Processor is in flat protected mode # Processor is in flat protected mode
# #
# @param[in] RAX Initial value of the EAX register (BIST: Built-in Self Test) # @param[in] RAX Initial value of the EAX register (BIST: Built-in Self Test)
# @param[in] DI 'BP': boot-strap processor, or 'AP': application processor # @param[in] DI 'BP': boot-strap processor, or 'AP': application processor
# @param[in] RBP Pointer to the start of the Boot Firmware Volume # @param[in] RBP Pointer to the start of the Boot Firmware Volume
# #
# @return None This routine does not return # @return None This routine does not return
# #
ASM_GLOBAL ASM_PFX(_ModuleEntryPoint) ASM_GLOBAL ASM_PFX(_ModuleEntryPoint)
ASM_PFX(_ModuleEntryPoint): ASM_PFX(_ModuleEntryPoint):
# #
# Load temporary stack top at very low memory. The C code # Load temporary stack top at very low memory. The C code
# can reload to a better address. # can reload to a better address.
# #
movq $BASE_512KB, %rsp .set SEC_TOP_OF_STACK, FixedPcdGet32 (PcdOvmfSecPeiTempRamBase) + \
nop FixedPcdGet32 (PcdOvmfSecPeiTempRamSize)
movq $SEC_TOP_OF_STACK, %rsp
# nop
# Setup parameters and call SecCoreStartupWithStack
# rcx: BootFirmwareVolumePtr #
# rdx: TopOfCurrentStack # Setup parameters and call SecCoreStartupWithStack
# # rcx: BootFirmwareVolumePtr
movq %rbp, %rcx # rdx: TopOfCurrentStack
movq %rsp, %rdx #
subq $0x20, %rsp movq %rbp, %rcx
call ASM_PFX(SecCoreStartupWithStack) movq %rsp, %rdx
subq $0x20, %rsp
call ASM_PFX(SecCoreStartupWithStack)

View File

@ -1,7 +1,7 @@
TITLE SecEntry.asm TITLE SecEntry.asm
;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------
;* ;*
;* Copyright (c) 2006 - 2009, Intel Corporation. All rights reserved.<BR> ;* Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved.<BR>
;* This program and the accompanying materials ;* This program and the accompanying materials
;* are licensed and made available under the terms and conditions of the BSD License ;* 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 ;* which accompanies this distribution. The full text of the license may be found at
@ -36,10 +36,11 @@ EXTERN SecCoreStartupWithStack:PROC
_ModuleEntryPoint PROC PUBLIC _ModuleEntryPoint PROC PUBLIC
; ;
; Load temporary stack top at very low memory. The C code ; Load temporary RAM stack based on PCDs
; can reload to a better address.
; ;
mov rsp, BASE_512KB SEC_TOP_OF_STACK EQU (FixedPcdGet32 (PcdOvmfSecPeiTempRamBase) + \
FixedPcdGet32 (PcdOvmfSecPeiTempRamSize))
mov rsp, SEC_TOP_OF_STACK
nop nop
; ;