15 0x04, 0x06, 0x14, 0x00, 0xEB, 0x85, 0x05, 0x2B,
16 0xB8, 0xD8, 0xA9, 0x49, 0x8B, 0x8C, 0xE2, 0x1B,
17 0x01, 0xAE, 0xF2, 0xB7, 0x7F, 0xFF, 0x04, 0x00
21#define MAX_APPLE_LEGACY_DEVICE_PATHS 16
26 IN CONST CHAR8 *SignatureStr,
36 (CONST UINT8 *)SignatureStr,
38 (CONST UINT32)AsciiStrLen (SignatureStr),
48 IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePaths,
49 IN UINTN MaxDevicePaths
58 BOOLEAN DevicePathExists;
60 EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;
61 EFI_DEVICE_PATH_PROTOCOL *DevicePath;
69 Status =
gBS->LocateHandleBuffer (
76 if (EFI_ERROR (Status)) {
80 for (HandleIndex = 0; HandleIndex < NoHandles && PathCount < MaxDevicePaths; HandleIndex++) {
81 Status =
gBS->HandleProtocol (
86 if (EFI_ERROR (Status)) {
90 Status =
gBS->HandleProtocol (
91 LoadedImage->DeviceHandle,
95 if (EFI_ERROR (Status)) {
102 if ( (DevicePathType (DevicePath) != HARDWARE_DEVICE_PATH)
103 || (DevicePathSubType (DevicePath) != HW_MEMMAP_DP))
111 DevicePathExists = FALSE;
112 for (PathIndex = 0; PathIndex < PathCount; PathIndex++) {
113 if (DevicePathNodeLength (DevicePath) != DevicePathNodeLength (DevicePaths[PathIndex])) {
117 if (
CompareMem (DevicePath, DevicePaths[PathIndex], DevicePathNodeLength (DevicePath))) {
118 DevicePathExists = TRUE;
123 if (DevicePathExists) {
132 DevicePaths[PathCount] = NULL;
138 OUT BOOLEAN *IsAppleInterfaceSupported
144 ASSERT (IsAppleInterfaceSupported != NULL);
151 *IsAppleInterfaceSupported = TRUE;
155 if (!EFI_ERROR (Status) && (Legacy8259 != NULL)) {
156 *IsAppleInterfaceSupported = FALSE;
161 return EFI_UNSUPPORTED;
166 IN EFI_DEVICE_PATH_PROTOCOL *HdDevicePath
170 EFI_HANDLE DiskHandle;
171 EFI_HANDLE PartitionHandle;
172 UINT8 PartitionIndex;
173 EFI_DEVICE_PATH_PROTOCOL *WholeDiskPath;
176 if (WholeDiskPath == NULL) {
177 return EFI_INVALID_PARAMETER;
186 if (DiskHandle == NULL) {
187 return EFI_INVALID_PARAMETER;
191 if (PartitionHandle == NULL) {
192 return EFI_INVALID_PARAMETER;
196 if (EFI_ERROR (Status)) {
201 if (EFI_ERROR (Status)) {
208 return gRT->SetVariable (
211 EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,
212 GetDevicePathSize (WholeDiskPath),
219 IN EFI_HANDLE ParentImageHandle,
220 OUT EFI_DEVICE_PATH_PROTOCOL **ImageDevicePath,
221 OUT EFI_HANDLE *ImageHandle
225 EFI_DEVICE_PATH_PROTOCOL **LegacyDevicePaths;
226 CHAR16 *UnicodeDevicePath;
233 if (LegacyDevicePaths == NULL) {
234 return EFI_OUT_OF_RESOURCES;
238 if (!EFI_ERROR (Status)) {
239 for (Index = 0; LegacyDevicePaths[Index] != NULL; Index++) {
240 Status =
gBS->LoadImage (
243 LegacyDevicePaths[Index],
248 if (Status != EFI_NOT_FOUND) {
249 *ImageDevicePath = LegacyDevicePaths[Index];
253 UnicodeDevicePath = ConvertDevicePathToText (*ImageDevicePath, FALSE, FALSE);
256 "OLB: Loaded Apple legacy interface at dp %s - %r\n",
257 UnicodeDevicePath != NULL ? UnicodeDevicePath : L
"<null>",
260 if (UnicodeDevicePath != NULL) {
261 FreePool (UnicodeDevicePath);
271 FreePool (LegacyDevicePaths);
278 IN EFI_HANDLE PartitionHandle,
279 IN BOOLEAN IsCdRomSupported
285 MASTER_BOOT_RECORD *Mbr;
286 EFI_DEVICE_PATH_PROTOCOL *DevicePath;
287 EFI_HANDLE DiskHandle;
290 ASSERT (PartitionHandle != NULL);
293 if (DevicePath == NULL) {
298 if (DiskHandle == NULL) {
307 if (!IsCdRomSupported) {
308 DEBUG ((DEBUG_INFO,
"OLB: CD-ROM boot not supported on this platform\n"));
314 if (EFI_ERROR (Status)) {
315 DEBUG ((DEBUG_INFO,
"OLB: Failed reading El-Torito - %r\n", Status));
322 DEBUG ((DEBUG_INFO,
"OLB: Disk does not contain a valid MBR\n"));
334 DEBUG ((DEBUG_INFO,
"OLB: Partition does not contain a valid PBR\n"));
339 BufferSize =
sizeof (*Mbr);
358 DEBUG ((DEBUG_INFO,
"OLB: Unknown legacy bootsector signature\n"));
368 IN EFI_DEVICE_PATH_PROTOCOL *PartitionPath
372 EFI_HANDLE DiskHandle;
373 EFI_HANDLE PartitionHandle;
374 MASTER_BOOT_RECORD *Mbr;
375 MASTER_BOOT_RECORD *Pbr;
376 UINT8 PartitionIndex;
377 UINT8 BiosDiskAddress;
379 IA32_REGISTER_SET Regs;
380 MASTER_BOOT_RECORD *MbrPtr = (MASTER_BOOT_RECORD *)0x0600;
381 MASTER_BOOT_RECORD *PbrPtr = (MASTER_BOOT_RECORD *)0x7C00;
387 Status =
gBS->LocateProtocol (
392 if (EFI_ERROR (Status)) {
393 DEBUG ((DEBUG_INFO,
"OLB: Could not locate Legacy8259 protocol\n"));
401 if (PartitionHandle == NULL) {
402 DEBUG ((DEBUG_INFO,
"OLB: Could not locate partition handle\n"));
403 return EFI_INVALID_PARAMETER;
408 DEBUG ((DEBUG_INFO,
"OLB: Partition does not contain a valid PBR\n"));
409 return EFI_INVALID_PARAMETER;
413 if (EFI_ERROR (Status)) {
424 if (DiskHandle == NULL) {
426 return EFI_INVALID_PARAMETER;
431 DEBUG ((DEBUG_INFO,
"OLB: Disk does not contain a valid MBR\n"));
433 return EFI_INVALID_PARAMETER;
442 if (EFI_ERROR (Status)) {
449 if (EFI_ERROR (Status)) {
464 if (EFI_ERROR (Status)) {
465 DEBUG ((DEBUG_INFO,
"OLB: Disk address could not be determined\n"));
474 CopyMem (PbrPtr, Pbr,
sizeof (*Pbr));
475 CopyMem (MbrPtr, Mbr,
sizeof (*Mbr));
477 DebugPrintHexDump (DEBUG_INFO,
"OLB: PbrPtr", (UINT8 *)PbrPtr,
sizeof (*PbrPtr));
485 ZeroMem (&Regs,
sizeof (Regs));
487 Regs.H.DL = BiosDiskAddress;
488 Regs.X.SI = (UINT16)(UINTN)&MbrPtr->Partition[PartitionIndex];
499 DEBUG ((DEBUG_WARN,
"OLB: Failure calling legacy boot sector\n"));
501 return EFI_INVALID_PARAMETER;
EFI_GUID gAppleBootVariableGuid
#define APPLE_BOOT_CAMP_HD_VARIABLE_NAME
EFI_STATUS InternalGetBiosDiskAddress(IN THUNK_CONTEXT *ThunkContext, IN EFI_LEGACY_8259_PROTOCOL *Legacy8259, IN EFI_HANDLE DiskHandle, OUT UINT8 *DriveAddress)
EFI_GUID gEfiLegacy8259ProtocolGuid
@ OcLegacyOsTypeWindowsNtldr
@ OcLegacyOsTypeWindowsBootmgr
enum OC_LEGACY_OS_TYPE_ OC_LEGACY_OS_TYPE
EFI_STATUS InternalLoadAppleLegacyInterface(IN EFI_HANDLE ParentImageHandle, OUT EFI_DEVICE_PATH_PROTOCOL **ImageDevicePath, OUT EFI_HANDLE *ImageHandle)
#define MAX_APPLE_LEGACY_DEVICE_PATHS
OC_LEGACY_OS_TYPE InternalGetPartitionLegacyOsType(IN EFI_HANDLE PartitionHandle, IN BOOLEAN IsCdRomSupported)
EFI_STATUS InternalSetBootCampHDPath(IN EFI_DEVICE_PATH_PROTOCOL *HdDevicePath)
EFI_STATUS InternalLoadLegacyPbr(IN EFI_DEVICE_PATH_PROTOCOL *PartitionPath)
STATIC EFI_STATUS ScanAppleLegacyInterfacePaths(IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePaths, IN UINTN MaxDevicePaths)
STATIC CONST UINT8 AppleLegacyInterfaceMediaDevicePathData[]
STATIC BOOLEAN CheckLegacySignature(IN CONST CHAR8 *SignatureStr, IN UINT8 *Buffer, IN UINTN BufferSize)
THUNK_CONTEXT mThunkContext
EFI_STATUS InternalIsLegacyInterfaceSupported(OUT BOOLEAN *IsAppleInterfaceSupported)
STATIC CONST EFI_DEVICE_PATH_PROTOCOL * AppleLegacyInterfaceMediaDevicePathPath
VOID DebugPrintHexDump(IN UINTN ErrorLevel, IN CONST CHAR8 *Message, IN UINT8 *Bytes, IN UINTN Size)
VOID DebugPrintDevicePath(IN UINTN ErrorLevel, IN CONST CHAR8 *Message, IN EFI_DEVICE_PATH_PROTOCOL *DevicePath OPTIONAL)
EFI_HANDLE OcPartitionGetPartitionHandle(IN EFI_DEVICE_PATH_PROTOCOL *HdDevicePath)
EFI_STATUS OcDiskGetMbrPartitionIndex(IN EFI_HANDLE PartitionHandle, OUT UINT8 *PartitionIndex)
EFI_HANDLE OcPartitionGetDiskHandle(IN EFI_DEVICE_PATH_PROTOCOL *HdDevicePath)
EFI_DEVICE_PATH_PROTOCOL * OcDiskGetDevicePath(IN EFI_DEVICE_PATH_PROTOCOL *HdDevicePath)
EFI_STATUS OcDiskReadElTorito(IN EFI_DEVICE_PATH_PROTOCOL *DiskDevicePath, OUT UINT8 **Buffer, OUT UINTN *BufferSize)
BOOLEAN OcIsDiskCdRom(IN EFI_DEVICE_PATH_PROTOCOL *DiskDevicePath)
MASTER_BOOT_RECORD * OcGetDiskMbrTable(IN EFI_HANDLE DiskHandle, IN BOOLEAN CheckPartitions)
EFI_STATUS OcDiskMarkMbrPartitionActive(IN EFI_HANDLE DiskHandle, IN UINT8 PartitionIndex)
EFI_STATUS OcLegacyThunkInitializeInterruptRedirection(IN EFI_LEGACY_8259_PROTOCOL *Legacy8259)
BOOLEAN EFIAPI OcLegacyThunkFarCall86(IN THUNK_CONTEXT *ThunkContext, IN EFI_LEGACY_8259_PROTOCOL *Legacy8259, IN UINT16 Segment, IN UINT16 Offset, IN IA32_REGISTER_SET *Regs, IN VOID *Stack, IN UINTN StackSize)
EFI_STATUS OcLegacyThunkInitializeBiosIntCaller(IN OUT THUNK_CONTEXT *ThunkContext)
VOID OcLegacyThunkDisconnectEfiGraphics(VOID)
BOOLEAN FindPattern(IN CONST UINT8 *Pattern, IN CONST UINT8 *PatternMask OPTIONAL, IN CONST UINT32 PatternSize, IN CONST UINT8 *Data, IN UINT32 DataSize, IN OUT UINT32 *DataOff)
INTN EFIAPI OcStriCmp(IN CONST CHAR16 *FirstString, IN CONST CHAR16 *SecondString)
OC_TYPING_BUFFER_ENTRY Buffer[OC_TYPING_BUFFER_SIZE]
INTN EFIAPI CompareMem(IN CONST VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
VOID *EFIAPI CopyMem(OUT VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
VOID *EFIAPI ZeroMem(OUT VOID *Buffer, IN UINTN Length)
EFI_RUNTIME_SERVICES * gRT
EFI_GUID gEfiLoadedImageProtocolGuid
EFI_GUID gEfiDevicePathProtocolGuid
EFI_DEVICE_PATH_PROTOCOL *EFIAPI DevicePathFromHandle(IN EFI_HANDLE Handle)