]> git.proxmox.com Git - mirror_edk2.git/blame - EmulatorPkg/FirmwareVolumePei/FirmwareVolumePei.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / EmulatorPkg / FirmwareVolumePei / FirmwareVolumePei.c
CommitLineData
949f388f 1/*++ @file\r
2\r
3Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved.<BR>\r
4Portions copyright (c) 2011, Apple Inc. All rights reserved.\r
e3ba31da 5SPDX-License-Identifier: BSD-2-Clause-Patent\r
949f388f 6\r
7**/\r
8\r
9#include "PiPei.h"\r
10#include <Ppi/EmuThunk.h>\r
11#include <Library/DebugLib.h>\r
12#include <Library/PeimEntryPoint.h>\r
13#include <Library/HobLib.h>\r
14#include <Library/PeiServicesLib.h>\r
15#include <Library/PeiServicesTablePointerLib.h>\r
16#include <Library/PcdLib.h>\r
17\r
18EFI_STATUS\r
19EFIAPI\r
20PeimInitializeFirmwareVolumePei (\r
a550d468
MK
21 IN EFI_PEI_FILE_HANDLE FileHandle,\r
22 IN CONST EFI_PEI_SERVICES **PeiServices\r
949f388f 23 )\r
a550d468 24\r
949f388f 25/*++\r
26\r
27Routine Description:\r
28 Perform a call-back into the SEC simulator to get address of the Firmware Hub\r
29\r
30Arguments:\r
afa99fac 31 FfsHeader - Ffs Header available to every PEIM\r
949f388f 32 PeiServices - General purpose services available to every PEIM.\r
d18d8a1d 33\r
949f388f 34Returns:\r
35 None\r
36\r
37**/\r
38{\r
39 EFI_STATUS Status;\r
40 EFI_PEI_PPI_DESCRIPTOR *PpiDescriptor;\r
41 EMU_THUNK_PPI *Thunk;\r
42 EFI_PHYSICAL_ADDRESS FdBase;\r
43 EFI_PHYSICAL_ADDRESS FdFixUp;\r
44 EFI_FIRMWARE_VOLUME_HEADER *FvHeader;\r
45 UINT64 FdSize;\r
46 UINTN Index;\r
47\r
9c7da8d8 48 DEBUG ((DEBUG_ERROR, "Unix Firmware Volume PEIM Loaded\n"));\r
949f388f 49\r
50 //\r
51 // Get the Fwh Information PPI\r
52 //\r
53 Status = PeiServicesLocatePpi (\r
a550d468
MK
54 &gEmuThunkPpiGuid, // GUID\r
55 0, // INSTANCE\r
56 &PpiDescriptor, // EFI_PEI_PPI_DESCRIPTOR\r
57 (VOID **)&Thunk // PPI\r
58 );\r
949f388f 59 ASSERT_EFI_ERROR (Status);\r
60\r
61 Index = 0;\r
62 do {\r
63 //\r
64 // Get information about all the FD's in the system\r
65 //\r
66 Status = Thunk->FirmwareDevices (Index, &FdBase, &FdSize, &FdFixUp);\r
67 if (!EFI_ERROR (Status)) {\r
68 //\r
69 // Assume the FD starts with an FV header\r
70 //\r
a550d468 71 FvHeader = (EFI_FIRMWARE_VOLUME_HEADER *)(UINTN)FdBase;\r
949f388f 72\r
73 //\r
74 // Make an FV Hob for the first FV in the FD\r
75 //\r
76 BuildFvHob (FdBase, FvHeader->FvLength);\r
77\r
78 if (Index == 0) {\r
79 //\r
80 // Assume the first FD was produced by the NT32.DSC\r
81 // All these strange offests are needed to keep in\r
82 // sync with the FlashMap and NT32.dsc file\r
83 //\r
84 BuildResourceDescriptorHob (\r
85 EFI_RESOURCE_FIRMWARE_DEVICE,\r
86 (EFI_RESOURCE_ATTRIBUTE_PRESENT | EFI_RESOURCE_ATTRIBUTE_INITIALIZED | EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE),\r
87 FdBase,\r
d18d8a1d 88 (\r
a550d468
MK
89 FvHeader->FvLength +\r
90 PcdGet32 (PcdFlashNvStorageVariableSize) +\r
91 PcdGet32 (PcdFlashNvStorageFtwWorkingSize) +\r
92 PcdGet32 (PcdFlashNvStorageFtwSpareSize) +\r
93 PcdGet32 (PcdEmuFlashNvStorageEventLogSize)\r
949f388f 94 )\r
a550d468 95 );\r
949f388f 96\r
97 //\r
98 // Hard code the address of the spare block and variable services.\r
99 // Assume it's a hard coded offset from FV0 in FD0.\r
100 //\r
a550d468 101 FdSize =\r
949f388f 102 PcdGet32 (PcdFlashNvStorageVariableSize) +\r
103 PcdGet32 (PcdFlashNvStorageFtwWorkingSize) +\r
104 PcdGet32 (PcdFlashNvStorageFtwSpareSize) +\r
105 PcdGet32 (PcdEmuFlashNvStorageEventLogSize);\r
106\r
107 BuildFvHob (FdFixUp + PcdGet64 (PcdEmuFlashNvStorageVariableBase), FdSize);\r
108 } else {\r
109 //\r
110 // For other FD's just map them in.\r
111 //\r
112 BuildResourceDescriptorHob (\r
113 EFI_RESOURCE_FIRMWARE_DEVICE,\r
114 (EFI_RESOURCE_ATTRIBUTE_PRESENT | EFI_RESOURCE_ATTRIBUTE_INITIALIZED | EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE),\r
115 FdBase,\r
116 FdSize\r
117 );\r
118 }\r
119 }\r
120\r
121 Index++;\r
122 } while (!EFI_ERROR (Status));\r
123\r
124 return Status;\r
125}\r