summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorqhuang8 <qhuang8@6f19259b-4bc3-4df7-8a09-765794883524>2007-11-08 03:57:04 +0000
committerqhuang8 <qhuang8@6f19259b-4bc3-4df7-8a09-765794883524>2007-11-08 03:57:04 +0000
commit30c8f8616d9f2c764e4b8c3566bef4f562115005 (patch)
treecad63742fb7dae15a2af4c2cd0ba1e33c1bd3b37
parentf942f107607e18944bd44f1d223670d190156f2b (diff)
downloadedk2-30c8f8616d9f2c764e4b8c3566bef4f562115005.zip
edk2-30c8f8616d9f2c764e4b8c3566bef4f562115005.tar.gz
edk2-30c8f8616d9f2c764e4b8c3566bef4f562115005.tar.bz2
PI spec will be updated to make it clear that this HOB should describe the stack range before going to DXE.
Therefore, we should update stack Hob in DxeLoad to reflect real stack git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@4290 6f19259b-4bc3-4df7-8a09-765794883524
-rw-r--r--MdeModulePkg/Core/DxeIplPeim/DxeIpl.h7
-rw-r--r--MdeModulePkg/Core/DxeIplPeim/DxeLoad.c30
-rw-r--r--MdeModulePkg/Core/DxeIplPeim/Ia32/DxeLoadFunc.c9
-rw-r--r--MdeModulePkg/Core/DxeIplPeim/Ipf/DxeLoadFunc.c5
-rw-r--r--MdeModulePkg/Core/DxeIplPeim/X64/DxeLoadFunc.c5
5 files changed, 56 insertions, 0 deletions
diff --git a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.h b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.h
index 5e47ca1..dab6839 100644
--- a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.h
+++ b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.h
@@ -33,6 +33,7 @@ Abstract:
#include <Ppi/Decompress.h>
#include <Ppi/FirmwareVolumeInfo.h>
+#include <Guid/MemoryAllocationHob.h>
#include <Guid/FirmwareFileSystem2.h>
#include <Library/DebugLib.h>
@@ -105,6 +106,12 @@ HandOffToDxeCore (
IN EFI_PEI_PPI_DESCRIPTOR *EndOfPeiSignal
);
+VOID
+UpdateStackHob (
+ IN EFI_PHYSICAL_ADDRESS BaseAddress,
+ IN UINT64 Length
+ );
+
EFI_STATUS
EFIAPI
PeimInitializeDxeIpl (
diff --git a/MdeModulePkg/Core/DxeIplPeim/DxeLoad.c b/MdeModulePkg/Core/DxeIplPeim/DxeLoad.c
index 28c9ece..d593e30 100644
--- a/MdeModulePkg/Core/DxeIplPeim/DxeLoad.c
+++ b/MdeModulePkg/Core/DxeIplPeim/DxeLoad.c
@@ -751,3 +751,33 @@ Decompress (
return EFI_SUCCESS;
}
+VOID
+UpdateStackHob (
+ IN EFI_PHYSICAL_ADDRESS BaseAddress,
+ IN UINT64 Length
+ )
+{
+ EFI_PEI_HOB_POINTERS Hob;
+
+ Hob.Raw = GetHobList ();
+ while ((Hob.Raw = GetNextHob (EFI_HOB_TYPE_MEMORY_ALLOCATION, Hob.Raw)) != NULL) {
+ if (CompareGuid (&gEfiHobMemoryAllocStackGuid, &(Hob.MemoryAllocationStack->AllocDescriptor.Name))) {
+ //
+ // Build a new memory allocation HOB with old stack info with EfiConventionalMemory type
+ // to be reclaimed by DXE core.
+ //
+ BuildMemoryAllocationHob (
+ Hob.MemoryAllocationStack->AllocDescriptor.MemoryBaseAddress,
+ Hob.MemoryAllocationStack->AllocDescriptor.MemoryLength,
+ EfiConventionalMemory
+ );
+ //
+ // Update the BSP Stack Hob to reflect the new stack info.
+ //
+ Hob.MemoryAllocationStack->AllocDescriptor.MemoryBaseAddress = BaseAddress;
+ Hob.MemoryAllocationStack->AllocDescriptor.MemoryLength = Length;
+ break;
+ }
+ Hob.Raw = GET_NEXT_HOB (Hob);
+ }
+}
diff --git a/MdeModulePkg/Core/DxeIplPeim/Ia32/DxeLoadFunc.c b/MdeModulePkg/Core/DxeIplPeim/Ia32/DxeLoadFunc.c
index 129b055..867c771 100644
--- a/MdeModulePkg/Core/DxeIplPeim/Ia32/DxeLoadFunc.c
+++ b/MdeModulePkg/Core/DxeIplPeim/Ia32/DxeLoadFunc.c
@@ -106,6 +106,10 @@ HandOffToDxeCore (
AsmWriteCr3 (PageTables);
+ //
+ // Update the contents of BSP stack HOB to reflect the real stack info passed to DxeCore.
+ //
+ UpdateStackHob (BaseOfStack, STACK_SIZE);
if (FeaturePcdGet (PcdDxeIplEnableIdt)) {
SizeOfTemplate = AsmGetVectorTemplatInfo (&TemplateBase);
@@ -163,6 +167,11 @@ HandOffToDxeCore (
Status = PeiServicesInstallPpi (EndOfPeiSignal);
ASSERT_EFI_ERROR (Status);
+ //
+ // Update the contents of BSP stack HOB to reflect the real stack info passed to DxeCore.
+ //
+ UpdateStackHob (BaseOfStack, STACK_SIZE);
+
SwitchStack (
(SWITCH_STACK_ENTRY_POINT)(UINTN)DxeCoreEntryPoint,
HobList.Raw,
diff --git a/MdeModulePkg/Core/DxeIplPeim/Ipf/DxeLoadFunc.c b/MdeModulePkg/Core/DxeIplPeim/Ipf/DxeLoadFunc.c
index 34141ab..bf97439 100644
--- a/MdeModulePkg/Core/DxeIplPeim/Ipf/DxeLoadFunc.c
+++ b/MdeModulePkg/Core/DxeIplPeim/Ipf/DxeLoadFunc.c
@@ -62,6 +62,11 @@ HandOffToDxeCore (
Status = PeiServicesInstallPpi (EndOfPeiSignal);
ASSERT_EFI_ERROR (Status);
+ //
+ // Update the contents of BSP stack HOB to reflect the real stack info passed to DxeCore.
+ //
+ UpdateStackHob ((EFI_PHYSICAL_ADDRESS)(UINTN) BaseOfStack, STACK_SIZE);
+
SwitchStack (
(SWITCH_STACK_ENTRY_POINT)(UINTN)DxeCoreEntryPoint,
HobList.Raw,
diff --git a/MdeModulePkg/Core/DxeIplPeim/X64/DxeLoadFunc.c b/MdeModulePkg/Core/DxeIplPeim/X64/DxeLoadFunc.c
index 53febd5..aab710a 100644
--- a/MdeModulePkg/Core/DxeIplPeim/X64/DxeLoadFunc.c
+++ b/MdeModulePkg/Core/DxeIplPeim/X64/DxeLoadFunc.c
@@ -51,6 +51,11 @@ HandOffToDxeCore (
Status = PeiServicesInstallPpi (EndOfPeiSignal);
ASSERT_EFI_ERROR (Status);
+ //
+ // Update the contents of BSP stack HOB to reflect the real stack info passed to DxeCore.
+ //
+ UpdateStackHob (BaseOfStack, STACK_SIZE);
+
SwitchStack (
(SWITCH_STACK_ENTRY_POINT)(UINTN)DxeCoreEntryPoint,
HobList.Raw,