OpenCore  1.0.4
OpenCore Bootloader
Loading...
Searching...
No Matches
OcDataHubLib.c
Go to the documentation of this file.
1
15#include <Uefi.h>
16
18#include <IndustryStandard/Pci.h>
19
21
22#include <Protocol/DataHub.h>
24#include <Protocol/PciIo.h>
25
26#include <Library/BaseLib.h>
27#include <Library/BaseMemoryLib.h>
28#include <Library/BaseOverflowLib.h>
29#include <Library/DebugLib.h>
30#include <Library/MemoryAllocationLib.h>
31#include <Library/OcMiscLib.h>
33#include <Library/OcStringLib.h>
34#include <Library/UefiBootServicesTableLib.h>
35#include <Library/UefiLib.h>
36#include <Library/UefiRuntimeServicesTableLib.h>
37
44 VOID
45 );
46
49 IN BOOLEAN Reinstall
50 )
51{
52 EFI_STATUS Status;
53 EFI_DATA_HUB_PROTOCOL *DataHub;
54
55 if (Reinstall) {
57 if (EFI_ERROR (Status)) {
58 DEBUG ((DEBUG_ERROR, "OCDH: Uninstall failed - %r\n", Status));
59 return NULL;
60 }
61 } else {
62 Status = gBS->LocateProtocol (
64 NULL,
65 (VOID **)&DataHub
66 );
67
68 if (!EFI_ERROR (Status)) {
69 return DataHub;
70 }
71 }
72
73 return DataHubInstall ();
74}
75
76STATIC
77EFI_STATUS
79 IN EFI_DATA_HUB_PROTOCOL *DataHub,
80 IN CONST CHAR16 *Key,
81 IN CONST CHAR8 *Value
82 )
83{
84 EFI_STATUS Status;
85
86 Status = EFI_SUCCESS;
87
88 if (Value != NULL) {
89 Status = SetDataHubEntry (
90 DataHub,
92 Key,
93 Value,
94 (UINT32)AsciiStrSize (Value)
95 );
96 }
97
98 return Status;
99}
100
101STATIC
102EFI_STATUS
104 IN EFI_DATA_HUB_PROTOCOL *DataHub,
105 IN CONST CHAR16 *Key,
106 IN CONST CHAR8 *Value
107 )
108{
109 EFI_STATUS Status;
110 CHAR16 *UnicodeValue;
111
112 Status = EFI_SUCCESS;
113
114 if (Value != NULL) {
115 UnicodeValue = AsciiStrCopyToUnicode (Value, 0);
116 if (UnicodeValue == NULL) {
117 DEBUG ((DEBUG_WARN, "OCDH: Data Hub failed to allocate %s\n", Key));
118 return EFI_OUT_OF_RESOURCES;
119 }
120
121 Status = SetDataHubEntry (
122 DataHub,
124 Key,
125 UnicodeValue,
126 (UINT32)StrSize (UnicodeValue)
127 );
128
129 FreePool (UnicodeValue);
130 }
131
132 return Status;
133}
134
135STATIC
136EFI_STATUS
138 IN EFI_DATA_HUB_PROTOCOL *DataHub,
139 IN CONST CHAR16 *Key,
140 IN CONST VOID *Value,
141 IN UINT32 Size
142 )
143{
144 EFI_STATUS Status;
145
146 Status = EFI_SUCCESS;
147
148 if (Value != NULL) {
149 Status = SetDataHubEntry (
150 DataHub,
152 Key,
153 Value,
154 Size
155 );
156 }
157
158 return Status;
159}
160
161STATIC
162EFI_STATUS
164 IN EFI_DATA_HUB_PROTOCOL *DataHub,
165 IN CONST CHAR16 *Key,
166 IN CONST VOID *Value,
167 IN UINT32 Size
168 )
169{
170 EFI_STATUS Status;
171
172 Status = EFI_SUCCESS;
173
174 if (Value != NULL) {
175 Status = SetDataHubEntry (
176 DataHub,
178 Key,
179 Value,
180 Size
181 );
182 }
183
184 return Status;
185}
186
187EFI_STATUS
189 IN EFI_DATA_HUB_PROTOCOL *DataHub,
190 IN EFI_GUID *DataRecordGuid,
191 IN CONST CHAR16 *Key,
192 IN CONST VOID *Data,
193 IN UINT32 DataSize
194 )
195{
196 EFI_STATUS Status;
197
199 UINT32 KeySize;
200 UINT32 TotalSize;
201 BOOLEAN Result;
202
203 KeySize = (UINT32)StrSize (Key);
204 Result = BaseOverflowTriAddU32 (
205 sizeof (*Entry),
206 KeySize,
207 DataSize,
208 &TotalSize
209 );
210 if (Result) {
211 return EFI_INVALID_PARAMETER;
212 }
213
214 Entry = AllocateZeroPool (TotalSize);
215
216 if (Entry == NULL) {
217 return EFI_OUT_OF_RESOURCES;
218 }
219
220 //
221 // TODO: We may want to fill header some day.
222 // Currently it is not important.
223 //
224 Entry->KeySize = KeySize;
225 Entry->ValueSize = DataSize;
226
227 CopyMem (&Entry->Data[0], Key, KeySize);
228 CopyMem (&Entry->Data[Entry->KeySize], Data, DataSize);
229
230 Status = DataHub->LogData (
231 DataHub,
232 DataRecordGuid,
235 Entry,
236 TotalSize
237 );
238
239 DEBUG ((
240 EFI_ERROR (Status) ? DEBUG_WARN : DEBUG_INFO,
241 "OCDH: Setting DataHub %g:%s (%u) - %r\n",
243 Key,
244 DataSize,
245 Status
246 ));
247
248 FreePool (Entry);
249
250 return Status;
251}
252
253EFI_STATUS
255 IN EFI_DATA_HUB_PROTOCOL *DataHub,
256 IN OC_DATA_HUB_DATA *Data,
257 IN OC_CPU_INFO *CpuInfo
258 )
259{
260 DataHubSetAppleMiscAscii (DataHub, OC_PLATFORM_NAME, Data->PlatformName);
261 DataHubSetAppleMiscUnicode (DataHub, OC_SYSTEM_PRODUCT_NAME, Data->SystemProductName);
262 DataHubSetAppleMiscUnicode (DataHub, OC_SYSTEM_SERIAL_NUMBER, Data->SystemSerialNumber);
263 if (Data->SystemUUID != NULL) {
264 DataHubSetAppleMiscData (DataHub, OC_SYSTEM_UUID, Data->SystemUUID, sizeof (*Data->SystemUUID));
265 }
266
267 DataHubSetAppleMiscAscii (DataHub, OC_BOARD_PRODUCT, Data->BoardProduct);
268 DataHubSetAppleMiscData (DataHub, OC_BOARD_REVISION, Data->BoardRevision, sizeof (*Data->BoardRevision));
269 DataHubSetAppleMiscData (DataHub, OC_STARTUP_POWER_EVENTS, Data->StartupPowerEvents, sizeof (*Data->StartupPowerEvents));
270 DataHubSetAppleProcessorData (DataHub, OC_INITIAL_TSC, Data->InitialTSC, sizeof (*Data->InitialTSC));
271 if (Data->FSBFrequency == NULL) {
272 Data->FSBFrequency = &CpuInfo->FSBFrequency;
273 }
274
275 DataHubSetAppleProcessorData (DataHub, OC_FSB_FREQUENCY, Data->FSBFrequency, sizeof (*Data->FSBFrequency));
276 if ((Data->ARTFrequency == NULL) && (CpuInfo->ARTFrequency > 0) && (CpuInfo->ARTFrequency != DEFAULT_ART_CLOCK_SOURCE)) {
277 Data->ARTFrequency = &CpuInfo->ARTFrequency;
278 }
279
280 DataHubSetAppleProcessorData (DataHub, OC_ART_FREQUENCY, Data->ARTFrequency, sizeof (*Data->ARTFrequency));
281 DataHubSetAppleMiscData (DataHub, OC_DEVICE_PATHS_SUPPORTED, Data->DevicePathsSupported, sizeof (*Data->DevicePathsSupported));
282 DataHubSetAppleMiscData (DataHub, OC_SMC_REVISION, Data->SmcRevision, OC_SMC_REVISION_SIZE);
283 DataHubSetAppleMiscData (DataHub, OC_SMC_BRANCH, Data->SmcBranch, OC_SMC_BRANCH_SIZE);
284 DataHubSetAppleMiscData (DataHub, OC_SMC_PLATFORM, Data->SmcPlatform, OC_SMC_PLATFORM_SIZE);
285 //
286 // Should normally be 0x20000, but it will cause issues like Recovery OS not booting
287 // without real coprocessor hardware present.
288 //
289 DataHubSetAppleMiscData (DataHub, OC_COPROCESSOR_VERSION, Data->CoprocessorVersion, sizeof (*Data->CoprocessorVersion));
290
291 return EFI_SUCCESS;
292}
EFI_GUID gApplePlatformProducerNameGuid
EFI_GUID gEfiMiscSubClassGuid
EFI_GUID gEfiProcessorSubClassGuid
#define EFI_DATA_RECORD_CLASS_DATA
Definition DataHub.h:64
EFI_GUID gEfiDataHubProtocolGuid
DMG_SIZE_DEVICE_PATH Size
EFI_BOOT_SERVICES * gBS
STATIC EFI_STATUS DataHubSetAppleMiscAscii(IN EFI_DATA_HUB_PROTOCOL *DataHub, IN CONST CHAR16 *Key, IN CONST CHAR8 *Value)
STATIC EFI_STATUS DataHubSetAppleMiscUnicode(IN EFI_DATA_HUB_PROTOCOL *DataHub, IN CONST CHAR16 *Key, IN CONST CHAR8 *Value)
STATIC EFI_STATUS DataHubSetAppleProcessorData(IN EFI_DATA_HUB_PROTOCOL *DataHub, IN CONST CHAR16 *Key, IN CONST VOID *Value, IN UINT32 Size)
STATIC EFI_STATUS DataHubSetAppleMiscData(IN EFI_DATA_HUB_PROTOCOL *DataHub, IN CONST CHAR16 *Key, IN CONST VOID *Value, IN UINT32 Size)
EFI_DATA_HUB_PROTOCOL * DataHubInstall(VOID)
Definition DataHub.c:538
EFI_STATUS SetDataHubEntry(IN EFI_DATA_HUB_PROTOCOL *DataHub, IN EFI_GUID *DataRecordGuid, IN CONST CHAR16 *Key, IN CONST VOID *Data, IN UINT32 DataSize)
EFI_STATUS UpdateDataHub(IN EFI_DATA_HUB_PROTOCOL *DataHub, IN OC_DATA_HUB_DATA *Data, IN OC_CPU_INFO *CpuInfo)
EFI_DATA_HUB_PROTOCOL * OcDataHubInstallProtocol(IN BOOLEAN Reinstall)
#define OC_SYSTEM_SERIAL_NUMBER
#define OC_BOARD_PRODUCT
#define OC_SMC_BRANCH_SIZE
#define OC_INITIAL_TSC
#define OC_SYSTEM_UUID
#define OC_SMC_PLATFORM
#define OC_PLATFORM_NAME
#define OC_COPROCESSOR_VERSION
#define OC_SYSTEM_PRODUCT_NAME
#define OC_ART_FREQUENCY
#define OC_SMC_BRANCH
#define OC_BOARD_REVISION
#define OC_FSB_FREQUENCY
#define OC_SMC_REVISION_SIZE
#define OC_STARTUP_POWER_EVENTS
#define OC_SMC_PLATFORM_SIZE
#define OC_SMC_REVISION
#define OC_DEVICE_PATHS_SUPPORTED
EFI_STATUS OcUninstallAllProtocolInstances(EFI_GUID *Protocol)
CHAR16 * AsciiStrCopyToUnicode(IN CONST CHAR8 *String, IN UINTN Length)
Definition OcAsciiLib.c:119
#define DEFAULT_ART_CLOCK_SOURCE
VOID *EFIAPI CopyMem(OUT VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)