public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: Vladimir Olovyannikov <vladimir.olovyannikov@broadcom.com>
To: Ard Biesheuvel <ard.biesheuvel@linaro.org>, edk2-devel@lists.01.org
Cc: leif.lindholm@linaro.org
Subject: Re: [PATCH 5/7] ArmPlatformPkg/MemoryInitPeiLib: don't reserve primary FV in memory
Date: Tue, 26 Dec 2017 13:52:25 -0800	[thread overview]
Message-ID: <7bd00d4b1fa918286d61e069fc68f6bd@mail.gmail.com> (raw)
In-Reply-To: <20171130152453.19205-6-ard.biesheuvel@linaro.org>

Hi Ard, Meenakshi,

I am having a problem I cannot explain the reason for, with this commit on
an ARM64 platform.

   ArmPlatformPkg/MemoryInitPeiLib: don't reserve primary FV in memory

    Now that PrePi no longer exposes its internal code via special HOBs,
    we can remove the special handling of the primary FV, which needed to
    be reserved so that DXE core could call into the PE/COFF and LZMA
    libraries in the PrePi module.

    Contributed-under: TianoCore Contribution Agreement 1.1
    Signed-off-by: Udit Kumar <udit.kumar@nxp.com>
    Signed-off-by: Meenakshi Aggarwal <meenakshi.aggarwal@nxp.com>
    [ardb: updated commit log]
    Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
    Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>

If a Shell is built "as is" from the source tree, there are no issues.
However, if I slightly modify Shell.c like in the following patch:

