Add SMM support to UEFI payload
Build a new SMM info HOB to payload to report SMM info. Add UEFI payload variable region into flash map. TEST=Tested on LeafHill with UEFI payload. Signed-off-by: Guo Dong <guo.dong@intel.com>
This commit is contained in:
parent
650fcf1cb7
commit
ee4b3f812f
|
@ -44,6 +44,7 @@
|
|||
gBootLoaderVersionFileGuid = { 0x3473a022, 0xc3c2, 0x4964, { 0xb3, 0x09, 0x22, 0xb3, 0xdf, 0xb0, 0xb6, 0xca } }
|
||||
gEfiDebugAgentGuid = { 0x865a5a9b, 0xb85d, 0x474c, { 0x84, 0x55, 0x65, 0xd1, 0xbe, 0x84, 0x4b, 0xe2 } }
|
||||
gDeviceTableHobGuid = { 0xd21fc32c, 0x7fd2, 0x435b, { 0xb8, 0xef, 0xc0, 0x42, 0x66, 0xa8, 0xf4, 0xf5 } }
|
||||
gSmmInformationGuid = { 0x2d939d66, 0xceec, 0x4244, { 0x94, 0x97, 0x6e, 0x1c, 0x6f, 0x92, 0x54, 0x2c } }
|
||||
|
||||
[PcdsFixedAtBuild]
|
||||
gPlatformCommonLibTokenSpaceGuid.PcdMaxLibraryDataEntry | 8 | UINT32 | 0x20000100
|
||||
|
|
|
@ -30,6 +30,7 @@ extern EFI_GUID gFlashMapInfoGuid;
|
|||
#define FLASH_MAP_SIG_UCODE SIGNATURE_32 ('U', 'C', 'O', 'D')
|
||||
#define FLASH_MAP_SIG_MRCDATA SIGNATURE_32 ('M', 'R', 'C', 'D')
|
||||
#define FLASH_MAP_SIG_VARIABLE SIGNATURE_32 ('V', 'A', 'R', 'S')
|
||||
#define FLASH_MAP_SIG_UEFIVARIABLE SIGNATURE_32 ('U', 'V', 'A', 'R')
|
||||
#define FLASH_MAP_SIG_PAYLOAD SIGNATURE_32 ('P', 'Y', 'L', 'D')
|
||||
#define FLASH_MAP_SIG_EPAYLOAD SIGNATURE_32 ('E', 'P', 'L', 'D')
|
||||
#define FLASH_MAP_SIG_SPI_IAS1 SIGNATURE_32 ('I', 'A', 'S', '1')
|
||||
|
|
|
@ -0,0 +1,31 @@
|
|||
/** @file
|
||||
This file defines the hob structure for the SMM related info.
|
||||
|
||||
Copyright (c) 2019, 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.
|
||||
|
||||
**/
|
||||
|
||||
#ifndef __SMM_INFORMATION_GUID_H__
|
||||
#define __SMM_INFORMATION_GUID_H__
|
||||
|
||||
///
|
||||
/// Serial Port Information GUID
|
||||
///
|
||||
extern EFI_GUID gSmmInformationGuid;
|
||||
|
||||
typedef struct {
|
||||
UINT8 Revision;
|
||||
UINT8 Flags;
|
||||
UINT8 Reserved[2];
|
||||
UINT32 SmmBase;
|
||||
UINT32 SmmSize;
|
||||
} SMM_INFORMATION;
|
||||
|
||||
#endif
|
|
@ -21,6 +21,7 @@
|
|||
#include <Guid/DeviceTableHobGuid.h>
|
||||
|
||||
#define STACK_DEBUG_FILL_PATTERN 0x5AA55AA5
|
||||
#define UEFI_PAYLOAD_ID_SIGNATURE SIGNATURE_32('U', 'E', 'F', 'I')
|
||||
|
||||
#define ALIGN_UP(address, align) (((address) + ((align) - 1)) & ~((align)-1))
|
||||
#define ALIGN_DOWN(address, align) ((address) & ~((align)-1))
|
||||
|
|
|
@ -48,6 +48,7 @@
|
|||
#include <Guid/PayloadKeyHashGuid.h>
|
||||
#include <Guid/LoaderLibraryDataGuid.h>
|
||||
#include <Guid/GraphicsInfoHob.h>
|
||||
#include <Guid/SmmInformationGuid.h>
|
||||
#include <Service/PlatformService.h>
|
||||
#include <Pi/PiBootMode.h>
|
||||
#include <FspEas.h>
|
||||
|
|
|
@ -92,6 +92,7 @@
|
|||
gSeedListInfoHobGuid
|
||||
gLoaderPlatformDataGuid
|
||||
gDeviceTableHobGuid
|
||||
gSmmInformationGuid
|
||||
|
||||
[Pcd]
|
||||
gPlatformCommonLibTokenSpaceGuid.PcdMaxLibraryDataEntry
|
||||
|
@ -126,6 +127,6 @@
|
|||
gPlatformCommonLibTokenSpaceGuid.PcdMeasuredBootEnabled
|
||||
gPlatformModuleTokenSpaceGuid.PcdSeedListBufferSize
|
||||
gPlatformCommonLibTokenSpaceGuid.PcdSeedListEnabled
|
||||
|
||||
gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseAddress
|
||||
[Depex]
|
||||
TRUE
|
||||
|
|
|
@ -524,6 +524,7 @@ BuildExtraInfoHob (
|
|||
SEED_LIST_INFO_HOB *SeedListInfoHob;
|
||||
PLT_DEVICE_TABLE *DeviceTable;
|
||||
VOID *DeviceTableHob;
|
||||
SMM_INFORMATION *SmmInfoHob;
|
||||
|
||||
LdrGlobal = (LOADER_GLOBAL_DATA *)GetLoaderGlobalDataPointer();
|
||||
S3Data = (S3_DATA *)LdrGlobal->S3DataPtr;
|
||||
|
@ -617,6 +618,12 @@ BuildExtraInfoHob (
|
|||
CopyMem (DeviceTableHob, DeviceTable, Length);
|
||||
}
|
||||
|
||||
// Build SMMRAM info Hob
|
||||
SmmInfoHob = BuildGuidHob (&gSmmInformationGuid, sizeof (SMM_INFORMATION));
|
||||
if (SmmInfoHob != NULL) {
|
||||
PlatformUpdateHobInfo (&gSmmInformationGuid, SmmInfoHob);
|
||||
}
|
||||
|
||||
// Build Performance Hob
|
||||
Count = LdrGlobal->PerfData.PerfIndex;
|
||||
Length = sizeof (PERFORMANCE_INFO) + sizeof (UINT64) * Count;
|
||||
|
|
|
@ -198,6 +198,7 @@ class FlashMap(Structure):
|
|||
"VARIABLE" : "VARS",
|
||||
"PAYLOAD" : "PYLD",
|
||||
"EPAYLOAD" : "EPLD",
|
||||
"UEFIVARIABLE" : "UVAR",
|
||||
"SPI_IAS1" : "IAS1",
|
||||
"SPI_IAS2" : "IAS2",
|
||||
"FWUPDATE" : "FWUP",
|
||||
|
|
|
@ -192,6 +192,7 @@ class BaseBoard(object):
|
|||
self.CFGDATA_SIZE = 0
|
||||
self.MRCDATA_SIZE = 0
|
||||
self.VARIABLE_SIZE = 0
|
||||
self.UEFI_VARIABLE_SIZE = 0
|
||||
self.FWUPDATE_SIZE = 0
|
||||
|
||||
self.SPI_IAS1_SIZE = 0
|
||||
|
@ -1076,6 +1077,9 @@ class Build(object):
|
|||
# create bootloader reserved binary of 4K size
|
||||
gen_file_with_size (os.path.join(self._fv_dir, 'SBLRSVD.bin'), 0x1000)
|
||||
|
||||
# create variable region for UEFI payload
|
||||
if self._board.UEFI_VARIABLE_SIZE > 0:
|
||||
gen_file_with_size (os.path.join(self._fv_dir, 'UEFIVARIABLE.bin'), self._board.UEFI_VARIABLE_SIZE)
|
||||
|
||||
# create ACM binary
|
||||
if self._board.ACM_SIZE > 0:
|
||||
|
|
|
@ -98,10 +98,12 @@ class Board(BaseBoard):
|
|||
|
||||
if len(self._PAYLOAD_NAME.split(';')) > 1:
|
||||
# EPAYLOAD is specified
|
||||
self.EPAYLOAD_SIZE = 0x00120000
|
||||
self.EPAYLOAD_SIZE = 0x00130000
|
||||
self.UEFI_VARIABLE_SIZE = 0x00040000
|
||||
else:
|
||||
# EPAYLOAD does not exist, create a dummy one
|
||||
self.EPAYLOAD_SIZE = 0x1000
|
||||
self.UEFI_VARIABLE_SIZE = 0x1000
|
||||
|
||||
if self.FSPDEBUG_MODE == 1:
|
||||
self.STAGE1B_SIZE += 0x00009000
|
||||
|
@ -134,15 +136,19 @@ class Board(BaseBoard):
|
|||
|
||||
self.PLD_HEAP_SIZE = 0x08000000
|
||||
|
||||
self.FWUPDATE_SIZE = 0x00030000
|
||||
self.FWUPDATE_SIZE = 0x00020000
|
||||
self.CFGDATA_SIZE = 0x00004000
|
||||
self.CFG_DATABASE_SIZE = self.CFGDATA_SIZE
|
||||
self.MRCDATA_SIZE = 0x00004000
|
||||
self.VARIABLE_SIZE = 0x00002000
|
||||
self.SPI_IAS1_SIZE = 0x00150000
|
||||
self.S3_DEBUG = 0
|
||||
self.SBLRSVD_SIZE = 0x00001000
|
||||
|
||||
if len(self._PAYLOAD_NAME.split(';')) > 1:
|
||||
self.SPI_IAS1_SIZE = 0x00001000
|
||||
else:
|
||||
self.SPI_IAS1_SIZE = 0x00150000
|
||||
|
||||
self._CFGDATA_INT_FILE = ['CfgData_Int_LeafHill.dlt']
|
||||
self._CFGDATA_EXT_FILE = ['CfgData_Ext_Gpmrb.dlt', 'CfgData_Ext_Up2.dlt','CfgData_Ext_OxbHill.dlt','CfgData_Ext_MB3.dlt','CfgData_Ext_JuniperHill.dlt']
|
||||
|
||||
|
@ -244,10 +250,13 @@ class Board(BaseBoard):
|
|||
),
|
||||
('Stitch_IBBL.bin', [
|
||||
('STAGE1A.fd', '', self.STAGE1A_SIZE, STITCH_OPS.MODE_FILE_NOP, STITCH_OPS.MODE_POS_TAIL)]
|
||||
),
|
||||
),
|
||||
('Stitch_EPLD.bin', [
|
||||
('EPAYLOAD.bin', '', self.EPAYLOAD_SIZE, STITCH_OPS.MODE_FILE_PAD, STITCH_OPS.MODE_POS_TAIL)]
|
||||
),
|
||||
('Stitch_UVAR.bin', [
|
||||
('UEFIVARIABLE.bin', '', self.UEFI_VARIABLE_SIZE, STITCH_OPS.MODE_FILE_NOP, STITCH_OPS.MODE_POS_TAIL)],
|
||||
),
|
||||
])
|
||||
|
||||
return img_list
|
||||
|
|
|
@ -676,7 +676,7 @@ BoardInit (
|
|||
SpiBaseAddress = GetDeviceAddr (OsBootDeviceSpi, 0);
|
||||
SpiBaseAddress = TO_MM_PCI_ADDRESS (SpiBaseAddress);
|
||||
|
||||
if ((GetBootMode() != BOOT_ON_FLASH_UPDATE) && (GetPayloadId() != 0)) {
|
||||
if ((GetBootMode() != BOOT_ON_FLASH_UPDATE) && (GetPayloadId() != 0) && (GetPayloadId() != UEFI_PAYLOAD_ID_SIGNATURE)) {
|
||||
// Set the BIOS Lock Enable and EISS bits
|
||||
MmioOr8 (SpiBaseAddress + R_SPI_BCR, (UINT8) (B_SPI_BCR_BLE | B_SPI_BCR_EISS));
|
||||
|
||||
|
@ -1304,6 +1304,28 @@ UpdateLoaderPlatformInfo (
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
Update loader SMM info.
|
||||
|
||||
@param[out] SmmInfoHob pointer to SMM information HOB
|
||||
|
||||
**/
|
||||
VOID
|
||||
UpdateSmmInfo (
|
||||
OUT SMM_INFORMATION *SmmInfoHob
|
||||
)
|
||||
{
|
||||
|
||||
SmmInfoHob->SmmBase = MmioRead32 (TO_MM_PCI_ADDRESS (0x00000000) + TSEG) & ~0xF;
|
||||
SmmInfoHob->SmmSize = MmioRead32 (TO_MM_PCI_ADDRESS (0x00000000) + BGSM) & ~0xF;
|
||||
SmmInfoHob->SmmSize -= SmmInfoHob->SmmBase;
|
||||
SmmInfoHob->Flags = 0;
|
||||
DEBUG ((EFI_D_INFO, "SmmRamBase = 0x%x, SmmRamSize = 0x%x\n", SmmInfoHob->SmmBase, SmmInfoHob->SmmSize));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Update Hob Info with platform specific data
|
||||
|
||||
|
@ -1336,6 +1358,8 @@ PlatformUpdateHobInfo (
|
|||
if (EFI_ERROR (Status)) {
|
||||
DEBUG ((DEBUG_ERROR, "Error caused while appending seeds to HOB: %r\n", Status));
|
||||
}
|
||||
} else if (Guid == &gSmmInformationGuid) {
|
||||
UpdateSmmInfo (HobInfo);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -61,6 +61,7 @@
|
|||
#include <Library/SeedListInfoLib.h>
|
||||
#include <Library/VariableLib.h>
|
||||
#include <CpuRegs.h>
|
||||
#include <SaRegs.h>
|
||||
#include <Service/PlatformService.h>
|
||||
#include <Library/ResetSystemLib.h>
|
||||
#include <Library/IocIpcLib.h>
|
||||
|
@ -69,6 +70,7 @@
|
|||
#include <Library/BootOptionLib.h>
|
||||
#include <ConfigDataCommonStruct.h>
|
||||
#include <PsdLib.h>
|
||||
#include <Guid/SmmInformationGuid.h>
|
||||
|
||||
#define IOC_UART_PPR_CLK_N_DIV 0x64
|
||||
#define IOC_UART_PPR_CLK_M_DIV 0x40
|
||||
|
|
|
@ -67,6 +67,7 @@
|
|||
gFspVariableNvDataHobGuid
|
||||
gEfiHeciMbpDataHobGuid
|
||||
gReservedMemoryResourceHobTsegGuid
|
||||
gSmmInformationGuid
|
||||
|
||||
[Pcd]
|
||||
gPlatformModuleTokenSpaceGuid.PcdPciResourceIoBase
|
||||
|
|
|
@ -371,6 +371,7 @@ def PatchFlashMap (ImageData, PlatformData = 0xffffffff):
|
|||
'RSVD' : 'ROOT/IFWI/BP1/SBPDT/BpdtObb/RSVD',
|
||||
'IAS1' : 'ROOT/IFWI/BP1/SBPDT/BpdtObb/PROV',
|
||||
'EPLD' : 'ROOT/IFWI/BP1/SBPDT/BpdtObb/EPLD',
|
||||
'UVAR' : 'ROOT/IFWI/BP1/SBPDT/BpdtObb/UVAR',
|
||||
'PYLD' : 'ROOT/IFWI/BP0/BPDT/BpdtIbb/PLD',
|
||||
'VARS' : 'ROOT/IFWI/BP0/BPDT/BpdtIbb/VAR',
|
||||
'MRCD' : 'ROOT/IFWI/BP0/BPDT/BpdtIbb/MRCD',
|
||||
|
@ -812,6 +813,7 @@ def CreateIfwiImage (IfwiIn, IfwiOut, BiosOut, PlatformData, NonRedundant, Stitc
|
|||
ObbList = [
|
||||
('PROV' , 'FB'),
|
||||
('EPLD' , 'EPLD'),
|
||||
('UVAR' , 'UVAR'),
|
||||
('PLD' , 'PLD'),
|
||||
|
||||
]
|
||||
|
@ -837,7 +839,7 @@ def CreateIfwiImage (IfwiIn, IfwiOut, BiosOut, PlatformData, NonRedundant, Stitc
|
|||
FilePath = ''
|
||||
else:
|
||||
FilePath = os.path.join(StitchDir, 'Stitch_%s.bin' % FileName)
|
||||
if CompName == 'EPLD' and not os.path.exists(FilePath):
|
||||
if (CompName == 'EPLD' or CompName == 'UVAR') and not os.path.exists(FilePath):
|
||||
Ret = 0
|
||||
else:
|
||||
Ret = ManipulateIfwi ('ADD', Bp1Sbpdt + CompName, IfwiData, FilePath)
|
||||
|
|
|
@ -299,4 +299,7 @@
|
|||
#define IGD_SWSCI_OFFSET 0x00E0
|
||||
#define IGD_ASLS_OFFSET 0x00FC
|
||||
|
||||
#define TSEG 0xb8 // TSEG base
|
||||
#define BGSM 0xb4 // Base GTT Stolen Memory
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue