UefiCpuPkg: Add SmmCpuPlatformHookLib

Add SmmCpuPlatformHookLib that provides platform specific functions
that are used to initialize SMM and process SMIs.  A Null instance
of this library is provided that should work for most platforms.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Michael Kinney <michael.d.kinney@intel.com>
Reviewed-by: Jeff Fan <jeff.fan@intel.com>

git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@18639 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
Michael Kinney 2015-10-19 19:11:15 +00:00 committed by mdkinney
parent a9764e68f9
commit 2b63446b1d
4 changed files with 257 additions and 0 deletions

View File

@ -0,0 +1,109 @@
/** @file
Public include file for the SMM CPU Platform Hook Library.
Copyright (c) 2010 - 2015, 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.
**/
#ifndef __SMM_CPU_PLATFORM_HOOK_LIB_H__
#define __SMM_CPU_PLATFORM_HOOK_LIB_H__
///
/// SMM Page Size Type
///
typedef enum {
SmmPageSize4K,
SmmPageSize2M,
SmmPageSize1G,
MaxSmmPageSizeType
} SMM_PAGE_SIZE_TYPE;
/**
Checks if platform produces a valid SMI.
This function checks if platform produces a valid SMI. This function is
called at SMM entry to detect if this is a spurious SMI. This function
must be implemented in an MP safe way because it is called by multiple CPU
threads.
@retval TRUE There is a valid SMI
@retval FALSE There is no valid SMI
**/
BOOLEAN
EFIAPI
PlatformValidSmi (
VOID
);
/**
Clears platform top level SMI status bit.
This function clears platform top level SMI status bit.
@retval TRUE The platform top level SMI status is cleared.
@retval FALSE The platform top level SMI status cannot be cleared.
**/
BOOLEAN
EFIAPI
ClearTopLevelSmiStatus (
VOID
);
/**
Performs platform specific way of SMM BSP election.
This function performs platform specific way of SMM BSP election.
@param IsBsp Output parameter. TRUE: the CPU this function executes
on is elected to be the SMM BSP. FALSE: the CPU this
function executes on is to be SMM AP.
@retval EFI_SUCCESS The function executes successfully.
@retval EFI_NOT_READY The function does not determine whether this CPU should be
BSP or AP. This may occur if hardware init sequence to
enable the determination is yet to be done, or the function
chooses not to do BSP election and will let SMM CPU driver to
use its default BSP election process.
@retval EFI_DEVICE_ERROR The function cannot determine whether this CPU should be
BSP or AP due to hardware error.
**/
EFI_STATUS
EFIAPI
PlatformSmmBspElection (
OUT BOOLEAN *IsBsp
);
/**
Get platform page table attribute .
This function gets page table attribute of platform.
@param Address Input parameter. Obtain the page table entries attribute on this address.
@param PageSize Output parameter. The size of the page.
@param NumOfPages Output parameter. Number of page.
@param PageAttribute Output parameter. Paging Attributes (WB, UC, etc).
@retval EFI_SUCCESS The platform page table attribute from the address is determined.
@retval EFI_UNSUPPORTED The platform does not support getting page table attribute for the address.
**/
EFI_STATUS
EFIAPI
GetPlatformPageTableAttribute (
IN UINT64 Address,
OUT SMM_PAGE_SIZE_TYPE *PageSize,
OUT UINTN *NumOfPages,
OUT UINTN *PageAttribute
);
#endif

View File

@ -0,0 +1,108 @@
/** @file
SMM CPU Platform Hook NULL library instance.
Copyright (c) 2006 - 2015, 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 <PiSmm.h>
#include <Library/SmmCpuPlatformHookLib.h>
/**
Checks if platform produces a valid SMI.
This function checks if platform produces a valid SMI. This function is
called at SMM entry to detect if this is a spurious SMI. This function
must be implemented in an MP safe way because it is called by multiple CPU
threads.
@retval TRUE There is a valid SMI
@retval FALSE There is no valid SMI
**/
BOOLEAN
EFIAPI
PlatformValidSmi (
VOID
)
{
return TRUE;
}
/**
Clears platform top level SMI status bit.
This function clears platform top level SMI status bit.
@retval TRUE The platform top level SMI status is cleared.
@retval FALSE The platform top level SMI status cannot be cleared.
**/
BOOLEAN
EFIAPI
ClearTopLevelSmiStatus (
VOID
)
{
return TRUE;
}
/**
Performs platform specific way of SMM BSP election.
This function performs platform specific way of SMM BSP election.
@param IsBsp Output parameter. TRUE: the CPU this function executes
on is elected to be the SMM BSP. FALSE: the CPU this
function executes on is to be SMM AP.
@retval EFI_SUCCESS The function executes successfully.
@retval EFI_NOT_READY The function does not determine whether this CPU should be
BSP or AP. This may occur if hardware init sequence to
enable the determination is yet to be done, or the function
chooses not to do BSP election and will let SMM CPU driver to
use its default BSP election process.
@retval EFI_DEVICE_ERROR The function cannot determine whether this CPU should be
BSP or AP due to hardware error.
**/
EFI_STATUS
EFIAPI
PlatformSmmBspElection (
OUT BOOLEAN *IsBsp
)
{
return EFI_NOT_READY;
}
/**
Get platform page table attribute.
This function gets page table attribute of platform.
@param Address Input parameter. Obtain the page table entries attribute on this address.
@param PageSize Output parameter. The size of the page.
@param NumOfPages Output parameter. Number of page.
@param PageAttribute Output parameter. Paging Attributes (WB, UC, etc).
@retval EFI_SUCCESS The platform page table attribute from the address is determined.
@retval EFI_UNSUPPORTED The platform does not support getting page table attribute for the address.
**/
EFI_STATUS
EFIAPI
GetPlatformPageTableAttribute (
IN UINT64 Address,
IN OUT SMM_PAGE_SIZE_TYPE *PageSize,
IN OUT UINTN *NumOfPages,
IN OUT UINTN *PageAttribute
)
{
return EFI_UNSUPPORTED;
}

View File

@ -0,0 +1,40 @@
## @file
# SMM CPU Platform Hook NULL library instance.
#
# Copyright (c) 2006 - 2015, 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.
#
##
################################################################################
#
# Defines Section - statements that will be processed to create a Makefile.
#
################################################################################
[Defines]
INF_VERSION = 0x00010005
BASE_NAME = SmmCpuPlatformHookLibNull
MODULE_UNI_FILE = SmmCpuPlatformHookLibNull.uni
FILE_GUID = D6494E1B-E06F-4ab5-B64D-48B25AA9EB33
MODULE_TYPE = DXE_DRIVER
VERSION_STRING = 1.0
LIBRARY_CLASS = SmmCpuPlatformHookLib
#
# The following information is for reference only and not required by the build tools.
#
# VALID_ARCHITECTURES = IA32 X64
#
[Sources]
SmmCpuPlatformHookLibNull.c
[Packages]
MdePkg/MdePkg.dec
UefiCpuPkg/UefiCpuPkg.dec