]> git.proxmox.com Git - mirror_edk2.git/blame - StandaloneMmPkg/Core/FwVol.c
StandaloneMmPkg/Core: Fix typo in function name
[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
86094561 5SPDX-License-Identifier: BSD-2-Clause-Patent\r
6b46d772
SV
6\r
7**/\r
8\r
9#include "StandaloneMmCore.h"\r
10#include <Library/FvLib.h>\r
d65e0e48 11#include <Library/ExtractGuidedSectionLib.h>\r
6b46d772
SV
12\r
13//\r
14// List of file types supported by dispatcher\r
15//\r
16EFI_FV_FILETYPE mMmFileTypes[] = {\r
17 EFI_FV_FILETYPE_MM,\r
18 0xE, //EFI_FV_FILETYPE_MM_STANDALONE,\r
19 //\r
20 // Note: DXE core will process the FV image file, so skip it in MM core\r
21 // EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE\r
22 //\r
23};\r
24\r
25EFI_STATUS\r
26MmAddToDriverList (\r
7f72ec0b
LE
27 IN EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader,\r
28 IN VOID *Pe32Data,\r
29 IN UINTN Pe32DataSize,\r
30 IN VOID *Depex,\r
31 IN UINTN DepexSize,\r
32 IN EFI_GUID *DriverName\r
6b46d772
SV
33 );\r
34\r
35BOOLEAN\r
36FvHasBeenProcessed (\r
7f72ec0b 37 IN EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader\r
6b46d772
SV
38 );\r
39\r
40VOID\r
81e9eca7 41FvIsBeingProcessed (\r
7f72ec0b 42 IN EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader\r
6b46d772
SV
43 );\r
44\r
45EFI_STATUS\r
46MmCoreFfsFindMmDriver (\r
47 IN EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader\r
48 )\r
49/*++\r
50\r
51Routine Description:\r
52 Given the pointer to the Firmware Volume Header find the\r
53 MM driver and return it's PE32 image.\r
54\r
55Arguments:\r
56 FwVolHeader - Pointer to memory mapped FV\r
57\r
58Returns:\r
59 other - Failure\r
60\r
61--*/\r
62{\r
d65e0e48
AB
63 EFI_STATUS Status;\r
64 EFI_STATUS DepexStatus;\r
65 EFI_FFS_FILE_HEADER *FileHeader;\r
66 EFI_FV_FILETYPE FileType;\r
67 VOID *Pe32Data;\r
68 UINTN Pe32DataSize;\r
69 VOID *Depex;\r
70 UINTN DepexSize;\r
71 UINTN Index;\r
72 EFI_COMMON_SECTION_HEADER *Section;\r
73 VOID *SectionData;\r
74 UINTN SectionDataSize;\r
75 UINT32 DstBufferSize;\r
76 VOID *ScratchBuffer;\r
77 UINT32 ScratchBufferSize;\r
78 VOID *DstBuffer;\r
79 UINT16 SectionAttribute;\r
80 UINT32 AuthenticationStatus;\r
81 EFI_FIRMWARE_VOLUME_HEADER *InnerFvHeader;\r
6b46d772
SV
82\r
83 DEBUG ((DEBUG_INFO, "MmCoreFfsFindMmDriver - 0x%x\n", FwVolHeader));\r
84\r
85 if (FvHasBeenProcessed (FwVolHeader)) {\r
86 return EFI_SUCCESS;\r
87 }\r
88\r
81e9eca7 89 FvIsBeingProcessed (FwVolHeader);\r
6b46d772 90\r
d65e0e48
AB
91 //\r
92 // First check for encapsulated compressed firmware volumes\r
93 //\r
94 FileHeader = NULL;\r
95 do {\r
96 Status = FfsFindNextFile (EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE,\r
97 FwVolHeader, &FileHeader);\r
98 if (EFI_ERROR (Status)) {\r
99 break;\r
100 }\r
101 Status = FfsFindSectionData (EFI_SECTION_GUID_DEFINED, FileHeader,\r
102 &SectionData, &SectionDataSize);\r
103 if (EFI_ERROR (Status)) {\r
104 break;\r
105 }\r
106 Section = (EFI_COMMON_SECTION_HEADER *)(FileHeader + 1);\r
107 Status = ExtractGuidedSectionGetInfo (Section, &DstBufferSize,\r
108 &ScratchBufferSize, &SectionAttribute);\r
109 if (EFI_ERROR (Status)) {\r
110 break;\r
111 }\r
112\r
113 //\r
114 // Allocate scratch buffer\r
115 //\r
116 ScratchBuffer = (VOID *)(UINTN)AllocatePages (EFI_SIZE_TO_PAGES (ScratchBufferSize));\r
117 if (ScratchBuffer == NULL) {\r
118 return EFI_OUT_OF_RESOURCES;\r
119 }\r
120\r
121 //\r
122 // Allocate destination buffer, extra one page for adjustment\r
123 //\r
124 DstBuffer = (VOID *)(UINTN)AllocatePages (EFI_SIZE_TO_PAGES (DstBufferSize));\r
125 if (DstBuffer == NULL) {\r
126 return EFI_OUT_OF_RESOURCES;\r
127 }\r
128\r
129 //\r
130 // Call decompress function\r
131 //\r
132 Status = ExtractGuidedSectionDecode (Section, &DstBuffer, ScratchBuffer,\r
133 &AuthenticationStatus);\r
134 FreePages (ScratchBuffer, EFI_SIZE_TO_PAGES (ScratchBufferSize));\r
135 if (EFI_ERROR (Status)) {\r
136 goto FreeDstBuffer;\r
137 }\r
138\r
139 DEBUG ((DEBUG_INFO,\r
140 "Processing compressed firmware volume (AuthenticationStatus == %x)\n",\r
141 AuthenticationStatus));\r
142\r
143 Status = FindFfsSectionInSections (DstBuffer, DstBufferSize,\r
144 EFI_SECTION_FIRMWARE_VOLUME_IMAGE, &Section);\r
145 if (EFI_ERROR (Status)) {\r
146 goto FreeDstBuffer;\r
147 }\r
148\r
149 InnerFvHeader = (VOID *)(Section + 1);\r
150 Status = MmCoreFfsFindMmDriver (InnerFvHeader);\r
151 if (EFI_ERROR (Status)) {\r
152 goto FreeDstBuffer;\r
153 }\r
154 } while (TRUE);\r
155\r
6b46d772
SV
156 for (Index = 0; Index < sizeof (mMmFileTypes) / sizeof (mMmFileTypes[0]); Index++) {\r
157 DEBUG ((DEBUG_INFO, "Check MmFileTypes - 0x%x\n", mMmFileTypes[Index]));\r
158 FileType = mMmFileTypes[Index];\r
159 FileHeader = NULL;\r
160 do {\r
161 Status = FfsFindNextFile (FileType, FwVolHeader, &FileHeader);\r
162 if (!EFI_ERROR (Status)) {\r
163 Status = FfsFindSectionData (EFI_SECTION_PE32, FileHeader, &Pe32Data, &Pe32DataSize);\r
164 DEBUG ((DEBUG_INFO, "Find PE data - 0x%x\n", Pe32Data));\r
165 DepexStatus = FfsFindSectionData (EFI_SECTION_MM_DEPEX, FileHeader, &Depex, &DepexSize);\r
166 if (!EFI_ERROR (DepexStatus)) {\r
167 MmAddToDriverList (FwVolHeader, Pe32Data, Pe32DataSize, Depex, DepexSize, &FileHeader->Name);\r
168 }\r
169 }\r
170 } while (!EFI_ERROR (Status));\r
171 }\r
172\r
d65e0e48
AB
173 return EFI_SUCCESS;\r
174\r
175FreeDstBuffer:\r
176 FreePages (DstBuffer, EFI_SIZE_TO_PAGES (DstBufferSize));\r
177\r
6b46d772
SV
178 return Status;\r
179}\r