summaryrefslogtreecommitdiffstats
path: root/MdePkg
diff options
context:
space:
mode:
authorxli24 <xli24@6f19259b-4bc3-4df7-8a09-765794883524>2009-12-25 08:20:37 +0000
committerxli24 <xli24@6f19259b-4bc3-4df7-8a09-765794883524>2009-12-25 08:20:37 +0000
commit41335d22448da9019e95a76bb8e8f10f231222e0 (patch)
treec14e761d83d3f05f81be0895d2f837efc3c0e978 /MdePkg
parente8ade0efd0a5770473824a95b7bb90d79e33f583 (diff)
downloadedk2-41335d22448da9019e95a76bb8e8f10f231222e0.tar.gz
edk2-41335d22448da9019e95a76bb8e8f10f231222e0.tar.bz2
edk2-41335d22448da9019e95a76bb8e8f10f231222e0.zip
Publish definition of MCA/INIT/PMI Protocol & ESAL, as introduced in PI 1.2.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@9616 6f19259b-4bc3-4df7-8a09-765794883524
Diffstat (limited to 'MdePkg')
-rw-r--r--MdePkg/Include/Protocol/ExtendedSalBootService.h214
-rw-r--r--MdePkg/Include/Protocol/ExtendedSalServiceClasses.h275
-rw-r--r--MdePkg/Include/Protocol/McaInitPmi.h207
-rw-r--r--MdePkg/MdePkg.dec23
4 files changed, 719 insertions, 0 deletions
diff --git a/MdePkg/Include/Protocol/ExtendedSalBootService.h b/MdePkg/Include/Protocol/ExtendedSalBootService.h
new file mode 100644
index 0000000000..6e3507e6de
--- /dev/null
+++ b/MdePkg/Include/Protocol/ExtendedSalBootService.h
@@ -0,0 +1,214 @@
+/** @file
+ Definition of Extended SAL Boot Service Protocol
+
+ The Extended SAL Boot Service Protocol provides a mechanisms for platform specific
+ drivers to update the SAL System Table and register Extended SAL Procedures that are
+ callable in physical or virtual mode using the SAL calling convention.
+
+ 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 _EXTENDED_SAL_BOOT_SERVICE_PROTOCOL_H_
+#define _EXTENDED_SAL_BOOT_SERVICE_PROTOCOL_H_
+
+#include <IndustryStandard/Sal.h>
+
+#define EXTENDED_SAL_BOOT_SERVICE_PROTOCOL_GUID \
+ { 0xde0ee9a4, 0x3c7a, 0x44f2, {0xb7, 0x8b, 0xe3, 0xcc, 0xd6, 0x9c, 0x3a, 0xf7 } }
+
+typedef struct _EXTENDED_SAL_BOOT_SERVICE_PROTOCOL EXTENDED_SAL_BOOT_SERVICE_PROTOCOL;
+
+/**
+ Adds platform specific information to the to the header of the SAL System Table.
+
+ @param This A pointer to the EXTENDED_SAL_BOOT_SERVICE_PROTOCOL instance.
+ @param SalAVersion Version of recovery SAL PEIM(s) in BCD format. Higher byte contains
+ the major revision and the lower byte contains the minor revision.
+ @param SalBVersion Version of DXE SAL Driver in BCD format. Higher byte contains
+ the major revision and the lower byte contains the minor revision.
+ @param OemId A pointer to a Null-terminated ASCII string that contains OEM unique string.
+ The string cannot be longer than 32 bytes in total length
+ @param ProductId A pointer to a Null-terminated ASCII string that uniquely identifies a family of
+ compatible products. The string cannot be longer than 32 bytes in total length.
+
+ @retval EFI_SUCCESS The SAL System Table header was updated successfully.
+ @retval EFI_INVALID_PARAMETER OemId is NULL.
+ @retval EFI_INVALID_PARAMETER ProductId is NULL.
+ @retval EFI_INVALID_PARAMETER The length of OemId is greater than 32 characters.
+ @retval EFI_INVALID_PARAMETER The length of ProductId is greater than 32 characters.
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EXTENDED_SAL_ADD_SST_INFO) (
+ IN EXTENDED_SAL_BOOT_SERVICE_PROTOCOL *This,
+ IN UINT16 SalAVersion,
+ IN UINT16 SalBVersion,
+ IN CHAR8 *OemId,
+ IN CHAR8 *ProductId
+ );
+
+/**
+ Adds an entry to the SAL System Table.
+
+ This function adds the SAL System Table Entry specified by TableEntry and EntrySize
+ to the SAL System Table.
+
+ @param This A pointer to the EXTENDED_SAL_BOOT_SERVICE_PROTOCOL instance.
+ @param TableEntry Pointer to a buffer containing a SAL System Table entry that is EntrySize bytes
+ in length. The first byte of the TableEntry describes the type of entry.
+ @param EntrySize The size, in bytes, of TableEntry.
+
+ @retval EFI_SUCCESSThe SAL System Table was updated successfully.
+ @retval EFI_INVALID_PARAMETER TableEntry is NULL.
+ @retval EFI_INVALID_PARAMETER TableEntry specifies an invalid entry type.
+ @retval EFI_INVALID_PARAMETER EntrySize is not valid for this type of entry.
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EXTENDED_SAL_ADD_SST_ENTRY) (
+ IN EXTENDED_SAL_BOOT_SERVICE_PROTOCOL *This,
+ IN UINT8 *TableEntry,
+ IN UINTN EntrySize
+ );
+
+/**
+ Internal ESAL procedures.
+
+ This is prototype of internal Extended SAL procedures, which is registerd by
+ EXTENDED_SAL_REGISTER_INTERNAL_PROC service.
+
+ @param FunctionId The Function ID associated with this Extended SAL Procedure.
+ @param Arg2 Second argument to the Extended SAL procedure.
+ @param Arg3 Third argument to the Extended SAL procedure.
+ @param Arg4 Fourth argument to the Extended SAL procedure.
+ @param Arg5 Fifth argument to the Extended SAL procedure.
+ @param Arg6 Sixth argument to the Extended SAL procedure.
+ @param Arg7 Seventh argument to the Extended SAL procedure.
+ @param Arg8 Eighth argument to the Extended SAL procedure.
+ @param VirtualMode TRUE if the Extended SAL Procedure is being invoked in virtual mode.
+ FALSE if the Extended SAL Procedure is being invoked in physical mode.
+ @param ModuleGlobal A pointer to the global context associated with this Extended SAL Procedure.
+
+ @return The result returned from the specified Extended SAL Procedure
+
+**/
+typedef
+SAL_RETURN_REGS
+(EFIAPI *SAL_INTERNAL_EXTENDED_SAL_PROC) (
+ IN UINT64 FunctionId,
+ IN UINT64 Arg2,
+ IN UINT64 Arg3,
+ IN UINT64 Arg4,
+ IN UINT64 Arg5,
+ IN UINT64 Arg6,
+ IN UINT64 Arg7,
+ IN UINT64 Arg8,
+ IN BOOLEAN VirtualMode,
+ IN VOID *ModuleGlobal OPTIONAL
+ );
+
+/**
+ Registers an Extended SAL Procedure.
+
+ The Extended SAL Procedure specified by InternalSalProc and named by ClassGuidLo,
+ ClassGuidHi, and FunctionId is added to the set of available Extended SAL Procedures.
+
+ @param This A pointer to the EXTENDED_SAL_BOOT_SERVICE_PROTOCOL instance.
+ @param ClassGuidLo The lower 64-bits of the class GUID for the Extended SAL Procedure being added.
+ Each class GUID contains one or more functions specified by a Function ID.
+ @param ClassGuidHi The upper 64-bits of the class GUID for the Extended SAL Procedure being added.
+ Each class GUID contains one or more functions specified by a Function ID.
+ @param FunctionId The Function ID for the Extended SAL Procedure that is being added. This Function
+ ID is a member of the Extended SAL Procedure class specified by ClassGuidLo
+ and ClassGuidHi.
+ @param InternalSalProc A pointer to the Extended SAL Procedure being added.
+ @param PhysicalModuleGlobal Pointer to a module global structure. This is a physical mode pointer.
+ This pointer is passed to the Extended SAL Procedure specified by ClassGuidLo,
+ ClassGuidHi, FunctionId, and InternalSalProc. If the system is in physical mode,
+ then this pointer is passed unmodified to InternalSalProc. If the system is in
+ virtual mode, then the virtual address associated with this pointer is passed to
+ InternalSalProc.
+
+ @retval EFI_SUCCESS The Extended SAL Procedure was added.
+ @retval EFI_OUT_OF_RESOURCES There are not enough resources available to add the Extended SAL Procedure.
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EXTENDED_SAL_REGISTER_INTERNAL_PROC) (
+ IN EXTENDED_SAL_BOOT_SERVICE_PROTOCOL *This,
+ IN UINT64 ClassGuidLo,
+ IN UINT64 ClassGuidHi,
+ IN UINT64 FunctionId,
+ IN SAL_INTERNAL_EXTENDED_SAL_PROC InternalSalProc,
+ IN VOID *PhysicalModuleGlobal OPTIONAL
+ );
+
+/**
+ Calls a previously registered Extended SAL Procedure.
+
+ This function calls the Extended SAL Procedure specified by ClassGuidLo, ClassGuidHi,
+ and FunctionId. The set of previously registered Extended SAL Procedures is searched for a
+ matching ClassGuidLo, ClassGuidHi, and FunctionId. If a match is not found, then
+ EFI_SAL_NOT_IMPLEMENTED is returned.
+
+ @param ClassGuidLo The lower 64-bits of the class GUID for the Extended SAL Procedure
+ that is being called.
+ @param ClassGuidHi The upper 64-bits of the class GUID for the Extended SAL Procedure
+ that is being called.
+ @param FunctionId Function ID for the Extended SAL Procedure being called.
+ @param Arg2 Second argument to the Extended SAL procedure.
+ @param Arg3 Third argument to the Extended SAL procedure.
+ @param Arg4 Fourth argument to the Extended SAL procedure.
+ @param Arg5 Fifth argument to the Extended SAL procedure.
+ @param Arg6 Sixth argument to the Extended SAL procedure.
+ @param Arg7 Seventh argument to the Extended SAL procedure.
+ @param Arg8 Eighth argument to the Extended SAL procedure.
+
+ @retval EFI_SAL_NOT_IMPLEMENTED The Extended SAL Procedure specified by ClassGuidLo,
+ ClassGuidHi, and FunctionId has not been registered.
+ @retval EFI_SAL_VIRTUAL_ADDRESS_ERROR This function was called in virtual mode before virtual mappings
+ for the specified Extended SAL Procedure are available.
+ @retval Other The result returned from the specified Extended SAL Procedure
+
+**/
+typedef
+SAL_RETURN_REGS
+(EFIAPI *EXTENDED_SAL_PROC) (
+ IN UINT64 ClassGuidLo,
+ IN UINT64 ClassGuidHi,
+ IN UINT64 FunctionId,
+ IN UINT64 Arg2,
+ IN UINT64 Arg3,
+ IN UINT64 Arg4,
+ IN UINT64 Arg5,
+ IN UINT64 Arg6,
+ IN UINT64 Arg7,
+ IN UINT64 Arg8
+ );
+
+///
+/// The EXTENDED_SAL_BOOT_SERVICE_PROTOCOL provides a mechanisms for platform specific
+/// drivers to update the SAL System Table and register Extended SAL Procedures that are
+/// callable in physical or virtual mode using the SAL calling convention.
+///
+struct _EXTENDED_SAL_BOOT_SERVICE_PROTOCOL {
+ EXTENDED_SAL_ADD_SST_INFO AddSalSystemTableInfo;
+ EXTENDED_SAL_ADD_SST_ENTRY AddSalSystemTableEntry;
+ EXTENDED_SAL_REGISTER_INTERNAL_PROC RegisterExtendedSalProc;
+ EXTENDED_SAL_PROC ExtendedSalProc;
+};
+
+extern EFI_GUID gEfiExtendedSalBootServiceProtocolGuid;
+
+#endif
diff --git a/MdePkg/Include/Protocol/ExtendedSalServiceClasses.h b/MdePkg/Include/Protocol/ExtendedSalServiceClasses.h
new file mode 100644
index 0000000000..08a51ef8b4
--- /dev/null
+++ b/MdePkg/Include/Protocol/ExtendedSalServiceClasses.h
@@ -0,0 +1,275 @@
+/** @file
+ The standard set of Extended SAL service classes.
+
+ 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 _EXTENDED_SAL_SERVICE_CLASSES_H_
+#define _EXTENDED_SAL_SERVICE_CLASSES_H_
+
+///
+/// Extended SAL Base I/O Services Class
+///
+///@{
+#define EFI_EXTENDED_SAL_BASE_IO_SERVICES_PROTOCOL_GUID_LO 0x451531e15aea42b5
+#define EFI_EXTENDED_SAL_BASE_IO_SERVICES_PROTOCOL_GUID_HI 0xa6657525d5b831bc
+#define EFI_EXTENDED_SAL_BASE_IO_SERVICES_PROTOCOL_GUID \
+ { 0x5aea42b5, 0x31e1, 0x4515, {0xbc, 0x31, 0xb8, 0xd5, 0x25, 0x75, 0x65, 0xa6 } }
+
+typedef enum {
+ IoReadFunctionId,
+ IoWriteFunctionId,
+ MemReadFunctionId,
+ MemWriteFunctionId
+} EFI_EXTENDED_SAL_BASE_IO_SERVICES_FUNC_ID;
+///@}
+
+///
+/// Extended SAL Stall Services Class
+///
+///@{
+#define EFI_EXTENDED_SAL_STALL_SERVICES_PROTOCOL_GUID_LO 0x4d8cac2753a58d06
+#define EFI_EXTENDED_SAL_STALL_SERVICES_PROTOCOL_GUID_HI 0x704165808af0e9b5
+#define EFI_EXTENDED_SAL_STALL_SERVICES_PROTOCOL_GUID \
+ { 0x53a58d06, 0xac27, 0x4d8c, {0xb5, 0xe9, 0xf0, 0x8a, 0x80, 0x65, 0x41, 0x70 } }
+
+typedef enum {
+ StallFunctionId
+} EFI_EXTENDED_SAL_STALL_FUNC_ID;
+///@}
+
+///
+/// Extended SAL Real Time Clock Services Class
+///
+///@{
+#define EFI_EXTENDED_SAL_RTC_SERVICES_PROTOCOL_GUID_LO 0x4d02efdb7e97a470
+#define EFI_EXTENDED_SAL_RTC_SERVICES_PROTOCOL_GUID_HI 0x96a27bd29061ce8f
+#define EFI_EXTENDED_SAL_RTC_SERVICES_PROTOCOL_GUID \
+ { 0x7e97a470, 0xefdb, 0x4d02, {0x8f, 0xce, 0x61, 0x90, 0xd2, 0x7b, 0xa2, 0x96 } }
+
+typedef enum {
+ GetTimeFunctionId,
+ SetTimeFunctionId,
+ GetWakeupTimeFunctionId,
+ SetWakeupTimeFunctionId,
+ GetRtcFreqFunctionId,
+ InitializeThresholdFunctionId,
+ BumpThresholdCountFunctionId,
+ GetThresholdCountFunctionId
+} EFI_EXTENDED_SAL_RTC_SERVICES_FUNC_ID;
+///@}
+
+///
+/// Extended SAL Variable Services Class
+///
+///@{
+#define EFI_EXTENDED_SAL_VARIABLE_SERVICES_PROTOCOL_GUID_LO 0x4370c6414ecb6c53
+#define EFI_EXTENDED_SAL_VARIABLE_SERVICES_PROTOCOL_GUID_HI 0x78836e490e3bb28c
+#define EFI_EXTENDED_SAL_VARIABLE_SERVICES_PROTOCOL_GUID \
+ { 0x4ecb6c53, 0xc641, 0x4370, {0x8c, 0xb2, 0x3b, 0x0e, 0x49, 0x6e, 0x83, 0x78 } }
+
+typedef enum {
+ EsalGetVariableFunctionId,
+ EsalGetNextVariableNameFunctionId,
+ EsalSetVariableFunctionId,
+ EsalQueryVariableInfoFunctionId
+} EFI_EXTENDED_SAL_VARIABLE_SERVICES_FUNC_ID;
+///@}
+
+///
+/// Extended SAL Monotonic Counter Services Class
+///
+///@{
+#define EFI_EXTENDED_SAL_MTC_SERVICES_PROTOCOL_GUID_LO 0x408b75e8899afd18
+#define EFI_EXTENDED_SAL_MTC_SERVICES_PROTOCOL_GUID_HI 0x54f4cd7e2e6e1aa4
+#define EFI_EXTENDED_SAL_MTC_SERVICES_PROTOCOL_GUID \
+ { 0x899afd18, 0x75e8, 0x408b, {0xa4, 0x1a, 0x6e, 0x2e, 0x7e, 0xcd, 0xf4, 0x54 } }
+
+typedef enum {
+ GetNextHighMonotonicCountFunctionId
+} EFI_EXTENDED_SAL_MTC_SERVICES_FUNC_ID;
+///@}
+
+///
+/// Extended SAL Reset Services Class
+///
+///@{
+#define EFI_EXTENDED_SAL_RESET_SERVICES_PROTOCOL_GUID_LO 0x46f58ce17d019990
+#define EFI_EXTENDED_SAL_RESET_SERVICES_PROTOCOL_GUID_HI 0xa06a6798513c76a7
+#define EFI_EXTENDED_SAL_RESET_SERVICES_PROTOCOL_GUID \
+ { 0x7d019990, 0x8ce1, 0x46f5, {0xa7, 0x76, 0x3c, 0x51, 0x98, 0x67, 0x6a, 0xa0 } }
+
+typedef enum {
+ ResetSystemFunctionId
+} EFI_EXTENDED_SAL_RESET_SERVICES_FUNC_ID;
+///@}
+
+///
+/// Extended SAL Status Code Services Class
+///
+///@{
+#define EFI_EXTENDED_SAL_STATUS_CODE_SERVICES_PROTOCOL_GUID_LO 0x420f55e9dbd91d
+#define EFI_EXTENDED_SAL_STATUS_CODE_SERVICES_PROTOCOL_GUID_HI 0x4fb437849f5e3996
+#define EFI_EXTENDED_SAL_STATUS_CODE_SERVICES_PROTOCOL_GUID \
+ { 0xdbd91d, 0x55e9, 0x420f, {0x96, 0x39, 0x5e, 0x9f, 0x84, 0x37, 0xb4, 0x4f } }
+
+typedef enum {
+ ReportStatusCodeServiceFunctionId
+} EFI_EXTENDED_SAL_STATUS_CODE_SERVICES_FUNC_ID;
+///@}
+
+///
+/// Extended SAL Firmware Volume Block Services Class
+///
+///@{
+#define EFI_EXTENDED_SAL_FV_BLOCK_SERVICES_PROTOCOL_GUID_LO 0x4f1dbcbba2271df1
+#define EFI_EXTENDED_SAL_FV_BLOCK_SERVICES_PROTOCOL_GUID_HI 0x1a072f17bc06a998
+#define EFI_EXTENDED_SAL_FV_BLOCK_SERVICES_PROTOCOL_GUID \
+ { 0xa2271df1, 0xbcbb, 0x4f1d, {0x98, 0xa9, 0x06, 0xbc, 0x17, 0x2f, 0x07, 0x1a } }
+
+typedef enum {
+ ReadFunctionId,
+ WriteFunctionId,
+ EraseBlockFunctionId,
+ GetVolumeAttributesFunctionId,
+ SetVolumeAttributesFunctionId,
+ GetPhysicalAddressFunctionId,
+ GetBlockSizeFunctionId,
+} EFI_EXTENDED_SAL_FV_BLOCK_SERVICES_FUNC_ID;
+///@}
+
+///
+/// Extended SAL MP Services Class
+///
+///@{
+#define EFI_EXTENDED_SAL_MP_SERVICES_PROTOCOL_GUID_LO 0x4dc0cf18697d81a2
+#define EFI_EXTENDED_SAL_MP_SERVICES_PROTOCOL_GUID_HI 0x3f8a613b11060d9e
+#define EFI_EXTENDED_SAL_MP_SERVICES_PROTOCOL_GUID \
+ { 0x697d81a2, 0xcf18, 0x4dc0, {0x9e, 0x0d, 0x06, 0x11, 0x3b, 0x61, 0x8a, 0x3f } }
+
+typedef enum {
+ AddCpuDataFunctionId,
+ RemoveCpuDataFunctionId,
+ ModifyCpuDataFunctionId,
+ GetCpuDataByIDFunctionId,
+ GetCpuDataByIndexFunctionId,
+ SendIpiFunctionId,
+ CurrentProcInfoFunctionId,
+ NumProcessorsFunctionId,
+ SetMinStateFunctionId,
+ GetMinStateFunctionId
+} EFI_EXTENDED_SAL_MP_SERVICES_FUNC_ID;
+///@}
+
+///
+/// Extended SAL PAL Services Class
+///
+///@{
+#define EFI_EXTENDED_SAL_PAL_SERVICES_PROTOCOL_GUID_LO 0x438d0fc2e1cd9d21
+#define EFI_EXTENDED_SAL_PAL_SERVICES_PROTOCOL_GUID_HI 0x571e966de6040397
+#define EFI_EXTENDED_SAL_PAL_SERVICES_PROTOCOL_GUID \
+ { 0xe1cd9d21, 0x0fc2, 0x438d, {0x97, 0x03, 0x04, 0xe6, 0x6d, 0x96, 0x1e, 0x57 } }
+
+typedef enum {
+ PalProcFunctionId,
+ SetNewPalEntryFunctionId,
+ GetNewPalEntryFunctionId,
+ EsalUpdatePalFunctionId
+} EFI_EXTENDED_SAL_PAL_SERVICES_FUNC_ID;
+///@}
+
+///
+/// Extended SAL Base Services Class
+///
+///@{
+#define EFI_EXTENDED_SAL_BASE_SERVICES_PROTOCOL_GUID_LO 0x41c30fe0d9e9fa06
+#define EFI_EXTENDED_SAL_BASE_SERVICES_PROTOCOL_GUID_HI 0xf894335a4283fb96
+#define EFI_EXTENDED_SAL_BASE_SERVICES_PROTOCOL_GUID \
+ { 0xd9e9fa06, 0x0fe0, 0x41c3, {0x96, 0xfb, 0x83, 0x42, 0x5a, 0x33, 0x94, 0xf8 } }
+
+typedef enum {
+ SalSetVectorsFunctionId,
+ SalMcRendezFunctionId,
+ SalMcSetParamsFunctionId,
+ EsalGetVectorsFunctionId,
+ EsalMcGetParamsFunctionId,
+ EsalMcGetMcParamsFunctionId,
+ EsalGetMcCheckinFlagsFunctionId,
+ EsalGetPlatformBaseFreqFunctionId,
+ EsalPhysicalIdInfoFunctionId,
+ EsalRegisterPhysicalAddrFunctionId
+} EFI_EXTENDED_SAL_BASE_SERVICES_FUNC_ID;
+///@}
+
+///
+/// Extended SAL MCA Services Class
+///
+///@{
+#define EFI_EXTENDED_SAL_MCA_SERVICES_PROTOCOL_GUID_LO 0x42b16cc72a591128
+#define EFI_EXTENDED_SAL_MCA_SERVICES_PROTOCOL_GUID_HI 0xbb2d683b9358f08a
+#define EFI_EXTENDED_SAL_MCA_SERVICES_PROTOCOL_GUID \
+ { 0x2a591128, 0x6cc7, 0x42b1, {0x8a, 0xf0, 0x58, 0x93, 0x3b, 0x68, 0x2d, 0xbb } }
+
+typedef enum {
+ McaGetStateInfoFunctionId,
+ McaRegisterCpuFunctionId
+} EFI_EXTENDED_SAL_MCA_SERVICES_FUNC_ID;
+///@}
+
+///
+/// Extended SAL PCI Services Class
+///
+///@{
+#define EFI_EXTENDED_SAL_PCI_SERVICES_PROTOCOL_GUID_LO 0x4905ad66a46b1a31
+#define EFI_EXTENDED_SAL_PCI_SERVICES_PROTOCOL_GUID_HI 0x6330dc59462bf692
+#define EFI_EXTENDED_SAL_PCI_SERVICES_PROTOCOL_GUID \
+ { 0xa46b1a31, 0xad66, 0x4905, {0x92, 0xf6, 0x2b, 0x46, 0x59, 0xdc, 0x30, 0x63 } }
+
+typedef enum {
+ SalPciConfigReadFunctionId,
+ SalPciConfigWriteFunctionId
+} EFI_EXTENDED_SAL_PCI_SERVICES_FUNC_ID;
+///@}
+
+///
+/// Extended SAL Cache Services Class
+///
+///@{
+#define EFI_EXTENDED_SAL_CACHE_SERVICES_PROTOCOL_GUID_LO 0x4ba52743edc9494
+#define EFI_EXTENDED_SAL_CACHE_SERVICES_PROTOCOL_GUID_HI 0x88f11352ef0a1888
+#define EFI_EXTENDED_SAL_CACHE_SERVICES_PROTOCOL_GUID \
+ { 0xedc9494, 0x2743, 0x4ba5, { 0x88, 0x18, 0x0a, 0xef, 0x52, 0x13, 0xf1, 0x88 } }
+
+typedef enum {
+ SalCacheInitFunctionId,
+ SalCacheFlushFunctionId
+} EFI_EXTENDED_SAL_CACHE_SERVICES_FUNC_ID;
+///@}
+
+///
+/// Extended SAL MCA Log Services Class
+///
+///@{
+#define EFI_EXTENDED_SAL_MCA_LOG_SERVICES_PROTOCOL_GUID_LO 0x4c0338a3cb3fd86e
+#define EFI_EXTENDED_SAL_MCA_LOG_SERVICES_PROTOCOL_GUID_HI 0x7aaba2a3cf905c9a
+#define EFI_EXTENDED_SAL_MCA_LOG_SERVICES_PROTOCOL_GUID \
+ { 0xcb3fd86e, 0x38a3, 0x4c03, {0x9a, 0x5c, 0x90, 0xcf, 0xa3, 0xa2, 0xab, 0x7a } }
+
+typedef enum {
+ SalGetStateInfoFunctionId,
+ SalGetStateInfoSizeFunctionId,
+ SalClearStateInfoFunctionId,
+ EsalGetStateBufferFunctionId,
+ EsalSaveStateBufferFunctionId
+} EFI_EXTENDED_SAL_MCA_LOG_SERVICES_FUNC_ID;
+///@}
+
+#endif
diff --git a/MdePkg/Include/Protocol/McaInitPmi.h b/MdePkg/Include/Protocol/McaInitPmi.h
new file mode 100644
index 0000000000..0a7b4e9724
--- /dev/null
+++ b/MdePkg/Include/Protocol/McaInitPmi.h
@@ -0,0 +1,207 @@
+/** @file
+ MCA/PMI/INIT Protocol as defined in PI Specification VOLUME 4.
+
+ This protocol provides services to handle Machine Checks (MCA),
+ Initialization (INIT) events, and Platform Management Interrupt (PMI) events
+ on an Intel Itanium Processor Family based system.
+
+ 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 __MCA_INIT_PMI_PROTOCOL_H__
+#define __MCA_INIT_PMI_PROTOCOL_H__
+
+///
+/// Global ID for the MCA/PMI/INIT Protocol.
+///
+#define EFI_SAL_MCA_INIT_PMI_PROTOCOL_GUID \
+ { 0xb60dc6e8, 0x3b6f, 0x11d5, {0xaf, 0x9, 0x0, 0xa0, 0xc9, 0x44, 0xa0, 0x5b} }
+
+
+///
+/// Declare forward reference for the Timer Architectural Protocol
+///
+typedef struct _EFI_SAL_MCA_INIT_PMI_PROTOCOL EFI_SAL_MCA_INIT_PMI_PROTOCOL;
+
+#pragma pack(1)
+///
+/// MCA Records Structure
+///
+typedef struct {
+ UINT64 First : 1;
+ UINT64 Last : 1;
+ UINT64 EntryCount : 16;
+ UINT64 DispatchedCount : 16;
+ UINT64 Reserved : 30;
+} SAL_MCA_COUNT_STRUCTURE;
+
+#pragma pack()
+
+/**
+ Prototype of MCA handler.
+
+ @param ModuleGlobal The context of MCA Handler
+ @param ProcessorStateParameters The processor state parameters (PSP)
+ @param MinstateBase Base address of the min-state
+ @param RendezvouseStateInformation Rendezvous state information to be passed to
+ the OS on OS MCA entry
+ @param CpuIndex Index of the logical processor
+ @param McaCountStructure Pointer to the MCA records structure
+ @param CorrectedMachineCheck This flag is set to TRUE is the MCA has been
+ corrected by the handler or by a previous handler
+
+ @retval EFI_SUCCESS Handler successfully returned
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_SAL_MCA_HANDLER) (
+ IN VOID *ModuleGlobal,
+ IN UINT64 ProcessorStateParameters,
+ IN EFI_PHYSICAL_ADDRESS MinstateBase,
+ IN UINT64 RendezvouseStateInformation,
+ IN UINT64 CpuIndex,
+ IN SAL_MCA_COUNT_STRUCTURE *McaCountStructure,
+ OUT BOOLEAN *CorrectedMachineCheck
+ );
+
+/**
+ Prototype of INIT handler.
+
+ @param ModuleGlobal The context of INIT Handler
+ @param ProcessorStateParameters The processor state parameters (PSP)
+ @param MinstateBase Base address of the min-state
+ @param McaInProgress This flag indicates if an MCA is in progress
+ @param CpuIndex Index of the logical processor
+ @param McaCountStructure Pointer to the MCA records structure
+ @param DumpSwitchPressed This flag indicates the crash dump switch has been pressed
+
+ @retval EFI_SUCCESS Handler successfully returned
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_SAL_INIT_HANDLER) (
+ IN VOID *ModuleGlobal,
+ IN UINT64 ProcessorStateParameters,
+ IN EFI_PHYSICAL_ADDRESS MinstateBase,
+ IN BOOLEAN McaInProgress,
+ IN UINT64 CpuIndex,
+ IN SAL_MCA_COUNT_STRUCTURE *McaCountStructure,
+ OUT BOOLEAN *DumpSwitchPressed
+ );
+
+/**
+ Prototype of PMI handler
+
+ @param ModuleGlobal The context of PMI Handler
+ @param CpuIndex Index of the logical processor
+ @param PmiVector The PMI vector number as received from the PALE_PMI exit state (GR24)
+
+ @retval EFI_SUCCESS Handler successfully returned
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_SAL_PMI_HANDLER) (
+ IN VOID *ModuleGlobal,
+ IN UINT64 CpuIndex,
+ IN UINT64 PmiVector
+ );
+
+/**
+ Register a MCA handler with the MCA dispatcher.
+
+ @param This The EFI_SAL_MCA_INIT_PMI_PROTOCOL instance
+ @param McaHandler The MCA handler to register
+ @param ModuleGlobal The context of MCA Handler
+ @param MakeFirst This flag specifies the handler should be made first in the list
+ @param MakeLast This flag specifies the handler should be made last in the list
+
+ @retval EFI_SUCCESS MCA Handle was registered
+ @retval EFI_OUT_OF_RESOURCES No more resources to register an MCA handler
+ @retval EFI_INVALID_PARAMETER Invalid parameters were passed
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_SAL_REGISTER_MCA_HANDLER) (
+ IN EFI_SAL_MCA_INIT_PMI_PROTOCOL *This,
+ IN EFI_SAL_MCA_HANDLER McaHandler,
+ IN VOID *ModuleGlobal,
+ IN BOOLEAN MakeFirst,
+ IN BOOLEAN MakeLast
+ );
+
+/**
+ Register an INIT handler with the INIT dispatcher.
+
+ @param This The EFI_SAL_MCA_INIT_PMI_PROTOCOL instance
+ @param InitHandler The INIT handler to register
+ @param ModuleGlobal The context of INIT Handler
+ @param MakeFirst This flag specifies the handler should be made first in the list
+ @param MakeLast This flag specifies the handler should be made last in the list
+
+ @retval EFI_SUCCESS INIT Handle was registered
+ @retval EFI_OUT_OF_RESOURCES No more resources to register an INIT handler
+ @retval EFI_INVALID_PARAMETER Invalid parameters were passed
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_SAL_REGISTER_INIT_HANDLER) (
+ IN EFI_SAL_MCA_INIT_PMI_PROTOCOL *This,
+ IN EFI_SAL_INIT_HANDLER InitHandler,
+ IN VOID *ModuleGlobal,
+ IN BOOLEAN MakeFirst,
+ IN BOOLEAN MakeLast
+ );
+
+/**
+ Register a PMI handler with the PMI dispatcher.
+
+ @param This The EFI_SAL_MCA_INIT_PMI_PROTOCOL instance
+ @param PmiHandler The PMI handler to register
+ @param ModuleGlobal The context of PMI Handler
+ @param MakeFirst This flag specifies the handler should be made first in the list
+ @param MakeLast This flag specifies the handler should be made last in the list
+
+ @retval EFI_SUCCESS PMI Handle was registered
+ @retval EFI_OUT_OF_RESOURCES No more resources to register an PMI handler
+ @retval EFI_INVALID_PARAMETER Invalid parameters were passed
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_SAL_REGISTER_PMI_HANDLER) (
+ IN EFI_SAL_MCA_INIT_PMI_PROTOCOL *This,
+ IN EFI_SAL_PMI_HANDLER PmiHandler,
+ IN VOID *ModuleGlobal,
+ IN BOOLEAN MakeFirst,
+ IN BOOLEAN MakeLast
+ );
+
+///
+/// This protocol is used to register MCA, INIT and PMI handlers with their respective dispatcher
+///
+struct _EFI_SAL_MCA_INIT_PMI_PROTOCOL {
+ EFI_SAL_REGISTER_MCA_HANDLER RegisterMcaHandler;
+ EFI_SAL_REGISTER_INIT_HANDLER RegisterInitHandler;
+ EFI_SAL_REGISTER_PMI_HANDLER RegisterPmiHandler;
+ BOOLEAN McaInProgress; ///< Whether MCA handler is in progress
+ BOOLEAN InitInProgress; ///< Whether Init handler is in progress
+ BOOLEAN PmiInProgress; ///< Whether Pmi handler is in progress
+};
+
+extern EFI_GUID gEfiSalMcaInitPmiProtocolGuid;
+
+#endif
+
diff --git a/MdePkg/MdePkg.dec b/MdePkg/MdePkg.dec
index 6c417d5214..7fe6daa461 100644
--- a/MdePkg/MdePkg.dec
+++ b/MdePkg/MdePkg.dec
@@ -730,6 +730,29 @@
## Include/Protocol/LegacyRegion2.h
gEfiLegacyRegion2ProtocolGuid = {0x70101eaf, 0x85, 0x440c, {0xb3, 0x56, 0x8e, 0xe3, 0x6f, 0xef, 0x24, 0xf0 } }
+ ## Include/Protocol/McaInitPmi.h
+ gEfiSalMcaInitPmiProtocolGuid = { 0xb60dc6e8, 0x3b6f, 0x11d5, {0xaf, 0x9, 0x0, 0xa0, 0xc9, 0x44, 0xa0, 0x5b } }
+
+ ## Include/Protocol/ExtendedSalBootService.h
+ gEfiExtendedSalBootServiceProtocolGuid = { 0xde0ee9a4, 0x3c7a, 0x44f2, {0xb7, 0x8b, 0xe3, 0xcc, 0xd6, 0x9c, 0x3a, 0xf7 } }
+
+ ## Include/Protocol/ExtendedSalServiceClasses.h
+ gEfiExtendedSalBaseIoServicesProtocolGuid = { 0x5aea42b5, 0x31e1, 0x4515, {0xbc, 0x31, 0xb8, 0xd5, 0x25, 0x75, 0x65, 0xa6 } }
+ gEfiExtendedSalStallServicesProtocolGuid = { 0x53a58d06, 0xac27, 0x4d8c, {0xb5, 0xe9, 0xf0, 0x8a, 0x80, 0x65, 0x41, 0x70 } }
+ gEfiExtendedSalRtcServicesProtocolGuid = { 0x7e97a470, 0xefdb, 0x4d02, {0x8f, 0xce, 0x61, 0x90, 0xd2, 0x7b, 0xa2, 0x96 } }
+ gEfiExtendedSalVariableServicesProtocolGuid = { 0x4ecb6c53, 0xc641, 0x4370, {0x8c, 0xb2, 0x3b, 0x0e, 0x49, 0x6e, 0x83, 0x78 } }
+ gEfiExtendedSalMtcServicesProtocolGuid = { 0x899afd18, 0x75e8, 0x408b, {0xa4, 0x1a, 0x6e, 0x2e, 0x7e, 0xcd, 0xf4, 0x54 } }
+ gEfiExtendedSalResetServicesProtocolGuid = { 0x7d019990, 0x8ce1, 0x46f5, {0xa7, 0x76, 0x3c, 0x51, 0x98, 0x67, 0x6a, 0xa0 } }
+ gEfiExtendedSalStatusCodeServicesProtocolGuid = { 0xdbd91d, 0x55e9, 0x420f, {0x96, 0x39, 0x5e, 0x9f, 0x84, 0x37, 0xb4, 0x4f } }
+ gEfiExtendedSalFvBlockServicesProtocolGuid = { 0xa2271df1, 0xbcbb, 0x4f1d, {0x98, 0xa9, 0x06, 0xbc, 0x17, 0x2f, 0x07, 0x1a } }
+ gEfiExtendedSalMpServicesProtocolGuid = { 0x697d81a2, 0xcf18, 0x4dc0, {0x9e, 0x0d, 0x06, 0x11, 0x3b, 0x61, 0x8a, 0x3f } }
+ gEfiExtendedSalPalServicesProtocolGuid = { 0xe1cd9d21, 0x0fc2, 0x438d, {0x97, 0x03, 0x04, 0xe6, 0x6d, 0x96, 0x1e, 0x57 } }
+ gEfiExtendedSalBaseServicesProtocolGuid = { 0xd9e9fa06, 0x0fe0, 0x41c3, {0x96, 0xfb, 0x83, 0x42, 0x5a, 0x33, 0x94, 0xf8 } }
+ gEfiExtendedSalMcaServicesProtocolGuid = { 0x2a591128, 0x6cc7, 0x42b1, {0x8a, 0xf0, 0x58, 0x93, 0x3b, 0x68, 0x2d, 0xbb } }
+ gEfiExtendedSalPciServicesProtocolGuid = { 0xa46b1a31, 0xad66, 0x4905, {0x92, 0xf6, 0x2b, 0x46, 0x59, 0xdc, 0x30, 0x63 } }
+ gEfiExtendedSalCacheServicesProtocolGuid = { 0xedc9494, 0x2743, 0x4ba5, { 0x88, 0x18, 0x0a, 0xef, 0x52, 0x13, 0xf1, 0x88 } }
+ gEfiExtendedSalMcaLogServicesProtocolGuid = { 0xcb3fd86e, 0x38a3, 0x4c03, {0x9a, 0x5c, 0x90, 0xcf, 0xa3, 0xa2, 0xab, 0x7a } }
+
#
# Protocols defined in UEFI2.1/UEFI2.0/EFI1.1
#