From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from linux.microsoft.com (linux.microsoft.com [13.77.154.182]) by mx.groups.io with SMTP id smtpd.web08.12118.1647966013818208969 for ; Tue, 22 Mar 2022 09:20:14 -0700 Authentication-Results: mx.groups.io; dkim=fail reason="body hash did not verify" header.i=@linux.microsoft.com header.s=default header.b=NQUcPVSX; spf=pass (domain: linux.microsoft.com, ip: 13.77.154.182, mailfrom: mikuback@linux.microsoft.com) Received: from localhost.localdomain (unknown [47.202.59.224]) by linux.microsoft.com (Postfix) with ESMTPSA id 0F14520DE489; Tue, 22 Mar 2022 09:20:11 -0700 (PDT) DKIM-Filter: OpenDKIM Filter v2.11.0 linux.microsoft.com 0F14520DE489 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.microsoft.com; s=default; t=1647966013; bh=AFLK5J37Y2czDlrSrh31UpugKeNmMG0koFI4PWccPI4=; h=From:To:Cc:Subject:Date:From; b=NQUcPVSXk38i3WZEbuZdRX6cqhH3wHZg3zYuctqPxZsKxYAuT8UL+HPvkSAvFo8VD 8HpINYjiYIYA2q5i7U96qJRFQqNebvkgCUFH7HRvKz7GrOjKj5H4+RvwUH8JdSwqlc BlLRMjb8gr5SBUduXaqeA4IRE7GLAzRYEpasTGGA= From: "Michael Kubacki" To: devel@edk2.groups.io Cc: Andrew Fish , Kang Gao , Michael D Kinney , Michael Kubacki , Leif Lindholm , Benjamin You , Liu Yun , Ankit Sinha , Nate DeSimone Subject: [PATCH v1 00/41] Add PrmPkg Date: Tue, 22 Mar 2022 12:19:06 -0400 Message-Id: <20220322161947.9319-1-mikuback@linux.microsoft.com> X-Mailer: git-send-email 2.28.0.windows.1 MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable From: Michael Kubacki This patch series adds a new package called PrmPkg. An RFC was sent to the edk2 mailing list on January 28, 2022 detailing the proposal, see https://edk2.groups.io/g/devel/message/86181. Platform Runtime Mechanism (PRM) is a new firmware solution that has been developed in edk2-staging/PlatformRuntimeMechanism. This patch series has been organized to greatly condense the history from the edk2-staging branch but to preserve important decisions and changes in history that help establish context of changes and will serve as valuable references for future development. Interest in PRM has increased across various vendors and we believe it is beneficial to make the source code more widely available for the following reasons: 1. PRM specification adoption 2. Feature completeness 3. Overall validation coverage 4. Interest from the community and future collaboration The technical details of PRM are covered in the PRM Specification in addition to the Readme.md file located in the root of PrmPkg in this patch series. 1. PRM specification adoption Intel and Microsoft have worked together to standardize PRM in the ACPI Specification and the PRM Specification hosted on uefi.org. * ACPI 6.4 Specification: https://uefi.org/node/4149 * PRM Specification: https://uefi.org/sites/default/files/resources/Platform%20Runtime%20Mec= hanism%20-%20with%20legal%20notice.pdf 2. Feature completeness PrmPkg implements the full firmware functionality described in the PRM Specification and there are no significant changes to functionality planned at this time. Though we are very much interested in evolving PRM based on feedback. 3. Overall validation coverage PrmPkg has been integrated and tested on client and server systems in addition to virtual platforms (OvmfPkg/QEMU). Platform integration is simple and a demonstration of this integration for OvmfPkg is available in the following branch: https://github.com/makubacki/edk2/tree/ovmf_prmpkg_integration The code has been built with: * MSFT VS2015, VS2017, and VS2019 * GCC5 (see https://bugzilla.tianocore.org/show_bug.cgi?id=3D3802) * iASL compiler (20200528 - https://acpica.org/node/181) The Linux kernel currently includes the following PRM support: * _OSC PRM bit - allows FW to know determine the OS is PRM-capable and can redirect _DSM method from alternate triggers (such as SMI) to PRM. * PRM invocation via _DSM, includes PRM module and handler parsing from ACPI PRMT table, and also the PRM operation region handler for runtime PRM service invocation. * An OS configuration for PRM enabling, PRM support can be disabled during OS image build. Note that upstream Linux does not currently support the following: * Ability for the OS driver to call a PRM handler directly, it has to be via ACPI _DSM. * Run time update PRM module and handler via PE/COFF PRM image. This commit provides additional context of the changes in Linux: https://github.com/torvalds/linux/commit/cefc7ca46235f01d5233e3abd4b79452= af01d9e9 Windows 11 (https://www.microsoft.com/software-download/windows11) and Windows Server 2022 (https://docs.microsoft.com/en-us/windows-hardwar= e/drivers/download-the-wdk) include the PRM functionality noted above in addition to PRM direct call and PRM runtime updates. PRM has been tested on IA32, X64, and AARCH64 targets. 4. Interest from the community and future collaboration PRM has been presented at several industry conferences: * OSFC 2020 - "PRM: SMM Goes on a Diet" https://cfp.osfc.io/osfc2020/talk/MCJASB/ * OCP Summit 2019 - "Case Study Alternatives for SMM Usage in Intel Platforms" https://www.youtube.com/watch?v=3Dmu3DRLM1dPA =20 In addition, Microsoft plans to publish the Windows PRM driver interface and a WDF sample driver that uses the interface to the Windows Driver Samples GitHub repository (https://github.com/microsoft/Windows-driver-samples). We believe a PrmPkg in edk2 can increase accessibility to PRM and ease collaboration. PrmPkg ------ PrmPkg contains the common functionality needed to enable PRM on any system. It does not contain platform-specific code such as PRM modules (and by extension PRM handlers). Other than sample modules, PrmPkg will only contain code needed to provide PRM feature functionality as defined in the PRM Specification. PrmPkg is scoped to continue to only contain platform-agnostic functionality in the future. The proposed maintainers of PrmPkg are: * Michael Kubacki * Nate DeSimone The proposed reviewers of PrmPkg are: * Ankit Sinha Cc: Andrew Fish Cc: Kang Gao Cc: Michael D Kinney Cc: Michael Kubacki Cc: Leif Lindholm Cc: Benjamin You Cc: Liu Yun Cc: Ankit Sinha Cc: Nate DeSimone Signed-off-by: Michael Kubacki Liu (2): PrmPkg: Publish PRM operation region to support PRM ACPI _DSM invocation PrmPkg: Export major/minor version in PRM module PE COFF header Liu Yun Y (1): PrmPkg: Update PRM OpRegion Michael Kubacki (38): PrmPkg: Add package and include headers PrmPkg: Add PrmConfig protocol interface PrmPkg/PrmContextBufferLib: Add initial library instance PrmPkg/PrmConfigDxe: Add initial driver PrmPkg: Add initial PrmSamplePrintModule PrmPkg: Add initial PrmSampleMemoryAllocationModule PrmPkg: Add initial PrmSampleHardwareAccessModule PrmPkg: Add initial PrmSampleContextBufferModule PrmPkg: Add initial package DSC file Readme.md: Add initial content PrmPkg: Add ALLOCATE_CONTEXT_BUFFER_IN_FW build option PrmPkg: Enable variable growth for the PRM_MODULE_EXPORT macro PrmPkg: Add initial PrmSsdtInstallDxe module PrmPkg: Remove PRM Module Update Lock PrmPkg: Remove ALLOCATE_CONTEXT_BUFFER_IN_FW build flag PrmPkg/PrmContextBuffer.h: Add ACPI parameter support structures PrmPkg/PrmLoaderDxe: Add ACPI parameter buffer support PrmPkg/PrmSampleContextBufferModule: Remove OS debug print requirement PrmPkg/PrmSampleHardwareAccessModule: Add non-print PRM handlers PrmPkg/SampleAcpiParameterBufferModule: Add initial module PrmPkg/HardwareAccessModuleConfigLib: Add initial library PrmPkg/Samples/Readme.md: Add initial file PrmPkg: Refactor some PrmLoaderDxe functionality into libraries PrmPkg/Application/PrmInfo: Add initial application PrmPkg: Enforce stricter types PrmPkg/Test/PrmPkgHostTest.dsc: Add initial file PrmPkg/Test/UnitTest/Library: Add initial UEFI Boot Services test lib PrmPkg/Library/DxePrmContextBufferLib: Add host-based unit tests PrmPkg/DxePrmModuleDiscoveryLib: Add initial host-based unit tests PrmPkg: Add PlatformGuid Readme.md: Add iASL note and QEMU sample link PrmPkg: Replace PcdPrmPlatformGuid with EDKII_DSC_PLATFORM_GUID PrmPkg/Samples: Remove PrmSampleMemoryAllocationModule PrmPkg/Samples: Remove PrmSamplePrintModule PrmPkg: Remove the concept of OS services Readme.md: Add a link to PRM Specification PrmPkg: Changes for edk2 repo transition PrmPkg: Apply uncrustify changes PrmPkg/Application/PrmInfo/PrmInfo.c = | 732 = +++++++++ PrmPkg/Library/DxePrmContextBufferLib/DxePrmContextBufferLib.c = | 199 = +++ PrmPkg/Library/DxePrmContextBufferLib/UnitTest/DxePrmContextBufferLibUni= tTest.c | 649 = ++++++++ PrmPkg/Library/DxePrmModuleDiscoveryLib/DxePrmModuleDiscoveryLib.c = | 386 = +++++ PrmPkg/Library/DxePrmModuleDiscoveryLib/UnitTest/DxePrmModuleDiscoveryLi= bUnitTest.c | 210 = +++ PrmPkg/Library/DxePrmPeCoffLib/DxePrmPeCoffLib.c = | 417 = +++++ PrmPkg/PrmConfigDxe/PrmConfigDxe.c = | 512 = ++++++ PrmPkg/PrmLoaderDxe/PrmLoaderDxe.c = | 377 = +++++ PrmPkg/PrmSsdtInstallDxe/PrmSsdtInstallDxe.c = | 110 = ++ PrmPkg/Samples/PrmSampleAcpiParameterBufferModule/Library/DxeAcpiParamet= erBufferModuleConfigLib/DxeAcpiParameterBufferModuleConfigLib.c | 127 = ++ PrmPkg/Samples/PrmSampleAcpiParameterBufferModule/PrmSampleAcpiParameter= BufferModule.c | 78 = + PrmPkg/Samples/PrmSampleContextBufferModule/Library/DxeContextBufferModu= leConfigLib/DxeContextBufferModuleConfigLib.c | 218 = +++ PrmPkg/Samples/PrmSampleContextBufferModule/PrmSampleContextBufferModule= .c | 84 = + PrmPkg/Samples/PrmSampleHardwareAccessModule/Library/DxeHardwareAccessMo= duleConfigLib/DxeHardwareAccessModuleConfigLib.c | 108 = ++ PrmPkg/Samples/PrmSampleHardwareAccessModule/PrmSampleHardwareAccessModu= le.c | 335 = ++++ PrmPkg/Test/UnitTest/Library/UefiBootServicesTableLibUnitTest/UefiBootSe= rvicesTableLibUnitTest.c | 119 = ++ PrmPkg/Test/UnitTest/Library/UefiBootServicesTableLibUnitTest/UefiBootSe= rvicesTableLibUnitTestEventTimer.c | 180 = +++ PrmPkg/Test/UnitTest/Library/UefiBootServicesTableLibUnitTest/UefiBootSe= rvicesTableLibUnitTestImage.c | 163 = ++ PrmPkg/Test/UnitTest/Library/UefiBootServicesTableLibUnitTest/UefiBootSe= rvicesTableLibUnitTestMemory.c | 145 = ++ PrmPkg/Test/UnitTest/Library/UefiBootServicesTableLibUnitTest/UefiBootSe= rvicesTableLibUnitTestMisc.c | 198 = +++ PrmPkg/Test/UnitTest/Library/UefiBootServicesTableLibUnitTest/UefiBootSe= rvicesTableLibUnitTestProtocol.c | 1650 = ++++++++++++++++++++ PrmPkg/Test/UnitTest/Library/UefiBootServicesTableLibUnitTest/UefiBootSe= rvicesTableLibUnitTestTpl.c | 43 = + .azurepipelines/templates/pr-gate-build-job.yml = | 2 = +- .pytool/CISettings.py = | 1 = + Maintainers.txt = | 8 = + PrmPkg/Application/PrmInfo/PrmInfo.h = | 49 = + PrmPkg/Application/PrmInfo/PrmInfo.inf = | 66 = + PrmPkg/Application/PrmInfo/PrmInfo.uni = | 11 = + PrmPkg/Application/PrmInfo/PrmInfoExtra.uni = | 12 = + PrmPkg/Application/PrmInfo/PrmInfoStrings.uni = | 132 = ++ PrmPkg/Include/Library/PrmContextBufferLib.h = | 99 = ++ PrmPkg/Include/Library/PrmModuleDiscoveryLib.h = | 60 = + PrmPkg/Include/Library/PrmPeCoffLib.h = | 111 = ++ PrmPkg/Include/Prm.h = | 46 = + PrmPkg/Include/PrmContextBuffer.h = | 171 = ++ PrmPkg/Include/PrmDataBuffer.h = | 50 = + PrmPkg/Include/PrmExportDescriptor.h = | 109 = ++ PrmPkg/Include/PrmMmio.h = | 45 = + PrmPkg/Include/PrmModule.h = | 47 = + PrmPkg/Include/PrmModuleImageContext.h = | 28 = + PrmPkg/Include/Protocol/PrmConfig.h = | 31 = + PrmPkg/Library/DxePrmContextBufferLib/DxePrmContextBufferLib.inf = | 35 = + PrmPkg/Library/DxePrmContextBufferLib/UnitTest/DxePrmContextBufferLibUni= tTestHost.inf | 46 = + PrmPkg/Library/DxePrmModuleDiscoveryLib/DxePrmModuleDiscoveryLib.inf = | 41 = + PrmPkg/Library/DxePrmModuleDiscoveryLib/PrmModuleDiscovery.h = | 39 = + PrmPkg/Library/DxePrmModuleDiscoveryLib/UnitTest/DxePrmModuleDiscoveryLi= bUnitTestHost.inf | 39 = + PrmPkg/Library/DxePrmPeCoffLib/DxePrmPeCoffLib.inf = | 32 = + PrmPkg/PrmConfigDxe/PrmConfigDxe.inf = | 48 = + PrmPkg/PrmLoaderDxe/PrmAcpiTable.h = | 96 = ++ PrmPkg/PrmLoaderDxe/PrmLoaderDxe.inf = | 61 = + PrmPkg/PrmPkg.ci.yaml = | 110 = ++ PrmPkg/PrmPkg.dec = | 67 = + PrmPkg/PrmPkg.dsc = | 142 = ++ PrmPkg/PrmPkg.uni = | 10 = + PrmPkg/PrmSsdtInstallDxe/Prm.asl = | 115 = ++ PrmPkg/PrmSsdtInstallDxe/PrmSsdtInstallDxe.inf = | 52 = + PrmPkg/Readme.md = | 264 = ++++ PrmPkg/Samples/PrmSampleAcpiParameterBufferModule/Library/DxeAcpiParamet= erBufferModuleConfigLib/DxeAcpiParameterBufferModuleConfigLib.inf | 39 = + PrmPkg/Samples/PrmSampleAcpiParameterBufferModule/PrmSampleAcpiParameter= BufferModule.inf | 41 = + PrmPkg/Samples/PrmSampleContextBufferModule/Include/StaticData.h = | 24 = + PrmPkg/Samples/PrmSampleContextBufferModule/Library/DxeContextBufferModu= leConfigLib/DxeContextBufferModuleConfigLib.inf | 39 = + PrmPkg/Samples/PrmSampleContextBufferModule/PrmSampleContextBufferModule= .inf | 44 = + PrmPkg/Samples/PrmSampleHardwareAccessModule/Hpet.h = | 108 = ++ PrmPkg/Samples/PrmSampleHardwareAccessModule/Library/DxeHardwareAccessMo= duleConfigLib/DxeHardwareAccessModuleConfigLib.inf | 39 = + PrmPkg/Samples/PrmSampleHardwareAccessModule/PrmSampleHardwareAccessModu= le.inf | 43 = + PrmPkg/Samples/Readme.md = | 146 = ++ PrmPkg/Test/PrmPkgHostTest.dsc = | 39 = + PrmPkg/Test/UnitTest/Library/UefiBootServicesTableLibUnitTest/UefiBootSe= rvicesTableLibTest.uni | 12 = + PrmPkg/Test/UnitTest/Library/UefiBootServicesTableLibUnitTest/UefiBootSe= rvicesTableLibUnitTest.h | 1042 = ++++++++++++ PrmPkg/Test/UnitTest/Library/UefiBootServicesTableLibUnitTest/UefiBootSe= rvicesTableLibUnitTest.inf | 46 = + PrmPkg/Test/UnitTest/Library/UefiBootServicesTableLibUnitTest/UefiBootSe= rvicesTableLibUnitTestProtocol.h | 120 = ++ 71 files changed, 11096 insertions(+), 1 deletion(-) create mode 100644 PrmPkg/Application/PrmInfo/PrmInfo.c create mode 100644 PrmPkg/Library/DxePrmContextBufferLib/DxePrmContextBu= fferLib.c create mode 100644 PrmPkg/Library/DxePrmContextBufferLib/UnitTest/DxePrm= ContextBufferLibUnitTest.c create mode 100644 PrmPkg/Library/DxePrmModuleDiscoveryLib/DxePrmModuleD= iscoveryLib.c create mode 100644 PrmPkg/Library/DxePrmModuleDiscoveryLib/UnitTest/DxeP= rmModuleDiscoveryLibUnitTest.c create mode 100644 PrmPkg/Library/DxePrmPeCoffLib/DxePrmPeCoffLib.c create mode 100644 PrmPkg/PrmConfigDxe/PrmConfigDxe.c create mode 100644 PrmPkg/PrmLoaderDxe/PrmLoaderDxe.c create mode 100644 PrmPkg/PrmSsdtInstallDxe/PrmSsdtInstallDxe.c create mode 100644 PrmPkg/Samples/PrmSampleAcpiParameterBufferModule/Lib= rary/DxeAcpiParameterBufferModuleConfigLib/DxeAcpiParameterBufferModuleCo= nfigLib.c create mode 100644 PrmPkg/Samples/PrmSampleAcpiParameterBufferModule/Prm= SampleAcpiParameterBufferModule.c create mode 100644 PrmPkg/Samples/PrmSampleContextBufferModule/Library/D= xeContextBufferModuleConfigLib/DxeContextBufferModuleConfigLib.c create mode 100644 PrmPkg/Samples/PrmSampleContextBufferModule/PrmSample= ContextBufferModule.c create mode 100644 PrmPkg/Samples/PrmSampleHardwareAccessModule/Library/= DxeHardwareAccessModuleConfigLib/DxeHardwareAccessModuleConfigLib.c create mode 100644 PrmPkg/Samples/PrmSampleHardwareAccessModule/PrmSampl= eHardwareAccessModule.c create mode 100644 PrmPkg/Test/UnitTest/Library/UefiBootServicesTableLib= UnitTest/UefiBootServicesTableLibUnitTest.c create mode 100644 PrmPkg/Test/UnitTest/Library/UefiBootServicesTableLib= UnitTest/UefiBootServicesTableLibUnitTestEventTimer.c create mode 100644 PrmPkg/Test/UnitTest/Library/UefiBootServicesTableLib= UnitTest/UefiBootServicesTableLibUnitTestImage.c create mode 100644 PrmPkg/Test/UnitTest/Library/UefiBootServicesTableLib= UnitTest/UefiBootServicesTableLibUnitTestMemory.c create mode 100644 PrmPkg/Test/UnitTest/Library/UefiBootServicesTableLib= UnitTest/UefiBootServicesTableLibUnitTestMisc.c create mode 100644 PrmPkg/Test/UnitTest/Library/UefiBootServicesTableLib= UnitTest/UefiBootServicesTableLibUnitTestProtocol.c create mode 100644 PrmPkg/Test/UnitTest/Library/UefiBootServicesTableLib= UnitTest/UefiBootServicesTableLibUnitTestTpl.c create mode 100644 PrmPkg/Application/PrmInfo/PrmInfo.h create mode 100644 PrmPkg/Application/PrmInfo/PrmInfo.inf create mode 100644 PrmPkg/Application/PrmInfo/PrmInfo.uni create mode 100644 PrmPkg/Application/PrmInfo/PrmInfoExtra.uni create mode 100644 PrmPkg/Application/PrmInfo/PrmInfoStrings.uni create mode 100644 PrmPkg/Include/Library/PrmContextBufferLib.h create mode 100644 PrmPkg/Include/Library/PrmModuleDiscoveryLib.h create mode 100644 PrmPkg/Include/Library/PrmPeCoffLib.h create mode 100644 PrmPkg/Include/Prm.h create mode 100644 PrmPkg/Include/PrmContextBuffer.h create mode 100644 PrmPkg/Include/PrmDataBuffer.h create mode 100644 PrmPkg/Include/PrmExportDescriptor.h create mode 100644 PrmPkg/Include/PrmMmio.h create mode 100644 PrmPkg/Include/PrmModule.h create mode 100644 PrmPkg/Include/PrmModuleImageContext.h create mode 100644 PrmPkg/Include/Protocol/PrmConfig.h create mode 100644 PrmPkg/Library/DxePrmContextBufferLib/DxePrmContextBu= fferLib.inf create mode 100644 PrmPkg/Library/DxePrmContextBufferLib/UnitTest/DxePrm= ContextBufferLibUnitTestHost.inf create mode 100644 PrmPkg/Library/DxePrmModuleDiscoveryLib/DxePrmModuleD= iscoveryLib.inf create mode 100644 PrmPkg/Library/DxePrmModuleDiscoveryLib/PrmModuleDisc= overy.h create mode 100644 PrmPkg/Library/DxePrmModuleDiscoveryLib/UnitTest/DxeP= rmModuleDiscoveryLibUnitTestHost.inf create mode 100644 PrmPkg/Library/DxePrmPeCoffLib/DxePrmPeCoffLib.inf create mode 100644 PrmPkg/PrmConfigDxe/PrmConfigDxe.inf create mode 100644 PrmPkg/PrmLoaderDxe/PrmAcpiTable.h create mode 100644 PrmPkg/PrmLoaderDxe/PrmLoaderDxe.inf create mode 100644 PrmPkg/PrmPkg.ci.yaml create mode 100644 PrmPkg/PrmPkg.dec create mode 100644 PrmPkg/PrmPkg.dsc create mode 100644 PrmPkg/PrmPkg.uni create mode 100644 PrmPkg/PrmSsdtInstallDxe/Prm.asl create mode 100644 PrmPkg/PrmSsdtInstallDxe/PrmSsdtInstallDxe.inf create mode 100644 PrmPkg/Readme.md create mode 100644 PrmPkg/Samples/PrmSampleAcpiParameterBufferModule/Lib= rary/DxeAcpiParameterBufferModuleConfigLib/DxeAcpiParameterBufferModuleCo= nfigLib.inf create mode 100644 PrmPkg/Samples/PrmSampleAcpiParameterBufferModule/Prm= SampleAcpiParameterBufferModule.inf create mode 100644 PrmPkg/Samples/PrmSampleContextBufferModule/Include/S= taticData.h create mode 100644 PrmPkg/Samples/PrmSampleContextBufferModule/Library/D= xeContextBufferModuleConfigLib/DxeContextBufferModuleConfigLib.inf create mode 100644 PrmPkg/Samples/PrmSampleContextBufferModule/PrmSample= ContextBufferModule.inf create mode 100644 PrmPkg/Samples/PrmSampleHardwareAccessModule/Hpet.h create mode 100644 PrmPkg/Samples/PrmSampleHardwareAccessModule/Library/= DxeHardwareAccessModuleConfigLib/DxeHardwareAccessModuleConfigLib.inf create mode 100644 PrmPkg/Samples/PrmSampleHardwareAccessModule/PrmSampl= eHardwareAccessModule.inf create mode 100644 PrmPkg/Samples/Readme.md create mode 100644 PrmPkg/Test/PrmPkgHostTest.dsc create mode 100644 PrmPkg/Test/UnitTest/Library/UefiBootServicesTableLib= UnitTest/UefiBootServicesTableLibTest.uni create mode 100644 PrmPkg/Test/UnitTest/Library/UefiBootServicesTableLib= UnitTest/UefiBootServicesTableLibUnitTest.h create mode 100644 PrmPkg/Test/UnitTest/Library/UefiBootServicesTableLib= UnitTest/UefiBootServicesTableLibUnitTest.inf create mode 100644 PrmPkg/Test/UnitTest/Library/UefiBootServicesTableLib= UnitTest/UefiBootServicesTableLibUnitTestProtocol.h --=20 2.28.0.windows.1