OpenCore  1.0.4
OpenCore Bootloader
Loading...
Searching...
No Matches
MachoFat.c
Go to the documentation of this file.
1
13#include <Uefi.h>
14
17
18#include <Library/BaseLib.h>
19#include <Library/BaseMemoryLib.h>
20#include <Library/BaseOverflowLib.h>
21#include <Library/DebugLib.h>
22#include <Library/OcMachoLib.h>
23
24#include "OcMachoLibInternal.h"
25
26EFI_STATUS
28 IN CONST UINT8 *Buffer,
29 IN UINT32 BufferSize,
30 IN UINT32 FullSize,
31 IN MACH_CPU_TYPE CpuType,
32 OUT UINT32 *FatOffset,
33 OUT UINT32 *FatSize
34 )
35{
36 BOOLEAN SwapBytes;
37 MACH_FAT_HEADER *FatHeader;
38 UINT32 NumberOfFatArch;
39 UINT32 Offset;
40 MACH_CPU_TYPE TmpCpuType;
41 UINT32 TmpSize;
42 UINT32 Index;
43 UINT32 Size;
44
45 ASSERT (Buffer != NULL);
46 ASSERT (BufferSize > 0);
47 ASSERT (FullSize > 0);
48 ASSERT (FatOffset != NULL);
49 ASSERT (FatSize != NULL);
50
51 if ( (BufferSize < sizeof (MACH_FAT_HEADER))
52 || !BASE_TYPE_ALIGNED (MACH_FAT_HEADER, Buffer))
53 {
54 return EFI_INVALID_PARAMETER;
55 }
56
57 FatHeader = (MACH_FAT_HEADER *)Buffer;
59 && (FatHeader->Signature != MACH_FAT_BINARY_SIGNATURE)
60 && (FatHeader->Signature != EFI_FAT_BINARY_SIGNATURE))
61 {
62 //
63 // Non-fat binary.
64 //
65 *FatOffset = 0;
66 *FatSize = FullSize;
67 return EFI_SUCCESS;
68 }
69
70 SwapBytes = FatHeader->Signature == MACH_FAT_BINARY_INVERT_SIGNATURE;
71 NumberOfFatArch = FatHeader->NumberOfFatArch;
72 if (SwapBytes) {
73 NumberOfFatArch = SwapBytes32 (NumberOfFatArch);
74 }
75
76 if ( BaseOverflowMulAddU32 (NumberOfFatArch, sizeof (MACH_FAT_ARCH), sizeof (MACH_FAT_HEADER), &TmpSize)
77 || (TmpSize > BufferSize))
78 {
79 return EFI_INVALID_PARAMETER;
80 }
81
82 //
83 // TODO: extend the interface to support subtypes (i.e. MachCpuSubtypeX8664H) some day.
84 //
85 for (Index = 0; Index < NumberOfFatArch; ++Index) {
86 TmpCpuType = FatHeader->FatArch[Index].CpuType;
87 if (SwapBytes) {
88 TmpCpuType = SwapBytes32 (TmpCpuType);
89 }
90
91 if (TmpCpuType == CpuType) {
92 Offset = FatHeader->FatArch[Index].Offset;
93 Size = FatHeader->FatArch[Index].Size;
94 if (SwapBytes) {
95 Offset = SwapBytes32 (Offset);
96 Size = SwapBytes32 (Size);
97 }
98
99 if ( (Offset == 0)
100 || BaseOverflowAddU32 (Offset, Size, &TmpSize)
101 || (TmpSize > FullSize))
102 {
103 return EFI_INVALID_PARAMETER;
104 }
105
106 *FatOffset = Offset;
107 *FatSize = Size;
108 return EFI_SUCCESS;
109 }
110 }
111
112 return EFI_NOT_FOUND;
113}
114
115EFI_STATUS
117 IN OUT UINT8 **FileData,
118 IN OUT UINT32 *FileSize,
119 IN MACH_CPU_TYPE CpuType
120 )
121{
122 EFI_STATUS Status;
123 UINT32 FatOffset;
124 UINT32 FatSize;
125
126 ASSERT (FileData != NULL);
127 ASSERT (FileSize != NULL);
128 ASSERT (*FileSize > 0);
129
130 Status = FatGetArchitectureOffset (*FileData, *FileSize, *FileSize, CpuType, &FatOffset, &FatSize);
131 if (EFI_ERROR (Status)) {
132 return Status;
133 }
134
135 *FileData += FatOffset;
136 *FileSize = FatSize;
137
138 return EFI_SUCCESS;
139}
140
141EFI_STATUS
143 IN OUT UINT8 **FileData,
144 IN OUT UINT32 *FileSize
145 )
146{
147 return FatFilterArchitectureByType (FileData, FileSize, MachCpuTypeX86);
148}
149
150EFI_STATUS
152 IN OUT UINT8 **FileData,
153 IN OUT UINT32 *FileSize
154 )
155{
156 return FatFilterArchitectureByType (FileData, FileSize, MachCpuTypeX8664);
157}
#define MACH_FAT_BINARY_SIGNATURE
#define EFI_FAT_BINARY_SIGNATURE
#define MACH_FAT_BINARY_INVERT_SIGNATURE
@ MachCpuTypeX8664
@ MachCpuTypeX86
INT32 MACH_CPU_TYPE
EFI_STATUS FatFilterArchitectureByType(IN OUT UINT8 **FileData, IN OUT UINT32 *FileSize, IN MACH_CPU_TYPE CpuType)
Definition MachoFat.c:116
EFI_STATUS FatFilterArchitecture64(IN OUT UINT8 **FileData, IN OUT UINT32 *FileSize)
Definition MachoFat.c:151
EFI_STATUS FatFilterArchitecture32(IN OUT UINT8 **FileData, IN OUT UINT32 *FileSize)
Definition MachoFat.c:142
EFI_STATUS FatGetArchitectureOffset(IN CONST UINT8 *Buffer, IN UINT32 BufferSize, IN UINT32 FullSize, IN MACH_CPU_TYPE CpuType, OUT UINT32 *FatOffset, OUT UINT32 *FatSize)
Definition MachoFat.c:27
DMG_SIZE_DEVICE_PATH Size
OC_TYPING_BUFFER_ENTRY Buffer[OC_TYPING_BUFFER_SIZE]
Definition OcTypingLib.h:42
#define ASSERT(x)
Definition coder.h:55
MACH_CPU_TYPE CpuType
MACH_FAT_ARCH FatArch[]