3 Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>
4 Copyright (c) 2016 - 2018, ARM Limited. All rights reserved.<BR>
5 SPDX-License-Identifier: BSD-2-Clause-Patent
9 #include "StandaloneMmCore.h"
10 #include <Library/FvLib.h>
11 #include <Library/ExtractGuidedSectionLib.h>
14 // List of file types supported by dispatcher
16 EFI_FV_FILETYPE mMmFileTypes
[] = {
18 0xE, //EFI_FV_FILETYPE_MM_STANDALONE,
20 // Note: DXE core will process the FV image file, so skip it in MM core
21 // EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE
27 IN EFI_FIRMWARE_VOLUME_HEADER
*FwVolHeader
,
29 IN UINTN Pe32DataSize
,
32 IN EFI_GUID
*DriverName
37 IN EFI_FIRMWARE_VOLUME_HEADER
*FwVolHeader
42 IN EFI_FIRMWARE_VOLUME_HEADER
*FwVolHeader
46 MmCoreFfsFindMmDriver (
47 IN EFI_FIRMWARE_VOLUME_HEADER
*FwVolHeader
52 Given the pointer to the Firmware Volume Header find the
53 MM driver and return it's PE32 image.
56 FwVolHeader - Pointer to memory mapped FV
64 EFI_STATUS DepexStatus
;
65 EFI_FFS_FILE_HEADER
*FileHeader
;
66 EFI_FV_FILETYPE FileType
;
72 EFI_COMMON_SECTION_HEADER
*Section
;
74 UINTN SectionDataSize
;
77 UINT32 ScratchBufferSize
;
79 UINT16 SectionAttribute
;
80 UINT32 AuthenticationStatus
;
81 EFI_FIRMWARE_VOLUME_HEADER
*InnerFvHeader
;
83 DEBUG ((DEBUG_INFO
, "MmCoreFfsFindMmDriver - 0x%x\n", FwVolHeader
));
85 if (FvHasBeenProcessed (FwVolHeader
)) {
89 FvIsBeingProcesssed (FwVolHeader
);
92 // First check for encapsulated compressed firmware volumes
96 Status
= FfsFindNextFile (EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE
,
97 FwVolHeader
, &FileHeader
);
98 if (EFI_ERROR (Status
)) {
101 Status
= FfsFindSectionData (EFI_SECTION_GUID_DEFINED
, FileHeader
,
102 &SectionData
, &SectionDataSize
);
103 if (EFI_ERROR (Status
)) {
106 Section
= (EFI_COMMON_SECTION_HEADER
*)(FileHeader
+ 1);
107 Status
= ExtractGuidedSectionGetInfo (Section
, &DstBufferSize
,
108 &ScratchBufferSize
, &SectionAttribute
);
109 if (EFI_ERROR (Status
)) {
114 // Allocate scratch buffer
116 ScratchBuffer
= (VOID
*)(UINTN
)AllocatePages (EFI_SIZE_TO_PAGES (ScratchBufferSize
));
117 if (ScratchBuffer
== NULL
) {
118 return EFI_OUT_OF_RESOURCES
;
122 // Allocate destination buffer, extra one page for adjustment
124 DstBuffer
= (VOID
*)(UINTN
)AllocatePages (EFI_SIZE_TO_PAGES (DstBufferSize
));
125 if (DstBuffer
== NULL
) {
126 return EFI_OUT_OF_RESOURCES
;
130 // Call decompress function
132 Status
= ExtractGuidedSectionDecode (Section
, &DstBuffer
, ScratchBuffer
,
133 &AuthenticationStatus
);
134 FreePages (ScratchBuffer
, EFI_SIZE_TO_PAGES (ScratchBufferSize
));
135 if (EFI_ERROR (Status
)) {
140 "Processing compressed firmware volume (AuthenticationStatus == %x)\n",
141 AuthenticationStatus
));
143 Status
= FindFfsSectionInSections (DstBuffer
, DstBufferSize
,
144 EFI_SECTION_FIRMWARE_VOLUME_IMAGE
, &Section
);
145 if (EFI_ERROR (Status
)) {
149 InnerFvHeader
= (VOID
*)(Section
+ 1);
150 Status
= MmCoreFfsFindMmDriver (InnerFvHeader
);
151 if (EFI_ERROR (Status
)) {
156 for (Index
= 0; Index
< sizeof (mMmFileTypes
) / sizeof (mMmFileTypes
[0]); Index
++) {
157 DEBUG ((DEBUG_INFO
, "Check MmFileTypes - 0x%x\n", mMmFileTypes
[Index
]));
158 FileType
= mMmFileTypes
[Index
];
161 Status
= FfsFindNextFile (FileType
, FwVolHeader
, &FileHeader
);
162 if (!EFI_ERROR (Status
)) {
163 Status
= FfsFindSectionData (EFI_SECTION_PE32
, FileHeader
, &Pe32Data
, &Pe32DataSize
);
164 DEBUG ((DEBUG_INFO
, "Find PE data - 0x%x\n", Pe32Data
));
165 DepexStatus
= FfsFindSectionData (EFI_SECTION_MM_DEPEX
, FileHeader
, &Depex
, &DepexSize
);
166 if (!EFI_ERROR (DepexStatus
)) {
167 MmAddToDriverList (FwVolHeader
, Pe32Data
, Pe32DataSize
, Depex
, DepexSize
, &FileHeader
->Name
);
170 } while (!EFI_ERROR (Status
));
176 FreePages (DstBuffer
, EFI_SIZE_TO_PAGES (DstBufferSize
));