18#include <Protocol/LoadedImage.h>
20#include <Protocol/SimpleTextOut.h>
22#include <Library/BaseLib.h>
23#include <Library/BaseMemoryLib.h>
24#include <Library/BaseOverflowLib.h>
28#include <Library/DevicePathLib.h>
31#include <Library/MemoryAllocationLib.h>
41#include <Library/PrintLib.h>
42#include <Library/UefiBootServicesTableLib.h>
43#include <Library/UefiRuntimeServicesTableLib.h>
44#include <Library/UefiLib.h>
45#include <Library/ResetSystemLib.h>
58 EFI_GRAPHICS_OUTPUT_PROTOCOL *Gop;
64 Status =
gBS->HandleProtocol (
65 gST->ConsoleOutHandle,
70 if (EFI_ERROR (Status)) {
78 "OCB: Saved mode %d/%d/%u - %r\n",
95 EFI_GRAPHICS_OUTPUT_PROTOCOL *Gop;
105 FoundGopMode = MAX_UINT32;
107 Status = EFI_SUCCESS;
109 Status =
gBS->HandleProtocol (
110 gST->ConsoleOutHandle,
115 if (!EFI_ERROR (Status)) {
116 FoundGopMode = Gop->Mode->Mode;
125 "OCB: Restored mode %d/%d/%u(%u) - %r\n",
148 BootContext->PickerContext->ApplePickerUnsupported
153 if (BootEntries == NULL) {
154 return EFI_OUT_OF_RESOURCES;
161 if (BootContext->DefaultEntry == NULL) {
162 BootContext->DefaultEntry = BootEntries[0];
163 BootContext->PickerContext->TimeoutSeconds = 0;
173 EFI_VARIABLE_BOOTSERVICE_ACCESS,
174 sizeof (EntryReason),
179 if (EFI_ERROR (Status)) {
180 FreePool (BootEntries);
184 Status = BootContext->PickerContext->ShowMenu (
192 FreePool (BootEntries);
200 IN CONST UINT8 *Password,
201 IN UINT32 PasswordSize,
210 PrivilegeContext->Salt,
211 PrivilegeContext->SaltSize,
212 PrivilegeContext->Hash
225 BOOLEAN HotKeysAlreadyLive;
227 if ( (PickerContext->PrivilegeContext == NULL)
228 || (PickerContext->PrivilegeContext->CurrentLevel >= Level))
233 HotKeysAlreadyLive = (PickerContext->HotKeyContext != NULL);
235 if (!HotKeysAlreadyLive) {
237 if (EFI_ERROR (Status)) {
242 Status = PickerContext->RequestPrivilege (
246 if (!EFI_ERROR (Status)) {
247 PickerContext->PrivilegeContext->CurrentLevel = Level;
250 if (!HotKeysAlreadyLive) {
268 BOOLEAN IsApplePickerSelection;
275 if (KeyMap == NULL) {
276 DEBUG ((DEBUG_ERROR,
"OCB: AppleKeyMap locate failure\n"));
277 return EFI_NOT_FOUND;
298 if (EFI_ERROR (Status)) {
299 if (Status != EFI_ABORTED) {
308 IsApplePickerSelection = FALSE;
312 if (EFI_ERROR (Status)) {
313 DEBUG ((DEBUG_WARN,
"OCB: Apple BootPicker failed - %r, fallback to builtin\n", Status));
314 Context->ApplePickerUnsupported = TRUE;
316 IsApplePickerSelection = TRUE;
324 Context->HideAuxiliary = FALSE;
332 IsApplePickerSelection = FALSE;
333 Context->BootOrder = NULL;
334 Context->BootOrderCount = 0;
342 || IsApplePickerSelection
360 if (BootContext == NULL) {
366 if (Context->HideAuxiliary || (Context->PickerCommand ==
OcPickerProtocolHotKey) || IsApplePickerSelection) {
368 Context->HideAuxiliary = FALSE;
369 if (IsApplePickerSelection) {
370 DEBUG ((DEBUG_WARN,
"OCB: Apple Picker returned no entry valid under OC, falling back to builtin\n"));
377 Context->TimeoutSeconds = 0;
384 DEBUG ((DEBUG_INFO,
"OCB: System has no boot entries, showing picker with auxiliary\n"));
390 DEBUG ((DEBUG_WARN,
"OCB: System has no boot entries\n"));
391 return EFI_NOT_FOUND;
397 "OCB: Showing menu... %a\n",
398 Context->PollAppleHotKeys ?
"(polling hotkeys)" :
""
408 if (EFI_ERROR (Status) && (Status != EFI_ABORTED)) {
410 DEBUG ((DEBUG_WARN,
"OCB: External interface ShowMenu failure, fallback to builtin - %r\n", Status));
417 if (EFI_ERROR (Status) && (Status != EFI_ABORTED)) {
418 DEBUG ((DEBUG_ERROR,
"OCB: ShowMenu failed - %r\n", Status));
424 Status = EFI_SUCCESS;
431 DEBUG ((DEBUG_INFO,
"OCB: System has no default boot entry, showing menu\n"));
437 ASSERT (!EFI_ERROR (Status) || Status == EFI_ABORTED);
439 Context->TimeoutSeconds = 0;
441 if (!EFI_ERROR (Status)) {
444 "OCB: Should boot from %u. %s (T:%d|F:%d|G:%d|E:%d|DEF:%d)\n",
465 DEBUG ((DEBUG_INFO,
"OCB: Setting default - %r\n", Status));
481 gST->ConOut->ClearScreen (
gST->ConOut);
491 if (EFI_ERROR (Status)) {
515 if (EFI_ERROR (Status)) {
548 return gRT->SetVariable (
551 EFI_VARIABLE_BOOTSERVICE_ACCESS,
552 sizeof (PickerEntryReason),
559 IN EFI_GUID *ApplicationGuid,
564 EFI_HANDLE NewHandle;
565 EFI_DEVICE_PATH_PROTOCOL *Dp;
567 DEBUG ((DEBUG_INFO,
"OCB: run fw app attempting to find %g...\n", ApplicationGuid));
571 DEBUG ((DEBUG_INFO,
"OCB: run fw app attempting to load %g...\n", ApplicationGuid));
573 Status =
gBS->LoadImage (
581 if (EFI_ERROR (Status)) {
582 Status = EFI_INVALID_PARAMETER;
585 Status = EFI_NOT_FOUND;
588 if (!EFI_ERROR (Status)) {
595 "OCB: run fw app attempting to start %g (%d) %r...\n",
600 Status =
gBS->StartImage (
606 if (EFI_ERROR (Status)) {
607 Status = EFI_UNSUPPORTED;
628 0x48, 0x83, 0xEC, 0x28, 0x80, 0x3D, 0x00, 0x00,
629 0x00, 0x00, 0x00, 0x74, 0x04, 0x33, 0xC0, 0xEB,
634 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
635 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
640 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
641 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
646 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
647 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
663 0x48, 0x53, 0x48, 0x83, 0xEC, 0x30,
664 0x80, 0x3D, 0x00, 0x00, 0x00, 0x00,0x00,
665 0x74, 0x04, 0x33, 0xDB, 0xEB, 0x5A
669 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
670 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,0xFF,
671 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
675 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
676 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00,
677 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
681 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
682 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00,
683 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF
695 Status =
gBS->LocateProtocol (
701 if (EFI_ERROR (Status)) {
702 DEBUG ((DEBUG_INFO,
"OCB: Cannot locate FirmwareUI protocol - %r\n", Status));
706 "OCB: Unlock FirmwareUI incompatible protocol revision %u != %u\n",
710 Status = EFI_UNSUPPORTED;
713 if (!EFI_ERROR (Status)) {
726 if (ReplaceCount == 0) {
740 Status = EFI_SUCCESS;
741 if (ReplaceCount == 0) {
742 Status = EFI_NOT_FOUND;
745 "OCB: 0x%016LX 0x%016LX 0x%016LX\n",
746 *((UINT64 *)((UINT8 *)FirmwareUI->
ConnectGop)),
747 *((UINT64 *)(((UINT8 *)FirmwareUI->
ConnectGop) + 8)),
748 *((UINT64 *)(((UINT8 *)FirmwareUI->
ConnectGop) + 16))
753 EFI_ERROR (Status) ? DEBUG_WARN : DEBUG_INFO,
754 "OCB: FirmwareUI ConnectGop patch - %r\n",
EFI_GUID gAppleBootPickerFileGuid
EFI_GUID gAppleFirmwareUserInterfaceProtocolGuid
#define APPLE_FIRMWARE_USER_INTERFACE_PROTOCOL_REVISION
#define APPLE_PICKER_ENTRY_REASON_VARIABLE_NAME
EFI_GUID gAppleVendorVariableGuid
APPLE_PICKER_ENTRY_REASON
@ ApplePickerEntryReasonUnknown
Unknown.
EFI_CONSOLE_CONTROL_SCREEN_MODE
APPLE_KEY_MAP_AGGREGATOR_PROTOCOL * OcAppleKeyMapInstallProtocols(IN BOOLEAN Reinstall)
VOID OcKeyMapFlush(IN APPLE_KEY_MAP_AGGREGATOR_PROTOCOL *KeyMap, IN APPLE_KEY_CODE Key, IN BOOLEAN FlushConsole)
#define OC_VOICE_OVER_AUDIO_FILE_LOADING
#define OC_VOICE_OVER_AUDIO_FILE_SELECTED
#define OC_VOICE_OVER_AUDIO_FILE_DEFAULT
#define OC_VOICE_OVER_AUDIO_FILE_EXECUTION_FAILURE
#define OC_VOICE_OVER_AUDIO_FILE_EXECUTION_SUCCESSFUL
#define OC_VOICE_OVER_AUDIO_BASE_TYPE_OPEN_CORE
#define OC_VOICE_OVER_AUDIO_FILE_WELCOME
STATIC CONST UINT8 AltConnectGopPrologueMask[]
EFI_STATUS InternalRunRequestPrivilege(IN OC_PICKER_CONTEXT *PickerContext, IN OC_PRIVILEGE_LEVEL Level)
STATIC CONST UINT8 AltConnectGopReplace[]
STATIC CONST UINT8 AltConnectGopPrologue[]
STATIC CONST UINT8 ConnectGopPrologue[]
STATIC CONST UINT8 ConnectGopReplaceMask[]
STATIC UINT32 mSavedGopMode
EFI_STATUS OcRunBootPicker(IN OC_PICKER_CONTEXT *Context)
EFI_STATUS OcRunFirmwareApplication(IN EFI_GUID *ApplicationGuid, IN BOOLEAN SetReason)
STATIC CONST UINT8 AltConnectGopReplaceMask[]
STATIC EFI_CONSOLE_CONTROL_SCREEN_MODE mSavedConsoleControlMode
STATIC EFI_STATUS SaveMode(VOID)
STATIC EFI_STATUS SetPickerEntryReason(IN APPLE_PICKER_ENTRY_REASON PickerEntryReason)
STATIC EFI_STATUS RestoreMode(VOID)
STATIC INT32 mSavedConsoleMode
STATIC CONST UINT8 ConnectGopReplace[]
BOOLEAN EFIAPI OcVerifyPassword(IN CONST UINT8 *Password, IN UINT32 PasswordSize, IN CONST OC_PRIVILEGE_CONTEXT *PrivilegeContext)
STATIC CONST UINT8 ConnectGopPrologueMask[]
EFI_STATUS OcUnlockAppleFirmwareUI(VOID)
STATIC EFI_STATUS RunShowMenu(IN OC_BOOT_CONTEXT *BootContext, OUT OC_BOOT_ENTRY **ChosenBootEntry)
EFI_STATUS OcLaunchAppleBootPicker(VOID)
@ OcPickerBootAppleRecovery
EFI_STATUS EFIAPI OcShowSimplePasswordRequest(IN OC_PICKER_CONTEXT *Context, IN OC_PRIVILEGE_LEVEL Level)
VOID OcFreeHotKeys(IN OC_PICKER_CONTEXT *Context)
#define OC_VOICE_OVER_SILENCE_NORMAL_MS
From boot.efi, constant.
OC_BOOT_CONTEXT * OcScanForBootEntries(IN OC_PICKER_CONTEXT *Context)
OC_BOOT_CONTEXT * OcScanForDefaultBootEntry(IN OC_PICKER_CONTEXT *Context, IN BOOLEAN UseBootNextOnly)
#define OC_VOICE_OVER_SIGNAL_NORMAL_MS
From boot.efi, constant.
EFI_STATUS EFIAPI OcPlayAudioFile(IN OC_PICKER_CONTEXT *Context, IN CONST CHAR8 *BasePath, IN CONST CHAR8 *BaseType, IN BOOLEAN Fallback)
EFI_STATUS OcSetDefaultBootEntry(IN OC_PICKER_CONTEXT *Context, IN OC_BOOT_ENTRY *Entry)
VOID OcImageLoaderActivate(VOID)
EFI_STATUS OcInitHotKeys(IN OUT OC_PICKER_CONTEXT *Context)
EFI_STATUS EFIAPI OcShowSimpleBootMenu(IN OC_BOOT_CONTEXT *BootContext, IN OC_BOOT_ENTRY **BootEntries, OUT OC_BOOT_ENTRY **ChosenBootEntry)
#define OC_VOICE_OVER_SIGNALS_PASSWORD_OK
Password correct for boot.efi.
EFI_STATUS EFIAPI OcPlayAudioBeep(IN OC_PICKER_CONTEXT *Context, IN UINT32 ToneCount, IN UINT32 ToneLength, IN UINT32 SilenceLength)
OC_BOOT_ENTRY ** OcEnumerateEntries(IN OC_BOOT_CONTEXT *BootContext)
EFI_STATUS EFIAPI OcPlayAudioEntry(IN OC_PICKER_CONTEXT *Context, IN OC_BOOT_ENTRY *Entry)
EFI_STATUS OcLoadBootEntry(IN OC_PICKER_CONTEXT *Context, IN OC_BOOT_ENTRY *BootEntry, IN EFI_HANDLE ParentHandle)
VOID OcFreeBootContext(IN OUT OC_BOOT_CONTEXT *Context)
EFI_CONSOLE_CONTROL_SCREEN_MODE OcConsoleControlSetMode(IN EFI_CONSOLE_CONTROL_SCREEN_MODE Mode)
#define OC_CONSOLE_MARK_UNCONTROLLED
EFI_CONSOLE_CONTROL_SCREEN_MODE OcConsoleControlGetMode(VOID)
BOOLEAN OcVerifyPasswordSha512(IN CONST UINT8 *Password, IN UINT32 PasswordSize, IN CONST UINT8 *Salt, IN UINT32 SaltSize, IN CONST UINT8 *RefHash)
EFI_DEVICE_PATH_PROTOCOL * OcCreateFvFileDevicePath(IN EFI_GUID *FileGuid)
#define SECONDS_TO_MICROSECONDS(x)
UINT32 ApplyPatch(IN CONST UINT8 *Pattern, IN CONST UINT8 *PatternMask OPTIONAL, IN CONST UINT32 PatternSize, IN CONST UINT8 *Replace, IN CONST UINT8 *ReplaceMask OPTIONAL, IN UINT8 *Data, IN UINT32 DataSize, IN UINT32 Count, IN UINT32 Skip)
OC_FIRMWARE_RUNTIME_PROTOCOL * OcDisableNvramProtection(VOID)
VOID OcRestoreNvramProtection(IN OC_FIRMWARE_RUNTIME_PROTOCOL *FwRuntime)
EFI_RUNTIME_SERVICES * gRT
EFI_GUID gEfiGraphicsOutputProtocolGuid
USER_INTERFACE_CONNECT_GOP ConnectGop
OC_BOOT_ENTRY * DefaultEntry
OC_PICKER_CONTEXT * PickerContext
OC_REQ_PRIVILEGE RequestPrivilege