EFIAPI GetAllSmmGaugeDataEx (VOID) { EFI_STATUS Status; EFI_SMM_COMMUNICATE_HEADER *SmmCommBufferHeader; SMM_PERF_COMMUNICATE_EX *SmmPerfCommData; UINTN CommSize; UINTN DataSize; if (mGaugeDataEx != NULL) { return mGaugeDataEx; } Status = GetCommunicationProtocol (); if (EFI_ERROR (Status)) { return NULL; } // // Initialize communicate buffer // SmmCommBufferHeader = (EFI_SMM_COMMUNICATE_HEADER *)mSmmPerformanceBuffer; SmmPerfCommData = (SMM_PERF_COMMUNICATE_EX *)SmmCommBufferHeader->Data; ZeroMem((UINT8*)SmmPerfCommData, sizeof(SMM_PERF_COMMUNICATE_EX)); CopyGuid (&SmmCommBufferHeader->HeaderGuid, &gSmmPerformanceExProtocolGuid); SmmCommBufferHeader->MessageLength = sizeof(SMM_PERF_COMMUNICATE_EX); CommSize = SMM_PERFORMANCE_COMMUNICATION_BUFFER_SIZE; // // Get totol number of SMM gauge entries // SmmPerfCommData->Function = SMM_PERF_FUNCTION_GET_GAUGE_ENTRY_NUMBER; Status = mSmmCommunication->Communicate (mSmmCommunication, mSmmPerformanceBuffer, &CommSize); if (EFI_ERROR (Status) || EFI_ERROR (SmmPerfCommData->ReturnStatus) || SmmPerfCommData->NumberOfEntries == 0) { return NULL; } mGaugeNumberOfEntriesEx = SmmPerfCommData->NumberOfEntries; DataSize = mGaugeNumberOfEntriesEx * sizeof(GAUGE_DATA_ENTRY_EX); mGaugeDataEx = AllocateZeroPool(DataSize); ASSERT (mGaugeDataEx != NULL); // // Get all SMM gauge data // SmmPerfCommData->Function = SMM_PERF_FUNCTION_GET_GAUGE_DATA; SmmPerfCommData->LogEntryKey = 0; SmmPerfCommData->NumberOfEntries = mGaugeNumberOfEntriesEx; SmmPerfCommData->GaugeDataEx = mGaugeDataEx; Status = mSmmCommunication->Communicate (mSmmCommunication, mSmmPerformanceBuffer, &CommSize); if (EFI_ERROR (Status) || EFI_ERROR (SmmPerfCommData->ReturnStatus)) { FreePool (mGaugeDataEx); mGaugeDataEx = NULL; mGaugeNumberOfEntriesEx = 0; } return mGaugeDataEx; }
EFIAPI GetAllSmmGaugeData ( IN UINTN LogEntryKey ) { EFI_STATUS Status; EFI_SMM_COMMUNICATE_HEADER *SmmCommBufferHeader; SMM_PERF_COMMUNICATE *SmmPerfCommData; UINTN CommSize; UINTN DataSize; if (mNoSmmPerfHandler) { // // Not try to get the SMM gauge data again // if no SMM Performance handler found. // return NULL; } if (LogEntryKey != 0) { if (mGaugeData != NULL) { return mGaugeData; } } else { // // Reget the SMM gauge data at the first entry get. // if (mGaugeData != NULL) { FreePool (mGaugeData); mGaugeData = NULL; mGaugeNumberOfEntries = 0; } } Status = GetCommunicationProtocol (); if (EFI_ERROR (Status)) { return NULL; } // // Initialize communicate buffer // SmmCommBufferHeader = (EFI_SMM_COMMUNICATE_HEADER *)mSmmPerformanceBuffer; SmmPerfCommData = (SMM_PERF_COMMUNICATE *)SmmCommBufferHeader->Data; ZeroMem((UINT8*)SmmPerfCommData, sizeof(SMM_PERF_COMMUNICATE)); CopyGuid (&SmmCommBufferHeader->HeaderGuid, &gSmmPerformanceProtocolGuid); SmmCommBufferHeader->MessageLength = sizeof(SMM_PERF_COMMUNICATE); CommSize = SMM_PERFORMANCE_COMMUNICATION_BUFFER_SIZE; // // Get total number of SMM gauge entries // SmmPerfCommData->Function = SMM_PERF_FUNCTION_GET_GAUGE_ENTRY_NUMBER; Status = mSmmCommunication->Communicate (mSmmCommunication, mSmmPerformanceBuffer, &CommSize); if (Status == EFI_NOT_FOUND) { mNoSmmPerfHandler = TRUE; } if (EFI_ERROR (Status) || EFI_ERROR (SmmPerfCommData->ReturnStatus) || SmmPerfCommData->NumberOfEntries == 0) { return NULL; } mGaugeNumberOfEntries = SmmPerfCommData->NumberOfEntries; DataSize = mGaugeNumberOfEntries * sizeof(GAUGE_DATA_ENTRY); mGaugeData = AllocateZeroPool(DataSize); ASSERT (mGaugeData != NULL); // // Get all SMM gauge data // SmmPerfCommData->Function = SMM_PERF_FUNCTION_GET_GAUGE_DATA; SmmPerfCommData->LogEntryKey = 0; SmmPerfCommData->NumberOfEntries = mGaugeNumberOfEntries; SmmPerfCommData->GaugeData = mGaugeData; Status = mSmmCommunication->Communicate (mSmmCommunication, mSmmPerformanceBuffer, &CommSize); if (EFI_ERROR (Status) || EFI_ERROR (SmmPerfCommData->ReturnStatus)) { FreePool (mGaugeData); mGaugeData = NULL; mGaugeNumberOfEntries = 0; } return mGaugeData; }