From 9e620719100f80892adfa8e2f810a485bce32fb9 Mon Sep 17 00:00:00 2001 From: rsun3 Date: Thu, 31 Dec 2009 08:42:28 +0000 Subject: Add 4 Framework/PI SMM thunk drivers. Combined use of these drivers can support usage model of PI SMM infrastructure + Framework Chipset SMM code + Framework platform SMM code in ECP platforms. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@9657 6f19259b-4bc3-4df7-8a09-765794883524 --- .../SmmAccess2OnSmmAccessThunk.c | 208 +++++++++++++++++++++ .../SmmAccess2OnSmmAccessThunk.h | 99 ++++++++++ .../SmmAccess2OnSmmAccessThunk.inf | 50 +++++ 3 files changed, 357 insertions(+) create mode 100644 EdkCompatibilityPkg/Compatibility/SmmAccess2OnSmmAccessThunk/SmmAccess2OnSmmAccessThunk.c create mode 100644 EdkCompatibilityPkg/Compatibility/SmmAccess2OnSmmAccessThunk/SmmAccess2OnSmmAccessThunk.h create mode 100644 EdkCompatibilityPkg/Compatibility/SmmAccess2OnSmmAccessThunk/SmmAccess2OnSmmAccessThunk.inf (limited to 'EdkCompatibilityPkg/Compatibility/SmmAccess2OnSmmAccessThunk') diff --git a/EdkCompatibilityPkg/Compatibility/SmmAccess2OnSmmAccessThunk/SmmAccess2OnSmmAccessThunk.c b/EdkCompatibilityPkg/Compatibility/SmmAccess2OnSmmAccessThunk/SmmAccess2OnSmmAccessThunk.c new file mode 100644 index 0000000000..97df22c24a --- /dev/null +++ b/EdkCompatibilityPkg/Compatibility/SmmAccess2OnSmmAccessThunk/SmmAccess2OnSmmAccessThunk.c @@ -0,0 +1,208 @@ +/** @file + SMM Access2 Protocol on SMM Access Protocol Thunk driver. + + Copyright (c) 2009 Intel Corporation + All rights reserved. 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 "SmmAccess2OnSmmAccessThunk.h" + +EFI_SMM_ACCESS2_PROTOCOL gSmmAccess2 = { + SmmAccess2Open, + SmmAccess2Close, + SmmAccess2Lock, + SmmAccess2GetCapabilities, + FALSE, + FALSE +}; + +EFI_SMM_ACCESS_PROTOCOL *mSmmAccess; +UINTN mSmramRegionNumber; + +/** + 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. +**/ +EFI_STATUS +EFIAPI +SmmAccess2Open ( + IN EFI_SMM_ACCESS2_PROTOCOL *This + ) +{ + EFI_STATUS Status; + UINTN DescriptorIndex; + + /// + /// Open all SMRAM regions via SMM Access Protocol + /// + + Status = EFI_SUCCESS; + for (DescriptorIndex = 0; DescriptorIndex < mSmramRegionNumber && !EFI_ERROR (Status); DescriptorIndex++) { + Status = mSmmAccess->Open (mSmmAccess, DescriptorIndex); + } + if (!EFI_ERROR (Status)) { + gSmmAccess2.OpenState = TRUE; + } + return Status; +} + +/** + 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. +**/ +EFI_STATUS +EFIAPI +SmmAccess2Close ( + IN EFI_SMM_ACCESS2_PROTOCOL *This + ) +{ + EFI_STATUS Status; + UINTN DescriptorIndex; + + /// + /// Close all SMRAM regions via SMM Access Protocol + /// + + Status = EFI_SUCCESS; + for (DescriptorIndex = 0; DescriptorIndex < mSmramRegionNumber && !EFI_ERROR (Status); DescriptorIndex++) { + Status = mSmmAccess->Close (mSmmAccess, DescriptorIndex); + } + if (!EFI_ERROR (Status)) { + gSmmAccess2.OpenState = FALSE; + } + return Status; +} + +/** + 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. +**/ +EFI_STATUS +EFIAPI +SmmAccess2Lock ( + IN EFI_SMM_ACCESS2_PROTOCOL *This + ) +{ + EFI_STATUS Status; + UINTN DescriptorIndex; + + /// + /// Lock all SMRAM regions via SMM Access Protocol + /// + + Status = EFI_SUCCESS; + for (DescriptorIndex = 0; DescriptorIndex < mSmramRegionNumber && !EFI_ERROR (Status); DescriptorIndex++) { + Status = mSmmAccess->Lock (mSmmAccess, DescriptorIndex); + } + if (!EFI_ERROR (Status)) { + gSmmAccess2.LockState = TRUE; + } + return Status; +} + +/** + 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. +**/ +EFI_STATUS +EFIAPI +SmmAccess2GetCapabilities ( + IN CONST EFI_SMM_ACCESS2_PROTOCOL *This, + IN OUT UINTN *SmramMapSize, + IN OUT EFI_SMRAM_DESCRIPTOR *SmramMap + ) +{ + return mSmmAccess->GetCapabilities (mSmmAccess, SmramMapSize, SmramMap); +} + +/** + Entry Point for SMM Access2 On SMM Access Thunk driver. + + @param[in] ImageHandle Image handle of this driver. + @param[in] SystemTable A Pointer to the EFI System Table. + + @retval EFI_SUCCESS The entry point is executed successfully. + @retval other Some error occurred when executing this entry point. +**/ +EFI_STATUS +EFIAPI +SmmAccess2ThunkMain ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + UINTN SmramMapSize; + + /// + /// Locate SMM Access Protocol + /// + Status = gBS->LocateProtocol (&gEfiSmmAccessProtocolGuid, NULL, (VOID **)&mSmmAccess); + ASSERT_EFI_ERROR (Status); + + /// + /// Calculate number of SMRAM regions + /// + SmramMapSize = 0; + Status = mSmmAccess->GetCapabilities (mSmmAccess, &SmramMapSize, NULL); + ASSERT (Status == EFI_BUFFER_TOO_SMALL); + + mSmramRegionNumber = SmramMapSize/sizeof (EFI_SMRAM_DESCRIPTOR); + ASSERT (mSmramRegionNumber > 0); + + /// + /// Assume all SMRAM regions have consistent OPEN and LOCK states + /// + gSmmAccess2.OpenState = mSmmAccess->OpenState; + gSmmAccess2.LockState = mSmmAccess->LockState; + + /// + /// Publish PI SMM Access2 Protocol + /// + Status = gBS->InstallProtocolInterface ( + &ImageHandle, + &gEfiSmmAccess2ProtocolGuid, + EFI_NATIVE_INTERFACE, + &gSmmAccess2 + ); + return Status; +} + diff --git a/EdkCompatibilityPkg/Compatibility/SmmAccess2OnSmmAccessThunk/SmmAccess2OnSmmAccessThunk.h b/EdkCompatibilityPkg/Compatibility/SmmAccess2OnSmmAccessThunk/SmmAccess2OnSmmAccessThunk.h new file mode 100644 index 0000000000..bc3415903a --- /dev/null +++ b/EdkCompatibilityPkg/Compatibility/SmmAccess2OnSmmAccessThunk/SmmAccess2OnSmmAccessThunk.h @@ -0,0 +1,99 @@ +/** @file + Include file for SMM Access2 Protocol on SMM Access Protocol Thunk driver. + + Copyright (c) 2009, Intel Corporation + All rights reserved. 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. + +**/ + +#ifndef _SMM_ACCESS2_ON_SMM_ACCESS_THUNK_H_ +#define _SMM_ACCESS2_ON_SMM_ACCESS_THUNK_H_ + +#include +#include +#include +#include +#include +#include +#include + +/** + 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. +**/ +EFI_STATUS +EFIAPI +SmmAccess2Open ( + IN EFI_SMM_ACCESS2_PROTOCOL *This + ); + +/** + 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. +**/ +EFI_STATUS +EFIAPI +SmmAccess2Close ( + IN EFI_SMM_ACCESS2_PROTOCOL *This + ); + +/** + 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. +**/ +EFI_STATUS +EFIAPI +SmmAccess2Lock ( + IN EFI_SMM_ACCESS2_PROTOCOL *This + ); + +/** + 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. +**/ +EFI_STATUS +EFIAPI +SmmAccess2GetCapabilities ( + IN CONST EFI_SMM_ACCESS2_PROTOCOL *This, + IN OUT UINTN *SmramMapSize, + IN OUT EFI_SMRAM_DESCRIPTOR *SmramMap + ); + +#endif diff --git a/EdkCompatibilityPkg/Compatibility/SmmAccess2OnSmmAccessThunk/SmmAccess2OnSmmAccessThunk.inf b/EdkCompatibilityPkg/Compatibility/SmmAccess2OnSmmAccessThunk/SmmAccess2OnSmmAccessThunk.inf new file mode 100644 index 0000000000..2262f4328e --- /dev/null +++ b/EdkCompatibilityPkg/Compatibility/SmmAccess2OnSmmAccessThunk/SmmAccess2OnSmmAccessThunk.inf @@ -0,0 +1,50 @@ +## @file +# Component description file for SMM Access2 Protocol on SMM Access Protocol Thunk driver. +# +# Copyright (c) 2009, Intel Corporation +# +# All rights reserved. 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 = SmmAccess2OnSmmAccessThunk + FILE_GUID = 98BBCDA4-18B4-46d3-BD1F-6A3A52D44CF8 + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 1.0 + ENTRY_POINT = SmmAccess2ThunkMain + +# +# The following information is for reference only and not required by the build tools. +# +# VALID_ARCHITECTURES = IA32 X64 +# + +[Sources] + SmmAccess2OnSmmAccessThunk.c + SmmAccess2OnSmmAccessThunk.h + +[Packages] + MdePkg/MdePkg.dec + IntelFrameworkPkg/IntelFrameworkPkg.dec + EdkCompatibilityPkg/EdkCompatibilityPkg.dec + +[LibraryClasses] + UefiDriverEntryPoint + UefiBootServicesTableLib + DebugLib + +[Protocols] + gEfiSmmAccessProtocolGuid # PROTOCOL ALWAYS_CONSUMED + gEfiSmmAccess2ProtocolGuid # PROTOCOL ALWAYS_PRODUCED + +[Depex] + gEfiSmmAccessProtocolGuid + -- cgit v1.2.3