]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Fix the bug that SMM Base Protocol.Communicate() does not work.
authorrsun3 <rsun3@6f19259b-4bc3-4df7-8a09-765794883524>
Thu, 25 Feb 2010 09:23:44 +0000 (09:23 +0000)
committerrsun3 <rsun3@6f19259b-4bc3-4df7-8a09-765794883524>
Thu, 25 Feb 2010 09:23:44 +0000 (09:23 +0000)
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@10067 6f19259b-4bc3-4df7-8a09-765794883524

EdkCompatibilityPkg/Compatibility/Include/Guid/SmmBaseThunkCommunication.h
EdkCompatibilityPkg/Compatibility/SmmBaseHelper/SmmBaseHelper.c
EdkCompatibilityPkg/Compatibility/SmmBaseOnSmmBase2Thunk/SmmBaseOnSmmBase2Thunk.c

index f8507e5946949c32bd3b4bff39a60a8770d217ba..20c37ec1c78f413b98f57b3cf001ed79f02c2b96 100644 (file)
@@ -2,7 +2,7 @@
   GUID and data structures for communication between SMM Base on SMM Base2 Thunk driver\r
   and SmmBaseHelper driver.\r
 \r
-  Copyright (c) 2009, Intel Corporation\r
+  Copyright (c) 2009 - 2010, Intel Corporation\r
   All rights reserved. This program and the accompanying materials\r
   are licensed and made available under the terms and conditions of the BSD License\r
   which accompanies this distribution.  The full text of the license may be found at\r
@@ -49,12 +49,19 @@ typedef struct {
   VOID                           *Buffer;\r
 } SMMBASE_FREE_POOL_ARG;\r
 \r
