On 02/18/19 05:11, Jordan Justen wrote:
> Apparently something depends on the heap being above the stack after
> TemporaryRamMigration.
> 
> This is the opposite order that OVMF has always used for TempRam
> before migration to permanent ram. In 42a83e80f37c (svn r10770), Mike
> changed OVMF's TemporaryRamMigration to swap the locations of heap and
> stack during the migration.
> 
> Rather than doing the swap during TemporaryRamMigration, this change
> causes OVMF to boot with TemporaryRam setup with heap being above the
> stack. Then, during TemporaryRamMigration, we can directly copy all of
> TemporaryRam.
> 
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Jordan Justen <jordan.l.jus...@intel.com>
> Cc: Laszlo Ersek <ler...@redhat.com>
> Cc: Ard Biesheuvel <ard.biesheu...@linaro.org>
> Cc: Anthony Perard <anthony.per...@citrix.com>
> Cc: Julien Grall <julien.gr...@linaro.org>
> ---
>  OvmfPkg/Sec/Ia32/SecEntry.nasm |  2 +-
>  OvmfPkg/Sec/SecMain.c          | 39 +++++++++++++++++-----------------
>  OvmfPkg/Sec/X64/SecEntry.nasm  |  2 +-
>  3 files changed, 22 insertions(+), 21 deletions(-)
> 
> diff --git a/OvmfPkg/Sec/Ia32/SecEntry.nasm b/OvmfPkg/Sec/Ia32/SecEntry.nasm
> index 03501969eb..61917b9eef 100644
> --- a/OvmfPkg/Sec/Ia32/SecEntry.nasm
> +++ b/OvmfPkg/Sec/Ia32/SecEntry.nasm
> @@ -57,7 +57,7 @@ ASM_PFX(_ModuleEntryPoint):
>      ; Load temporary RAM stack based on PCDs
>      ;
>      %define SEC_TOP_OF_STACK (FixedPcdGet32 (PcdOvmfSecPeiTempRamBase) + \
> -                          FixedPcdGet32 (PcdOvmfSecPeiTempRamSize))
> +                          (FixedPcdGet32 (PcdOvmfSecPeiTempRamSize) / 2))
>      mov     eax, SEC_TOP_OF_STACK
>      mov     esp, eax
>      nop
> diff --git a/OvmfPkg/Sec/SecMain.c b/OvmfPkg/Sec/SecMain.c
> index f7fec3d8c0..46ac739862 100644
> --- a/OvmfPkg/Sec/SecMain.c
> +++ b/OvmfPkg/Sec/SecMain.c
> @@ -1,7 +1,7 @@
>  /** @file
>    Main SEC phase code.  Transitions to PEI.
>  
> -  Copyright (c) 2008 - 2015, Intel Corporation. All rights reserved.<BR>
> +  Copyright (c) 2008 - 2019, Intel Corporation. All rights reserved.<BR>
>    (C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>
>  
>    This program and the accompanying materials
> @@ -779,15 +779,15 @@ SecCoreStartupWithStack (
>  #endif
>  
>    //
> -  // |-------------|       <-- TopOfCurrentStack
> -  // |   Stack     | 32k
>    // |-------------|
>    // |    Heap     | 32k
> +  // |-------------|       <-- TopOfCurrentStack
> +  // |   Stack     | 32k
>    // |-------------|       <-- SecCoreData.TemporaryRamBase
>    //
>  
>    ASSERT ((UINTN) (PcdGet32 (PcdOvmfSecPeiTempRamBase) +
> -                   PcdGet32 (PcdOvmfSecPeiTempRamSize)) ==
> +                   (PcdGet32 (PcdOvmfSecPeiTempRamSize) / 2)) ==
>            (UINTN) TopOfCurrentStack);
>  
>    //
> @@ -795,14 +795,17 @@ SecCoreStartupWithStack (
>    //
>    SecCoreData.DataSize = sizeof(EFI_SEC_PEI_HAND_OFF);
>  
> -  SecCoreData.TemporaryRamSize       = (UINTN) PcdGet32 
> (PcdOvmfSecPeiTempRamSize);
> -  SecCoreData.TemporaryRamBase       = (VOID*)((UINT8 *)TopOfCurrentStack - 
> SecCoreData.TemporaryRamSize);
> +  SecCoreData.TemporaryRamBase =
> +    (VOID*)(UINTN) PcdGet32 (PcdOvmfSecPeiTempRamBase);
> +  SecCoreData.TemporaryRamSize = (UINTN) PcdGet32 (PcdOvmfSecPeiTempRamSize);
>  
> -  SecCoreData.PeiTemporaryRamBase    = SecCoreData.TemporaryRamBase;
> -  SecCoreData.PeiTemporaryRamSize    = SecCoreData.TemporaryRamSize >> 1;
> +  SecCoreData.PeiTemporaryRamBase =
> +    (UINT8*)(VOID*)(UINTN) PcdGet32 (PcdOvmfSecPeiTempRamBase) +
> +    ((UINTN) PcdGet32 (PcdOvmfSecPeiTempRamSize) / 2);
> +  SecCoreData.PeiTemporaryRamSize = PcdGet32 (PcdOvmfSecPeiTempRamSize) / 2;
>  
> -  SecCoreData.StackBase              = (UINT8 *)SecCoreData.TemporaryRamBase 
> + SecCoreData.PeiTemporaryRamSize;
> -  SecCoreData.StackSize              = SecCoreData.TemporaryRamSize >> 1;
> +  SecCoreData.StackBase = (VOID*)(UINTN) PcdGet32 (PcdOvmfSecPeiTempRamBase);
> +  SecCoreData.StackSize = PcdGet32 (PcdOvmfSecPeiTempRamSize) / 2;
>  
>    SecCoreData.BootFirmwareVolumeBase = BootFv;
>    SecCoreData.BootFirmwareVolumeSize = (UINTN) BootFv->FvLength;
> @@ -895,10 +898,10 @@ TemporaryRamMigration (
>      (UINT64)CopySize
>      ));
>    
> -  OldHeap = (VOID*)(UINTN)TemporaryMemoryBase;
> +  OldHeap = (VOID*)((UINTN)TemporaryMemoryBase + (CopySize >> 1));
>    NewHeap = (VOID*)((UINTN)PermanentMemoryBase + (CopySize >> 1));
>    
> -  OldStack = (VOID*)((UINTN)TemporaryMemoryBase + (CopySize >> 1));
> +  OldStack = (VOID*)(UINTN)TemporaryMemoryBase;
>    NewStack = (VOID*)(UINTN)PermanentMemoryBase;
>  
>    DebugAgentContext.HeapMigrateOffset = (UINTN)NewHeap - (UINTN)OldHeap;
> @@ -908,15 +911,13 @@ TemporaryRamMigration (
>    InitializeDebugAgent (DEBUG_AGENT_INIT_POSTMEM_SEC, (VOID *) 
> &DebugAgentContext, NULL);
>  
>    //
> -  // Migrate Heap
> +  // Migrate the whole temporary memory to permenent memory.

s/permenent/permanent/

>    //
> -  CopyMem (NewHeap, OldHeap, CopySize >> 1);
> +  CopyMem(
> +    (VOID*)(UINTN)PermanentMemoryBase,
> +    (VOID*)(UINTN)TemporaryMemoryBase,
> +    CopySize);

I think the last paren should be on a separate line, in this style.

With those updates:

Reviewed-by: Laszlo Ersek <ler...@redhat.com>

Thanks
Laszlo

>  
> -  //
> -  // Migrate Stack
> -  //
> -  CopyMem (NewStack, OldStack, CopySize >> 1);
> -  
>    //
>    // Rebase IDT table in permanent memory
>    //
> diff --git a/OvmfPkg/Sec/X64/SecEntry.nasm b/OvmfPkg/Sec/X64/SecEntry.nasm
> index d76adcffd8..dd603d6eb0 100644
> --- a/OvmfPkg/Sec/X64/SecEntry.nasm
> +++ b/OvmfPkg/Sec/X64/SecEntry.nasm
> @@ -59,7 +59,7 @@ ASM_PFX(_ModuleEntryPoint):
>      ; Load temporary RAM stack based on PCDs
>      ;
>      %define SEC_TOP_OF_STACK (FixedPcdGet32 (PcdOvmfSecPeiTempRamBase) + \
> -                          FixedPcdGet32 (PcdOvmfSecPeiTempRamSize))
> +                          (FixedPcdGet32 (PcdOvmfSecPeiTempRamSize) / 2))
>      mov     rsp, SEC_TOP_OF_STACK
>      nop
>  
> 

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to