OpenCore  1.0.4
OpenCore Bootloader
Loading...
Searching...
No Matches
OpenCore.c
Go to the documentation of this file.
1
15#include <Uefi.h>
16
17#include <Guid/OcVariable.h>
18
19#include <Protocol/DevicePath.h>
20#include <Protocol/LoadedImage.h>
22#include <Protocol/SimpleFileSystem.h>
24
25#include <Library/OcMainLib.h>
26
27#include <Library/DebugLib.h>
29#include <Library/DevicePathLib.h>
30#include <Library/MemoryAllocationLib.h>
35#include <Library/OcCpuLib.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>
44
45STATIC
46OC_GLOBAL_CONFIG
48
49STATIC
52
53STATIC
56
57STATIC
58UINT8
60
61STATIC
64
65STATIC
68
69STATIC
70EFI_HANDLE
72
73STATIC
74EFI_DEVICE_PATH_PROTOCOL *
76
77STATIC
78CHAR16 *
80
81STATIC
82EFI_STATUS
83EFIAPI
85 IN OC_BOOT_ENTRY *Chosen,
86 IN EFI_HANDLE ImageHandle,
87 OUT UINTN *ExitDataSize,
88 OUT CHAR16 **ExitData OPTIONAL,
89 IN BOOLEAN LaunchInText
90 )
91{
92 EFI_STATUS Status;
94
95 OldMode = OcConsoleControlSetMode (
97 );
98
99 Status = gBS->StartImage (
100 ImageHandle,
101 ExitDataSize,
102 ExitData
103 );
104
105 if (EFI_ERROR (Status)) {
106 DEBUG ((DEBUG_WARN, "OC: Boot failed - %r\n", Status));
107 }
108
109 OcConsoleControlSetMode (OldMode);
110
111 return Status;
112}
113
114STATIC
115VOID
117 IN OC_STORAGE_CONTEXT *Storage,
118 IN EFI_DEVICE_PATH_PROTOCOL *LoadPath
119 )
120{
121 EFI_STATUS Status;
122 OC_PRIVILEGE_CONTEXT *Privilege;
123
124 DEBUG ((DEBUG_INFO, "OC: OcMiscEarlyInit...\n"));
125 Status = OcMiscEarlyInit (
126 Storage,
129 );
130
131 if (EFI_ERROR (Status)) {
132 return;
133 }
134
136
137 DEBUG ((DEBUG_INFO, "OC: OcLoadNvramSupport...\n"));
139 DEBUG ((DEBUG_INFO, "OC: OcMiscMiddleInit...\n"));
141 Storage,
144 LoadPath,
146 mOpenCoreConfiguration.Booter.Quirks.ForceBooterSignature ? mOpenCoreBooterHash : NULL
147 );
148 DEBUG ((DEBUG_INFO, "OC: OcLoadUefiSupport...\n"));
150 DEBUG_CODE_BEGIN ();
151 DEBUG ((DEBUG_INFO, "OC: OcMiscLoadSystemReport...\n"));
153 DEBUG_CODE_END ();
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"));
164
165 if (mOpenCoreConfiguration.Misc.Security.EnablePassword) {
167 mOpenCorePrivilege.Hash = mOpenCoreConfiguration.Misc.Security.PasswordHash;
168 mOpenCorePrivilege.Salt = OC_BLOB_GET (&mOpenCoreConfiguration.Misc.Security.PasswordSalt);
169 mOpenCorePrivilege.SaltSize = mOpenCoreConfiguration.Misc.Security.PasswordSalt.Size;
170
171 Privilege = &mOpenCorePrivilege;
172 } else {
173 Privilege = NULL;
174 }
175
176 DEBUG ((DEBUG_INFO, "OC: All green, starting boot management...\n"));
177
178 OcMiscBoot (
181 Privilege,
183 mOpenCoreConfiguration.Uefi.Quirks.RequestBootVarRouting,
185 );
186}
187
188STATIC
189EFI_STATUS
191 IN EFI_HANDLE DeviceHandle,
192 IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *FileSystem,
193 IN EFI_DEVICE_PATH_PROTOCOL *LoadPath
194 )
195{
196 EFI_STATUS Status;
197 EFI_DEVICE_PATH_PROTOCOL *RemainingPath;
198 UINTN StoragePathSize;
199
201 mStorageHandle = DeviceHandle;
202
203 //
204 // Calculate root path (never freed).
205 //
206 RemainingPath = NULL;
207 mStorageRoot = OcCopyDevicePathFullName (LoadPath, &RemainingPath);
208 //
209 // Skipping this or later failing to call UnicodeGetParentDirectory means
210 // we got valid path to the root of the partition. This happens when
211 // OpenCore.efi was loaded from e.g. firmware and then bootstrapped
212 // on a different partition.
213 //
214 if (mStorageRoot == NULL) {
215 DEBUG ((DEBUG_ERROR, "OC: Failed to get launcher path\n"));
216 return EFI_UNSUPPORTED;
217 }
218
219 DEBUG ((DEBUG_INFO, "OC: Storage root %s\n", mStorageRoot));
220
221 ASSERT (RemainingPath != NULL);
222
224 DEBUG ((DEBUG_ERROR, "OC: Failed to get launcher root path\n"));
225 FreePool (mStorageRoot);
226 return EFI_UNSUPPORTED;
227 }
228
229 StoragePathSize = (UINTN)RemainingPath - (UINTN)LoadPath;
230 mStoragePath = AllocatePool (StoragePathSize + END_DEVICE_PATH_LENGTH);
231 if (mStoragePath == NULL) {
232 FreePool (mStorageRoot);
233 return EFI_OUT_OF_RESOURCES;
234 }
235
236 CopyMem (mStoragePath, LoadPath, StoragePathSize);
237 SetDevicePathEndNode ((UINT8 *)mStoragePath + StoragePathSize);
238
239 Status = OcStorageInitFromFs (
241 FileSystem,
246 );
247
248 if (!EFI_ERROR (Status)) {
249 OcMain (&mOpenCoreStorage, LoadPath);
251 } else {
252 DEBUG ((DEBUG_ERROR, "OC: Failed to open root FS - %r!\n", Status));
253 if (Status == EFI_SECURITY_VIOLATION) {
254 CpuDeadLoop ();
255 }
256 }
257
258 return Status;
259}
260
261STATIC
262EFI_HANDLE
263EFIAPI
265 IN OC_BOOTSTRAP_PROTOCOL *This
266 )
267{
268 return mStorageHandle;
269}
270
271STATIC
275 .GetLoadHandle = OcGetLoadHandle,
276};
277
278EFI_STATUS
279EFIAPI
281 IN EFI_HANDLE ImageHandle,
282 IN EFI_SYSTEM_TABLE *SystemTable
283 )
284{
285 EFI_STATUS Status;
286 EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;
287 EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *FileSystem;
288 EFI_HANDLE BootstrapHandle;
289 OC_BOOTSTRAP_PROTOCOL *Bootstrap;
290 EFI_DEVICE_PATH_PROTOCOL *AbsPath;
291
292 DEBUG ((DEBUG_INFO, "OC: Starting OpenCore...\n"));
293
294 //
295 // We have just started by bootstrap or manually at EFI/OC/OpenCore.efi.
296 // When bootstrap runs us, we only install the protocol.
297 // Otherwise we do self start.
298 //
299
300 Bootstrap = NULL;
301 Status = gBS->LocateProtocol (
303 NULL,
304 (VOID **)&Bootstrap
305 );
306
307 if (!EFI_ERROR (Status)) {
308 DEBUG ((DEBUG_INFO, "OC: Found previous image, aborting\n"));
309 return EFI_ALREADY_STARTED;
310 }
311
312 LoadedImage = NULL;
313 Status = gBS->HandleProtocol (
314 ImageHandle,
316 (VOID **)&LoadedImage
317 );
318
319 if (EFI_ERROR (Status)) {
320 DEBUG ((DEBUG_ERROR, "OC: Failed to locate loaded image - %r\n", Status));
321 return EFI_NOT_FOUND;
322 }
323
324 if (LoadedImage->DeviceHandle == NULL) {
325 DEBUG ((DEBUG_INFO, "OC: Missing boot device\n"));
326 //
327 // This is not critical as boot path may be complete.
328 //
329 }
330
331 if (LoadedImage->FilePath == NULL) {
332 DEBUG ((DEBUG_ERROR, "OC: Missing boot path\n"));
333 return EFI_INVALID_PARAMETER;
334 }
335
336 DebugPrintDevicePath (DEBUG_INFO, "OC: Booter path", LoadedImage->FilePath);
337
338 //
339 // Obtain the file system device path
340 //
341 FileSystem = OcLocateFileSystem (
342 LoadedImage->DeviceHandle,
343 LoadedImage->FilePath
344 );
345 if (FileSystem == NULL) {
346 DEBUG ((DEBUG_ERROR, "OC: Failed to locate file system\n"));
347 return EFI_INVALID_PARAMETER;
348 }
349
350 AbsPath = AbsoluteDevicePath (LoadedImage->DeviceHandle, LoadedImage->FilePath);
351 if (AbsPath == NULL) {
352 DEBUG ((DEBUG_ERROR, "OC: Failed to allocate absolute path\n"));
353 return EFI_OUT_OF_RESOURCES;
354 }
355
356 DebugPrintDevicePath (DEBUG_INFO, "OC: Absolute booter path", LoadedImage->FilePath);
357
358 BootstrapHandle = NULL;
359 Status = gBS->InstallMultipleProtocolInterfaces (
360 &BootstrapHandle,
363 NULL
364 );
365 if (EFI_ERROR (Status)) {
366 DEBUG ((DEBUG_ERROR, "OC: Failed to install bootstrap protocol - %r\n", Status));
367 FreePool (AbsPath);
368 return Status;
369 }
370
371 OcBootstrap (LoadedImage->DeviceHandle, FileSystem, AbsPath);
372 DEBUG ((DEBUG_ERROR, "OC: Failed to boot\n"));
373 CpuDeadLoop ();
374
375 return EFI_SUCCESS;
376}
EFI_CONSOLE_CONTROL_SCREEN_MODE
@ EfiConsoleControlScreenGraphics
@ EfiConsoleControlScreenText
@ OcPrivilegeUnauthorized
EFI_BOOT_SERVICES * gBS
#define OC_BOOTSTRAP_PROTOCOL_REVISION
Definition OcBootstrap.h:33
EFI_GUID gOcBootstrapProtocolGuid
EFI_CONSOLE_CONTROL_SCREEN_MODE OcConsoleControlSetMode(IN EFI_CONSOLE_CONTROL_SCREEN_MODE Mode)
VOID OcCpuScanProcessor(IN OUT OC_CPU_INFO *Cpu)
Definition OcCpuLib.c:832
#define SHA1_DIGEST_SIZE
Definition OcCryptoLib.h:44
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)
Definition OpenCore.c:116
STATIC EFI_HANDLE mStorageHandle
Definition OpenCore.c:71
STATIC EFI_STATUS EFIAPI OcStartImage(IN OC_BOOT_ENTRY *Chosen, IN EFI_HANDLE ImageHandle, OUT UINTN *ExitDataSize, OUT CHAR16 **ExitData OPTIONAL, IN BOOLEAN LaunchInText)
Definition OpenCore.c:84
STATIC EFI_STATUS OcBootstrap(IN EFI_HANDLE DeviceHandle, IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *FileSystem, IN EFI_DEVICE_PATH_PROTOCOL *LoadPath)
Definition OpenCore.c:190
EFI_STATUS EFIAPI UefiMain(IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable)
Definition OpenCore.c:280
STATIC OC_STORAGE_CONTEXT mOpenCoreStorage
Definition OpenCore.c:51
STATIC UINT8 mOpenCoreBooterHash[SHA1_DIGEST_SIZE]
Definition OpenCore.c:59
STATIC EFI_HANDLE EFIAPI OcGetLoadHandle(IN OC_BOOTSTRAP_PROTOCOL *This)
Definition OpenCore.c:264
STATIC OC_CPU_INFO mOpenCoreCpuInfo
Definition OpenCore.c:55
STATIC EFI_DEVICE_PATH_PROTOCOL * mStoragePath
Definition OpenCore.c:75
STATIC OC_RSA_PUBLIC_KEY * mOpenCoreVaultKey
Definition OpenCore.c:63
STATIC OC_BOOTSTRAP_PROTOCOL mOpenCoreBootStrap
Definition OpenCore.c:273
STATIC CHAR16 * mStorageRoot
Definition OpenCore.c:79
STATIC OC_PRIVILEGE_CONTEXT mOpenCorePrivilege
Definition OpenCore.c:67
STATIC OC_GLOBAL_CONFIG mOpenCoreConfiguration
Definition OpenCore.c:47
VOID *EFIAPI CopyMem(OUT VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
EFI_GUID gEfiLoadedImageProtocolGuid
#define ASSERT(x)
Definition coder.h:55
OC_PRIVILEGE_LEVEL CurrentLevel