+typedef struct {\r
+  EFI_HANDLE                     ImageHandle;\r
+  VOID                           *CommunicationBuffer;\r
+  UINTN                          *SourceSize;\r
+} SMMBASE_COMMUNICATE_ARG;\r
+\r
 typedef union {\r
   SMMBASE_REGISTER_ARG           Register;\r
   SMMBASE_UNREGISTER_ARG         UnRegister;\r
   SMMBASE_REGISTER_CALLBACK_ARG  RegisterCallback;\r
   SMMBASE_ALLOCATE_POOL_ARG      AllocatePool;\r
   SMMBASE_FREE_POOL_ARG          FreePool;\r
+  SMMBASE_COMMUNICATE_ARG        Communicate;\r
 } SMMBASE_FUNCTION_ARGS;\r
 \r
 typedef enum {\r
@@ -63,6 +70,7 @@ typedef enum {
   SMMBASE_REGISTER_CALLBACK,\r
   SMMBASE_ALLOCATE_POOL,\r
   SMMBASE_FREE_POOL,\r
+  SMMBASE_COMMUNICATE,\r
 } SMMBASE_FUNCTION;\r
 \r
 typedef struct {\r
index 8a6214afd304bc380a47720e8143cc12cdedd7ae..2a4437b13450c028ea766db1e4b519e1f4b3ed44 100644 (file)
@@ -602,6 +602,49 @@ HelperFreePool (
   FunctionData->Status = EFI_SUCCESS;\r
 }\r
 \r
+/** \r
+  Thunk service of EFI_SMM_BASE_PROTOCOL.Communicate().\r
+\r
+  @param[in, out] FunctionData  Pointer to SMMBASE_FUNCTION_DATA.\r
+**/\r
+VOID\r
+HelperCommunicate (\r
+  IN OUT SMMBASE_FUNCTION_DATA *FunctionData\r
+  )\r
+{\r
+  LIST_ENTRY     *Node;\r
+  CALLBACK_INFO  *CallbackInfo;\r
+\r
+  if (FunctionData->Args.Communicate.CommunicationBuffer == NULL) {\r
+    FunctionData->Status = EFI_INVALID_PARAMETER;\r
+    return;\r
+  }\r
+\r
+  Node = GetFirstNode (&mCallbackInfoListHead);\r
+  while (!IsNull (&mCallbackInfoListHead, Node)) {\r
+    CallbackInfo = (CALLBACK_INFO *)Node;\r
+\r
+    if (FunctionData->Args.Communicate.ImageHandle == CallbackInfo->SmmImageHandle) {\r
+      ///\r
+      /// Thunk into original Framwork SMI handler\r
+      ///\r
+      (CallbackInfo->CallbackAddress) (\r
+                       CallbackInfo->SmmImageHandle,\r
+                       FunctionData->Args.Communicate.CommunicationBuffer,\r
+                       FunctionData->Args.Communicate.SourceSize\r
+                       );\r
+      ///\r
+      /// The message was successfully posted.\r
+      ///\r
+      FunctionData->Status = EFI_SUCCESS;\r
+      return;\r
+    }\r
+    Node = GetNextNode (&mCallbackInfoListHead, Node);\r
+  }\r
+\r
+  FunctionData->Status = EFI_INVALID_PARAMETER;\r
+}\r
+\r
 /**\r
   Communication service SMI Handler entry.\r
 \r
@@ -654,6 +697,9 @@ SmmHandlerEntry (
     case SMMBASE_FREE_POOL:\r
       HelperFreePool (FunctionData);\r
       break;\r
+    case SMMBASE_COMMUNICATE:\r
+      HelperCommunicate (FunctionData);\r
+      break;\r
     default:\r
       ASSERT (FALSE);\r
       FunctionData->Status = EFI_UNSUPPORTED;\r
index 942167067da17ba4b3c9a47a4367025d60a12f36..61e40cc2282f8c4d743fa0c1db0eb871521d1553 100644 (file)
@@ -160,15 +160,10 @@ SmmBaseHelperService (
 \r
   mCommunicationData.FunctionData.Status = EFI_UNSUPPORTED;\r
 \r
-  if (IsInSmm()) {\r
+  if ((mCommunicationData.FunctionData.Function != SMMBASE_COMMUNICATE) && IsInSmm()) {\r
     ///\r
     /// If in SMM mode, directly call services in SMM Base Helper.\r
     ///\r
-    if (mSmmBaseHelperReady == NULL) {\r
-      ASSERT (FALSE);\r
-      return;\r
-    }\r
-\r
     DataSize = (UINTN)(sizeof (SMMBASE_FUNCTION_DATA));\r
     mSmmBaseHelperReady->ServiceEntry (\r
                            NULL,\r
@@ -178,13 +173,8 @@ SmmBaseHelperService (
                            );\r
   } else {\r
     ///\r
-    /// If in non-SMM mode, call services in SMM Base Helper via SMM Communication Protocol.\r
+    /// Call services in SMM Base Helper via SMM Communication Protocol.\r
     ///\r
-    if (mSmmCommunication == NULL) {\r
-      ASSERT (FALSE);\r
-      return;\r
-    }\r
-\r
     DataSize = (UINTN)(sizeof (mCommunicationData));\r
     mSmmCommunication->Communicate (\r
                          mSmmCommunication,\r
@@ -291,16 +281,17 @@ SmmBaseCommunicate (
   IN OUT  UINTN                     *BufferSize\r
   )\r
 {\r
-  if (mSmmCommunication == NULL) {\r
-    ASSERT (FALSE);\r
-    return EFI_UNSUPPORTED;\r
-  }\r
+  ///\r
+  /// Note this is a runtime interface\r
+  ///\r
+\r
+  mCommunicationData.FunctionData.Function = SMMBASE_COMMUNICATE;\r
+  mCommunicationData.FunctionData.Args.Communicate.ImageHandle = ImageHandle;\r
+  mCommunicationData.FunctionData.Args.Communicate.CommunicationBuffer = CommunicationBuffer;\r
+  mCommunicationData.FunctionData.Args.Communicate.SourceSize = BufferSize;\r
 \r
-  return mSmmCommunication->Communicate (\r
-                              mSmmCommunication,\r
-                              CommunicationBuffer,\r
-                              BufferSize\r
-                              );\r
+  SmmBaseHelperService ();\r
+  return mCommunicationData.FunctionData.Status;\r
 }\r
 \r
 /**\r
@@ -451,11 +442,6 @@ SmmBaseGetSmstLocation (
   OUT     EFI_SMM_SYSTEM_TABLE      **Smst\r
   )\r
 {\r
-  if (mSmmBaseHelperReady == NULL) {\r
-    ASSERT (FALSE);\r
-    return EFI_UNSUPPORTED;\r
-  }\r
-\r
   if (!IsInSmm ()) {\r
     return EFI_UNSUPPORTED;\r
   }\r
@@ -484,9 +470,7 @@ SmmBaseAddressChangeEvent (
   IN VOID             *Context\r
   )\r
 {\r
-  if (mSmmCommunication != NULL) {\r
-    EfiConvertPointer (0x0, (VOID **) &mSmmCommunication);\r
-  }\r
+  EfiConvertPointer (0x0, (VOID **) &mSmmCommunication);\r
 }\r
 \r
 /**\r