OpenCore  1.0.4
OpenCore Bootloader
Loading...
Searching...
No Matches
FvOnFv2Thunk.c
Go to the documentation of this file.
1
22#include <PiDxe.h>
23#include <Protocol/FirmwareVolume2.h>
25#include <Library/BaseLib.h>
26#include <Library/DebugLib.h>
27#include <Library/UefiBootServicesTableLib.h>
28#include <Library/UefiDriverEntryPoint.h>
29#include <Library/UefiLib.h>
30#include <Library/MemoryAllocationLib.h>
31
32#define FIRMWARE_VOLUME_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('f', 'v', 't', 'h')
33
39
40#define FIRMWARE_VOLUME_PRIVATE_DATA_FROM_THIS(a) CR (a, FIRMWARE_VOLUME_PRIVATE_DATA, FirmwareVolume, FIRMWARE_VOLUME_PRIVATE_DATA_SIGNATURE)
41
52 IN EFI_FV_ATTRIBUTES Fv2Attributes
53 )
54{
55 //
56 // Clear those filed that is not defined in Framework FV spec and Alignment conversion.
57 //
58 return (Fv2Attributes & 0x1ff) | ((UINTN)EFI_FV_ALIGNMENT_2 << RShiftU64 ((Fv2Attributes & EFI_FV2_ALIGNMENT), 16));
59}
60
71EFI_STATUS
72EFIAPI
75 OUT FRAMEWORK_EFI_FV_ATTRIBUTES *Attributes
76 )
77{
78 EFI_STATUS Status;
80 EFI_FIRMWARE_VOLUME2_PROTOCOL *FirmwareVolume2;
81
83 FirmwareVolume2 = Private->FirmwareVolume2;
84
85 Status = FirmwareVolume2->GetVolumeAttributes (
86 FirmwareVolume2,
87 Attributes
88 );
89 if (!EFI_ERROR (Status)) {
90 *Attributes = Fv2AttributesToFvAttributes (*Attributes);
91 }
92
93 return Status;
94}
95
109EFI_STATUS
110EFIAPI
113 IN OUT FRAMEWORK_EFI_FV_ATTRIBUTES *Attributes
114 )
115{
117 EFI_FIRMWARE_VOLUME2_PROTOCOL *FirmwareVolume2;
118 EFI_FV_ATTRIBUTES Fv2Attributes;
119 EFI_STATUS Status;
120
122 FirmwareVolume2 = Private->FirmwareVolume2;
123
124 Fv2Attributes = (*Attributes & 0x1ff);
125 Status = FirmwareVolume2->SetVolumeAttributes (
126 FirmwareVolume2,
127 &Fv2Attributes
128 );
129
130 *Attributes = Fv2AttributesToFvAttributes (Fv2Attributes);
131
132 return Status;
133}
134
165EFI_STATUS
166EFIAPI
169 IN EFI_GUID *NameGuid,
170 IN OUT VOID **Buffer,
171 IN OUT UINTN *BufferSize,
172 OUT EFI_FV_FILETYPE *FoundType,
173 OUT EFI_FV_FILE_ATTRIBUTES *FileAttributes,
174 OUT UINT32 *AuthenticationStatus
175 )
176{
178 EFI_FIRMWARE_VOLUME2_PROTOCOL *FirmwareVolume2;
179 EFI_STATUS Status;
180
182 FirmwareVolume2 = Private->FirmwareVolume2;
183
184 Status = FirmwareVolume2->ReadFile (
185 FirmwareVolume2,
186 NameGuid,
187 Buffer,
188 BufferSize,
189 FoundType,
190 FileAttributes,
191 AuthenticationStatus
192 );
193
194 //
195 // For Framework FV attrbutes, only alignment fields are valid.
196 //
197 *FileAttributes = *FileAttributes & EFI_FV_FILE_ATTRIB_ALIGNMENT;
198
199 return Status;
200}
201
232EFI_STATUS
233EFIAPI
236 IN EFI_GUID *NameGuid,
237 IN EFI_SECTION_TYPE SectionType,
238 IN UINTN SectionInstance,
239 IN OUT VOID **Buffer,
240 IN OUT UINTN *BufferSize,
241 OUT UINT32 *AuthenticationStatus
242 )
243{
245 EFI_FIRMWARE_VOLUME2_PROTOCOL *FirmwareVolume2;
246
248 FirmwareVolume2 = Private->FirmwareVolume2;
249
250 return FirmwareVolume2->ReadSection (
251 FirmwareVolume2,
252 NameGuid,
253 SectionType,
254 SectionInstance,
255 Buffer,
256 BufferSize,
257 AuthenticationStatus
258 );
259}
260
284EFI_STATUS
285EFIAPI
288 IN UINT32 NumberOfFiles,
289 IN FRAMEWORK_EFI_FV_WRITE_POLICY WritePolicy,
291 )
292{
294 EFI_FIRMWARE_VOLUME2_PROTOCOL *FirmwareVolume2;
295 EFI_FV_WRITE_FILE_DATA *PiFileData;
296 EFI_STATUS Status;
297 UINTN Index;
298
300 FirmwareVolume2 = Private->FirmwareVolume2;
301
302 PiFileData = AllocateCopyPool (sizeof (EFI_FV_WRITE_FILE_DATA), FileData);
303 ASSERT (PiFileData != NULL);
304
305 //
306 // Framework Spec assume firmware files are Memory-Mapped.
307 //
308 for (Index = 0; Index < NumberOfFiles; Index++) {
309 PiFileData[Index].FileAttributes |= EFI_FV_FILE_ATTRIB_MEMORY_MAPPED;
310 }
311
312 Status = FirmwareVolume2->WriteFile (
313 FirmwareVolume2,
314 NumberOfFiles,
315 WritePolicy,
316 (EFI_FV_WRITE_FILE_DATA *)FileData
317 );
318
319 FreePool (PiFileData);
320 return Status;
321}
322
343EFI_STATUS
344EFIAPI
347 IN OUT VOID *Key,
348 IN OUT EFI_FV_FILETYPE *FileType,
349 OUT EFI_GUID *NameGuid,
350 OUT EFI_FV_FILE_ATTRIBUTES *Attributes,
351 OUT UINTN *Size
352 )
353{
355 EFI_FIRMWARE_VOLUME2_PROTOCOL *FirmwareVolume2;
356 EFI_STATUS Status;
357
359 FirmwareVolume2 = Private->FirmwareVolume2;
360
361 Status = FirmwareVolume2->GetNextFile (
362 FirmwareVolume2,
363 Key,
364 FileType,
365 NameGuid,
366 Attributes,
367 Size
368 );
369
370 //
371 // For Framework FV attrbutes, only alignment fields are valid.
372 //
373 *Attributes = *Attributes & EFI_FV_FILE_ATTRIB_ALIGNMENT;
374
375 return Status;
376}
377
378//
379// Firmware Volume Protocol template
380//
382
397
398//
399// Module globals
400//
401
411VOID
412EFIAPI
414 IN EFI_EVENT Event,
415 IN VOID *Context
416 )
417{
418 EFI_STATUS Status;
419 UINTN BufferSize;
420 EFI_HANDLE Handle;
422 EFI_FIRMWARE_VOLUME_PROTOCOL *FirmwareVolume;
423
424 while (TRUE) {
425 BufferSize = sizeof (Handle);
426 Status = gBS->LocateHandle (
427 ByRegisterNotify,
428 &gEfiFirmwareVolume2ProtocolGuid,
430 &BufferSize,
431 &Handle
432 );
433 if (EFI_ERROR (Status)) {
434 //
435 // Exit Path of While Loop....
436 //
437 break;
438 }
439
440 //
441 // Skip this handle if the Firmware Volume Protocol is already installed
442 //
443 Status = gBS->HandleProtocol (
444 Handle,
446 (VOID **)&FirmwareVolume
447 );
448 if (!EFI_ERROR (Status)) {
449 continue;
450 }
451
452 //
453 // Allocate private data structure
454 //
455 Private = AllocateCopyPool (sizeof (FIRMWARE_VOLUME_PRIVATE_DATA), &gFirmwareVolumePrivateDataTemplate);
456 if (Private == NULL) {
457 continue;
458 }
459
460 //
461 // Retrieve the Firmware Volume2 Protocol
462 //
463 Status = gBS->HandleProtocol (
464 Handle,
465 &gEfiFirmwareVolume2ProtocolGuid,
466 (VOID **)&Private->FirmwareVolume2
467 );
468 if (EFI_ERROR (Status)) {
469 DEBUG ((DEBUG_INFO, "OCFV: HandleProtocol FirmwareVolume2 failure: %r\n", Status));
470 }
471
472 //
473 // Fill in rest of private data structure
474 //
475 Private->FirmwareVolume.KeySize = Private->FirmwareVolume2->KeySize;
476 Private->FirmwareVolume.ParentHandle = Private->FirmwareVolume2->ParentHandle;
477
478 //
479 // Install Firmware Volume Protocol onto same handle
480 //
481 Status = gBS->InstallMultipleProtocolInterfaces (
482 &Handle,
484 &Private->FirmwareVolume,
485 NULL
486 );
487 if (EFI_ERROR (Status)) {
488 DEBUG ((DEBUG_INFO, "OCFV: Install FirmwareVolume protocol failure: %r\n", Status));
489 }
490 }
491}
492
505EFI_STATUS
506EFIAPI
508 IN EFI_HANDLE ImageHandle,
509 IN EFI_SYSTEM_TABLE *SystemTable
510 )
511{
512 EfiCreateProtocolNotifyEvent (
513 &gEfiFirmwareVolume2ProtocolGuid,
514 TPL_CALLBACK,
516 NULL,
518 );
519 return EFI_SUCCESS;
520}
UINT8 EFI_SECTION_TYPE
UINT64 EFI_FV_ATTRIBUTES
UINT32 EFI_FV_FILE_ATTRIBUTES
UINT8 EFI_FV_FILETYPE
UINT64 FRAMEWORK_EFI_FV_ATTRIBUTES
#define EFI_FV_ALIGNMENT_2
UINT32 FRAMEWORK_EFI_FV_WRITE_POLICY
EFI_GUID gEfiFirmwareVolumeProtocolGuid
EFI_STATUS EFIAPI InitializeFirmwareVolume2(IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable)
EFI_STATUS EFIAPI FvWriteFile(IN EFI_FIRMWARE_VOLUME_PROTOCOL *This, IN UINT32 NumberOfFiles, IN FRAMEWORK_EFI_FV_WRITE_POLICY WritePolicy, IN FRAMEWORK_EFI_FV_WRITE_FILE_DATA *FileData)
FRAMEWORK_EFI_FV_ATTRIBUTES Fv2AttributesToFvAttributes(IN EFI_FV_ATTRIBUTES Fv2Attributes)
EFI_STATUS EFIAPI FvGetVolumeAttributes(IN EFI_FIRMWARE_VOLUME_PROTOCOL *This, OUT FRAMEWORK_EFI_FV_ATTRIBUTES *Attributes)
VOID EFIAPI FvNotificationEvent(IN EFI_EVENT Event, IN VOID *Context)
FIRMWARE_VOLUME_PRIVATE_DATA gFirmwareVolumePrivateDataTemplate
EFI_STATUS EFIAPI FvReadFile(IN EFI_FIRMWARE_VOLUME_PROTOCOL *This, IN EFI_GUID *NameGuid, IN OUT VOID **Buffer, IN OUT UINTN *BufferSize, OUT EFI_FV_FILETYPE *FoundType, OUT EFI_FV_FILE_ATTRIBUTES *FileAttributes, OUT UINT32 *AuthenticationStatus)
EFI_EVENT mFvRegistration
EFI_STATUS EFIAPI FvSetVolumeAttributes(IN EFI_FIRMWARE_VOLUME_PROTOCOL *This, IN OUT FRAMEWORK_EFI_FV_ATTRIBUTES *Attributes)
EFI_STATUS EFIAPI FvGetNextFile(IN EFI_FIRMWARE_VOLUME_PROTOCOL *This, IN OUT VOID *Key, IN OUT EFI_FV_FILETYPE *FileType, OUT EFI_GUID *NameGuid, OUT EFI_FV_FILE_ATTRIBUTES *Attributes, OUT UINTN *Size)
#define FIRMWARE_VOLUME_PRIVATE_DATA_SIGNATURE
EFI_STATUS EFIAPI FvReadSection(IN EFI_FIRMWARE_VOLUME_PROTOCOL *This, IN EFI_GUID *NameGuid, IN EFI_SECTION_TYPE SectionType, IN UINTN SectionInstance, IN OUT VOID **Buffer, IN OUT UINTN *BufferSize, OUT UINT32 *AuthenticationStatus)
#define FIRMWARE_VOLUME_PRIVATE_DATA_FROM_THIS(a)
DMG_SIZE_DEVICE_PATH Size
EFI_BOOT_SERVICES * gBS
OC_TYPING_BUFFER_ENTRY Buffer[OC_TYPING_BUFFER_SIZE]
Definition OcTypingLib.h:42
APPLE_EVENT_HANDLE Handle
Definition OcTypingLib.h:45
UINT64 EFIAPI RShiftU64(IN UINT64 Operand, IN UINTN Count)
Definition UserMath.c:86
#define ASSERT(x)
Definition coder.h:55
EFI_FV_FILE_ATTRIBUTES FileAttributes
EFI_FIRMWARE_VOLUME2_PROTOCOL * FirmwareVolume2
EFI_FIRMWARE_VOLUME_PROTOCOL FirmwareVolume