aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Application/Loader/Loader.c25
-rw-r--r--Application/Loader/Loader.inf8
-rw-r--r--Application/Loader/Loader.vcxproj2
-rw-r--r--EfiGuardPkg.dsc7
4 files changed, 34 insertions, 8 deletions
diff --git a/Application/Loader/Loader.c b/Application/Loader/Loader.c
index a0849f0..4dc9e22 100644
--- a/Application/Loader/Loader.c
+++ b/Application/Loader/Loader.c
@@ -5,9 +5,11 @@
#include <Protocol/SimpleFileSystem.h>
#include <Protocol/LoadedImage.h>
#include <Protocol/LegacyBios.h>
+#include <Library/PcdLib.h>
#include <Library/UefiLib.h>
#include <Library/DebugLib.h>
#include <Library/MemoryAllocationLib.h>
+#include <Library/ReportStatusCodeLib.h>
#include <Library/DevicePathLib.h>
#include <Library/UefiBootServicesTableLib.h>
#include <Library/UefiBootManagerLib.h>
@@ -37,6 +39,12 @@ STATIC CHAR16* mDriverPaths[] = {
VOID
EFIAPI
+BmRepairAllControllers(
+ IN UINTN ReconnectRepairCount
+ );
+
+VOID
+EFIAPI
BmSetMemoryTypeInformationVariable(
IN BOOLEAN Boot
);
@@ -448,6 +456,13 @@ TryBootOptionsInOrder(
// Signal the EVT_SIGNAL_READY_TO_BOOT event
EfiSignalEventReadyToBoot();
+ REPORT_STATUS_CODE(EFI_PROGRESS_CODE, (EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_DXE_BS_PC_READY_TO_BOOT_EVENT));
+
+ // Repair system through DriverHealth protocol
+ BmRepairAllControllers(0);
+
+ // Save the memory map in the MemoryTypeInformation variable for resuming from ACPI S4 (hibernate)
+ BmSetMemoryTypeInformationVariable((BootOptions[Index].Attributes & LOAD_OPTION_CATEGORY) == LOAD_OPTION_CATEGORY_BOOT);
// Handle BBS entries
if (IsLegacy)
@@ -469,18 +484,12 @@ TryBootOptionsInOrder(
return !EFI_ERROR(BootOptions[Index].Status);
}
- // So again, DO NOT call this abortion:
- //BmSetMemoryTypeInformationVariable((BOOLEAN)((BootOptions[Index].Attributes & LOAD_OPTION_CATEGORY) == LOAD_OPTION_CATEGORY_BOOT));
- //
- // OK, maybe call it after all, but pretend this is *not* a boot entry, so that the system will not go into an infinite boot (reset) loop.
- // This may or may not fix hibernation related issues (S4 entry/resume). See https://github.com/Mattiwatti/EfiGuard/issues/12
- BmSetMemoryTypeInformationVariable(FALSE);
-
// Ensure the image path is connected end-to-end by Dispatch()ing any required drivers through DXE services
EfiBootManagerConnectDevicePath(BootOptions[Index].FilePath, NULL);
// Instead of creating a ramdisk and reading the file into it (¿que?), just pass the path we saved earlier.
// This is the point where the driver kicks in via its LoadImage hook.
+ REPORT_STATUS_CODE(EFI_PROGRESS_CODE, PcdGet32(PcdProgressCodeOsLoaderLoad));
EFI_HANDLE ImageHandle = NULL;
Status = gBS->LoadImage(TRUE,
gImageHandle,
@@ -499,6 +508,7 @@ TryBootOptionsInOrder(
gBS->UnloadImage(ImageHandle);
Print(L"LoadImage error %llx (%r)\r\n", Status, Status);
+ BootOptions[Index].Status = Status;
continue;
}
@@ -523,6 +533,7 @@ TryBootOptionsInOrder(
gBS->SetWatchdogTimer((UINTN)(5 * 60), 0x0000, 0x00, NULL);
// Start the image and set the return code in the boot option status
+ REPORT_STATUS_CODE(EFI_PROGRESS_CODE, PcdGet32(PcdProgressCodeOsLoaderStart));
Status = gBS->StartImage(ImageHandle,
&BootOptions[Index].ExitDataSize,
&BootOptions[Index].ExitData);
diff --git a/Application/Loader/Loader.inf b/Application/Loader/Loader.inf
index e817bd5..b400fe0 100644
--- a/Application/Loader/Loader.inf
+++ b/Application/Loader/Loader.inf
@@ -21,6 +21,7 @@
UefiBootServicesTableLib
DebugLib
UefiLib
+ ReportStatusCodeLib
DevicePathLib
PrintLib
UefiBootManagerLib
@@ -28,6 +29,8 @@
[Guids]
## SOMETIMES_PRODUCES ## Variable:L"BootCurrent" (The boot option of current boot)
gEfiGlobalVariableGuid
+ ## SOMETIMES_PRODUCES ## Variable:L"MemoryTypeInformation."
+ gEfiMemoryTypeInformationGuid ## SOMETIMES_PRODUCES
gEfiEventReadyToBootGuid ## SOMETIMES_PRODUCES
gEfiHobListGuid ## CONSUMES
gEfiDxeServicesTableGuid ## CONSUMES
@@ -55,6 +58,11 @@
gEfiSimpleTextOutProtocolGuid ## CONSUMES
gEfiLegacyBiosProtocolGuid ## CONSUMES
+[Pcd]
+ gEfiMdeModulePkgTokenSpaceGuid.PcdResetOnMemoryTypeInformationChange ## SOMETIMES_CONSUMES
+ gEfiMdeModulePkgTokenSpaceGuid.PcdProgressCodeOsLoaderLoad ## SOMETIMES_CONSUMES
+ gEfiMdeModulePkgTokenSpaceGuid.PcdProgressCodeOsLoaderStart ## SOMETIMES_CONSUMES
+
[BuildOptions.Common]
*:DEBUG_*_*_PP_FLAGS = -D EFI_DEBUG
*:DEBUG_*_*_CC_FLAGS = -D EFI_DEBUG
diff --git a/Application/Loader/Loader.vcxproj b/Application/Loader/Loader.vcxproj
index 512b624..4c4b3fa 100644
--- a/Application/Loader/Loader.vcxproj
+++ b/Application/Loader/Loader.vcxproj
@@ -25,7 +25,7 @@
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ItemDefinitionGroup>
<ClCompile>
- <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">CONFIGURE_DRIVER=1;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">CONFIGURE_DRIVER=1;_PCD_GET_MODE_32_PcdProgressCodeOsLoaderLoad=0x3058000;_PCD_GET_MODE_32_PcdProgressCodeOsLoaderStart=0x3058001;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)Include;$(EDK_PATH)\OvmfPkg\Csm\Include</AdditionalIncludeDirectories>
</ClCompile>
<Link>
diff --git a/EfiGuardPkg.dsc b/EfiGuardPkg.dsc
index 49fddb3..8d00b46 100644
--- a/EfiGuardPkg.dsc
+++ b/EfiGuardPkg.dsc
@@ -65,6 +65,13 @@
VariablePolicyHelperLib|MdeModulePkg/Library/VariablePolicyHelperLib/VariablePolicyHelperLib.inf
UefiBootManagerLib|MdeModulePkg/Library/UefiBootManagerLib/UefiBootManagerLib.inf
+[PcdsFixedAtBuild]
+ # Enable error and progress status code reporting
+ gEfiMdePkgTokenSpaceGuid.PcdReportStatusCodePropertyMask|0x03
+
+ # See https://edk2-devel.narkive.com/sSVnhXxV/edk2-bdssetmemorytypeinformationvariable
+ gEfiMdeModulePkgTokenSpaceGuid.PcdResetOnMemoryTypeInformationChange|FALSE
+
[Components]
# DXE driver
EfiGuardPkg/EfiGuardDxe/EfiGuardDxe.inf