Fix EDKT497. In the patch:
authoryshang1 <yshang1@de2fecce-e211-0410-80a6-f3fac2684e05>
Fri, 12 Jan 2007 02:41:42 +0000 (02:41 +0000)
committeryshang1 <yshang1@de2fecce-e211-0410-80a6-f3fac2684e05>
Fri, 12 Jan 2007 02:41:42 +0000 (02:41 +0000)
1) Check TPL<=TPL_CALLBACK prior to invoking SerialIO protocol.
2) Check TPL <= TPL_NOTIFY prior to allocate memory in datahub status code driver.
3) Add lock to prevent the critical data.

git-svn-id: https://edk2.tianocore.org/svn/edk2/trunk@2225 de2fecce-e211-0410-80a6-f3fac2684e05

edk2/EdkModulePkg/Universal/StatusCode/Dxe/Common/DxeStatusCodeCommon.c
edk2/EdkModulePkg/Universal/StatusCode/Dxe/DataHubStatusCodeWorker.c
edk2/EdkModulePkg/Universal/StatusCode/Dxe/SerialStatusCodeWorker.c

index 43fe3fd..1ac1c74 100644 (file)
@@ -148,6 +148,9 @@ ReportDispatcher (
   IN EFI_STATUS_CODE_DATA     *Data      OPTIONAL\r
   )\r
 {\r
+       volatile int tt = 1;\r
+       while (tt) {\r
+       }\r
   //\r
   // Use atom operation to avoid the reentant of report.\r
   // If current status is not zero, then the function is reentrancy.\r
index c5da322..2871436 100644 (file)
 //\r
 // Initialize FIFO to cache records.\r
 //\r
-STATIC \r
-EFI_LOCK                  mFifoLock        = EFI_INITIALIZE_LOCK_VARIABLE  (EFI_TPL_HIGH_LEVEL);\r
 STATIC\r
-LIST_ENTRY                mRecordsFifo     = INITIALIZE_LIST_HEAD_VARIABLE (mRecordsFifo);\r
+LIST_ENTRY                mRecordsFifo          = INITIALIZE_LIST_HEAD_VARIABLE (mRecordsFifo);\r
 STATIC\r
-UINTN                     mNumberOfRecords = 0;\r
+LIST_ENTRY                mRecordsBuffer        = INITIALIZE_LIST_HEAD_VARIABLE (mRecordsBuffer);\r
 STATIC\r
 EFI_EVENT                 mLogDataHubEvent;\r
 //\r
@@ -34,7 +32,9 @@ EFI_DATA_HUB_PROTOCOL     *mDataHubProtocol;
 \r
 \r
 /**\r
-  Return buffer of length DATAHUB_STATUSCODE_RECORD\r
+  Return one DATAHUB_STATUSCODE_RECORD space.\r
+  The size of free record pool would be extend, if the pool is empty. \r
+\r
  \r
   @retval  NULL   Can not allocate free memeory for record.\r
   @retval  !NULL  Point to buffer of record.\r
@@ -46,17 +46,39 @@ AcquireRecordBuffer (
   )\r
 {\r
   DATAHUB_STATUSCODE_RECORD *Record;\r
+  EFI_TPL                   CurrentTpl;\r
+  LIST_ENTRY                *Node;\r
+  UINT32                    Index;\r
+\r
+  CurrentTpl = gBS->RaiseTPL (EFI_TPL_HIGH_LEVEL);\r
+\r
+  if (!IsListEmpty (&mRecordsBuffer)) {\r
+    Node = GetFirstNode (&mRecordsBuffer);\r
+    RemoveEntryList (Node);\r
 \r
-  Record   = (DATAHUB_STATUSCODE_RECORD *) AllocateZeroPool (sizeof (DATAHUB_STATUSCODE_RECORD));\r
-  if (NULL == Record) {\r
-    return NULL;\r
+    Record = CR (Node, DATAHUB_STATUSCODE_RECORD, Node, DATAHUB_STATUS_CODE_SIGNATURE);\r
+  } else {\r
+    if (CurrentTpl > EFI_TPL_NOTIFY) {\r
+      gBS->RestoreTPL (CurrentTpl);\r
+      return NULL;\r
+    }\r
+\r
+    gBS->RestoreTPL (CurrentTpl);\r
+    Record   = (DATAHUB_STATUSCODE_RECORD *) AllocateZeroPool (sizeof (DATAHUB_STATUSCODE_RECORD) * 16);\r
+    if (NULL == Record) {\r
+      return NULL;\r
+    }\r
+\r
+    CurrentTpl = gBS->RaiseTPL (EFI_TPL_HIGH_LEVEL);\r
+    for (Index = 1; Index < 16; Index++) {\r
+      InsertTailList (&mRecordsBuffer, &Record[Index].Node);\r
+    }\r
   }\r
-  Record->Signature = DATAHUB_STATUS_CODE_SIGNATURE;\r
 \r
-  EfiAcquireLock (&mFifoLock);\r
+  Record->Signature = DATAHUB_STATUS_CODE_SIGNATURE;\r
   InsertTailList (&mRecordsFifo, &Record->Node);\r
-  mNumberOfRecords++;\r
-  EfiReleaseLock (&mFifoLock);\r
+\r
+  gBS->RestoreTPL (CurrentTpl);\r
 \r
   return Record;\r
 }\r
@@ -73,15 +95,16 @@ FreeRecordBuffer (
   IN  DATAHUB_STATUSCODE_RECORD  *Record\r
   )\r
 {\r
+  EFI_TPL  CurrentTpl;\r
+\r
   ASSERT (Record != NULL);\r
-  ASSERT (mNumberOfRecords != 0);\r
 \r
-  EfiAcquireLock (&mFifoLock);\r
+  CurrentTpl = gBS->RaiseTPL (EFI_TPL_HIGH_LEVEL);\r
+\r
   RemoveEntryList (&Record->Node);\r
-  mNumberOfRecords--;\r
-  EfiReleaseLock (&mFifoLock);\r
+  InsertTailList (&mRecordsBuffer, &Record->Node);\r
 \r
-  FreePool (Record);\r
+  gBS->RestoreTPL (CurrentTpl);\r
 }\r
 \r
 \r
@@ -207,12 +230,15 @@ LogDataHubEventCallBack (
   UINT32                            Size;\r
   UINT64                            DataRecordClass;\r
   LIST_ENTRY                        *Node;\r
+  EFI_TPL                           CurrentTpl;\r
 \r
   //\r
   // Log DataRecord in Data Hub.\r
   // Journal records fifo to find all record entry.\r
   //\r
   //\r
+  CurrentTpl = gBS->RaiseTPL (EFI_TPL_HIGH_LEVEL);\r
+\r
   for (Node = mRecordsFifo.ForwardLink; Node != &mRecordsFifo;) {\r
     Record = CR (Node, DATAHUB_STATUSCODE_RECORD, Node, DATAHUB_STATUS_CODE_SIGNATURE);\r
     Node   = Node->ForwardLink;\r
@@ -251,8 +277,12 @@ LogDataHubEventCallBack (
                         Size\r
                         );\r
 \r
+\r
+\r
     FreeRecordBuffer (Record);\r
   }\r
+\r
+  gBS->RestoreTPL (CurrentTpl);\r
 }\r
 \r
 \r
index d491283..0b16dfe 100644 (file)
@@ -90,10 +90,19 @@ SerialStatusCodeReportWorker (
   UINTN           CharCount;\r
   VA_LIST         Marker;\r
   EFI_DEBUG_INFO  *DebugInfo;\r
+  EFI_TPL         CurrentTpl;\r
 \r
 \r
-  if (FeaturePcdGet (PcdStatusCodeUseEfiSerial) && EfiAtRuntime ()) {\r
-    return EFI_DEVICE_ERROR;\r
+  if (FeaturePcdGet (PcdStatusCodeUseEfiSerial)) {\r
+    if (EfiAtRuntime ()) {\r
+      return EFI_DEVICE_ERROR;\r
+    }\r
+    CurrentTpl = gBS->RaiseTPL (EFI_TPL_HIGH_LEVEL);\r
+    gBS->RestoreTPL (CurrentTpl);\r
+\r
+    if (CurrentTpl > EFI_TPL_CALLBACK ) {\r
+      return EFI_DEVICE_ERROR;\r
+    }\r
   }\r
 \r
   Buffer[0] = '\0';\r