]> git.proxmox.com Git - mirror_edk2.git/blame - StandaloneMmPkg/Core/FwVol.c
SourceLevelDebugPkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / StandaloneMmPkg / Core / FwVol.c
CommitLineData
6b46d772
SV
1/**@file\r
2\r
3Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>\r
4Copyright (c) 2016 - 2018, ARM Limited. All rights reserved.<BR>\r
5This program and the accompanying materials\r
6are licensed and made available under the terms and conditions of the BSD License\r
7which accompanies this distribution. The full text of the license may be found at\r
8http://opensource.org/licenses/bsd-license.php\r
9\r
10THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
13**/\r
14\r
15#include "StandaloneMmCore.h"\r
16#include <Library/FvLib.h>\r
d65e0e48 17#include <Library/ExtractGuidedSectionLib.h>\r
6b46d772
SV
18\r
19//\r
20// List of file types supported by dispatcher\r
21//\r
22EFI_FV_FILETYPE mMmFileTypes[] = {\r
23 EFI_FV_FILETYPE_MM,\r
24 0xE, //EFI_FV_FILETYPE_MM_STANDALONE,\r
25 //\r
26 // Note: DXE core will process the FV image file, so skip it in MM core\r
27 // EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE\r
28 //\r
29};\r
30\r
31EFI_STATUS\r
32MmAddToDriverList (\r
33 IN EFI_HANDLE FvHandle,\r
34 IN VOID *Pe32Data,\r
35 IN UINTN Pe32DataSize,\r
36 IN VOID *Depex,\r
37 IN UINTN DepexSize,\r
38 IN EFI_GUID *DriverName\r
39 );\r
40\r
41BOOLEAN\r
42FvHasBeenProcessed (\r
43 IN EFI_HANDLE FvHandle\r
44 );\r
45\r
46VOID\r
47FvIsBeingProcesssed (\r
48 IN EFI_HANDLE FvHandle\r
49 );\r
50\r
51EFI_STATUS\r
52MmCoreFfsFindMmDriver (\r
53 IN EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader\r
54 )\r
55/*++\r
56\r
57Routine Description:\r
58 Given the pointer to the Firmware Volume Header find the\r
59 MM driver and return it's PE32 image.\r
60\r
61Arguments:\r
62 FwVolHeader - Pointer to memory mapped FV\r
63\r
64Returns:\r
65 other - Failure\r
66\r
67--*/\r
68{\r
d65e0e48
AB
69 EFI_STATUS Status;\r
70 EFI_STATUS DepexStatus;\r
71 EFI_FFS_FILE_HEADER *FileHeader;\r
72 EFI_FV_FILETYPE FileType;\r
73 VOID *Pe32Data;\r
74 UINTN Pe32DataSize;\r
75 VOID *Depex;\r
76 UINTN DepexSize;\r
77 UINTN Index;\r
78 EFI_COMMON_SECTION_HEADER *Section;\r
79 VOID *SectionData;\r
80 UINTN SectionDataSize;\r
81 UINT32 DstBufferSize;\r
82 VOID *ScratchBuffer;\r
83 UINT32 ScratchBufferSize;\r
84 VOID *DstBuffer;\r
85 UINT16 SectionAttribute;\r
86 UINT32 AuthenticationStatus;\r
87 EFI_FIRMWARE_VOLUME_HEADER *InnerFvHeader;\r
6b46d772
SV
88\r
89 DEBUG ((DEBUG_INFO, "MmCoreFfsFindMmDriver - 0x%x\n", FwVolHeader));\r
90\r
91 if (FvHasBeenProcessed (FwVolHeader)) {\r
92 return EFI_SUCCESS;\r
93 }\r
94\r
95 FvIsBeingProcesssed (FwVolHeader);\r
96\r
d65e0e48
AB
97 //\r
98 // First check for encapsulated compressed firmware volumes\r
99 //\r
100 FileHeader = NULL;\r
101 do {\r
102 Status = FfsFindNextFile (EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE,\r
103 FwVolHeader, &FileHeader);\r
104 if (EFI_ERROR (Status)) {\r
105 break;\r
106 }\r
107 Status = FfsFindSectionData (EFI_SECTION_GUID_DEFINED, FileHeader,\r
108 &SectionData, &SectionDataSize);\r
109 if (EFI_ERROR (Status)) {\r
110 break;\r
111 }\r
112 Section = (EFI_COMMON_SECTION_HEADER *)(FileHeader + 1);\r
113 Status = ExtractGuidedSectionGetInfo (Section, &DstBufferSize,\r
114 &ScratchBufferSize, &SectionAttribute);\r
115 if (EFI_ERROR (Status)) {\r
116 break;\r
117 }\r
118\r
119 //\r
120 // Allocate scratch buffer\r
121 //\r
122 ScratchBuffer = (VOID *)(UINTN)AllocatePages (EFI_SIZE_TO_PAGES (ScratchBufferSize));\r
123 if (ScratchBuffer == NULL) {\r
124 return EFI_OUT_OF_RESOURCES;\r
125 }\r
126\r
127 //\r
128 // Allocate destination buffer, extra one page for adjustment\r
129 //\r
130 DstBuffer = (VOID *)(UINTN)AllocatePages (EFI_SIZE_TO_PAGES (DstBufferSize));\r
131 if (DstBuffer == NULL) {\r
132 return EFI_OUT_OF_RESOURCES;\r
133 }\r
134\r
135 //\r
136 // Call decompress function\r
137 //\r
138 Status = ExtractGuidedSectionDecode (Section, &DstBuffer, ScratchBuffer,\r
139 &AuthenticationStatus);\r
140 FreePages (ScratchBuffer, EFI_SIZE_TO_PAGES (ScratchBufferSize));\r
141 if (EFI_ERROR (Status)) {\r
142 goto FreeDstBuffer;\r
143 }\r
144\r
145 DEBUG ((DEBUG_INFO,\r
146 "Processing compressed firmware volume (AuthenticationStatus == %x)\n",\r
147 AuthenticationStatus));\r
148\r
149 Status = FindFfsSectionInSections (DstBuffer, DstBufferSize,\r
150 EFI_SECTION_FIRMWARE_VOLUME_IMAGE, &Section);\r
151 if (EFI_ERROR (Status)) {\r
152 goto FreeDstBuffer;\r
153 }\r
154\r
155 InnerFvHeader = (VOID *)(Section + 1);\r
156 Status = MmCoreFfsFindMmDriver (InnerFvHeader);\r
157 if (EFI_ERROR (Status)) {\r
158 goto FreeDstBuffer;\r
159 }\r
160 } while (TRUE);\r
161\r
6b46d772
SV
162 for (Index = 0; Index < sizeof (mMmFileTypes) / sizeof (mMmFileTypes[0]); Index++) {\r
163 DEBUG ((DEBUG_INFO, "Check MmFileTypes - 0x%x\n", mMmFileTypes[Index]));\r
164 FileType = mMmFileTypes[Index];\r
165 FileHeader = NULL;\r
166 do {\r
167 Status = FfsFindNextFile (FileType, FwVolHeader, &FileHeader);\r
168 if (!EFI_ERROR (Status)) {\r
169 Status = FfsFindSectionData (EFI_SECTION_PE32, FileHeader, &Pe32Data, &Pe32DataSize);\r
170 DEBUG ((DEBUG_INFO, "Find PE data - 0x%x\n", Pe32Data));\r
171 DepexStatus = FfsFindSectionData (EFI_SECTION_MM_DEPEX, FileHeader, &Depex, &DepexSize);\r
172 if (!EFI_ERROR (DepexStatus)) {\r
173 MmAddToDriverList (FwVolHeader, Pe32Data, Pe32DataSize, Depex, DepexSize, &FileHeader->Name);\r
174 }\r
175 }\r
176 } while (!EFI_ERROR (Status));\r
177 }\r
178\r
d65e0e48
AB
179 return EFI_SUCCESS;\r
180\r
181FreeDstBuffer:\r
182 FreePages (DstBuffer, EFI_SIZE_TO_PAGES (DstBufferSize));\r
183\r
6b46d772
SV
184 return Status;\r
185}\r