OpenCore  1.0.4
OpenCore Bootloader
Loading...
Searching...
No Matches
OpenCoreMisc.c
Go to the documentation of this file.
1
16
17#include <Library/OcMainLib.h>
18
19#include <Guid/AppleVariable.h>
20#include <Guid/OcVariable.h>
21
22#include <Library/BaseLib.h>
23#include <Library/DebugLib.h>
24#include <Library/DevicePathLib.h>
25#include <Library/MemoryAllocationLib.h>
26#include <Library/OcAcpiLib.h>
29#include <Library/OcAudioLib.h>
32#include <Library/OcCpuLib.h>
36#include <Library/OcSmbiosLib.h>
37#include <Library/OcStringLib.h>
39#include <Library/PcdLib.h>
40#include <Library/PrintLib.h>
41#include <Library/SerialPortLib.h>
42#include <Library/UefiBootServicesTableLib.h>
43#include <Library/UefiRuntimeServicesTableLib.h>
44
46
47#include <ShimVars.h>
48
49STATIC
50VOID
52 IN EFI_DEVICE_PATH_PROTOCOL *LoadPath OPTIONAL
53 )
54{
55 EFI_STATUS Status;
56 CHAR16 *DevicePath;
57 CHAR8 OutPath[256];
58
59 if (LoadPath != NULL) {
60 DevicePath = ConvertDevicePathToText (LoadPath, FALSE, FALSE);
61 if (DevicePath != NULL) {
62 AsciiSPrint (OutPath, sizeof (OutPath), "%s", DevicePath);
63 FreePool (DevicePath);
64 } else {
65 LoadPath = NULL;
66 }
67 }
68
69 if (LoadPath == NULL) {
70 AsciiSPrint (OutPath, sizeof (OutPath), "Unknown");
71 }
72
73 Status = OcSetSystemVariable (
76 AsciiStrSize (OutPath),
77 OutPath,
78 NULL
79 );
80
81 DEBUG ((
82 EFI_ERROR (Status) ? DEBUG_WARN : DEBUG_INFO,
83 "OC: Setting NVRAM %g:%s = %a - %r\n",
86 OutPath,
87 Status
88 ));
89}
90
91STATIC
92EFI_STATUS
94 IN EFI_HANDLE VolumeHandle
95 )
96{
97 EFI_STATUS Status;
98 EFI_FILE_PROTOCOL *Fs;
99 EFI_FILE_PROTOCOL *SysReport;
100 EFI_FILE_PROTOCOL *SubReport;
101 OC_CPU_INFO CpuInfo;
102
103 OcCpuScanProcessor (&CpuInfo);
104
105 if (VolumeHandle != NULL) {
106 Fs = OcLocateRootVolume (VolumeHandle, NULL);
107 } else {
108 Fs = NULL;
109 }
110
111 if (Fs == NULL) {
112 Status = OcFindWritableFileSystem (&Fs);
113 if (EFI_ERROR (Status)) {
114 DEBUG ((DEBUG_INFO, "OC: No usable filesystem for report - %r\n", Status));
115 return EFI_NOT_FOUND;
116 }
117 }
118
119 Status = OcSafeFileOpen (
120 Fs,
121 &SysReport,
122 L"SysReport",
123 EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE,
124 EFI_FILE_DIRECTORY
125 );
126 if (!EFI_ERROR (Status)) {
127 DEBUG ((DEBUG_INFO, "OC: Report is already created, skipping\n"));
128 SysReport->Close (SysReport);
129 Fs->Close (Fs);
130 return EFI_ALREADY_STARTED;
131 }
132
133 Status = OcSafeFileOpen (
134 Fs,
135 &SysReport,
136 L"SysReport",
137 EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE | EFI_FILE_MODE_CREATE,
138 EFI_FILE_DIRECTORY
139 );
140 if (EFI_ERROR (Status)) {
141 DEBUG ((DEBUG_INFO, "OC: Cannot create SysReport - %r\n", Status));
142 Fs->Close (Fs);
143 return Status;
144 }
145
146 Status = OcSafeFileOpen (
147 SysReport,
148 &SubReport,
149 L"ACPI",
150 EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE | EFI_FILE_MODE_CREATE,
151 EFI_FILE_DIRECTORY
152 );
153 if (!EFI_ERROR (Status)) {
154 DEBUG ((DEBUG_INFO, "OC: Dumping ACPI for report...\n"));
155 Status = AcpiDumpTables (SubReport);
156 SubReport->Close (SubReport);
157 }
158
159 DEBUG ((DEBUG_INFO, "OC: ACPI dumping - %r\n", Status));
160
161 Status = OcSafeFileOpen (
162 SysReport,
163 &SubReport,
164 L"SMBIOS",
165 EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE | EFI_FILE_MODE_CREATE,
166 EFI_FILE_DIRECTORY
167 );
168 if (!EFI_ERROR (Status)) {
169 DEBUG ((DEBUG_INFO, "OC: Dumping SMBIOS for report...\n"));
170 Status = OcSmbiosDump (SubReport);
171 SubReport->Close (SubReport);
172 }
173
174 DEBUG ((DEBUG_INFO, "OC: SMBIOS dumping - %r\n", Status));
175
176 Status = OcSafeFileOpen (
177 SysReport,
178 &SubReport,
179 L"Audio",
180 EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE | EFI_FILE_MODE_CREATE,
181 EFI_FILE_DIRECTORY
182 );
183 if (!EFI_ERROR (Status)) {
184 DEBUG ((DEBUG_INFO, "OC: Dumping audio for report...\n"));
185 Status = OcAudioDump (SubReport);
186 SubReport->Close (SubReport);
187 }
188
189 DEBUG ((DEBUG_INFO, "OC: Audio dumping - %r\n", Status));
190
191 Status = OcSafeFileOpen (
192 SysReport,
193 &SubReport,
194 L"CPU",
195 EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE | EFI_FILE_MODE_CREATE,
196 EFI_FILE_DIRECTORY
197 );
198 if (!EFI_ERROR (Status)) {
199 DEBUG ((DEBUG_INFO, "OC: Dumping CPUInfo for report...\n"));
200 Status = OcCpuInfoDump (&CpuInfo, SubReport);
201 SubReport->Close (SubReport);
202 }
203
204 DEBUG ((DEBUG_INFO, "OC: CPUInfo dumping - %r\n", Status));
205
206 Status = OcSafeFileOpen (
207 SysReport,
208 &SubReport,
209 L"PCI",
210 EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE | EFI_FILE_MODE_CREATE,
211 EFI_FILE_DIRECTORY
212 );
213 if (!EFI_ERROR (Status)) {
214 DEBUG ((DEBUG_INFO, "OC: Dumping PCIInfo for report...\n"));
215 Status = OcPciInfoDump (SubReport);
216 SubReport->Close (SubReport);
217 }
218
219 DEBUG ((DEBUG_INFO, "OC: PCIInfo dumping - %r\n", Status));
220
221 Status = OcSafeFileOpen (
222 SysReport,
223 &SubReport,
224 L"GOP",
225 EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE | EFI_FILE_MODE_CREATE,
226 EFI_FILE_DIRECTORY
227 );
228 if (!EFI_ERROR (Status)) {
229 DEBUG ((DEBUG_INFO, "OC: Dumping GOPInfo for report...\n"));
230 Status = OcGopInfoDump (SubReport);
231 SubReport->Close (SubReport);
232 }
233
234 DEBUG ((DEBUG_INFO, "OC: GOPInfo dumping - %r\n", Status));
235
236 Status = OcSafeFileOpen (
237 SysReport,
238 &SubReport,
239 L"Drivers",
240 EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE | EFI_FILE_MODE_CREATE,
241 EFI_FILE_DIRECTORY
242 );
243 if (!EFI_ERROR (Status)) {
244 DEBUG ((DEBUG_INFO, "OC: Dumping DriverImageNames for report...\n"));
245 Status = OcDriverInfoDump (SubReport);
246 SubReport->Close (SubReport);
247 }
248
249 DEBUG ((DEBUG_INFO, "OC: DriverImageNames dumping - %r\n", Status));
250
251 SysReport->Close (SysReport);
252 Fs->Close (Fs);
253
254 return EFI_SUCCESS;
255}
256
257STATIC
258EFI_STATUS
259EFIAPI
261 IN OC_STORAGE_CONTEXT *Storage,
262 IN OC_BOOT_ENTRY *ChosenEntry,
263 OUT VOID **Data,
264 OUT UINT32 *DataSize,
265 OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath,
266 OUT EFI_HANDLE *StorageHandle,
267 OUT EFI_DEVICE_PATH_PROTOCOL **StoragePath,
268 IN OC_DMG_LOADING_SUPPORT DmgLoading,
269 OUT OC_APPLE_DISK_IMAGE_PRELOAD_CONTEXT *DmgPreloadContext,
270 OUT VOID **CustomFreeContext
271 )
272{
273 EFI_STATUS Status;
274 CHAR16 ToolPath[OC_STORAGE_SAFE_PATH_MAX];
275
276 Status = OcUnicodeSafeSPrint (
277 ToolPath,
278 sizeof (ToolPath),
280 ChosenEntry->PathName
281 );
282 if (EFI_ERROR (Status)) {
283 DEBUG ((
284 DEBUG_ERROR,
285 "OC: Tool %s%s does not fit path!\n",
287 ChosenEntry->PathName
288 ));
289 return EFI_NOT_FOUND;
290 }
291
293 Storage,
294 ToolPath,
295 DataSize
296 );
297 if (*Data == NULL) {
298 DEBUG ((
299 DEBUG_WARN,
300 "OC: Tool %s cannot be found!\n",
301 ToolPath
302 ));
303 return EFI_NOT_FOUND;
304 }
305
306 Status = OcStorageGetInfo (
307 Storage,
308 ToolPath,
309 DevicePath,
310 StorageHandle,
311 StoragePath,
312 ChosenEntry->ExposeDevicePath
313 );
314 if (!EFI_ERROR (Status)) {
315 DEBUG ((DEBUG_INFO, "OC: Returning tool %s\n", ToolPath));
316 DebugPrintDevicePath (DEBUG_INFO, "OC: Tool path", *DevicePath);
317 DebugPrintDevicePath (DEBUG_INFO, "OC: Storage path", *StoragePath);
318 }
319
320 return EFI_SUCCESS;
321}
322
323STATIC
324VOID
326 IN OC_STORAGE_CONTEXT *Storage
327 )
328{
329 EFI_STATUS Status;
330 VOID *PanicLog;
331 EFI_FILE_PROTOCOL *RootFs;
332 UINT32 PanicLogSize;
333 EFI_TIME PanicLogDate;
334 CHAR16 PanicLogName[32];
335
336 PanicLog = OcReadApplePanicLog (&PanicLogSize);
337 if (PanicLog != NULL) {
338 Status = gRT->GetTime (&PanicLogDate, NULL);
339 if (EFI_ERROR (Status)) {
340 ZeroMem (&PanicLogDate, sizeof (PanicLogDate));
341 }
342
343 UnicodeSPrint (
344 PanicLogName,
345 sizeof (PanicLogName),
346 L"panic-%04u-%02u-%02u-%02u%02u%02u.txt",
347 (UINT32)PanicLogDate.Year,
348 (UINT32)PanicLogDate.Month,
349 (UINT32)PanicLogDate.Day,
350 (UINT32)PanicLogDate.Hour,
351 (UINT32)PanicLogDate.Minute,
352 (UINT32)PanicLogDate.Second
353 );
354
355 Status = Storage->FileSystem->OpenVolume (
356 Storage->FileSystem,
357 &RootFs
358 );
359 if (!EFI_ERROR (Status)) {
360 Status = OcSetFileData (RootFs, PanicLogName, PanicLog, PanicLogSize);
361 RootFs->Close (RootFs);
362 }
363
364 DEBUG ((DEBUG_INFO, "OC: Saving %u byte panic log %s - %r\n", PanicLogSize, PanicLogName, Status));
365 FreePool (PanicLog);
366 } else {
367 DEBUG ((DEBUG_INFO, "OC: Panic log does not exist\n"));
368 }
369}
370
371CONST CHAR8 *
373 VOID
374 )
375{
376 UINT32 Month;
377
383 "OPEN_CORE_VERSION must follow X.Y.Z format, where X.Y.Z are single digits."
384 );
385
387 L_STR_LEN (OPEN_CORE_TARGET) == 3,
388 "OPEN_CORE_TARGET must follow XYZ format, where XYZ is build target."
389 );
390
391 STATIC CHAR8 mOpenCoreVersion[] = {
392 /* [2]:[0] = */ OPEN_CORE_TARGET
393 /* [3] = */ "-"
394 /* [6]:[4] = */ "XXX"
395 /* [7] = */ "-"
396 /* [12]:[8] = */ "YYYY-"
397 /* [15]:[13] = */ "MM-"
398 /* [17]:[16] = */ "DD"
399 };
400
401 STATIC BOOLEAN mOpenCoreVersionReady;
402
403 if (!mOpenCoreVersionReady) {
404 mOpenCoreVersion[4] = OPEN_CORE_VERSION[0];
405 mOpenCoreVersion[5] = OPEN_CORE_VERSION[2];
406 mOpenCoreVersion[6] = OPEN_CORE_VERSION[4];
407
408 mOpenCoreVersion[8] = __DATE__[7];
409 mOpenCoreVersion[9] = __DATE__[8];
410 mOpenCoreVersion[10] = __DATE__[9];
411 mOpenCoreVersion[11] = __DATE__[10];
412
413 Month =
414 (__DATE__[0] == 'J' && __DATE__[1] == 'a' && __DATE__[2] == 'n') ? 1 :
415 (__DATE__[0] == 'F' && __DATE__[1] == 'e' && __DATE__[2] == 'b') ? 2 :
416 (__DATE__[0] == 'M' && __DATE__[1] == 'a' && __DATE__[2] == 'r') ? 3 :
417 (__DATE__[0] == 'A' && __DATE__[1] == 'p' && __DATE__[2] == 'r') ? 4 :
418 (__DATE__[0] == 'M' && __DATE__[1] == 'a' && __DATE__[2] == 'y') ? 5 :
419 (__DATE__[0] == 'J' && __DATE__[1] == 'u' && __DATE__[2] == 'n') ? 6 :
420 (__DATE__[0] == 'J' && __DATE__[1] == 'u' && __DATE__[2] == 'l') ? 7 :
421 (__DATE__[0] == 'A' && __DATE__[1] == 'u' && __DATE__[2] == 'g') ? 8 :
422 (__DATE__[0] == 'S' && __DATE__[1] == 'e' && __DATE__[2] == 'p') ? 9 :
423 (__DATE__[0] == 'O' && __DATE__[1] == 'c' && __DATE__[2] == 't') ? 10 :
424 (__DATE__[0] == 'N' && __DATE__[1] == 'o' && __DATE__[2] == 'v') ? 11 :
425 (__DATE__[0] == 'D' && __DATE__[1] == 'e' && __DATE__[2] == 'c') ? 12 : 0;
426
427 mOpenCoreVersion[13] = Month < 10 ? '0' : '1';
428 mOpenCoreVersion[14] = '0' + (Month % 10);
429 mOpenCoreVersion[16] = __DATE__[4] >= '0' ? __DATE__[4] : '0';
430 mOpenCoreVersion[17] = __DATE__[5];
431
432 mOpenCoreVersionReady = TRUE;
433 }
434
435 return mOpenCoreVersion;
436}
437
438EFI_STATUS
440 IN OC_STORAGE_CONTEXT *Storage,
441 OUT OC_GLOBAL_CONFIG *Config,
442 IN OC_RSA_PUBLIC_KEY *VaultKey OPTIONAL
443 )
444{
445 EFI_STATUS Status;
446 CHAR8 *ConfigData;
447 UINT32 ConfigDataSize;
448 EFI_TIME BootTime;
449 CONST CHAR8 *AsciiVault;
450 OCS_VAULT_MODE Vault;
451 UINTN PciDeviceInfoSize;
452
453 ConfigData = OcStorageReadFileUnicode (
454 Storage,
456 &ConfigDataSize
457 );
458
459 if (ConfigData != NULL) {
460 DEBUG ((DEBUG_INFO, "OC: Loaded configuration of %u bytes\n", ConfigDataSize));
461
462 Status = OcConfigurationInit (Config, ConfigData, ConfigDataSize, NULL);
463 if (EFI_ERROR (Status)) {
464 DEBUG ((DEBUG_ERROR, "OC: Failed to parse configuration!\n"));
465 CpuDeadLoop ();
466 return EFI_UNSUPPORTED;
467 }
468
469 FreePool (ConfigData);
470 } else {
471 DEBUG ((DEBUG_ERROR, "OC: Failed to load configuration!\n"));
472 CpuDeadLoop ();
473 return EFI_UNSUPPORTED;
474 }
475
476 Status = OcShimRetainProtocol (Config->Uefi.Quirks.ShimRetainProtocol);
477 if (EFI_ERROR (Status)) {
478 DEBUG ((DEBUG_WARN, "OC: Failed to set %g:%s\n", &gShimLockGuid, SHIM_RETAIN_PROTOCOL));
479 }
480
481 OcLoadDrivers (Storage, Config, NULL, TRUE);
482
483 OcVariableInit (Config->Uefi.Quirks.ForceOcWriteFlash);
484
485 AsciiVault = OC_BLOB_GET (&Config->Misc.Security.Vault);
486 if (AsciiStrCmp (AsciiVault, "Secure") == 0) {
487 Vault = OcsVaultSecure;
488 } else if (AsciiStrCmp (AsciiVault, "Optional") == 0) {
489 Vault = OcsVaultOptional;
490 } else if (AsciiStrCmp (AsciiVault, "Basic") == 0) {
491 Vault = OcsVaultBasic;
492 } else {
493 DEBUG ((DEBUG_ERROR, "OC: Invalid Vault mode: %a\n", AsciiVault));
494 CpuDeadLoop ();
495 return EFI_UNSUPPORTED;
496 }
497
498 //
499 // Sanity check that the configuration is adequate.
500 //
501 if (!Storage->HasVault && (Vault >= OcsVaultBasic)) {
502 DEBUG ((DEBUG_ERROR, "OC: Configuration requires vault but no vault provided!\n"));
503 CpuDeadLoop ();
504 return EFI_SECURITY_VIOLATION;
505 }
506
507 if ((VaultKey == NULL) && (Vault >= OcsVaultSecure)) {
508 DEBUG ((DEBUG_ERROR, "OC: Configuration requires signed vault but no public key provided!\n"));
509 CpuDeadLoop ();
510 return EFI_SECURITY_VIOLATION;
511 }
512
513 DEBUG ((DEBUG_INFO, "OC: Watchdog status is %d\n", Config->Misc.Debug.DisableWatchDog == FALSE));
514
515 if (Config->Misc.Debug.DisableWatchDog) {
516 //
517 // boot.efi kills watchdog only in FV2 UI.
518 //
519 gBS->SetWatchdogTimer (0, 0, 0, NULL);
520 }
521
522 if (Config->Misc.Serial.Override) {
523 //
524 // Validate the size of PciDeviceInfo. Abort on error.
525 //
526 PciDeviceInfoSize = Config->Misc.Serial.Custom.PciDeviceInfo.Size;
527 if (PciDeviceInfoSize > OC_SERIAL_PCI_DEVICE_INFO_MAX_SIZE) {
528 DEBUG ((DEBUG_INFO, "OC: Aborting overriding serial port properties with borked PciDeviceInfo size %u\n", PciDeviceInfoSize));
529 } else {
530 PatchPcdSetPtr (PcdSerialPciDeviceInfo, &PciDeviceInfoSize, OC_BLOB_GET (&Config->Misc.Serial.Custom.PciDeviceInfo));
531 PatchPcdSet8 (PcdSerialRegisterAccessWidth, Config->Misc.Serial.Custom.RegisterAccessWidth);
532 PatchPcdSetBool (PcdSerialUseMmio, Config->Misc.Serial.Custom.UseMmio);
533 PatchPcdSetBool (PcdSerialUseHardwareFlowControl, Config->Misc.Serial.Custom.UseHardwareFlowControl);
534 PatchPcdSetBool (PcdSerialDetectCable, Config->Misc.Serial.Custom.DetectCable);
535 PatchPcdSet64 (PcdSerialRegisterBase, Config->Misc.Serial.Custom.RegisterBase);
536 PatchPcdSet32 (PcdSerialBaudRate, Config->Misc.Serial.Custom.BaudRate);
537 PatchPcdSet8 (PcdSerialLineControl, Config->Misc.Serial.Custom.LineControl);
538 PatchPcdSet8 (PcdSerialFifoControl, Config->Misc.Serial.Custom.FifoControl);
539 PatchPcdSet32 (PcdSerialClockRate, Config->Misc.Serial.Custom.ClockRate);
540 PatchPcdSet32 (PcdSerialExtendedTxFifoSize, Config->Misc.Serial.Custom.ExtendedTxFifoSize);
541 PatchPcdSet32 (PcdSerialRegisterStride, Config->Misc.Serial.Custom.RegisterStride);
542 }
543 }
544
545 if (Config->Misc.Serial.Init) {
546 SerialPortInitialize ();
547 }
548
550 Config->Misc.Debug.Target,
551 OC_BLOB_GET (&Config->Misc.Debug.LogModules),
552 Config->Misc.Debug.DisplayDelay,
553 (UINTN)Config->Misc.Debug.DisplayLevel,
554 (UINTN)Config->Misc.Security.HaltLevel,
556 Storage->FileSystem
557 );
558
559 DEBUG ((
560 DEBUG_INFO,
561 "OC: OpenCore %a is loading in %a mode (%d/%d)...\n",
563 AsciiVault,
564 Storage->HasVault,
565 VaultKey != NULL
566 ));
567
568 Status = gRT->GetTime (&BootTime, NULL);
569 if (!EFI_ERROR (Status)) {
570 DEBUG ((
571 DEBUG_INFO,
572 "OC: Boot timestamp - %04u.%02u.%02u %02u:%02u:%02u\n",
573 BootTime.Year,
574 BootTime.Month,
575 BootTime.Day,
576 BootTime.Hour,
577 BootTime.Minute,
578 BootTime.Second
579 ));
580 } else {
581 DEBUG ((
582 DEBUG_INFO,
583 "OC: Boot timestamp - %r\n",
584 Status
585 ));
586 }
587
588 return EFI_SUCCESS;
589}
590
600STATIC
601CHAR16 *
603 IN CONST CHAR16 *RootPath,
604 IN CONST CHAR8 *LauncherPath,
605 OUT CONST CHAR16 **MatchSuffix
606 )
607{
608 CHAR16 *BootstrapPath;
609 UINTN BootstrapSize;
610
611 //
612 // MatchSuffix allows us to reduce option duplication when switching between
613 // OpenCore versions. Using OpenCore.efi (OPEN_CORE_APP_PATH) will overwrite
614 // any option with this path (e.g. OC\OpenCore.efi and OC2\OpenCore.efi).
615 // For custom paths no deduplication happens.
616 //
617 if (AsciiStrCmp (LauncherPath, "Default") == 0) {
618 BootstrapSize = StrSize (RootPath) + L_STR_SIZE (OPEN_CORE_APP_PATH);
619 BootstrapPath = AllocatePool (BootstrapSize);
620 if (BootstrapPath == NULL) {
621 return NULL;
622 }
623
624 UnicodeSPrint (BootstrapPath, BootstrapSize, L"%s\\%s", RootPath, OPEN_CORE_APP_PATH);
625 *MatchSuffix = OPEN_CORE_APP_PATH;
626 } else {
627 BootstrapPath = AsciiStrCopyToUnicode (LauncherPath, 0);
628 if (BootstrapPath == NULL) {
629 return NULL;
630 }
631
632 *MatchSuffix = BootstrapPath;
633 }
634
635 return BootstrapPath;
636}
637
638VOID
640 IN OC_STORAGE_CONTEXT *Storage,
641 IN OC_GLOBAL_CONFIG *Config,
642 IN CONST CHAR16 *RootPath,
643 IN EFI_DEVICE_PATH_PROTOCOL *LoadPath,
644 IN EFI_HANDLE StorageHandle,
645 OUT UINT8 *Signature OPTIONAL
646 )
647{
648 EFI_STATUS Status;
649 EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *FileSystem;
650 CONST CHAR8 *LauncherOption;
651 CONST CHAR8 *LauncherPath;
652 CHAR16 *FullLauncherPath;
653 CONST CHAR16 *MatchSuffix;
654 VOID *LauncherData;
655 UINT32 LauncherSize;
656 UINT32 BootProtectFlag;
657 BOOLEAN HasFullLauncher;
658 BOOLEAN HasShortLauncher;
659 BOOLEAN HasSystemLauncher;
660
661 if ((Config->Misc.Security.ExposeSensitiveData & OCS_EXPOSE_BOOT_PATH) != 0) {
662 OcStoreLoadPath (LoadPath);
663 }
664
665 BootProtectFlag = 0;
666 LauncherOption = OC_BLOB_GET (&Config->Misc.Boot.LauncherOption);
667 LauncherPath = OC_BLOB_GET (&Config->Misc.Boot.LauncherPath);
668 DEBUG ((
669 DEBUG_INFO,
670 "OC: StorageHandle %p with %a LauncherOption pointing to %a\n",
671 StorageHandle,
672 LauncherOption,
673 LauncherPath
674 ));
675
676 //
677 // Full-form paths cause entry duplication on e.g. HP 15-ab237ne, InsydeH2O.
678 //
679 HasFullLauncher = AsciiStrCmp (LauncherOption, "Full") == 0;
680 HasShortLauncher = !HasFullLauncher && AsciiStrCmp (LauncherOption, "Short") == 0;
681 HasSystemLauncher = !HasFullLauncher && !HasShortLauncher && AsciiStrCmp (LauncherOption, "System") == 0;
682 if (!HasFullLauncher && !HasShortLauncher && !HasSystemLauncher) {
683 LauncherPath = "Default";
684 }
685
686 FullLauncherPath = BuildLauncherPath (RootPath, LauncherPath, &MatchSuffix);
687 if (FullLauncherPath != NULL) {
688 if (HasFullLauncher || HasShortLauncher) {
690 L"OpenCore",
691 StorageHandle,
692 FullLauncherPath,
693 HasShortLauncher,
694 MatchSuffix,
695 StrLen (MatchSuffix)
696 );
697 BootProtectFlag = OC_BOOT_PROTECT_VARIABLE_BOOTSTRAP;
698 }
699
700 //
701 // Note: This technically is a TOCTOU, but no Macs support Secure Boot with OC anyway.
702 //
703 if (Signature != NULL) {
704 Status = gBS->HandleProtocol (
705 StorageHandle,
707 (VOID **)&FileSystem
708 );
709 if (!EFI_ERROR (Status)) {
710 LauncherData = OcReadFile (FileSystem, FullLauncherPath, &LauncherSize, BASE_32MB);
711 if (LauncherData != NULL) {
712 Sha1 (Signature, LauncherData, LauncherSize);
713 DEBUG ((
714 DEBUG_INFO,
715 "OC: Launcher %s signature is %02X%02X%02X%02X\n",
716 FullLauncherPath,
717 Signature[0],
718 Signature[1],
719 Signature[2],
720 Signature[3]
721 ));
722 FreePool (LauncherData);
723 }
724 }
725 }
726
727 FreePool (FullLauncherPath);
728 }
729
730 //
731 // Inform about boot protection.
732 //
736 sizeof (BootProtectFlag),
737 &BootProtectFlag,
738 NULL
739 );
740}
741
742EFI_STATUS
744 IN OC_STORAGE_CONTEXT *Storage,
745 IN OC_GLOBAL_CONFIG *Config
746 )
747{
748 EFI_STATUS HibernateStatus;
749 CONST CHAR8 *HibernateMode;
750 UINT32 HibernateMask;
751
752 HibernateMode = OC_BLOB_GET (&Config->Misc.Boot.HibernateMode);
753
754 if (AsciiStrCmp (HibernateMode, "None") == 0) {
755 HibernateMask = HIBERNATE_MODE_NONE;
756 } else if (AsciiStrCmp (HibernateMode, "Auto") == 0) {
758 } else if (AsciiStrCmp (HibernateMode, "RTC") == 0) {
759 HibernateMask = HIBERNATE_MODE_RTC;
760 } else if (AsciiStrCmp (HibernateMode, "NVRAM") == 0) {
761 HibernateMask = HIBERNATE_MODE_NVRAM;
762 } else {
763 DEBUG ((DEBUG_INFO, "OC: Invalid HibernateMode: %a\n", HibernateMode));
764 HibernateMask = HIBERNATE_MODE_NONE;
765 }
766
767 DEBUG ((DEBUG_INFO, "OC: Translated HibernateMode %a to %u\n", HibernateMode, HibernateMask));
768
769 HibernateStatus = OcActivateHibernateWake (HibernateMask);
770 DEBUG ((
771 DEBUG_INFO,
772 "OC: Hibernation activation - %r, hibernation wake - %a\n",
773 HibernateStatus,
774 OcIsAppleHibernateWake () ? "yes" : "no"
775 ));
776
777 if (Config->Misc.Debug.ApplePanic) {
778 SavePanicLog (Storage);
779 }
780
781 OcAppleDebugLogConfigure (Config->Misc.Debug.AppleDebug);
782
783 return EFI_SUCCESS;
784}
785
786VOID
788 IN OC_GLOBAL_CONFIG *Config,
789 IN EFI_HANDLE LoadHandle OPTIONAL
790 )
791{
792 if ((LoadHandle != NULL) && Config->Misc.Debug.SysReport) {
793 ProduceDebugReport (LoadHandle);
794 }
795}
796
797VOID
799 IN OC_STORAGE_CONTEXT *Storage,
800 IN OC_GLOBAL_CONFIG *Config,
801 IN OC_PRIVILEGE_CONTEXT *Privilege OPTIONAL,
802 IN OC_IMAGE_START StartImage,
803 IN BOOLEAN CustomBootGuid,
804 IN EFI_HANDLE LoadHandle
805 )
806{
807 EFI_STATUS Status;
808 OC_PICKER_CONTEXT *Context;
809 OC_PICKER_MODE PickerMode;
810 OC_DMG_LOADING_SUPPORT DmgLoading;
811 UINTN ContextSize;
812 UINT32 Index;
813 UINT32 EntryIndex;
814 OC_INTERFACE_PROTOCOL *Interface;
815 UINTN BlessOverrideSize;
816 CHAR16 **BlessOverride;
817 CONST CHAR8 *AsciiPicker;
818 CONST CHAR8 *AsciiPickerVariant;
819 CONST CHAR8 *AsciiInstanceIdentifier;
820 CONST CHAR8 *AsciiDmg;
821
822 AsciiPicker = OC_BLOB_GET (&Config->Misc.Boot.PickerMode);
823
824 if (AsciiStrCmp (AsciiPicker, "Builtin") == 0) {
825 PickerMode = OcPickerModeBuiltin;
826 } else if (AsciiStrCmp (AsciiPicker, "External") == 0) {
827 PickerMode = OcPickerModeExternal;
828 } else if (AsciiStrCmp (AsciiPicker, "Apple") == 0) {
829 PickerMode = OcPickerModeApple;
830 } else {
831 DEBUG ((DEBUG_WARN, "OC: Unknown PickerMode: %a, using builtin\n", AsciiPicker));
832 PickerMode = OcPickerModeBuiltin;
833 }
834
835 AsciiPickerVariant = OC_BLOB_GET (&Config->Misc.Boot.PickerVariant);
836 AsciiInstanceIdentifier = OC_BLOB_GET (&Config->Misc.Boot.InstanceIdentifier);
837
838 AsciiDmg = OC_BLOB_GET (&Config->Misc.Security.DmgLoading);
839
840 if (AsciiStrCmp (AsciiDmg, "Disabled") == 0) {
841 DmgLoading = OcDmgLoadingDisabled;
842 } else if (AsciiStrCmp (AsciiDmg, "Any") == 0) {
843 DmgLoading = OcDmgLoadingAnyImage;
844 } else if (AsciiStrCmp (AsciiDmg, "Signed") == 0) {
845 DmgLoading = OcDmgLoadingAppleSigned;
846 } else {
847 DEBUG ((DEBUG_WARN, "OC: Unknown DmgLoading: %a, using Signed\n", AsciiDmg));
848 DmgLoading = OcDmgLoadingAppleSigned;
849 }
850
851 //
852 // Do not use our boot picker unless asked.
853 //
854 if (PickerMode == OcPickerModeExternal) {
855 DEBUG ((DEBUG_INFO, "OC: Handing off to external boot controller\n"));
856
857 Status = gBS->LocateProtocol (
859 NULL,
860 (VOID **)&Interface
861 );
862 if (!EFI_ERROR (Status)) {
863 if (Interface->Revision != OC_INTERFACE_REVISION) {
864 DEBUG ((
865 DEBUG_INFO,
866 "OC: Incompatible external GUI protocol - %u vs %u\n",
867 Interface->Revision,
869 ));
870 Interface = NULL;
871 }
872 } else {
873 DEBUG ((DEBUG_INFO, "OC: Missing external GUI protocol - %r\n", Status));
874 Interface = NULL;
875 }
876 } else {
877 Interface = NULL;
878 }
879
880 //
881 // Due to the file size and sanity guarantees OcXmlLib makes,
882 // adding Counts cannot overflow.
883 //
884 if (!BaseOverflowMulAddUN (
885 sizeof (OC_PICKER_ENTRY),
886 Config->Misc.Entries.Count + Config->Misc.Tools.Count,
887 sizeof (OC_PICKER_CONTEXT),
888 &ContextSize
889 ))
890 {
891 Context = AllocateZeroPool (ContextSize);
892 } else {
893 Context = NULL;
894 }
895
896 if (Context == NULL) {
897 DEBUG ((DEBUG_ERROR, "OC: Failed to allocate boot picker context!\n"));
898 return;
899 }
900
901 if (Config->Misc.BlessOverride.Count > 0) {
902 if (!BaseOverflowMulUN (
903 Config->Misc.BlessOverride.Count,
904 sizeof (*BlessOverride),
905 &BlessOverrideSize
906 ))
907 {
908 BlessOverride = AllocateZeroPool (BlessOverrideSize);
909 } else {
910 BlessOverride = NULL;
911 }
912
913 if (BlessOverride == NULL) {
914 FreePool (Context);
915 DEBUG ((DEBUG_ERROR, "OC: Failed to allocate bless overrides!\n"));
916 return;
917 }
918
919 for (Index = 0; Index < Config->Misc.BlessOverride.Count; ++Index) {
920 BlessOverride[Index] = AsciiStrCopyToUnicode (
922 Config->Misc.BlessOverride.Values[Index]
923 ),
924 0
925 );
926 if (BlessOverride[Index] == NULL) {
927 for (EntryIndex = 0; EntryIndex < Index; ++EntryIndex) {
928 FreePool (BlessOverride[EntryIndex]);
929 }
930
931 FreePool (BlessOverride);
932 FreePool (Context);
933 DEBUG ((DEBUG_ERROR, "OC: Failed to allocate bless overrides!\n"));
934 return;
935 }
936 }
937
938 Context->NumCustomBootPaths = Config->Misc.BlessOverride.Count;
939 Context->CustomBootPaths = BlessOverride;
940 }
941
942 Context->ScanPolicy = Config->Misc.Security.ScanPolicy;
943 Context->DmgLoading = DmgLoading;
944 Context->TimeoutSeconds = Config->Misc.Boot.Timeout;
945 Context->TakeoffDelay = Config->Misc.Boot.TakeoffDelay;
946 Context->StartImage = StartImage;
947 Context->CustomBootGuid = CustomBootGuid;
948 Context->LoaderHandle = LoadHandle;
949 Context->StorageContext = Storage;
950 Context->CustomRead = OcToolLoadEntry;
951 Context->PrivilegeContext = Privilege;
961 Context->PickerMode = PickerMode;
962 Context->ConsoleAttributes = Config->Misc.Boot.ConsoleAttributes;
963 Context->PickerAttributes = Config->Misc.Boot.PickerAttributes;
964 Context->PickerVariant = AsciiPickerVariant;
965 Context->InstanceIdentifier = AsciiInstanceIdentifier;
966 Context->BlacklistAppleUpdate = Config->Misc.Security.BlacklistAppleUpdate;
967
968 if ((Config->Misc.Security.ExposeSensitiveData & OCS_EXPOSE_VERSION_UI) != 0) {
970 }
971
972 Status = OcHandleRecoveryRequest (
973 &Context->RecoveryInitiator
974 );
975
976 if (!EFI_ERROR (Status)) {
978 } else if (Config->Misc.Boot.ShowPicker && !Config->Misc.Boot.HibernateSkipsPicker) {
980 } else if (Config->Misc.Boot.ShowPicker && Config->Misc.Boot.HibernateSkipsPicker) {
981 if (OcIsAppleHibernateWake ()) {
983 } else {
985 }
986 } else {
988 }
989
990 for (Index = 0, EntryIndex = 0; Index < Config->Misc.Entries.Count; ++Index) {
991 if (Config->Misc.Entries.Values[Index]->Enabled) {
992 Context->CustomEntries[EntryIndex].Name = OC_BLOB_GET (&Config->Misc.Entries.Values[Index]->Name);
993 Context->CustomEntries[EntryIndex].Path = OC_BLOB_GET (&Config->Misc.Entries.Values[Index]->Path);
994 Context->CustomEntries[EntryIndex].Arguments = OC_BLOB_GET (&Config->Misc.Entries.Values[Index]->Arguments);
995 Context->CustomEntries[EntryIndex].Flavour = OC_BLOB_GET (&Config->Misc.Entries.Values[Index]->Flavour);
996 Context->CustomEntries[EntryIndex].Auxiliary = Config->Misc.Entries.Values[Index]->Auxiliary;
997 Context->CustomEntries[EntryIndex].Tool = FALSE;
998 Context->CustomEntries[EntryIndex].TextMode = Config->Misc.Entries.Values[Index]->TextMode;
999 Context->CustomEntries[EntryIndex].RealPath = TRUE;
1000 Context->CustomEntries[EntryIndex].FullNvramAccess = FALSE;
1001 ++EntryIndex;
1002 }
1003 }
1004
1005 Context->AbsoluteEntryCount = EntryIndex;
1006 //
1007 // Due to the file size and sanity guarantees OcXmlLib makes,
1008 // EntryIndex cannot overflow.
1009 //
1010 for (Index = 0; Index < Config->Misc.Tools.Count; ++Index) {
1011 if (Config->Misc.Tools.Values[Index]->Enabled) {
1012 Context->CustomEntries[EntryIndex].Name = OC_BLOB_GET (&Config->Misc.Tools.Values[Index]->Name);
1013 Context->CustomEntries[EntryIndex].Path = OC_BLOB_GET (&Config->Misc.Tools.Values[Index]->Path);
1014 Context->CustomEntries[EntryIndex].Arguments = OC_BLOB_GET (&Config->Misc.Tools.Values[Index]->Arguments);
1015 Context->CustomEntries[EntryIndex].Flavour = OC_BLOB_GET (&Config->Misc.Tools.Values[Index]->Flavour);
1016 Context->CustomEntries[EntryIndex].Auxiliary = Config->Misc.Tools.Values[Index]->Auxiliary;
1017 Context->CustomEntries[EntryIndex].Tool = TRUE;
1018 Context->CustomEntries[EntryIndex].TextMode = Config->Misc.Tools.Values[Index]->TextMode;
1019 Context->CustomEntries[EntryIndex].RealPath = Config->Misc.Tools.Values[Index]->RealPath;
1020 Context->CustomEntries[EntryIndex].FullNvramAccess = Config->Misc.Tools.Values[Index]->FullNvramAccess;
1021 ++EntryIndex;
1022 }
1023 }
1024
1025 Context->AllCustomEntryCount = EntryIndex;
1026 Context->PollAppleHotKeys = Config->Misc.Boot.PollAppleHotKeys;
1027 Context->HideAuxiliary = Config->Misc.Boot.HideAuxiliary;
1028 Context->PickerAudioAssist = Config->Misc.Boot.PickerAudioAssist;
1029
1030 OcPreLocateAudioProtocol (Context);
1031
1032 DEBUG ((DEBUG_INFO, "OC: Ready for takeoff in %u us\n", (UINT32)Context->TakeoffDelay));
1033
1034 OcLoadPickerHotKeys (Context);
1035
1036 Context->AllowSetDefault = Config->Misc.Security.AllowSetDefault;
1037
1038 if (Interface != NULL) {
1039 Status = Interface->PopulateContext (Interface, Storage, Context);
1040 if (EFI_ERROR (Status)) {
1041 DEBUG ((DEBUG_WARN, "OC: External interface failure, fallback to builtin - %r\n", Status));
1042 }
1043 }
1044
1045 Status = OcRunBootPicker (Context);
1046
1047 if (EFI_ERROR (Status)) {
1048 DEBUG ((DEBUG_ERROR, "OC: Failed to show boot menu!\n"));
1049 }
1050}
1051
1052VOID
1054 IN OC_GLOBAL_CONFIG *Config
1055 )
1056{
1057 if ( ( ((Config->Misc.Security.ScanPolicy & OC_SCAN_FILE_SYSTEM_LOCK) == 0)
1058 && ((Config->Misc.Security.ScanPolicy & OC_SCAN_FILE_SYSTEM_BITS) != 0))
1059 || ( ((Config->Misc.Security.ScanPolicy & OC_SCAN_DEVICE_LOCK) == 0)
1060 && ((Config->Misc.Security.ScanPolicy & OC_SCAN_DEVICE_BITS) != 0)))
1061 {
1062 DEBUG ((DEBUG_ERROR, "OC: Invalid ScanPolicy %X\n", Config->Misc.Security.ScanPolicy));
1063 CpuDeadLoop ();
1064 }
1065
1066 //
1067 // Inform drivers about our scan policy.
1068 //
1072 sizeof (Config->Misc.Security.ScanPolicy),
1073 &Config->Misc.Security.ScanPolicy,
1074 NULL
1075 );
1076}
UINT8 Signature[8]
Definition BiosId.h:67
EFI_STATUS AcpiDumpTables(IN EFI_FILE_PROTOCOL *Root)
Definition AcpiDump.c:102
EFI_STATUS OcAudioDump(IN EFI_FILE_PROTOCOL *Root)
STATIC_ASSERT(BYTES_PER_PIXEL==sizeof(UINT32), "Non 4-byte pixels are unsupported!")
EFI_STATUS OcRegisterBootstrapBootOption(IN CONST CHAR16 *OptionName, IN EFI_HANDLE DeviceHandle, IN CONST CHAR16 *FilePath, IN BOOLEAN ShortForm, IN CONST CHAR16 *MatchSuffix, IN UINTN MatchSuffixLen)
EFI_STATUS EFIAPI OcGetBootEntryIcon(IN OC_PICKER_CONTEXT *Context, IN OC_BOOT_ENTRY *BootEntry, OUT VOID **ImageData, OUT UINT32 *DataLength)
#define HIBERNATE_MODE_NONE
@ OcPickerShowPicker
@ OcPickerBootAppleRecovery
@ OcPickerDefault
EFI_STATUS OcActivateHibernateWake(IN UINT32 HibernateMask)
VOID * OcReadApplePanicLog(OUT UINT32 *PanicSize)
Definition ApplePanic.c:242
#define HIBERNATE_MODE_NVRAM
EFI_STATUS EFIAPI OcShowSimplePasswordRequest(IN OC_PICKER_CONTEXT *Context, IN OC_PRIVILEGE_LEVEL Level)
VOID EFIAPI OcToggleVoiceOver(IN OC_PICKER_CONTEXT *Context, IN CONST CHAR8 *BasePath OPTIONAL, IN CONST CHAR8 *BaseType OPTIONAL)
Definition BootAudio.c:255
#define HIBERNATE_MODE_RTC
#define OC_SCAN_DEVICE_LOCK
EFI_STATUS OcRunBootPicker(IN OC_PICKER_CONTEXT *Context)
EFI_STATUS EFIAPI OcGetBootEntryLabelImage(IN OC_PICKER_CONTEXT *Context, IN OC_BOOT_ENTRY *BootEntry, IN UINT8 Scale, OUT VOID **ImageData, OUT UINT32 *DataLength)
EFI_STATUS EFIAPI OcPlayAudioFile(IN OC_PICKER_CONTEXT *Context, IN CONST CHAR8 *BasePath, IN CONST CHAR8 *BaseType, IN BOOLEAN Fallback)
Definition BootAudio.c:77
enum OC_PICKER_MODE_ OC_PICKER_MODE
EFI_STATUS EFIAPI OcPreLocateAudioProtocol(IN OC_PICKER_CONTEXT *Context)
Definition BootAudio.c:53
OC_DMG_LOADING_SUPPORT
@ OcDmgLoadingAnyImage
@ OcDmgLoadingDisabled
@ OcDmgLoadingAppleSigned
EFI_STATUS EFIAPI OcShowSimpleBootMenu(IN OC_BOOT_CONTEXT *BootContext, IN OC_BOOT_ENTRY **BootEntries, OUT OC_BOOT_ENTRY **ChosenBootEntry)
BOOLEAN OcIsAppleHibernateWake(VOID)
EFI_STATUS EFIAPI OcPlayAudioBeep(IN OC_PICKER_CONTEXT *Context, IN UINT32 ToneCount, IN UINT32 ToneLength, IN UINT32 SilenceLength)
Definition BootAudio.c:155
BOOLEAN EFIAPI OcVerifyPassword(IN CONST UINT8 *Password, IN UINT32 PasswordSize, IN CONST OC_PRIVILEGE_CONTEXT *PrivilegeContext)
#define OC_SCAN_FILE_SYSTEM_LOCK
EFI_STATUS OcHandleRecoveryRequest(OUT EFI_DEVICE_PATH_PROTOCOL **Initiator OPTIONAL)
@ OcPickerModeExternal
@ OcPickerModeApple
@ OcPickerModeBuiltin
#define OC_SCAN_DEVICE_BITS
EFI_STATUS(EFIAPI * OC_IMAGE_START)(IN OC_BOOT_ENTRY *ChosenEntry, IN EFI_HANDLE ImageHandle, OUT UINTN *ExitDataSize, OUT CHAR16 **ExitData OPTIONAL, IN BOOLEAN LaunchInText)
EFI_STATUS EFIAPI OcPlayAudioEntry(IN OC_PICKER_CONTEXT *Context, IN OC_BOOT_ENTRY *Entry)
Definition BootAudio.c:188
VOID OcLoadPickerHotKeys(IN OUT OC_PICKER_CONTEXT *Context)
#define OC_SCAN_FILE_SYSTEM_BITS
EFI_BOOT_SERVICES * gBS
@ OcsVaultOptional
@ OcsVaultBasic
@ OcsVaultSecure
#define OCS_EXPOSE_VERSION_UI
#define OC_SERIAL_PCI_DEVICE_INFO_MAX_SIZE
EFI_STATUS OcConfigurationInit(OUT OC_GLOBAL_CONFIG *Config, IN VOID *Buffer, IN UINT32 Size, IN OUT UINT32 *ErrorCount OPTIONAL)
#define OCS_EXPOSE_BOOT_PATH
EFI_STATUS OcGopInfoDump(IN EFI_FILE_PROTOCOL *Root)
Definition GopInfoDump.c:26
VOID OcCpuScanProcessor(IN OUT OC_CPU_INFO *Cpu)
Definition OcCpuLib.c:832
VOID Sha1(UINT8 *Hash, UINT8 *Data, UINTN Len)
VOID DebugPrintDevicePath(IN UINTN ErrorLevel, IN CONST CHAR8 *Message, IN EFI_DEVICE_PATH_PROTOCOL *DevicePath OPTIONAL)
EFI_STATUS OcPciInfoDump(IN EFI_FILE_PROTOCOL *Root)
EFI_STATUS OcCpuInfoDump(IN OC_CPU_INFO *CpuInfo, IN EFI_FILE_PROTOCOL *Root)
Definition CpuInfoDump.c:23
EFI_FILE_PROTOCOL * OcLocateRootVolume(IN EFI_HANDLE DeviceHandle OPTIONAL, IN EFI_DEVICE_PATH_PROTOCOL *FilePath OPTIONAL)
VOID * OcReadFile(IN CONST EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *FileSystem, IN CONST CHAR16 *FilePath, OUT UINT32 *FileSize OPTIONAL, IN CONST UINT32 MaxFileSize OPTIONAL)
Definition ReadFile.c:33
EFI_STATUS OcSetFileData(IN EFI_FILE_PROTOCOL *WritableFs OPTIONAL, IN CONST CHAR16 *FileName, IN CONST VOID *Buffer, IN UINT32 Size)
EFI_STATUS OcSafeFileOpen(IN CONST EFI_FILE_PROTOCOL *Directory, OUT EFI_FILE_PROTOCOL **NewHandle, IN CONST CHAR16 *FileName, IN CONST UINT64 OpenMode, IN CONST UINT64 Attributes)
Definition OpenFile.c:29
EFI_STATUS OcFindWritableFileSystem(IN OUT EFI_FILE_PROTOCOL **WritableFs)
#define OC_INTERFACE_REVISION
Definition OcInterface.h:27
EFI_GUID gOcInterfaceProtocolGuid
VOID OcAppleDebugLogConfigure(IN BOOLEAN Enable)
Definition OcAppleLog.c:295
EFI_STATUS OcConfigureLogProtocol(IN OC_LOG_OPTIONS Options, IN CONST CHAR8 *LogModules, IN UINT32 DisplayDelay, IN UINTN DisplayLevel, IN UINTN HaltLevel, IN CONST CHAR16 *LogPrefixPath OPTIONAL, IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *LogFileSystem OPTIONAL)
Definition OcLog.c:599
VOID OcLoadDrivers(IN OC_STORAGE_CONTEXT *Storage, IN OC_GLOBAL_CONFIG *Config, OUT EFI_HANDLE **DriversToConnect OPTIONAL, IN BOOLEAN LoadEarly)
#define OPEN_CORE_LOG_PREFIX_PATH
Definition OcMainLib.h:54
#define OPEN_CORE_TOOL_PATH
Definition OcMainLib.h:62
#define OPEN_CORE_APP_PATH
Definition OcMainLib.h:50
#define OPEN_CORE_CONFIG_PATH
Definition OcMainLib.h:52
EFI_STATUS OcDriverInfoDump(IN EFI_FILE_PROTOCOL *Root)
#define OPEN_CORE_VERSION
Definition OcMainLib.h:33
EFI_STATUS OcSmbiosDump(IN EFI_FILE_PROTOCOL *Root)
Definition SmbiosDump.c:35
VOID * OcStorageReadFileUnicode(IN OC_STORAGE_CONTEXT *Context, IN CONST CHAR16 *FilePath, OUT UINT32 *FileSize OPTIONAL)
#define OC_STORAGE_SAFE_PATH_MAX
EFI_STATUS OcStorageGetInfo(IN OC_STORAGE_CONTEXT *Context, IN CONST CHAR16 *FilePath, OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath, OUT EFI_HANDLE *StorageHandle, OUT EFI_DEVICE_PATH_PROTOCOL **StoragePath, IN BOOLEAN RealPath)
#define L_STR_LEN(String)
Definition OcStringLib.h:26
#define L_STR_SIZE(String)
Definition OcStringLib.h:35
CHAR16 * AsciiStrCopyToUnicode(IN CONST CHAR8 *String, IN UINTN Length)
Definition OcAsciiLib.c:119
EFI_STATUS EFIAPI OcUnicodeSafeSPrint(OUT CHAR16 *StartOfBuffer, IN UINTN BufferSize, IN CONST CHAR16 *FormatString,...)
#define OC_BLOB_GET(Blob)
#define OC_LOG_VARIABLE_PATH
Definition OcVariable.h:26
#define OC_BOOT_PROTECT_VARIABLE_BOOTSTRAP
Definition OcVariable.h:49
EFI_GUID gOcVendorVariableGuid
#define OC_BOOT_PROTECT_VARIABLE_NAME
Definition OcVariable.h:44
#define OC_SCAN_POLICY_VARIABLE_NAME
Definition OcVariable.h:39
EFI_STATUS OcSetSystemVariable(IN CHAR16 *VariableName, IN UINT32 Attributes, IN UINTN DataSize, IN VOID *Data, IN EFI_GUID *VendorGuid OPTIONAL)
#define OPEN_CORE_NVRAM_ATTR
#define OPEN_CORE_INT_NVRAM_ATTR
EFI_STATUS OcShimRetainProtocol(IN BOOLEAN Required)
Definition Shim.c:13
VOID OcVariableInit(IN BOOLEAN ForceOcWriteFlash)
VOID OcMiscBoot(IN OC_STORAGE_CONTEXT *Storage, IN OC_GLOBAL_CONFIG *Config, IN OC_PRIVILEGE_CONTEXT *Privilege OPTIONAL, IN OC_IMAGE_START StartImage, IN BOOLEAN CustomBootGuid, IN EFI_HANDLE LoadHandle)
STATIC CHAR16 * BuildLauncherPath(IN CONST CHAR16 *RootPath, IN CONST CHAR8 *LauncherPath, OUT CONST CHAR16 **MatchSuffix)
EFI_STATUS OcMiscEarlyInit(IN OC_STORAGE_CONTEXT *Storage, OUT OC_GLOBAL_CONFIG *Config, IN OC_RSA_PUBLIC_KEY *VaultKey OPTIONAL)
CONST CHAR8 * OcMiscGetVersionString(VOID)
STATIC VOID SavePanicLog(IN OC_STORAGE_CONTEXT *Storage)
STATIC EFI_STATUS ProduceDebugReport(IN EFI_HANDLE VolumeHandle)
STATIC VOID OcStoreLoadPath(IN EFI_DEVICE_PATH_PROTOCOL *LoadPath OPTIONAL)
EFI_STATUS OcMiscLateInit(IN OC_STORAGE_CONTEXT *Storage, IN OC_GLOBAL_CONFIG *Config)
VOID OcMiscLoadSystemReport(IN OC_GLOBAL_CONFIG *Config, IN EFI_HANDLE LoadHandle OPTIONAL)
VOID OcMiscMiddleInit(IN OC_STORAGE_CONTEXT *Storage, IN OC_GLOBAL_CONFIG *Config, IN CONST CHAR16 *RootPath, IN EFI_DEVICE_PATH_PROTOCOL *LoadPath, IN EFI_HANDLE StorageHandle, OUT UINT8 *Signature OPTIONAL)
STATIC EFI_STATUS EFIAPI OcToolLoadEntry(IN OC_STORAGE_CONTEXT *Storage, IN OC_BOOT_ENTRY *ChosenEntry, OUT VOID **Data, OUT UINT32 *DataSize, OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath, OUT EFI_HANDLE *StorageHandle, OUT EFI_DEVICE_PATH_PROTOCOL **StoragePath, IN OC_DMG_LOADING_SUPPORT DmgLoading, OUT OC_APPLE_DISK_IMAGE_PRELOAD_CONTEXT *DmgPreloadContext, OUT VOID **CustomFreeContext)
VOID OcMiscUefiQuirksLoaded(IN OC_GLOBAL_CONFIG *Config)
EFI_GUID gShimLockGuid
#define SHIM_RETAIN_PROTOCOL
Definition ShimVars.h:16
VOID *EFIAPI ZeroMem(OUT VOID *Buffer, IN UINTN Length)
EFI_RUNTIME_SERVICES * gRT
EFI_GUID gEfiSimpleFileSystemProtocolGuid
OC_POPULATE_CONTEXT PopulateContext
A pointer to the PopulateContext function.
Definition OcInterface.h:63
OC_PLAY_AUDIO_ENTRY PlayAudioEntry
OC_PICKER_ENTRY CustomEntries[]
OC_PLAY_AUDIO_BEEP PlayAudioBeep
OC_GET_ENTRY_ICON GetEntryIcon
OC_STORAGE_CONTEXT * StorageContext
OC_PLAY_AUDIO_FILE PlayAudioFile
OC_REQ_PRIVILEGE RequestPrivilege
OC_PRIVILEGE_CONTEXT * PrivilegeContext
EFI_DEVICE_PATH_PROTOCOL * RecoveryInitiator
OC_DMG_LOADING_SUPPORT DmgLoading
OC_GET_ENTRY_LABEL_IMAGE GetEntryLabelImage
OC_VERIFY_PASSWORD VerifyPassword
OC_TOGGLE_VOICE_OVER ToggleVoiceOver
CONST CHAR8 * InstanceIdentifier
CONST CHAR8 * Arguments