+ Status = mSmmCommunication->Communicate (mSmmCommunication, SmmCommunicateHeader, SmmCommunicateSize);\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
+ Status = SmmVariableFunctionHeader->ReturnStatus;\r
+ return Status;\r
+}\r
+\r
+/**\r
+\r
+ This function get and print the variable statistics data from SMM variable driver.\r
+\r
+ @retval EFI_SUCCESS Print the statistics information successfully.\r
+ @retval EFI_NOT_FOUND Not found the statistics information.\r
+\r
+**/\r
+EFI_STATUS\r
+PrintInfoFromSmm (\r
+ VOID\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ VARIABLE_INFO_ENTRY *VariableInfo;\r
+ EFI_SMM_COMMUNICATE_HEADER *CommBuffer;\r
+ UINTN RealCommSize;\r
+ UINTN CommSize;\r
+ SMM_VARIABLE_COMMUNICATE_HEADER *FunctionHeader;\r
+ EFI_SMM_VARIABLE_PROTOCOL *Smmvariable;\r
+\r
+ Status = gBS->LocateProtocol (&gEfiSmmVariableProtocolGuid, NULL, (VOID **) &Smmvariable);\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+\r
+ Status = gBS->LocateProtocol (&gEfiSmmCommunicationProtocolGuid, NULL, (VOID **) &mSmmCommunication);\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+\r
+ CommSize = SMM_COMMUNICATE_HEADER_SIZE + SMM_VARIABLE_COMMUNICATE_HEADER_SIZE;\r
+ RealCommSize = CommSize;\r
+ CommBuffer = AllocateZeroPool (CommSize);\r
+ ASSERT (CommBuffer != NULL);\r
+\r
+ Print (L"Non-Volatile SMM Variables:\n");\r
+ do {\r
+ Status = GetVariableStatisticsData (CommBuffer, &CommSize);\r
+ if (Status == EFI_BUFFER_TOO_SMALL) {\r
+ FreePool (CommBuffer);\r
+ CommBuffer = AllocateZeroPool (CommSize);\r
+ ASSERT (CommBuffer != NULL);\r
+ RealCommSize = CommSize;\r
+ Status = GetVariableStatisticsData (CommBuffer, &CommSize);\r
+ }\r
+\r
+ if (EFI_ERROR (Status) || (CommSize <= SMM_COMMUNICATE_HEADER_SIZE + SMM_VARIABLE_COMMUNICATE_HEADER_SIZE)) {\r
+ break;\r
+ }\r
+\r
+ if (CommSize < RealCommSize) {\r
+ CommSize = RealCommSize;\r
+ }\r
+\r
+ FunctionHeader = (SMM_VARIABLE_COMMUNICATE_HEADER *) CommBuffer->Data;\r
+ VariableInfo = (VARIABLE_INFO_ENTRY *) FunctionHeader->Data;\r
+\r
+ if (!VariableInfo->Volatile) {\r
+ Print (\r
+ L"%g R%03d(%03d) W%03d D%03d:%s\n",\r
+ &VariableInfo->VendorGuid,\r
+ VariableInfo->ReadCount,\r
+ VariableInfo->CacheCount,\r
+ VariableInfo->WriteCount,\r
+ VariableInfo->DeleteCount,\r
+ (CHAR16 *)(VariableInfo + 1)\r
+ );\r
+ }\r
+ } while (TRUE);\r
+\r
+ Print (L"Volatile SMM Variables:\n");\r
+ ZeroMem (CommBuffer, CommSize);\r
+ do {\r
+ Status = GetVariableStatisticsData (CommBuffer, &CommSize);\r
+ if (Status == EFI_BUFFER_TOO_SMALL) {\r
+ FreePool (CommBuffer);\r
+ CommBuffer = AllocateZeroPool (CommSize);\r
+ ASSERT (CommBuffer != NULL);\r
+ RealCommSize = CommSize;\r
+ Status = GetVariableStatisticsData (CommBuffer, &CommSize);\r
+ }\r
+\r
+ if (EFI_ERROR (Status) || (CommSize <= SMM_COMMUNICATE_HEADER_SIZE + SMM_VARIABLE_COMMUNICATE_HEADER_SIZE)) {\r
+ break;\r
+ }\r
+\r
+ if (CommSize < RealCommSize) {\r
+ CommSize = RealCommSize;\r
+ }\r
+\r
+ FunctionHeader = (SMM_VARIABLE_COMMUNICATE_HEADER *) CommBuffer->Data;\r
+ VariableInfo = (VARIABLE_INFO_ENTRY *) FunctionHeader->Data;\r
+\r
+ if (VariableInfo->Volatile) {\r
+ Print (\r
+ L"%g R%03d(%03d) W%03d D%03d:%s\n",\r
+ &VariableInfo->VendorGuid,\r
+ VariableInfo->ReadCount,\r
+ VariableInfo->CacheCount,\r
+ VariableInfo->WriteCount,\r
+ VariableInfo->DeleteCount,\r
+ (CHAR16 *)(VariableInfo + 1)\r
+ );\r
+ }\r
+ } while (TRUE);\r
+\r
+ FreePool (CommBuffer);\r
+ return Status;\r
+}\r