]> git.proxmox.com Git - mirror_edk2.git/blame - StandaloneMmPkg/Core/FwVol.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / StandaloneMmPkg / Core / FwVol.c
CommitLineData
b2b02a48
SM
1/** @file\r
2 Firmware volume helper interfaces.\r
6b46d772 3\r
b2b02a48
SM
4 Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>\r
5 Copyright (c) 2016 - 2021, Arm Limited. All rights reserved.<BR>\r
6 SPDX-License-Identifier: BSD-2-Clause-Patent\r
6b46d772
SV
7\r
8**/\r
9\r
10#include "StandaloneMmCore.h"\r
11#include <Library/FvLib.h>\r
d65e0e48 12#include <Library/ExtractGuidedSectionLib.h>\r
6b46d772
SV
13\r
14//\r
15// List of file types supported by dispatcher\r
16//\r
91415a36 17EFI_FV_FILETYPE mMmFileTypes[] = {\r
6b46d772 18 EFI_FV_FILETYPE_MM,\r
91415a36 19 0xE, // EFI_FV_FILETYPE_MM_STANDALONE,\r
6b46d772
SV
20 //\r
21 // Note: DXE core will process the FV image file, so skip it in MM core\r
22 // EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE\r
23 //\r
24};\r
25\r
26EFI_STATUS\r
27MmAddToDriverList (\r
91415a36
MK
28 IN EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader,\r
29 IN VOID *Pe32Data,\r
30 IN UINTN Pe32DataSize,\r
31 IN VOID *Depex,\r
32 IN UINTN DepexSize,\r
33 IN EFI_GUID *DriverName\r
6b46d772
SV
34 );\r
35\r
36BOOLEAN\r
37FvHasBeenProcessed (\r
91415a36 38 IN EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader\r
6b46d772
SV
39 );\r
40\r
41VOID\r
81e9eca7 42FvIsBeingProcessed (\r
91415a36 43 IN EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader\r
6b46d772
SV
44 );\r
45\r
92df3ca8 46/**\r
6b46d772 47 Given the pointer to the Firmware Volume Header find the\r
2a0755a9 48 MM driver and return its PE32 image.\r
6b46d772 49\r
92df3ca8 50 @param [in] FwVolHeader Pointer to memory mapped FV\r
6b46d772 51\r
92df3ca8
SM
52 @retval EFI_SUCCESS Success.\r
53 @retval EFI_INVALID_PARAMETER Invalid parameter.\r
54 @retval EFI_NOT_FOUND Could not find section data.\r
55 @retval EFI_OUT_OF_RESOURCES Out of resources.\r
56 @retval EFI_VOLUME_CORRUPTED Firmware volume is corrupted.\r
57 @retval EFI_UNSUPPORTED Operation not supported.\r
6b46d772 58\r
92df3ca8
SM
59**/\r
60EFI_STATUS\r
61MmCoreFfsFindMmDriver (\r
62 IN EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader\r
63 )\r
6b46d772 64{\r
91415a36
MK
65 EFI_STATUS Status;\r
66 EFI_STATUS DepexStatus;\r
67 EFI_FFS_FILE_HEADER *FileHeader;\r
68 EFI_FV_FILETYPE FileType;\r
69 VOID *Pe32Data;\r
70 UINTN Pe32DataSize;\r
71 VOID *Depex;\r
72 UINTN DepexSize;\r
73 UINTN Index;\r
74 EFI_COMMON_SECTION_HEADER *Section;\r
75 VOID *SectionData;\r
76 UINTN SectionDataSize;\r
77 UINT32 DstBufferSize;\r
78 VOID *ScratchBuffer;\r
79 UINT32 ScratchBufferSize;\r
80 VOID *DstBuffer;\r
81 UINT16 SectionAttribute;\r
82 UINT32 AuthenticationStatus;\r
83 EFI_FIRMWARE_VOLUME_HEADER *InnerFvHeader;\r
6b46d772
SV
84\r
85 DEBUG ((DEBUG_INFO, "MmCoreFfsFindMmDriver - 0x%x\n", FwVolHeader));\r
86\r
87 if (FvHasBeenProcessed (FwVolHeader)) {\r
88 return EFI_SUCCESS;\r
89 }\r
90\r
81e9eca7 91 FvIsBeingProcessed (FwVolHeader);\r
6b46d772 92\r
d65e0e48
AB
93 //\r
94 // First check for encapsulated compressed firmware volumes\r
95 //\r
96 FileHeader = NULL;\r
97 do {\r
91415a36
MK
98 Status = FfsFindNextFile (\r
99 EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE,\r
100 FwVolHeader,\r
101 &FileHeader\r
102 );\r
d65e0e48
AB
103 if (EFI_ERROR (Status)) {\r
104 break;\r
105 }\r
91415a36
MK
106\r
107 Status = FfsFindSectionData (\r
108 EFI_SECTION_GUID_DEFINED,\r
109 FileHeader,\r
110 &SectionData,\r
111 &SectionDataSize\r
112 );\r
d65e0e48
AB
113 if (EFI_ERROR (Status)) {\r
114 break;\r
115 }\r
91415a36 116\r
d65e0e48 117 Section = (EFI_COMMON_SECTION_HEADER *)(FileHeader + 1);\r
91415a36
MK
118 Status = ExtractGuidedSectionGetInfo (\r
119 Section,\r
120 &DstBufferSize,\r
121 &ScratchBufferSize,\r
122 &SectionAttribute\r
123 );\r
d65e0e48
AB
124 if (EFI_ERROR (Status)) {\r
125 break;\r
126 }\r
127\r
128 //\r
129 // Allocate scratch buffer\r
130 //\r
131 ScratchBuffer = (VOID *)(UINTN)AllocatePages (EFI_SIZE_TO_PAGES (ScratchBufferSize));\r
132 if (ScratchBuffer == NULL) {\r
133 return EFI_OUT_OF_RESOURCES;\r
134 }\r
135\r
136 //\r
137 // Allocate destination buffer, extra one page for adjustment\r
138 //\r
139 DstBuffer = (VOID *)(UINTN)AllocatePages (EFI_SIZE_TO_PAGES (DstBufferSize));\r
140 if (DstBuffer == NULL) {\r
141 return EFI_OUT_OF_RESOURCES;\r
142 }\r
143\r
144 //\r
145 // Call decompress function\r
146 //\r
91415a36
MK
147 Status = ExtractGuidedSectionDecode (\r
148 Section,\r
149 &DstBuffer,\r
150 ScratchBuffer,\r
151 &AuthenticationStatus\r
152 );\r
d65e0e48
AB
153 FreePages (ScratchBuffer, EFI_SIZE_TO_PAGES (ScratchBufferSize));\r
154 if (EFI_ERROR (Status)) {\r
155 goto FreeDstBuffer;\r
156 }\r
157\r
91415a36
MK
158 DEBUG ((\r
159 DEBUG_INFO,\r
d65e0e48 160 "Processing compressed firmware volume (AuthenticationStatus == %x)\n",\r
91415a36
MK
161 AuthenticationStatus\r
162 ));\r
163\r
164 Status = FindFfsSectionInSections (\r
165 DstBuffer,\r
166 DstBufferSize,\r
167 EFI_SECTION_FIRMWARE_VOLUME_IMAGE,\r
168 &Section\r
169 );\r
d65e0e48
AB
170 if (EFI_ERROR (Status)) {\r
171 goto FreeDstBuffer;\r
172 }\r
173\r
174 InnerFvHeader = (VOID *)(Section + 1);\r
91415a36 175 Status = MmCoreFfsFindMmDriver (InnerFvHeader);\r
d65e0e48
AB
176 if (EFI_ERROR (Status)) {\r
177 goto FreeDstBuffer;\r
178 }\r
179 } while (TRUE);\r
180\r
6b46d772
SV
181 for (Index = 0; Index < sizeof (mMmFileTypes) / sizeof (mMmFileTypes[0]); Index++) {\r
182 DEBUG ((DEBUG_INFO, "Check MmFileTypes - 0x%x\n", mMmFileTypes[Index]));\r
91415a36 183 FileType = mMmFileTypes[Index];\r
6b46d772
SV
184 FileHeader = NULL;\r
185 do {\r
186 Status = FfsFindNextFile (FileType, FwVolHeader, &FileHeader);\r
187 if (!EFI_ERROR (Status)) {\r
188 Status = FfsFindSectionData (EFI_SECTION_PE32, FileHeader, &Pe32Data, &Pe32DataSize);\r
189 DEBUG ((DEBUG_INFO, "Find PE data - 0x%x\n", Pe32Data));\r
190 DepexStatus = FfsFindSectionData (EFI_SECTION_MM_DEPEX, FileHeader, &Depex, &DepexSize);\r
191 if (!EFI_ERROR (DepexStatus)) {\r
192 MmAddToDriverList (FwVolHeader, Pe32Data, Pe32DataSize, Depex, DepexSize, &FileHeader->Name);\r
193 }\r
194 }\r
195 } while (!EFI_ERROR (Status));\r
196 }\r
197\r
d65e0e48
AB
198 return EFI_SUCCESS;\r
199\r
200FreeDstBuffer:\r
201 FreePages (DstBuffer, EFI_SIZE_TO_PAGES (DstBufferSize));\r
202\r
6b46d772
SV
203 return Status;\r
204}\r