EfiBootManagerFreeLoadOptions (BootOptions, BootOptionCount);\r
}\r
\r
+VOID\r
+RestrictBootOptionsToFirmware (\r
+ VOID\r
+ )\r
+{\r
+ EFI_BOOT_MANAGER_LOAD_OPTION *BootOptions;\r
+ UINTN BootOptionCount;\r
+ UINTN Index;\r
+\r
+ BootOptions = EfiBootManagerGetLoadOptions (\r
+ &BootOptionCount,\r
+ LoadOptionTypeBoot\r
+ );\r
+\r
+ for (Index = 0; Index < BootOptionCount; ++Index) {\r
+ EFI_DEVICE_PATH_PROTOCOL *Node1;\r
+\r
+ //\r
+ // If the device path starts with Fv(...),\r
+ // then keep the boot option.\r
+ //\r
+ Node1 = BootOptions[Index].FilePath;\r
+ if (((DevicePathType (Node1) == MEDIA_DEVICE_PATH) &&\r
+ (DevicePathSubType (Node1) == MEDIA_PIWG_FW_VOL_DP)))\r
+ {\r
+ continue;\r
+ }\r
+\r
+ //\r
+ // Delete the boot option.\r
+ //\r
+ EfiBootManagerDeleteLoadOptionVariable (\r
+ BootOptions[Index].OptionNumber,\r
+ LoadOptionTypeBoot\r
+ );\r
+ }\r
+\r
+ EfiBootManagerFreeLoadOptions (BootOptions, BootOptionCount);\r
+}\r
+\r
VOID\r
PlatformRegisterOptionsAndKeys (\r
VOID\r
Status\r
));\r
\r
- PlatformRegisterOptionsAndKeys ();\r
+ if (!FeaturePcdGet (PcdBootRestrictToFirmware)) {\r
+ PlatformRegisterOptionsAndKeys ();\r
+ }\r
\r
//\r
// Install both VIRTIO_DEVICE_PROTOCOL and (dependent) EFI_RNG_PROTOCOL\r
//\r
// Perform some platform specific connect sequence\r
//\r
- PlatformBdsConnectSequence ();\r
-\r
- EfiBootManagerRefreshAllBootOption ();\r
+ if (FeaturePcdGet (PcdBootRestrictToFirmware)) {\r
+ RestrictBootOptionsToFirmware ();\r
+ } else {\r
+ PlatformBdsConnectSequence ();\r
+ EfiBootManagerRefreshAllBootOption ();\r
+ }\r
\r
//\r
// Register UEFI Shell\r
LOAD_OPTION_ACTIVE\r
);\r
\r
+ //\r
+ // Register Grub\r
+ //\r
+ PlatformRegisterFvBootOption (\r
+ &gGrubFileGuid,\r
+ L"Grub Bootloader",\r
+ LOAD_OPTION_ACTIVE\r
+ );\r
+\r
RemoveStaleFvFileOptions ();\r
SetBootOrderFromQemu ();\r
\r
EFI_BOOT_MANAGER_LOAD_OPTION BootManagerMenu;\r
UINTN Index;\r
\r
+ if (FeaturePcdGet (PcdBootRestrictToFirmware)) {\r
+ AsciiPrint (\r
+ "%a: No bootable option was found.\n",\r
+ gEfiCallerBaseName\r
+ );\r
+ CpuDeadLoop ();\r
+ }\r
+\r
//\r
// BootManagerMenu doesn't contain the correct information when return status\r
// is EFI_NOT_FOUND.\r
gUefiOvmfPkgTokenSpaceGuid.PcdEmuVariableEvent\r
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashVariablesEnable\r
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfHostBridgePciDevId\r
+ gUefiOvmfPkgTokenSpaceGuid.PcdBootRestrictToFirmware\r
gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiS3Enable\r
gEfiMdePkgTokenSpaceGuid.PcdPlatformBootTimeOut\r
gEfiMdePkgTokenSpaceGuid.PcdUartDefaultBaudRate ## CONSUMES\r
gEfiGlobalVariableGuid\r
gRootBridgesConnectedEventGroupGuid\r
gUefiShellFileGuid\r
+ gGrubFileGuid\r
# check to decide whether to abort dispatch of the driver it is linked into.\r
gUefiOvmfPkgTokenSpaceGuid.PcdEntryPointOverrideFwCfgVarName|""|VOID*|0x68\r
\r
+ ## Restrict boot to EFI applications in firmware volumes.\r
+ gUefiOvmfPkgTokenSpaceGuid.PcdBootRestrictToFirmware|FALSE|BOOLEAN|0x6c\r
+\r
[PcdsDynamic, PcdsDynamicEx]\r
gUefiOvmfPkgTokenSpaceGuid.PcdEmuVariableEvent|0|UINT64|2\r
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashVariablesEnable|FALSE|BOOLEAN|0x10\r