Laszlo, There are 2 reasons to list all source files used in a module build in the [Sources] section.
1) Support incremental builds. If a change to the .h file is made, then the module may not be rebuilt if the .h file is not listed in [Sources] 2) Support of UEFI Distribution Package distribution format. The UPT tools that creates UDP packages uses the [Sources] section for the inventory of files. If a file is missing, then it will not be included in the UDP file. Use of STATIC in OvmfPkg is ok. I only mentioned it to be consistent with other packages. I mention global variable location to be consistent with other packages. The preference is to put all globals before function implementations within a C file, so they are not mixed between functions and are harder to find. The ctags issue is interesting. I wonder if anyone else has found a way around that issue. Mike > -----Original Message----- > From: edk2-devel [mailto:edk2-devel-boun...@lists.01.org] On Behalf Of Laszlo > Ersek > Sent: Monday, November 23, 2015 4:14 AM > To: Kinney, Michael D <michael.d.kin...@intel.com>; edk2-de...@ml01.01.org > Subject: Re: [edk2] [PATCH v4 08/41] OvmfPkg: add DXE_DRIVER for providing > TSEG-as-SMRAM during boot-time DXE > > On 11/21/15 07:03, Kinney, Michael D wrote: > > Laszlo, > > > > Minor comments included below. > > > > Reviewed-by: Michael Kinney <michael.d.kin...@intel.com> > > Thank you. I'll pick up your R-b, but I'll also respond to your comments > below: > > >> -----Original Message----- > >> From: edk2-devel [mailto:edk2-devel-boun...@lists.01.org] On Behalf > >> Of Laszlo Ersek > >> Sent: Tuesday, November 3, 2015 1:01 PM > >> To: edk2-de...@ml01.01.org > >> Subject: [edk2] [PATCH v4 08/41] OvmfPkg: add DXE_DRIVER for > >> providing TSEG-as-SMRAM during boot-time DXE > >> > >> The SMM core depends on EFI_SMM_ACCESS2_PROTOCOL. This small driver > >> (which is a thin wrapper around "OvmfPkg/SmmAccess/SmramInternal.c" that > >> was added in the previous patch) provides that > protocol. > >> > >> Notably, EFI_SMM_ACCESS2_PROTOCOL is for boot time only, therefore our > >> MODULE_TYPE is not DXE_RUNTIME_DRIVER. > >> > >> Contributed-under: TianoCore Contribution Agreement 1.0 > >> Signed-off-by: Laszlo Ersek <ler...@redhat.com> > >> --- > >> OvmfPkg/OvmfPkgIa32.dsc | 4 + > >> OvmfPkg/OvmfPkgIa32X64.dsc | 4 + > >> OvmfPkg/OvmfPkgX64.dsc | 4 + > >> OvmfPkg/OvmfPkgIa32.fdf | 4 + > >> OvmfPkg/OvmfPkgIa32X64.fdf | 4 + > >> OvmfPkg/OvmfPkgX64.fdf | 4 + > >> OvmfPkg/SmmAccess/SmmAccess2Dxe.inf | 57 +++++++ > >> OvmfPkg/SmmAccess/SmmAccess2Dxe.c | 156 ++++++++++++++++++++ > >> 8 files changed, 237 insertions(+) > >> > >> diff --git a/OvmfPkg/OvmfPkgIa32.dsc b/OvmfPkg/OvmfPkgIa32.dsc index > >> 0b729ca..d7bc38d 100644 > >> --- a/OvmfPkg/OvmfPkgIa32.dsc > >> +++ b/OvmfPkg/OvmfPkgIa32.dsc > >> @@ -672,3 +672,7 @@ [Components] > >> !endif > >> > >> OvmfPkg/PlatformDxe/Platform.inf > >> + > >> +!if $(SMM_REQUIRE) == TRUE > >> + OvmfPkg/SmmAccess/SmmAccess2Dxe.inf > >> +!endif > >> diff --git a/OvmfPkg/OvmfPkgIa32X64.dsc b/OvmfPkg/OvmfPkgIa32X64.dsc > >> index 7f672d9..e17cbe5 100644 > >> --- a/OvmfPkg/OvmfPkgIa32X64.dsc > >> +++ b/OvmfPkg/OvmfPkgIa32X64.dsc > >> @@ -679,3 +679,7 @@ [Components.X64] > >> !endif > >> > >> OvmfPkg/PlatformDxe/Platform.inf > >> + > >> +!if $(SMM_REQUIRE) == TRUE > >> + OvmfPkg/SmmAccess/SmmAccess2Dxe.inf > >> +!endif > >> diff --git a/OvmfPkg/OvmfPkgX64.dsc b/OvmfPkg/OvmfPkgX64.dsc index > >> 986c019..a748fb3 100644 > >> --- a/OvmfPkg/OvmfPkgX64.dsc > >> +++ b/OvmfPkg/OvmfPkgX64.dsc > >> @@ -677,3 +677,7 @@ [Components] > >> !endif > >> > >> OvmfPkg/PlatformDxe/Platform.inf > >> + > >> +!if $(SMM_REQUIRE) == TRUE > >> + OvmfPkg/SmmAccess/SmmAccess2Dxe.inf > >> +!endif > >> diff --git a/OvmfPkg/OvmfPkgIa32.fdf b/OvmfPkg/OvmfPkgIa32.fdf index > >> 650dab1..285720f 100644 > >> --- a/OvmfPkg/OvmfPkgIa32.fdf > >> +++ b/OvmfPkg/OvmfPkgIa32.fdf > >> @@ -355,6 +355,10 @@ [FV.DXEFV] > >> INF OvmfPkg/QemuVideoDxe/QemuVideoDxe.inf > >> INF OvmfPkg/PlatformDxe/Platform.inf > >> > >> +!if $(SMM_REQUIRE) == TRUE > >> +INF OvmfPkg/SmmAccess/SmmAccess2Dxe.inf > >> +!endif > >> + > >> > >> ##################################################################### > >> ########### > >> > >> [FV.FVMAIN_COMPACT] > >> diff --git a/OvmfPkg/OvmfPkgIa32X64.fdf b/OvmfPkg/OvmfPkgIa32X64.fdf > >> index 5830401..02e8752 100644 > >> --- a/OvmfPkg/OvmfPkgIa32X64.fdf > >> +++ b/OvmfPkg/OvmfPkgIa32X64.fdf > >> @@ -355,6 +355,10 @@ [FV.DXEFV] > >> INF OvmfPkg/QemuVideoDxe/QemuVideoDxe.inf > >> INF OvmfPkg/PlatformDxe/Platform.inf > >> > >> +!if $(SMM_REQUIRE) == TRUE > >> +INF OvmfPkg/SmmAccess/SmmAccess2Dxe.inf > >> +!endif > >> + > >> > >> ##################################################################### > >> ########### > >> > >> [FV.FVMAIN_COMPACT] > >> diff --git a/OvmfPkg/OvmfPkgX64.fdf b/OvmfPkg/OvmfPkgX64.fdf index > >> 9dd6171..f04c36b 100644 > >> --- a/OvmfPkg/OvmfPkgX64.fdf > >> +++ b/OvmfPkg/OvmfPkgX64.fdf > >> @@ -355,6 +355,10 @@ [FV.DXEFV] > >> INF OvmfPkg/QemuVideoDxe/QemuVideoDxe.inf > >> INF OvmfPkg/PlatformDxe/Platform.inf > >> > >> +!if $(SMM_REQUIRE) == TRUE > >> +INF OvmfPkg/SmmAccess/SmmAccess2Dxe.inf > >> +!endif > >> + > >> > >> ##################################################################### > >> ########### > >> > >> [FV.FVMAIN_COMPACT] > >> diff --git a/OvmfPkg/SmmAccess/SmmAccess2Dxe.inf > >> b/OvmfPkg/SmmAccess/SmmAccess2Dxe.inf > >> new file mode 100644 > >> index 0000000..3ce48ae > >> --- /dev/null > >> +++ b/OvmfPkg/SmmAccess/SmmAccess2Dxe.inf > >> @@ -0,0 +1,57 @@ > >> +## @file > >> +# A DXE_DRIVER providing SMRAM access by producing > >> EFI_SMM_ACCESS2_PROTOCOL. > >> +# > >> +# Q35 TSEG is expected to have been verified and set up by the > >> +SmmAccessPei # driver. > >> +# > >> +# Copyright (C) 2013, 2015, Red Hat, Inc. > >> +# > >> +# This program and the accompanying materials are licensed and made > >> +available # under the terms and conditions of the BSD License which > >> +accompanies this # distribution. The full text of the license may be > >> +found at # http://opensource.org/licenses/bsd-license.php > >> +# > >> +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > >> +BASIS, WITHOUT # WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > >> EXPRESS OR IMPLIED. > >> +# > >> +## > >> + > >> +[Defines] > >> + INF_VERSION = 0x00010005 > >> + BASE_NAME = SmmAccess2Dxe > >> + FILE_GUID = AC95AD3D-4366-44BF-9A62-E4B29D7A2206 > >> + MODULE_TYPE = DXE_DRIVER > >> + VERSION_STRING = 1.0 > >> + PI_SPECIFICATION_VERSION = 0x00010400 > >> + ENTRY_POINT = SmmAccess2DxeEntryPoint > >> + > >> +# > >> +# The following information is for reference only and not required by the > >> build tools. > >> +# > >> +# VALID_ARCHITECTURES = IA32 X64 > >> +# > >> + > >> +[Sources] > >> + SmmAccess2Dxe.c > >> + SmramInternal.c > > > > SmramInternal.h is missing from [Sources] section. > > It is not clear to me if there is a general requirement to list *.h files in > the [Sources] sections of INF files. I think we usually only list the > C files in OvmfPkg. > > $ git grep -l '\.h' -- 'OvmfPkg/*.inf' > > OvmfPkg/AcpiTables/AcpiTables.inf > OvmfPkg/Library/PlatformBdsLib/PlatformBdsLib.inf > OvmfPkg/PciHostBridgeDxe/PciHostBridgeDxe.inf > OvmfPkg/SataControllerDxe/SataControllerDxe.inf > OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.inf > OvmfPkg/XenBusDxe/XenBusDxe.inf > OvmfPkg/XenPvBlkDxe/XenPvBlkDxe.inf > > I vaguely remember that the last two were created with the UEFI driver > wizard. The others were all created by cloning and > customizing other > edk2 modules. So it seems to be confirmed that whenever we wrote a module > from scratch under OvmfPkg, we wouldn't list the > header files in [Sources], only the C, assembly and ASL files. > > I always thought the build utilities would automatically deduce the header > dependencies (recursively). > > Does this practice conflict with the edk2 specs? > > Anyway, I can fix this up. > > > > >> + > >> +[Packages] > >> + MdeModulePkg/MdeModulePkg.dec > >> + MdePkg/MdePkg.dec > >> + OvmfPkg/OvmfPkg.dec > >> + > >> +[LibraryClasses] > >> + DebugLib > >> + PcdLib > >> + PciLib > >> + UefiBootServicesTableLib > >> + UefiDriverEntryPoint > >> + > >> +[Protocols] > >> + gEfiSmmAccess2ProtocolGuid # PROTOCOL ALWAYS_PRODUCED > > > > Comment should be: ## PRODUCES > > I'll fix it up, but it's also unclear to me when ALWAYS_PRODUCED has become > deprecated. > > > > >> + > >> +[FeaturePcd] > >> + gUefiOvmfPkgTokenSpaceGuid.PcdSmmSmramRequire > >> + > >> +[Depex] > >> + TRUE > >> diff --git a/OvmfPkg/SmmAccess/SmmAccess2Dxe.c > >> b/OvmfPkg/SmmAccess/SmmAccess2Dxe.c > >> new file mode 100644 > >> index 0000000..d513039 > >> --- /dev/null > >> +++ b/OvmfPkg/SmmAccess/SmmAccess2Dxe.c > >> @@ -0,0 +1,156 @@ > >> +/** @file > >> + > >> + A DXE_DRIVER providing SMRAM access by producing > >> EFI_SMM_ACCESS2_PROTOCOL. > >> + > >> + Q35 TSEG is expected to have been verified and set up by the > >> + SmmAccessPei driver. > >> + > >> + Copyright (C) 2013, 2015, Red Hat, Inc.<BR> Copyright (c) 2009 - > >> + 2010, Intel Corporation. All rights reserved.<BR> > >> + > >> + This program and the accompanying materials are licensed and made > >> + available under the terms and conditions of the BSD License which > >> + accompanies this distribution. The full text of the license may be > >> + found at http://opensource.org/licenses/bsd-license.php > >> + > >> + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > >> + BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > >> EXPRESS OR IMPLIED. > >> + > >> +**/ > >> + > >> +#include <Library/DebugLib.h> > >> +#include <Library/PcdLib.h> > >> +#include <Library/UefiBootServicesTableLib.h> > >> +#include <Protocol/SmmAccess2.h> > >> + > >> +#include "SmramInternal.h" > >> + > >> +/** > >> + Opens the SMRAM area to be accessible by a boot-service driver. > >> + > >> + This function "opens" SMRAM so that it is visible while not inside of > >> SMM. > >> + The function should return EFI_UNSUPPORTED if the hardware does > >> + not support hiding of SMRAM. The function should return > >> + EFI_DEVICE_ERROR if the SMRAM configuration is locked. > >> + > >> + @param[in] This The EFI_SMM_ACCESS2_PROTOCOL instance. > >> + > >> + @retval EFI_SUCCESS The operation was successful. > >> + @retval EFI_UNSUPPORTED The system does not support opening and > >> closing of > >> + SMRAM. > >> + @retval EFI_DEVICE_ERROR SMRAM cannot be opened, perhaps because it is > >> + locked. > >> +**/ > >> +STATIC > > > > Recommend removing STATIC from public functions. > > I understand that there are debuggability problems with some toolchains if > functions are declared static, but for OVMF we mostly use > manual instrumentation. (Or else, when people take the time to set up gdb > <https://edk2.bluestop.org/w/tianocore/debugging- > with-gdb/>, then gdb doesn't have issues with STATIC.) > > It is common C practice (and more closely, OvmfPkg practice) to keep protocol > member functions with internal ("static") linkage on the > language level, and expose them only via function pointers. I'd like to stick > with STATIC in OvmfPkg; we've never had problem reports > in this are. > > > > >> +EFI_STATUS > >> +EFIAPI > >> +SmmAccess2DxeOpen ( > >> + IN EFI_SMM_ACCESS2_PROTOCOL *This > >> + ) > >> +{ > >> + return SmramAccessOpen (&This->LockState, &This->OpenState); } > >> + > >> +/** > >> + Inhibits access to the SMRAM. > >> + > >> + This function "closes" SMRAM so that it is not visible while outside of > >> SMM. > >> + The function should return EFI_UNSUPPORTED if the hardware does > >> + not support hiding of SMRAM. > >> + > >> + @param[in] This The EFI_SMM_ACCESS2_PROTOCOL instance. > >> + > >> + @retval EFI_SUCCESS The operation was successful. > >> + @retval EFI_UNSUPPORTED The system does not support opening and > >> closing of > >> + SMRAM. > >> + @retval EFI_DEVICE_ERROR SMRAM cannot be closed. > >> +**/ > >> +STATIC > > > > Recommend removing STATIC from public functions. > > > >> +EFI_STATUS > >> +EFIAPI > >> +SmmAccess2DxeClose ( > >> + IN EFI_SMM_ACCESS2_PROTOCOL *This > >> + ) > >> +{ > >> + return SmramAccessClose (&This->LockState, &This->OpenState); } > >> + > >> +/** > >> + Inhibits access to the SMRAM. > >> + > >> + This function prohibits access to the SMRAM region. This function > >> + is usually implemented such that it is a write-once operation. > >> + > >> + @param[in] This The EFI_SMM_ACCESS2_PROTOCOL instance. > >> + > >> + @retval EFI_SUCCESS The device was successfully locked. > >> + @retval EFI_UNSUPPORTED The system does not support locking of SMRAM. > >> +**/ > >> +STATIC > > > > Recommend removing STATIC from public functions. > > > >> +EFI_STATUS > >> +EFIAPI > >> +SmmAccess2DxeLock ( > >> + IN EFI_SMM_ACCESS2_PROTOCOL *This > >> + ) > >> +{ > >> + return SmramAccessLock (&This->LockState, &This->OpenState); } > >> + > >> +/** > >> + Queries the memory controller for the possible regions that will > >> +support > >> + SMRAM. > >> + > >> + @param[in] This The EFI_SMM_ACCESS2_PROTOCOL instance. > >> + @param[in,out] SmramMapSize A pointer to the size, in bytes, of the > >> + SmramMemoryMap buffer. > >> + @param[in,out] SmramMap A pointer to the buffer in which firmware > >> + places the current memory map. > >> + > >> + @retval EFI_SUCCESS The chipset supported the given resource. > >> + @retval EFI_BUFFER_TOO_SMALL The SmramMap parameter was too small. The > >> + current buffer size needed to hold the > >> memory > >> + map is returned in SmramMapSize. > >> +**/ > >> +STATIC > > > > Recommend removing STATIC from public functions. > > > >> +EFI_STATUS > >> +EFIAPI > >> +SmmAccess2DxeGetCapabilities ( > >> + IN CONST EFI_SMM_ACCESS2_PROTOCOL *This, > >> + IN OUT UINTN *SmramMapSize, > >> + IN OUT EFI_SMRAM_DESCRIPTOR *SmramMap > >> + ) > >> +{ > >> + return SmramAccessGetCapabilities (This->LockState, This->OpenState, > >> + SmramMapSize, SmramMap); > >> +} > >> + > >> +// > >> +// LockState and OpenState will be filled in by the entry point. > >> +// > >> +STATIC EFI_SMM_ACCESS2_PROTOCOL mAccess2 = { > >> + &SmmAccess2DxeOpen, > >> + &SmmAccess2DxeClose, > >> + &SmmAccess2DxeLock, > >> + &SmmAccess2DxeGetCapabilities > >> +}; > > > > Recommend removing STATIC from produced protocol structure. > > Global variable are typically placed before function implementation in a > > file. > > I placed the initialization of mAccess2 here because I wanted to avoid the > (quite verbose) forward declarations of the member > functions. > > Also, forward declarations make the "Jump To Tag" functionality of > ctags-compatible text editors quite inconvenient: the forward > declaration of the function gets highlighted instead of the function > definition. > > One way to avoid the forward declarations of the functions and to keep the > (initializer-less) definition of mAccess2 at the top would > be to explicitly assign the mAccess2.* fields in SmmAccess2DxeEntryPoint() > below. If you strongly dislike the code as-is, I can > implement this option. > > Thanks! > Laszlo > > > > >> + > >> +// > >> +// Entry point of this driver. > >> +// > >> +EFI_STATUS > >> +EFIAPI > >> +SmmAccess2DxeEntryPoint ( > >> + IN EFI_HANDLE ImageHandle, > >> + IN EFI_SYSTEM_TABLE *SystemTable > >> + ) > >> +{ > >> + // > >> + // This module should only be included if SMRAM support is required. > >> + // > >> + ASSERT (FeaturePcdGet (PcdSmmSmramRequire)); > >> + > >> + GetStates (&mAccess2.LockState, &mAccess2.OpenState); > >> + return gBS->InstallMultipleProtocolInterfaces (&ImageHandle, > >> + &gEfiSmmAccess2ProtocolGuid, &mAccess2, > >> + NULL); > >> +} > >> -- > >> 1.8.3.1 > >> > >> > >> _______________________________________________ > >> edk2-devel mailing list > >> edk2-devel@lists.01.org > >> https://lists.01.org/mailman/listinfo/edk2-devel > > _______________________________________________ > edk2-devel mailing list > edk2-devel@lists.01.org > https://lists.01.org/mailman/listinfo/edk2-devel _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel