+ 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