Hi All,


I need UEFI experts help on the problem with Armv8 board on warm UEFI reset.

Cold reset works fine.



Here is how I set up a warm reset:



STATIC

EFI_STATUS

ShutdownUefiBootServices (

  VOID

  )

{

  EFI_STATUS              Status;

  UINTN                   MemoryMapSize;

  EFI_MEMORY_DESCRIPTOR   *MemoryMap;

  UINTN                   MapKey;

  UINTN                   DescriptorSize;

  UINT32                  DescriptorVersion;

  UINTN                   Pages;



  MemoryMap = NULL;

  MemoryMapSize = 0;

  Pages = 0;



  do {

    Status = gBS->GetMemoryMap (

                    &MemoryMapSize,

                    MemoryMap,

                    &MapKey,

                    &DescriptorSize,

                    &DescriptorVersion

                    );

    if (Status == EFI_BUFFER_TOO_SMALL) {



      Pages = EFI_SIZE_TO_PAGES (MemoryMapSize) + 1;

      MemoryMap = AllocatePages (Pages);



      //

      // Get System MemoryMap

      //

      Status = gBS->GetMemoryMap (

                      &MemoryMapSize,

                      MemoryMap,

                      &MapKey,

                      &DescriptorSize,

                      &DescriptorVersion

                      );

    }



    // Don't do anything between the GetMemoryMap() and ExitBootServices()

    if (!EFI_ERROR(Status)) {

      Status = gBS->ExitBootServices (gImageHandle, MapKey);

      if (EFI_ERROR(Status)) {

        FreePages (MemoryMap, Pages);

        MemoryMap = NULL;

        MemoryMapSize = 0;

      }

    }

  } while (EFI_ERROR(Status));



  return Status;

}



Then perform

ArmCleanDataCache ();

ArmInvalidateDataCache ();

ArmDisableInstructionCache ();

ArmInvalidateInstructionCache ();

ArmDisableMmu ();



Then jump to start of FV:



typedef

VOID

(EFIAPI *START_FV)(

  VOID

);

StartOfFv = (START_FV)(UINTN)PcdGet64(PcdFvBaseAddress);

StartOfFv ();



Now this is what happens on warm reset:

reset -c warm

1. Until ArmEnableMmu() gets called, everything works as expected.

    Here is the stack right before ArmEnableMmu() is called:

     ArmConfigureMmu+0x4f8

     InitMmu+0x24

     MemoryPeim+0x440

     PrePiMain+0x114

     PrimaryMain+0x68

     CEntryPoint+0xC4

     EL2:0x00000000800008BC

     -----  End of stack info -----



2. Here is the stack as soon as Mmu is enabled with ArmEnableMmu() :

    ArmConfigureMmu+0x4fc <-- This one is correct, at line 745 in
ArmConfigureMmu() in ArmPkg/Library/ArmMmuLib/AArch64/ArmMmuLibCore.c
(return EFI_SUCCESS)

   _ModuleEntryPoint+0x24 <-- Wrong. This points directly to ASSERT(FALSE);
and to CpuDeadLoop() in DxeCoreEntryPoint.c, lines 59-60.

   El2:0x000000008E5E8300 <-- Absolutely bogus

    --- End of stack info ---



So, as soon as ArmEnableMmu() exits, execution jumps directly to
CpuDeadLoop() in DxeCoreEntryPoint of _ModuleEntryPoint().



Would be grateful for any advice.



Thank you,

Vladimir
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to