]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Core/DxeIplPeim/DxeLoad.c
ArmPkg/ArmLib MMU: add functions to set/clear RO and XN bits on regions
[mirror_edk2.git] / MdeModulePkg / Core / DxeIplPeim / DxeLoad.c
index 89d3a6fcffec662cac5bea835e9e7f37c316d0a4..d7d693fdeb40350c8a3f9d1acad1fe0303cbd188 100644 (file)
@@ -92,27 +92,26 @@ PeimInitializeDxeIpl (
     // Ensure that DXE IPL is shadowed to permanent memory.\r
     //\r
     ASSERT (Status == EFI_ALREADY_STARTED);\r
+  }\r
      \r
-    //\r
-    // Get custom extract guided section method guid list \r
-    //\r
-    ExtractHandlerNumber = ExtractGuidedSectionGetGuidList (&ExtractHandlerGuidTable);\r
-    \r
-    //\r
-    // Install custom extraction guid PPI\r
-    //\r
-    if (ExtractHandlerNumber > 0) {\r
-      GuidPpi = (EFI_PEI_PPI_DESCRIPTOR *) AllocatePool (ExtractHandlerNumber * sizeof (EFI_PEI_PPI_DESCRIPTOR));\r
-      ASSERT (GuidPpi != NULL);\r
-      while (ExtractHandlerNumber-- > 0) {\r
-        GuidPpi->Flags = EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST;\r
-        GuidPpi->Ppi   = (VOID *) &mCustomGuidedSectionExtractionPpi;\r
-        GuidPpi->Guid  = &ExtractHandlerGuidTable[ExtractHandlerNumber];\r
-        Status = PeiServicesInstallPpi (GuidPpi++);\r
-        ASSERT_EFI_ERROR(Status);\r
-      }\r
+  //\r
+  // Get custom extract guided section method guid list \r
+  //\r
+  ExtractHandlerNumber = ExtractGuidedSectionGetGuidList (&ExtractHandlerGuidTable);\r
+  \r
+  //\r
+  // Install custom extraction guid PPI\r
+  //\r
+  if (ExtractHandlerNumber > 0) {\r
+    GuidPpi = (EFI_PEI_PPI_DESCRIPTOR *) AllocatePool (ExtractHandlerNumber * sizeof (EFI_PEI_PPI_DESCRIPTOR));\r
+    ASSERT (GuidPpi != NULL);\r
+    while (ExtractHandlerNumber-- > 0) {\r
+      GuidPpi->Flags = EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST;\r
+      GuidPpi->Ppi   = (VOID *) &mCustomGuidedSectionExtractionPpi;\r
+      GuidPpi->Guid  = &ExtractHandlerGuidTable[ExtractHandlerNumber];\r
+      Status = PeiServicesInstallPpi (GuidPpi++);\r
+      ASSERT_EFI_ERROR(Status);\r
     }\r
-    \r
   }\r
   \r
   //\r
@@ -242,20 +241,25 @@ DxeLoadCore (
                NULL,\r
                (VOID **) &PeiRecovery\r
                );\r
-    //\r
-    // Report Status code the failure of locating Recovery PPI \r
-    //\r
-    REPORT_STATUS_CODE (\r
-      EFI_ERROR_CODE | EFI_ERROR_MAJOR,\r
-      (EFI_SOFTWARE_PEI_MODULE | EFI_SW_PEI_EC_RECOVERY_PPI_NOT_FOUND)\r
-      );    \r
-    ASSERT_EFI_ERROR (Status);\r
+\r
+    if (EFI_ERROR (Status)) {\r
+      DEBUG ((DEBUG_ERROR, "Locate Recovery PPI Failed.(Status = %r)\n", Status));\r
+      //\r
+      // Report Status code the failure of locating Recovery PPI \r
+      //\r
+      REPORT_STATUS_CODE (\r
+        EFI_ERROR_CODE | EFI_ERROR_MAJOR,\r
+        (EFI_SOFTWARE_PEI_MODULE | EFI_SW_PEI_EC_RECOVERY_PPI_NOT_FOUND)\r
+        );\r
+      CpuDeadLoop ();\r
+    }\r
+\r
     REPORT_STATUS_CODE (EFI_PROGRESS_CODE, (EFI_SOFTWARE_PEI_MODULE | EFI_SW_PEI_PC_CAPSULE_LOAD));\r
     Status = PeiRecovery->LoadRecoveryCapsule (PeiServices, PeiRecovery);\r
     if (EFI_ERROR (Status)) {\r
       DEBUG ((DEBUG_ERROR, "Load Recovery Capsule Failed.(Status = %r)\n", Status));\r
       //\r
-      // Report Status code that S3Resume PPI can not be found\r
+      // Report Status code that recovery image can not be found\r
       //\r
       REPORT_STATUS_CODE (\r
         EFI_ERROR_CODE | EFI_ERROR_MAJOR,\r
@@ -269,31 +273,36 @@ DxeLoadCore (
     //\r
   }\r
 \r
-  Status = PeiServicesLocatePpi (\r
-             &gEfiPeiReadOnlyVariable2PpiGuid,\r
-             0,\r
-             NULL,\r
-             (VOID **)&Variable\r
-             );\r
-  if (!EFI_ERROR (Status)) {\r
-    DataSize = sizeof (MemoryData);\r
-    Status = Variable->GetVariable ( \r
-                         Variable, \r
-                         EFI_MEMORY_TYPE_INFORMATION_VARIABLE_NAME,\r
-                         &gEfiMemoryTypeInformationGuid,\r
-                         NULL,\r
-                         &DataSize,\r
-                         &MemoryData\r
-                         );\r
-    if (!EFI_ERROR (Status) && ValidateMemoryTypeInfoVariable(MemoryData, DataSize)) {\r
-      //\r
-      // Build the GUID'd HOB for DXE\r
-      //\r
-      BuildGuidDataHob (\r
-        &gEfiMemoryTypeInformationGuid,\r
-        MemoryData,\r
-        DataSize\r
-        );\r
+  if (GetFirstGuidHob ((CONST EFI_GUID *)&gEfiMemoryTypeInformationGuid) == NULL) {\r
+    //\r
+    // Don't build GuidHob if GuidHob has been installed.\r
+    //\r
+    Status = PeiServicesLocatePpi (\r
+               &gEfiPeiReadOnlyVariable2PpiGuid,\r
+               0,\r
+               NULL,\r
+               (VOID **)&Variable\r
+               );\r
+    if (!EFI_ERROR (Status)) {\r
+      DataSize = sizeof (MemoryData);\r
+      Status = Variable->GetVariable ( \r
+                           Variable, \r
+                           EFI_MEMORY_TYPE_INFORMATION_VARIABLE_NAME,\r
+                           &gEfiMemoryTypeInformationGuid,\r
+                           NULL,\r
+                           &DataSize,\r
+                           &MemoryData\r
+                           );\r
+      if (!EFI_ERROR (Status) && ValidateMemoryTypeInfoVariable(MemoryData, DataSize)) {\r
+        //\r
+        // Build the GUID'd HOB for DXE\r
+        //\r
+        BuildGuidDataHob (\r
+          &gEfiMemoryTypeInformationGuid,\r
+          MemoryData,\r
+          DataSize\r
+          );\r
+      }\r
     }\r
   }\r
 \r