19#include <Protocol/DevicePath.h>
20#include <Protocol/LoadedImage.h>
22#include <Protocol/SimpleFileSystem.h>
27#include <Library/DebugLib.h>
29#include <Library/DevicePathLib.h>
30#include <Library/MemoryAllocationLib.h>
39#include <Library/PrintLib.h>
40#include <Library/UefiBootServicesTableLib.h>
41#include <Library/UefiRuntimeServicesTableLib.h>
42#include <Library/UefiDriverEntryPoint.h>
43#include <Library/UefiLib.h>
74EFI_DEVICE_PATH_PROTOCOL *
86 IN EFI_HANDLE ImageHandle,
87 OUT UINTN *ExitDataSize,
88 OUT CHAR16 **ExitData OPTIONAL,
89 IN BOOLEAN LaunchInText
99 Status =
gBS->StartImage (
105 if (EFI_ERROR (Status)) {
106 DEBUG ((DEBUG_WARN,
"OC: Boot failed - %r\n", Status));
118 IN EFI_DEVICE_PATH_PROTOCOL *LoadPath
124 DEBUG ((DEBUG_INFO,
"OC: OcMiscEarlyInit...\n"));
131 if (EFI_ERROR (Status)) {
137 DEBUG ((DEBUG_INFO,
"OC: OcLoadNvramSupport...\n"));
139 DEBUG ((DEBUG_INFO,
"OC: OcMiscMiddleInit...\n"));
148 DEBUG ((DEBUG_INFO,
"OC: OcLoadUefiSupport...\n"));
151 DEBUG ((DEBUG_INFO,
"OC: OcMiscLoadSystemReport...\n"));
154 DEBUG ((DEBUG_INFO,
"OC: OcLoadAcpiSupport...\n"));
156 DEBUG ((DEBUG_INFO,
"OC: OcLoadPlatformSupport...\n"));
158 DEBUG ((DEBUG_INFO,
"OC: OcLoadDevPropsSupport...\n"));
160 DEBUG ((DEBUG_INFO,
"OC: OcMiscLateInit...\n"));
162 DEBUG ((DEBUG_INFO,
"OC: OcLoadKernelSupport...\n"));
176 DEBUG ((DEBUG_INFO,
"OC: All green, starting boot management...\n"));
191 IN EFI_HANDLE DeviceHandle,
192 IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *FileSystem,
193 IN EFI_DEVICE_PATH_PROTOCOL *LoadPath
197 EFI_DEVICE_PATH_PROTOCOL *RemainingPath;
198 UINTN StoragePathSize;
206 RemainingPath = NULL;
215 DEBUG ((DEBUG_ERROR,
"OC: Failed to get launcher path\n"));
216 return EFI_UNSUPPORTED;
219 DEBUG ((DEBUG_INFO,
"OC: Storage root %s\n",
mStorageRoot));
221 ASSERT (RemainingPath != NULL);
224 DEBUG ((DEBUG_ERROR,
"OC: Failed to get launcher root path\n"));
226 return EFI_UNSUPPORTED;
229 StoragePathSize = (UINTN)RemainingPath - (UINTN)LoadPath;
230 mStoragePath = AllocatePool (StoragePathSize + END_DEVICE_PATH_LENGTH);
233 return EFI_OUT_OF_RESOURCES;
237 SetDevicePathEndNode ((UINT8 *)
mStoragePath + StoragePathSize);
248 if (!EFI_ERROR (Status)) {
252 DEBUG ((DEBUG_ERROR,
"OC: Failed to open root FS - %r!\n", Status));
253 if (Status == EFI_SECURITY_VIOLATION) {
281 IN EFI_HANDLE ImageHandle,
282 IN EFI_SYSTEM_TABLE *SystemTable
286 EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;
287 EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *FileSystem;
288 EFI_HANDLE BootstrapHandle;
290 EFI_DEVICE_PATH_PROTOCOL *AbsPath;
292 DEBUG ((DEBUG_INFO,
"OC: Starting OpenCore...\n"));
301 Status =
gBS->LocateProtocol (
307 if (!EFI_ERROR (Status)) {
308 DEBUG ((DEBUG_INFO,
"OC: Found previous image, aborting\n"));
309 return EFI_ALREADY_STARTED;
313 Status =
gBS->HandleProtocol (
316 (VOID **)&LoadedImage
319 if (EFI_ERROR (Status)) {
320 DEBUG ((DEBUG_ERROR,
"OC: Failed to locate loaded image - %r\n", Status));
321 return EFI_NOT_FOUND;
324 if (LoadedImage->DeviceHandle == NULL) {
325 DEBUG ((DEBUG_INFO,
"OC: Missing boot device\n"));
331 if (LoadedImage->FilePath == NULL) {
332 DEBUG ((DEBUG_ERROR,
"OC: Missing boot path\n"));
333 return EFI_INVALID_PARAMETER;
342 LoadedImage->DeviceHandle,
343 LoadedImage->FilePath
345 if (FileSystem == NULL) {
346 DEBUG ((DEBUG_ERROR,
"OC: Failed to locate file system\n"));
347 return EFI_INVALID_PARAMETER;
351 if (AbsPath == NULL) {
352 DEBUG ((DEBUG_ERROR,
"OC: Failed to allocate absolute path\n"));
353 return EFI_OUT_OF_RESOURCES;
358 BootstrapHandle = NULL;
359 Status =
gBS->InstallMultipleProtocolInterfaces (
365 if (EFI_ERROR (Status)) {
366 DEBUG ((DEBUG_ERROR,
"OC: Failed to install bootstrap protocol - %r\n", Status));
371 OcBootstrap (LoadedImage->DeviceHandle, FileSystem, AbsPath);
372 DEBUG ((DEBUG_ERROR,
"OC: Failed to boot\n"));
EFI_CONSOLE_CONTROL_SCREEN_MODE
@ EfiConsoleControlScreenGraphics
@ EfiConsoleControlScreenText
@ OcPrivilegeUnauthorized
#define OC_BOOTSTRAP_PROTOCOL_REVISION
EFI_GUID gOcBootstrapProtocolGuid
EFI_CONSOLE_CONTROL_SCREEN_MODE OcConsoleControlSetMode(IN EFI_CONSOLE_CONTROL_SCREEN_MODE Mode)
VOID OcCpuScanProcessor(IN OUT OC_CPU_INFO *Cpu)
VOID DebugPrintDevicePath(IN UINTN ErrorLevel, IN CONST CHAR8 *Message, IN EFI_DEVICE_PATH_PROTOCOL *DevicePath OPTIONAL)
CHAR16 * OcCopyDevicePathFullName(IN EFI_DEVICE_PATH_PROTOCOL *DevicePath, OUT EFI_DEVICE_PATH_PROTOCOL **FileDevicePath OPTIONAL)
EFI_DEVICE_PATH_PROTOCOL * AbsoluteDevicePath(IN EFI_HANDLE Handle, IN EFI_DEVICE_PATH_PROTOCOL *RelativePath OPTIONAL)
EFI_SIMPLE_FILE_SYSTEM_PROTOCOL * OcLocateFileSystem(IN EFI_HANDLE DeviceHandle OPTIONAL, IN EFI_DEVICE_PATH_PROTOCOL *FilePath OPTIONAL)
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)
EFI_STATUS OcMiscEarlyInit(IN OC_STORAGE_CONTEXT *Storage, OUT OC_GLOBAL_CONFIG *Config, IN OC_RSA_PUBLIC_KEY *VaultKey OPTIONAL)
VOID OcLoadPlatformSupport(IN OC_GLOBAL_CONFIG *Config, IN OC_CPU_INFO *CpuInfo)
VOID OcLoadUefiSupport(IN OC_STORAGE_CONTEXT *Storage, IN OC_GLOBAL_CONFIG *Config, IN OC_CPU_INFO *CpuInfo, IN UINT8 *Signature)
EFI_STATUS OcMiscLateInit(IN OC_STORAGE_CONTEXT *Storage, IN OC_GLOBAL_CONFIG *Config)
VOID OcLoadNvramSupport(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)
VOID OcLoadKernelSupport(IN OC_STORAGE_CONTEXT *Storage, IN OC_GLOBAL_CONFIG *Config, IN OC_CPU_INFO *CpuInfo)
OC_RSA_PUBLIC_KEY * OcGetVaultKey(VOID)
VOID OcLoadAcpiSupport(IN OC_STORAGE_CONTEXT *Storage, IN OC_GLOBAL_CONFIG *Config)
VOID OcLoadDevPropsSupport(IN OC_GLOBAL_CONFIG *Config)
EFI_STATUS OcStorageInitFromFs(OUT OC_STORAGE_CONTEXT *Context, IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *FileSystem, IN EFI_HANDLE StorageHandle OPTIONAL, IN EFI_DEVICE_PATH_PROTOCOL *StoragePath OPTIONAL, IN CONST CHAR16 *StorageRoot, IN OC_RSA_PUBLIC_KEY *StorageKey OPTIONAL)
VOID OcStorageFree(IN OUT OC_STORAGE_CONTEXT *Context)
BOOLEAN UnicodeGetParentDirectory(IN OUT CHAR16 *String)
#define OC_BLOB_GET(Blob)
STATIC VOID OcMain(IN OC_STORAGE_CONTEXT *Storage, IN EFI_DEVICE_PATH_PROTOCOL *LoadPath)
STATIC EFI_HANDLE mStorageHandle
STATIC EFI_STATUS EFIAPI OcStartImage(IN OC_BOOT_ENTRY *Chosen, IN EFI_HANDLE ImageHandle, OUT UINTN *ExitDataSize, OUT CHAR16 **ExitData OPTIONAL, IN BOOLEAN LaunchInText)
STATIC EFI_STATUS OcBootstrap(IN EFI_HANDLE DeviceHandle, IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *FileSystem, IN EFI_DEVICE_PATH_PROTOCOL *LoadPath)
EFI_STATUS EFIAPI UefiMain(IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable)
STATIC OC_STORAGE_CONTEXT mOpenCoreStorage
STATIC UINT8 mOpenCoreBooterHash[SHA1_DIGEST_SIZE]
STATIC EFI_HANDLE EFIAPI OcGetLoadHandle(IN OC_BOOTSTRAP_PROTOCOL *This)
STATIC OC_CPU_INFO mOpenCoreCpuInfo
STATIC EFI_DEVICE_PATH_PROTOCOL * mStoragePath
STATIC OC_RSA_PUBLIC_KEY * mOpenCoreVaultKey
STATIC OC_BOOTSTRAP_PROTOCOL mOpenCoreBootStrap
STATIC CHAR16 * mStorageRoot
STATIC OC_PRIVILEGE_CONTEXT mOpenCorePrivilege
STATIC OC_GLOBAL_CONFIG mOpenCoreConfiguration
VOID *EFIAPI CopyMem(OUT VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
EFI_GUID gEfiLoadedImageProtocolGuid
OC_PRIVILEGE_LEVEL CurrentLevel