diff --git a/ShellPkg/Application/Shell/Shell.c
b/ShellPkg/Application/Shell/Shell.c
index 577e17311bea..bbbdde8ced96 100644
--- a/ShellPkg/Application/Shell/Shell.c
+++ b/ShellPkg/Application/Shell/Shell.c
@@ -339,6 +339,11 @@ UefiMain (
   EFI_HANDLE                      ConInHandle;
   EFI_SIMPLE_TEXT_INPUT_PROTOCOL  *OldConIn;
   SPLIT_LIST                      *Split;
+  CHAR16                          *DelayStr;
+  CHAR16                          *NoMapStr;
+  UINTN                           DelayVarSize;
+  UINTN                           NoMapVarSize;
+  BOOLEAN                         SilentStart;

   if (PcdGet8(PcdShellSupportLevel) > 3) {
     return (EFI_UNSUPPORTED);
@@ -360,6 +365,7 @@ UefiMain (
   ShellInfoObject.PageBreakEnabled            =
PcdGetBool(PcdShellPageBreakDefault);
   ShellInfoObject.ViewingSettings.InsertMode  =
PcdGetBool(PcdShellInsertModeDefault);
   ShellInfoObject.LogScreenCount              = PcdGet8
(PcdShellScreenLogCount  );
+  SilentStart                                 = FALSE;

   //
   // verify we dont allow for spec violation
@@ -452,6 +458,21 @@ UefiMain (
       goto FreeResources;
     }

+    if (!ShellInfoObject.ShellInitSettings.BitUnion.Bits.Delay) {
+      // Command line has priority over the variable
+      Status = ShellFindEnvVarInList(L"startupdelay", &DelayStr,
&DelayVarSize, NULL);
+      if (!EFI_ERROR (Status)) {
+        ShellInfoObject.ShellInitSettings.Delay = ShellStrToUintn
(DelayStr);
+      }
+    }
+
+    if (!ShellInfoObject.ShellInitSettings.BitUnion.Bits.NoMap) {
+      Status = ShellFindEnvVarInList(L"silentstart", &NoMapStr,
&NoMapVarSize, NULL);
+      if (!EFI_ERROR (Status)) {
+        SilentStart = (BOOLEAN)ShellStrToUintn (NoMapStr);
+      }
+    }
+
     //
     // If shell support level is >= 1 create the mappings and paths
     //
@@ -492,7 +513,7 @@ UefiMain (
     //
     // Display the version
     //
-    if (!ShellInfoObject.ShellInitSettings.BitUnion.Bits.NoVersion) {
+    if (!ShellInfoObject.ShellInitSettings.BitUnion.Bits.NoVersion &&
!SilentStart) {
         ShellPrintHiiEx (
           0,
           gST->ConOut->Mode->CursorRow,
@@ -529,7 +550,7 @@ UefiMain (
     //
     // Display the mapping
     //
-    if (PcdGet8(PcdShellSupportLevel) >= 2 &&
!ShellInfoObject.ShellInitSettings.BitUnion.Bits.NoMap) {
+    if (PcdGet8(PcdShellSupportLevel) >= 2 &&
!ShellInfoObject.ShellInitSettings.BitUnion.Bits.NoMap && !SilentStart) {
       Status = RunCommand(L"map");
       ASSERT_EFI_ERROR(Status);
     }

Shell fails to load.
Here is an excerpt from the debug log:

add-symbol-file
/uefi/Build/StingrayPkg/DEBUG_GCC5/AARCH64/ShellPkg/Application/Shell/Shel
l/DEBUG/Shell.dll 0x88480000
Loading driver at 0x0008847F000 EntryPoint=0x00088480000 Shell.efi
InstallProtocolInterface: BC62157E-3E33-4FEC-9920-2D3B36D750DF 8D095118
ProtectUefiImageCommon - 0x8D08ED40
  - 0x000000008847F000 - 0x0000000000152000
SetUefiImageMemoryAttributes - 0x000000008847F000 - 0x0000000000001000
(0x0000000000004008)
SetUefiImageMemoryAttributes - 0x0000000088480000 - 0x00000000000E6000
(0x0000000000020008)
SetUefiImageMemoryAttributes - 0x0000000088566000 - 0x000000000006B000
(0x0000000000004008)
InstallProtocolInterface: 387477C2-69C7-11D2-8E39-00A0C969723B 8D088920
InstallProtocolInterface: 752F3136-4E16-4FDC-A22A-E5F46812F4CA 8C71AF98
InstallProtocolInterface: 6302D008-7F9B-4F30-87AC-60C9FEF5DA4E 88566710
--- Blank lines -----
3h
--- Blank lines -----

InstallProtocolInterface: 387477C2-69C7-11D2-8E39-00A0C969723B 8C0A1B18
InstallProtocolInterface: 387477C2-69C7-11D2-8E39-00A0C969723B A3ABE6B398
InstallProtocolInterface: 387477C2-69C7-11D2-8E39-00A0C969723B 8C0A1B18
InstallProtocolInterface: 387477C2-69C7-11D2-8E39-00A0C969723B A3ABE6B398
InstallProtocolInterface: 387477C2-69C7-11D2-8E39-00A0C969723B 8C0A1B18
InstallProtocolInterface: 387477C2-69C7-11D2-8E39-00A0C969723B A3ABE6B398
InstallProtocolInterface: 387477C2-69C7-11D2-8E39-00A0C969723B 8C0A1B18
InstallProtocolInterface: 387477C2-69C7-11D2-8E39-00A0C969723B A3ABE6B398
InstallProtocolInterface: 387477C2-69C7-11D2-8E39-00A0C969723B 8C0A1B18
InstallProtocolInterface: 387477C2-69C7-11D2-8E39-00A0C969723B 8C0A1B18
InstallProtocolInterface: 387477C2-69C7-11D2-8E39-00A0C969723B 8C0A1E18
InstallProtocolInterface: 387477C2-69C7-11D2-8E39-00A0C969723B 8C0A1B18
InstallProtocolInterface: 387477C2-69C7-11D2-8E39-00A0C969723B 8C0A1E18
InstallProtocolInterface: 387477C2-69C7-11D2-8E39-00A0C969723B 8C0A1B18
InstallProtocolInterface: 387477C2-69C7-11D2-8E39-00A0C969723B 8C0A1E18
InstallProtocolInterface: 387477C2-69C7-11D2-8E39-00A0C969723B 8C0A1B18
InstallProtocolInterface: 387477C2-69C7-11D2-8E39-00A0C969723B 8C0A1E18
InstallProtocolInterface: 387477C2-69C7-11D2-8E39-00A0C969723B 8C0A1B18
InstallProtocolInterface: 387477C2-69C7-11D2-8E39-00A0C969723B 8C0A1E18
InstallProtocolInterface: 387477C2-69C7-11D2-8E39-00A0C969723B 8C0A1B18
InstallProtocolInterface: 387477C2-69C7-11D2-8E39-00A0C969723B 8C0A1E18
InstallProtocolInterface: 387477C2-69C7-11D2-8E39-00A0C969723B 8C0A1B18
ASSERT [DxeCore]
/uefi/MdeModulePkg/Core/Dxe/SectionExtraction/CoreSectionExtraction.c(300)
: ((BOOLEAN)(0==1))

Here 387477C2-69C7-11D2-8E39-00A0C969723B GUID is
gEfiSimpleTextOutProtocolGuid.

And there is no way to do source-level debug because FV image cannot be
found in memory at the given location.
As soon as I revert this commit
(8ae5fc182941cf9ff7a222eb0a484088a0db8e2e), everything gets back to
normal.
Could you please explain me what I am doing wrong?

Thank you,
Vladimir

-----Original Message-----
From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf Of Ard
Biesheuvel
Sent: Thursday, November 30, 2017 7:25 AM
To: edk2-devel@lists.01.org
Cc: leif.lindholm@linaro.org; Ard Biesheuvel
Subject: [edk2] [PATCH 5/7] ArmPlatformPkg/MemoryInitPeiLib: don't reserve
primary FV in memory

From: Meenakshi Aggarwal <meenakshi.aggarwal@nxp.com>

Now that PrePi no longer exposes its internal code via special HOBs, we
can remove the special handling of the primary FV, which needed to be
reserved so that DXE core could call into the PE/COFF and LZMA libraries
in the PrePi module.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Udit Kumar <udit.kumar@nxp.com>
Signed-off-by: Meenakshi Aggarwal <meenakshi.aggarwal@nxp.com>
[ardb: updated commit log]
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
---
 ArmPlatformPkg/MemoryInitPei/MemoryInitPeiLib.c | 69 --------------------
 1 file changed, 69 deletions(-)

diff --git a/ArmPlatformPkg/MemoryInitPei/MemoryInitPeiLib.c
b/ArmPlatformPkg/MemoryInitPei/MemoryInitPeiLib.c
index 2feb11f21d5d..d03214b5df66 100644
--- a/ArmPlatformPkg/MemoryInitPei/MemoryInitPeiLib.c
+++ b/ArmPlatformPkg/MemoryInitPei/MemoryInitPeiLib.c
@@ -70,11 +70,7 @@ MemoryPeim (
 {
   ARM_MEMORY_REGION_DESCRIPTOR *MemoryTable;
   EFI_RESOURCE_ATTRIBUTE_TYPE  ResourceAttributes;
-  UINT64                       ResourceLength;
   EFI_PEI_HOB_POINTERS         NextHob;
-  EFI_PHYSICAL_ADDRESS         FdTop;
-  EFI_PHYSICAL_ADDRESS         SystemMemoryTop;
-  EFI_PHYSICAL_ADDRESS         ResourceTop;
   BOOLEAN                      Found;

   // Get Virtual Memory Map from the Platform Library @@ -121,71 +117,6
@@ MemoryPeim (
     );
   }

-  //
-  // Reserved the memory space occupied by the firmware volume
-  //
-
-  SystemMemoryTop = (EFI_PHYSICAL_ADDRESS)PcdGet64 (PcdSystemMemoryBase)
+ (EFI_PHYSICAL_ADDRESS)PcdGet64 (PcdSystemMemorySize);
-  FdTop = (EFI_PHYSICAL_ADDRESS)PcdGet64 (PcdFdBaseAddress) +
(EFI_PHYSICAL_ADDRESS)PcdGet32 (PcdFdSize);
-
-  // EDK2 does not have the concept of boot firmware copied into DRAM. To
avoid the DXE
-  // core to overwrite this area we must mark the region with the
attribute non-present
-  if ((PcdGet64 (PcdFdBaseAddress) >= PcdGet64 (PcdSystemMemoryBase)) &&
(FdTop <= SystemMemoryTop)) {
-    Found = FALSE;
-
-    // Search for System Memory Hob that contains the firmware
-    NextHob.Raw = GetHobList ();
-    while ((NextHob.Raw = GetNextHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR,
NextHob.Raw)) != NULL) {
-      if ((NextHob.ResourceDescriptor->ResourceType ==
EFI_RESOURCE_SYSTEM_MEMORY) &&
-          (PcdGet64 (PcdFdBaseAddress) >=
NextHob.ResourceDescriptor->PhysicalStart) &&
-          (FdTop <= NextHob.ResourceDescriptor->PhysicalStart +
NextHob.ResourceDescriptor->ResourceLength))
-      {
-        ResourceAttributes =
NextHob.ResourceDescriptor->ResourceAttribute;
-        ResourceLength = NextHob.ResourceDescriptor->ResourceLength;
-        ResourceTop = NextHob.ResourceDescriptor->PhysicalStart +
ResourceLength;
-
-        if (PcdGet64 (PcdFdBaseAddress) ==
NextHob.ResourceDescriptor->PhysicalStart) {
-          if (SystemMemoryTop == FdTop) {
-            NextHob.ResourceDescriptor->ResourceAttribute =
ResourceAttributes & ~EFI_RESOURCE_ATTRIBUTE_PRESENT;
-          } else {
-            // Create the System Memory HOB for the firmware with the
non-present attribute
-            BuildResourceDescriptorHob (EFI_RESOURCE_SYSTEM_MEMORY,
-                                        ResourceAttributes &
~EFI_RESOURCE_ATTRIBUTE_PRESENT,
-                                        PcdGet64 (PcdFdBaseAddress),
-                                        PcdGet32 (PcdFdSize));
-
-            // Top of the FD is system memory available for UEFI
-            NextHob.ResourceDescriptor->PhysicalStart +=
PcdGet32(PcdFdSize);
-            NextHob.ResourceDescriptor->ResourceLength -=
PcdGet32(PcdFdSize);
-          }
-        } else {
-          // Create the System Memory HOB for the firmware with the
non-present attribute
-          BuildResourceDescriptorHob (EFI_RESOURCE_SYSTEM_MEMORY,
-                                      ResourceAttributes &
~EFI_RESOURCE_ATTRIBUTE_PRESENT,
-                                      PcdGet64 (PcdFdBaseAddress),
-                                      PcdGet32 (PcdFdSize));
-
-          // Update the HOB
-          NextHob.ResourceDescriptor->ResourceLength = PcdGet64
(PcdFdBaseAddress) - NextHob.ResourceDescriptor->PhysicalStart;
-
-          // If there is some memory available on the top of the FD then
create a HOB
-          if (FdTop < NextHob.ResourceDescriptor->PhysicalStart +
ResourceLength) {
-            // Create the System Memory HOB for the remaining region (top
of the FD)
-            BuildResourceDescriptorHob (EFI_RESOURCE_SYSTEM_MEMORY,
-                                        ResourceAttributes,
-                                        FdTop,
-                                        ResourceTop - FdTop);
-          }
-        }
-        Found = TRUE;
-        break;
-      }
-      NextHob.Raw = GET_NEXT_HOB (NextHob);
-    }
-
-    ASSERT(Found);
-  }
-
   // Build Memory Allocation Hob
   InitMmu (MemoryTable);

--
2.11.0

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


  reply	other threads:[~2017-12-26 21:47 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-11-30 15:24 [PATCH 0/7] ArmPlatformPkg/PrePi: stop exposing internal code via HOBs Ard Biesheuvel
2017-11-30 15:24 ` [PATCH 1/7] EmbeddedPkg BeagleBoardPkg: move special HOB reuse libraries into platform Ard Biesheuvel
2017-11-30 15:24 ` [PATCH 2/7] BeagleBoardPkg: create private PrePi implementation Ard Biesheuvel
2017-11-30 15:24 ` [PATCH 3/7] BeagleBoardPkg: clone MemoryInitPeiLib Ard Biesheuvel
2017-11-30 15:24 ` [PATCH 4/7] ArmPlatformPkg/PrePi: don't expose PE/COFF and LZMA libraries via HOBs Ard Biesheuvel
2017-11-30 15:24 ` [PATCH 5/7] ArmPlatformPkg/MemoryInitPeiLib: don't reserve primary FV in memory Ard Biesheuvel
2017-12-26 21:52   ` Vladimir Olovyannikov [this message]
2017-12-26 23:06     ` Ard Biesheuvel
2017-12-27  1:58       ` Vladimir Olovyannikov
2017-12-27  2:01       ` Vladimir Olovyannikov
2017-12-27  7:37     ` Udit Kumar
2017-11-30 15:24 ` [PATCH 6/7] ArmPlatformPkg/PrePi; call all constructors by hand Ard Biesheuvel
2017-11-30 16:31   ` Leif Lindholm
2017-11-30 16:35     ` Ard Biesheuvel
2017-11-30 16:45       ` Leif Lindholm
2017-11-30 17:12         ` Ard Biesheuvel
2017-11-30 15:24 ` [PATCH 7/7] ArmPlatformPkg/PrePi: remove bogus IntelFrameworkModulePkg reference Ard Biesheuvel

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=7bd00d4b1fa918286d61e069fc68f6bd@mail.gmail.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox