mirror of https://github.com/acidanthera/audk.git
IntelFsp2Pkg: FSP should not override IDT
REF: https://bugzilla.tianocore.org/show_bug.cgi?id=1265 FSP should not override IDT table when it is initialized by boot loader. IDT should be re-initialized in FSP only when it is invalid. To mitigate temporary memory usage a PCD PcdFspMaxInterruptSupported created for platform to decide how many interrupts the FSP IDT table can support. Test: Verified on internal platform and boots successfully. Cc: Jiewen Yao <Jiewen.yao@intel.com> Cc: Desimone Nathaniel L <nathaniel.l.desimone@intel.com> Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Chasel Chiu <chasel.chiu@intel.com> Reviewed-by: Jiewen Yao <Jiewen.yao@intel.com>
This commit is contained in:
parent
5061efe70d
commit
b1cc6f672f
|
@ -62,6 +62,7 @@
|
||||||
gIntelFsp2PkgTokenSpaceGuid.PcdTemporaryRamSize ## CONSUMES
|
gIntelFsp2PkgTokenSpaceGuid.PcdTemporaryRamSize ## CONSUMES
|
||||||
gIntelFsp2PkgTokenSpaceGuid.PcdFspTemporaryRamSize ## CONSUMES
|
gIntelFsp2PkgTokenSpaceGuid.PcdFspTemporaryRamSize ## CONSUMES
|
||||||
gIntelFsp2PkgTokenSpaceGuid.PcdFspHeapSizePercentage ## CONSUMES
|
gIntelFsp2PkgTokenSpaceGuid.PcdFspHeapSizePercentage ## CONSUMES
|
||||||
|
gIntelFsp2PkgTokenSpaceGuid.PcdFspMaxInterruptSupported ## CONSUMES
|
||||||
|
|
||||||
[Ppis]
|
[Ppis]
|
||||||
gEfiTemporaryRamSupportPpiGuid ## PRODUCES
|
gEfiTemporaryRamSupportPpiGuid ## PRODUCES
|
||||||
|
|
|
@ -70,6 +70,7 @@ SecStartup (
|
||||||
UINT32 Index;
|
UINT32 Index;
|
||||||
FSP_GLOBAL_DATA PeiFspData;
|
FSP_GLOBAL_DATA PeiFspData;
|
||||||
UINT64 ExceptionHandler;
|
UINT64 ExceptionHandler;
|
||||||
|
UINTN IdtSize;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Process all libraries constructor function linked to SecCore.
|
// Process all libraries constructor function linked to SecCore.
|
||||||
|
@ -98,13 +99,26 @@ SecStartup (
|
||||||
// | |
|
// | |
|
||||||
// |-------------------|----> TempRamBase
|
// |-------------------|----> TempRamBase
|
||||||
IdtTableInStack.PeiService = NULL;
|
IdtTableInStack.PeiService = NULL;
|
||||||
ExceptionHandler = FspGetExceptionHandler(mIdtEntryTemplate);
|
AsmReadIdtr (&IdtDescriptor);
|
||||||
for (Index = 0; Index < SEC_IDT_ENTRY_COUNT; Index ++) {
|
if ((IdtDescriptor.Base == 0) && (IdtDescriptor.Limit == 0xFFFF)) {
|
||||||
CopyMem ((VOID*)&IdtTableInStack.IdtTable[Index], (VOID*)&ExceptionHandler, sizeof (UINT64));
|
ExceptionHandler = FspGetExceptionHandler(mIdtEntryTemplate);
|
||||||
|
for (Index = 0; Index < FixedPcdGet8(PcdFspMaxInterruptSupported); Index ++) {
|
||||||
|
CopyMem ((VOID*)&IdtTableInStack.IdtTable[Index], (VOID*)&ExceptionHandler, sizeof (UINT64));
|
||||||
|
}
|
||||||
|
IdtSize = sizeof (IdtTableInStack.IdtTable);
|
||||||
|
} else {
|
||||||
|
if (IdtDescriptor.Limit + 1 > sizeof (IdtTableInStack.IdtTable)) {
|
||||||
|
//
|
||||||
|
// ERROR: IDT table size from boot loader is larger than FSP can support, DeadLoop here!
|
||||||
|
//
|
||||||
|
CpuDeadLoop();
|
||||||
|
} else {
|
||||||
|
IdtSize = IdtDescriptor.Limit + 1;
|
||||||
|
}
|
||||||
|
CopyMem ((VOID *) (UINTN) &IdtTableInStack.IdtTable, (VOID *) IdtDescriptor.Base, IdtSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
IdtDescriptor.Base = (UINTN) &IdtTableInStack.IdtTable;
|
IdtDescriptor.Base = (UINTN) &IdtTableInStack.IdtTable;
|
||||||
IdtDescriptor.Limit = (UINT16)(sizeof (IdtTableInStack.IdtTable) - 1);
|
IdtDescriptor.Limit = (UINT16)(IdtSize - 1);
|
||||||
|
|
||||||
AsmWriteIdtr (&IdtDescriptor);
|
AsmWriteIdtr (&IdtDescriptor);
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/** @file
|
/** @file
|
||||||
|
|
||||||
Copyright (c) 2014 - 2016, Intel Corporation. All rights reserved.<BR>
|
Copyright (c) 2014 - 2018, 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
|
||||||
|
@ -29,8 +29,6 @@
|
||||||
#include <Library/FspCommonLib.h>
|
#include <Library/FspCommonLib.h>
|
||||||
#include <FspEas.h>
|
#include <FspEas.h>
|
||||||
|
|
||||||
#define SEC_IDT_ENTRY_COUNT 34
|
|
||||||
|
|
||||||
typedef VOID (*PEI_CORE_ENTRY) ( \
|
typedef VOID (*PEI_CORE_ENTRY) ( \
|
||||||
IN CONST EFI_SEC_PEI_HAND_OFF *SecCoreData, \
|
IN CONST EFI_SEC_PEI_HAND_OFF *SecCoreData, \
|
||||||
IN CONST EFI_PEI_PPI_DESCRIPTOR *PpiList \
|
IN CONST EFI_PEI_PPI_DESCRIPTOR *PpiList \
|
||||||
|
@ -38,7 +36,7 @@ typedef VOID (*PEI_CORE_ENTRY) ( \
|
||||||
|
|
||||||
typedef struct _SEC_IDT_TABLE {
|
typedef struct _SEC_IDT_TABLE {
|
||||||
EFI_PEI_SERVICES *PeiService;
|
EFI_PEI_SERVICES *PeiService;
|
||||||
UINT64 IdtTable[SEC_IDT_ENTRY_COUNT];
|
UINT64 IdtTable[FixedPcdGet8 (PcdFspMaxInterruptSupported)];
|
||||||
} SEC_IDT_TABLE;
|
} SEC_IDT_TABLE;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -86,6 +86,10 @@
|
||||||
# x % of FSP temporary memory will be used for heap
|
# x % of FSP temporary memory will be used for heap
|
||||||
# (100 - x) % of FSP temporary memory will be used for stack
|
# (100 - x) % of FSP temporary memory will be used for stack
|
||||||
gIntelFsp2PkgTokenSpaceGuid.PcdFspHeapSizePercentage | 50| UINT8|0x10000004
|
gIntelFsp2PkgTokenSpaceGuid.PcdFspHeapSizePercentage | 50| UINT8|0x10000004
|
||||||
|
#
|
||||||
|
# Maximal Interrupt supported in IDT table.
|
||||||
|
#
|
||||||
|
gIntelFsp2PkgTokenSpaceGuid.PcdFspMaxInterruptSupported | 34| UINT8|0x10000005
|
||||||
|
|
||||||
[PcdsFixedAtBuild,PcdsDynamic,PcdsDynamicEx]
|
[PcdsFixedAtBuild,PcdsDynamic,PcdsDynamicEx]
|
||||||
gIntelFsp2PkgTokenSpaceGuid.PcdFspReservedMemoryLength |0x00100000|UINT32|0x46530000
|
gIntelFsp2PkgTokenSpaceGuid.PcdFspReservedMemoryLength |0x00100000|UINT32|0x46530000
|
||||||
|
|
Loading…
Reference in New Issue