mirror of https://github.com/acidanthera/audk.git
ArmPlatformPkg: Fix stack switch bug after commit 7945b29
This is the complementary patch for the commit 7945b29
, which strictly
aligns temporary heap size and temporary stack size, but does not do
the same thing when switching stack and heap to permanent memory, and
then it may cause fatal data corruption like PHIT HOB lost and stack
pointer unaligned.
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Heyi Guo <heyi.guo@linaro.org>
Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@19213 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
d1baf355b1
commit
4960d8e004
|
@ -117,22 +117,25 @@ PrePeiCoreTemporaryRamSupport (
|
||||||
VOID *NewHeap;
|
VOID *NewHeap;
|
||||||
VOID *OldStack;
|
VOID *OldStack;
|
||||||
VOID *NewStack;
|
VOID *NewStack;
|
||||||
|
UINTN HeapSize;
|
||||||
|
|
||||||
|
HeapSize = ALIGN_VALUE (CopySize / 2, CPU_STACK_ALIGNMENT);
|
||||||
|
|
||||||
OldHeap = (VOID*)(UINTN)TemporaryMemoryBase;
|
OldHeap = (VOID*)(UINTN)TemporaryMemoryBase;
|
||||||
NewHeap = (VOID*)((UINTN)PermanentMemoryBase + (CopySize >> 1));
|
NewHeap = (VOID*)((UINTN)PermanentMemoryBase + (CopySize - HeapSize));
|
||||||
|
|
||||||
OldStack = (VOID*)((UINTN)TemporaryMemoryBase + (CopySize >> 1));
|
OldStack = (VOID*)((UINTN)TemporaryMemoryBase + HeapSize);
|
||||||
NewStack = (VOID*)(UINTN)PermanentMemoryBase;
|
NewStack = (VOID*)(UINTN)PermanentMemoryBase;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Migrate the temporary memory stack to permanent memory stack.
|
// Migrate the temporary memory stack to permanent memory stack.
|
||||||
//
|
//
|
||||||
CopyMem (NewStack, OldStack, CopySize >> 1);
|
CopyMem (NewStack, OldStack, CopySize - HeapSize);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Migrate the temporary memory heap to permanent memory heap.
|
// Migrate the temporary memory heap to permanent memory heap.
|
||||||
//
|
//
|
||||||
CopyMem (NewHeap, OldHeap, CopySize >> 1);
|
CopyMem (NewHeap, OldHeap, HeapSize);
|
||||||
|
|
||||||
SecSwitchStack ((UINTN)NewStack - (UINTN)OldStack);
|
SecSwitchStack ((UINTN)NewStack - (UINTN)OldStack);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue