/** @file Copyright (c) 2004 - 2014, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent Module Name: MiscSubclassDriverEntryPoint.c Abstract: This driver parses the mMiscSubclassDataTable structure and reports any generated data to the DataHub. **/ #include "CommonHeader.h" #include "MiscSubclassDriver.h" #include #include EFI_HII_HANDLE mHiiHandle; EFI_HII_STRING_PROTOCOL *mHiiString; EFI_PLATFORM_INFO_HOB *mPlatformInfo=NULL; EFI_STRING EFIAPI SmbiosMiscGetString ( IN EFI_STRING_ID StringId ){ EFI_STATUS Status; UINTN StringSize; CHAR16 TempString; EFI_STRING String; String = NULL; // // Retrieve the size of the string in the string package for the BestLanguage // StringSize = 0; Status = mHiiString->GetString ( mHiiString, "en-US", mHiiHandle, StringId, &TempString, &StringSize, NULL ); // // If GetString() returns EFI_SUCCESS for a zero size, // then there are no supported languages registered for HiiHandle. If GetString() // returns an error other than EFI_BUFFER_TOO_SMALL, then HiiHandle is not present // in the HII Database // if (Status != EFI_BUFFER_TOO_SMALL) { goto Error; } // // Allocate a buffer for the return string // String = AllocateZeroPool (StringSize); if (String == NULL) { goto Error; } // // Retrieve the string from the string package // Status = mHiiString->GetString ( mHiiString, "en-US", mHiiHandle, StringId, String, &StringSize, NULL ); if (EFI_ERROR (Status)) { // // Free the buffer and return NULL if the supported languages can not be retrieved. // FreePool (String); String = NULL; } Error: return String; } /** Standard EFI driver point. This driver parses the mMiscSubclassDataTable structure and reports any generated data to the DataHub. @param ImageHandle - Handle for the image of this driver @param SystemTable - Pointer to the EFI System Table @retval EFI_SUCCESS - The data was successfully reported to the Data Hub. @retval EFI_DEVICE_ERROR - Can not locate any protocols **/ EFI_STATUS EFIAPI MiscSubclassDriverEntryPoint ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable ) { UINTN Index; EFI_STATUS EfiStatus; EFI_SMBIOS_PROTOCOL *Smbios; EFI_PEI_HOB_POINTERS GuidHob; GuidHob.Raw = GetHobList (); if (GuidHob.Raw != NULL) { if ((GuidHob.Raw = GetNextGuidHob (&gEfiPlatformInfoGuid, GuidHob.Raw)) != NULL) { mPlatformInfo = GET_GUID_HOB_DATA (GuidHob.Guid); } } DEBUG ((EFI_D_ERROR, "PlatformInfoHob->BoardId [0x%x]\n", mPlatformInfo->BoardId)); // // Retrieve the pointer to the UEFI HII String Protocol // EfiStatus = gBS->LocateProtocol ( &gEfiHiiStringProtocolGuid, NULL, (VOID **) &mHiiString ); ASSERT_EFI_ERROR (EfiStatus); EfiStatus = gBS->LocateProtocol( &gEfiSmbiosProtocolGuid, NULL, (VOID**)&Smbios ); if (EFI_ERROR(EfiStatus)) { DEBUG((EFI_D_ERROR, "Could not locate SMBIOS protocol. %r\n", EfiStatus)); return EfiStatus; } mHiiHandle = HiiAddPackages ( &gEfiCallerIdGuid, NULL, MiscSubclassStrings, NULL ); ASSERT (mHiiHandle != NULL); for (Index = 0; Index < mMiscSubclassDataTableEntries; ++Index) { // // If the entry have a function pointer, just log the data. // if (mMiscSubclassDataTable[Index].Function != NULL) { EfiStatus = (*mMiscSubclassDataTable[Index].Function)( mMiscSubclassDataTable[Index].RecordData, Smbios ); if (EFI_ERROR(EfiStatus)) { DEBUG((EFI_D_ERROR, "Misc smbios store error. Index=%d, ReturnStatus=%r\n", Index, EfiStatus)); return EfiStatus; } } } return EfiStatus; }