- SmmPerfCommData->LogEntryKey = 0;\r
- SmmPerfCommData->NumberOfEntries = mGaugeNumberOfEntriesEx;\r
- SmmPerfCommData->GaugeDataEx = mGaugeDataEx;\r
- Status = mSmmCommunication->Communicate (mSmmCommunication, mSmmPerformanceBuffer, &CommSize);\r
- if (EFI_ERROR (Status) || EFI_ERROR (SmmPerfCommData->ReturnStatus)) {\r
- FreePool (mGaugeDataEx);\r
- mGaugeDataEx = NULL;\r
- mGaugeNumberOfEntriesEx = 0;\r
- }\r
- \r
+ SmmPerfCommData->GaugeDataEx = (GAUGE_DATA_ENTRY_EX *) Buffer;\r
+ EntriesGot = 0;\r
+ do {\r
+ SmmPerfCommData->LogEntryKey = EntriesGot;\r
+ if ((mGaugeNumberOfEntriesEx - EntriesGot) >= NumberOfEntries) {\r
+ SmmPerfCommData->NumberOfEntries = NumberOfEntries;\r
+ } else {\r
+ SmmPerfCommData->NumberOfEntries = mGaugeNumberOfEntriesEx - EntriesGot;\r
+ }\r
+ Status = mSmmCommunication->Communicate (mSmmCommunication, mSmmPerformanceBuffer, &CommSize);\r
+ if (EFI_ERROR (Status) || EFI_ERROR (SmmPerfCommData->ReturnStatus)) {\r
+ FreePool (mGaugeDataEx);\r
+ mGaugeDataEx = NULL;\r
+ mGaugeNumberOfEntriesEx = 0;\r
+ return NULL;\r
+ } else {\r
+ CopyMem (&mGaugeDataEx[EntriesGot], Buffer, SmmPerfCommData->NumberOfEntries * sizeof (GAUGE_DATA_ENTRY_EX));\r
+ }\r
+ EntriesGot += SmmPerfCommData->NumberOfEntries;\r
+ } while (EntriesGot < mGaugeNumberOfEntriesEx);\r
+\r