git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@11213
6f19259b-4bc3-4df7-8a09-
765794883524
#include EFI_GUID_DEFINITION (StatusCodeCallerId)\r
#include EFI_GUID_DEFINITION (Hob)\r
#include EFI_ARCH_PROTOCOL_DEFINITION (StatusCode)\r
#include EFI_GUID_DEFINITION (StatusCodeCallerId)\r
#include EFI_GUID_DEFINITION (Hob)\r
#include EFI_ARCH_PROTOCOL_DEFINITION (StatusCode)\r
+#include EFI_PROTOCOL_DEFINITION (SmmStatusCode)\r
+#include EFI_PROTOCOL_DEFINITION (SmmBase)\r
\r
//\r
// Driver Lib Module Globals\r
\r
//\r
// Driver Lib Module Globals\r
static EFI_EVENT mEfiVirtualNotifyEvent = NULL;\r
static BOOLEAN mRuntimeLibInitialized = FALSE;\r
static BOOLEAN mEfiGoneVirtual = FALSE;\r
static EFI_EVENT mEfiVirtualNotifyEvent = NULL;\r
static BOOLEAN mRuntimeLibInitialized = FALSE;\r
static BOOLEAN mEfiGoneVirtual = FALSE;\r
+static BOOLEAN mInSmm = FALSE;\r
\r
//\r
// Runtime Global, but you should use the Lib functions\r
\r
//\r
// Runtime Global, but you should use the Lib functions\r
EFI_CPU_IO_PROTOCOL *gCpuIo;\r
BOOLEAN mEfiAtRuntime = FALSE;\r
FVB_ENTRY *mFvbEntry;\r
EFI_CPU_IO_PROTOCOL *gCpuIo;\r
BOOLEAN mEfiAtRuntime = FALSE;\r
FVB_ENTRY *mFvbEntry;\r
+EFI_SMM_STATUS_CODE_PROTOCOL *gSmmStatusCodeProtocol = NULL;\r
\r
#if (EFI_SPECIFICATION_VERSION >= 0x00020000)\r
\r
\r
#if (EFI_SPECIFICATION_VERSION >= 0x00020000)\r
\r
- EFI_STATUS Status;\r
-#if (EFI_SPECIFICATION_VERSION >= 0x00020000)\r
- VOID *Registration;\r
-#endif\r
+ EFI_STATUS Status;\r
+ EFI_SMM_BASE_PROTOCOL *SmmBase;\r
\r
if (mRuntimeLibInitialized) {\r
return EFI_ALREADY_STARTED;\r
\r
if (mRuntimeLibInitialized) {\r
return EFI_ALREADY_STARTED;\r
mRT = SystemTable->RuntimeServices;\r
ASSERT (mRT != NULL);\r
\r
mRT = SystemTable->RuntimeServices;\r
ASSERT (mRT != NULL);\r
\r
-#if (EFI_SPECIFICATION_VERSION >= 0x00020000)\r
- // Register EFI_STATUS_CODE_PROTOCOL notify function\r
+ // Check whether it is in SMM mode.\r
- Status = gBS->CreateEvent (\r
- EFI_EVENT_NOTIFY_SIGNAL,\r
- EFI_TPL_CALLBACK,\r
- OnStatusCodeInstall,\r
- NULL,\r
- &gEfiStatusCodeNotifyEvent\r
- );\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- Status = gBS->RegisterProtocolNotify (\r
- &gEfiStatusCodeRuntimeProtocolGuid,\r
- gEfiStatusCodeNotifyEvent,\r
- &Registration\r
- );\r
- ASSERT_EFI_ERROR (Status);\r
+ Status = gBS->LocateProtocol (&gEfiSmmBaseProtocolGuid, NULL, &SmmBase);\r
+ if (!EFI_ERROR (Status)) {\r
+ SmmBase->InSmm (SmmBase, &mInSmm);\r
+ }\r
- gBS->SignalEvent (gEfiStatusCodeNotifyEvent);\r
-#endif\r
+ //\r
+ // Directly locate SmmStatusCode protocol\r
+ //\r
+ Status = gBS->LocateProtocol (&gEfiSmmStatusCodeProtocolGuid, NULL, &gSmmStatusCodeProtocol);\r
+ if (EFI_ERROR (Status)) {\r
+ gSmmStatusCodeProtocol = NULL;\r
+ }\r
\r
Status = gBS->LocateProtocol (&gEfiCpuIoProtocolGuid, NULL, (VOID **) &gCpuIo);\r
if (EFI_ERROR (Status)) {\r
\r
Status = gBS->LocateProtocol (&gEfiCpuIoProtocolGuid, NULL, (VOID **) &gCpuIo);\r
if (EFI_ERROR (Status)) {\r
--*/\r
{\r
EFI_STATUS Status;\r
--*/\r
{\r
EFI_STATUS Status;\r
+ \r
+ if (mInSmm) {\r
+ if (gSmmStatusCodeProtocol == NULL) {\r
+ return EFI_UNSUPPORTED;\r
+ }\r
+ Status = gSmmStatusCodeProtocol->ReportStatusCode (gSmmStatusCodeProtocol, CodeType, Value, Instance, CallerId, Data);\r
+ return Status;\r
+ }\r
\r
#if (EFI_SPECIFICATION_VERSION >= 0x00020000)\r
if (gReportStatusCode == NULL) {\r
\r
#if (EFI_SPECIFICATION_VERSION >= 0x00020000)\r
if (gReportStatusCode == NULL) {\r
#include EFI_GUID_DEFINITION (StatusCodeCallerId)\r
#include EFI_GUID_DEFINITION (Hob)\r
#include EFI_ARCH_PROTOCOL_DEFINITION (StatusCode)\r
#include EFI_GUID_DEFINITION (StatusCodeCallerId)\r
#include EFI_GUID_DEFINITION (Hob)\r
#include EFI_ARCH_PROTOCOL_DEFINITION (StatusCode)\r
+#include EFI_PROTOCOL_DEFINITION (SmmStatusCode)\r
+#include EFI_PROTOCOL_DEFINITION (SmmBase)\r
\r
//\r
// Driver Lib Module Globals\r
\r
//\r
// Driver Lib Module Globals\r
static EFI_EVENT mEfiVirtualNotifyEvent = NULL;\r
static BOOLEAN mRuntimeLibInitialized = FALSE;\r
static BOOLEAN mEfiGoneVirtual = FALSE;\r
static EFI_EVENT mEfiVirtualNotifyEvent = NULL;\r
static BOOLEAN mRuntimeLibInitialized = FALSE;\r
static BOOLEAN mEfiGoneVirtual = FALSE;\r
+static BOOLEAN mInSmm = FALSE;\r
\r
//\r
// Runtime Global, but you should use the Lib functions\r
\r
//\r
// Runtime Global, but you should use the Lib functions\r
EFI_CPU_IO_PROTOCOL *gCpuIo;\r
BOOLEAN mEfiAtRuntime = FALSE;\r
FVB_ENTRY *mFvbEntry;\r
EFI_CPU_IO_PROTOCOL *gCpuIo;\r
BOOLEAN mEfiAtRuntime = FALSE;\r
FVB_ENTRY *mFvbEntry;\r
+EFI_SMM_STATUS_CODE_PROTOCOL *gSmmStatusCodeProtocol = NULL;\r
\r
#if (EFI_SPECIFICATION_VERSION >= 0x00020000)\r
\r
\r
#if (EFI_SPECIFICATION_VERSION >= 0x00020000)\r
\r
- EFI_STATUS Status;\r
-#if (EFI_SPECIFICATION_VERSION >= 0x00020000)\r
- VOID *Registration;\r
-#endif\r
+ EFI_STATUS Status;\r
+ EFI_SMM_BASE_PROTOCOL *SmmBase;\r
\r
if (mRuntimeLibInitialized) {\r
return EFI_ALREADY_STARTED;\r
\r
if (mRuntimeLibInitialized) {\r
return EFI_ALREADY_STARTED;\r
mRT = SystemTable->RuntimeServices;\r
ASSERT (mRT != NULL);\r
\r
mRT = SystemTable->RuntimeServices;\r
ASSERT (mRT != NULL);\r
\r
-#if (EFI_SPECIFICATION_VERSION >= 0x00020000)\r
- // Register EFI_STATUS_CODE_PROTOCOL notify function\r
+ // Check whether it is in SMM mode.\r
- Status = gBS->CreateEvent (\r
- EFI_EVENT_NOTIFY_SIGNAL,\r
- EFI_TPL_CALLBACK,\r
- OnStatusCodeInstall,\r
- NULL,\r
- &gEfiStatusCodeNotifyEvent\r
- );\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- Status = gBS->RegisterProtocolNotify (\r
- &gEfiStatusCodeRuntimeProtocolGuid,\r
- gEfiStatusCodeNotifyEvent,\r
- &Registration\r
- );\r
- ASSERT_EFI_ERROR (Status);\r
+ Status = gBS->LocateProtocol (&gEfiSmmBaseProtocolGuid, NULL, &SmmBase);\r
+ if (!EFI_ERROR (Status)) {\r
+ SmmBase->InSmm (SmmBase, &mInSmm);\r
+ }\r
- gBS->SignalEvent (gEfiStatusCodeNotifyEvent);\r
-#endif\r
+ //\r
+ // Directly locate SmmStatusCode protocol\r
+ //\r
+ Status = gBS->LocateProtocol (&gEfiSmmStatusCodeProtocolGuid, NULL, &gSmmStatusCodeProtocol);\r
+ if (EFI_ERROR (Status)) {\r
+ gSmmStatusCodeProtocol = NULL;\r
+ }\r
\r
Status = gBS->LocateProtocol (&gEfiCpuIoProtocolGuid, NULL, (VOID **) &gCpuIo);\r
if (EFI_ERROR (Status)) {\r
\r
Status = gBS->LocateProtocol (&gEfiCpuIoProtocolGuid, NULL, (VOID **) &gCpuIo);\r
if (EFI_ERROR (Status)) {\r
--*/\r
{\r
EFI_STATUS Status;\r
--*/\r
{\r
EFI_STATUS Status;\r
+ \r
+ if (mInSmm) {\r
+ if (gSmmStatusCodeProtocol == NULL) {\r
+ return EFI_UNSUPPORTED;\r
+ }\r
+ Status = gSmmStatusCodeProtocol->ReportStatusCode (gSmmStatusCodeProtocol, CodeType, Value, Instance, CallerId, Data);\r
+ return Status;\r
+ }\r
\r
#if (EFI_SPECIFICATION_VERSION >= 0x00020000)\r
if (gReportStatusCode == NULL) {\r
\r
#if (EFI_SPECIFICATION_VERSION >= 0x00020000)\r
if (gReportStatusCode == NULL) {\r