datahubgen.c

来自「EFI BIOS是Intel提出的下一代的BIOS标准。这里上传的Edk源代码是」· C语言 代码 · 共 505 行 · 第 1/2 页

C
505
字号
  //
  // Record Header
  //
  EfiCopyMem (&DataRecord, &mMiscSubclassDriverDataHeader, sizeof (DataRecord.Header));

  //
  // Record Type 2
  //
  AString = GetSmbiosString (SmbiosTable, SmbiosTable.Type0->BiosVersion);
  UString = EfiLibAllocateZeroPool ((EfiAsciiStrLen(AString) + 1) * sizeof(CHAR16) + sizeof(FIRMWARE_BIOS_VERSIONE));
  ASSERT (UString != NULL);
  EfiCopyMem (UString, FIRMWARE_BIOS_VERSIONE, sizeof(FIRMWARE_BIOS_VERSIONE));
  Ascii2Unicode (UString + sizeof(FIRMWARE_BIOS_VERSIONE) / sizeof(CHAR16) - 1, AString);

  Token  = 0;
  Status = gHii->NewString (gHii, NULL, gStringHandle, &Token, UString);
  if (EFI_ERROR (Status)) {
    gBS->FreePool (UString);
    return ;
  }
  gBS->FreePool (UString);

  DataRecord.Header.RecordType = EFI_MISC_BIOS_VENDOR_RECORD_NUMBER;
  DataRecord.Record.MiscBiosVendor.BiosVendor  = 0;
  DataRecord.Record.MiscBiosVendor.BiosVersion = Token;
  DataRecord.Record.MiscBiosVendor.BiosReleaseDate  = 0;
  DataRecord.Record.MiscBiosVendor.BiosStartingAddress  = 0;
  DataRecord.Record.MiscBiosVendor.BiosPhysicalDeviceSize.Value  = 0;
  DataRecord.Record.MiscBiosVendor.BiosPhysicalDeviceSize.Exponent  = 0;
//  DataRecord.Record.MiscBiosVendor.BiosCharacteristics1  = {0};
//  DataRecord.Record.MiscBiosVendor.BiosCharacteristics2  = {0};
  DataRecord.Record.MiscBiosVendor.BiosMajorRelease  = 0;
  DataRecord.Record.MiscBiosVendor.BiosMinorRelease  = 0;
  DataRecord.Record.MiscBiosVendor.BiosEmbeddedFirmwareMajorRelease  = 0;
  DataRecord.Record.MiscBiosVendor.BiosEmbeddedFirmwareMinorRelease  = 0;

  Status = gDataHub->LogData (
                       gDataHub,
                       &gMiscSubClassName,
                       &gMiscProducerGuid,
                       EFI_DATA_RECORD_CLASS_DATA,
                       &DataRecord,
                       sizeof (DataRecord.Header) + sizeof (DataRecord.Record.MiscBiosVendor)
                       );

  //
  // System information (TYPE 1)
  // 
  SmbiosTable = GetSmbiosTableFromType ((SMBIOS_TABLE_STRUCTURE *)Smbios, 1, 0);
  if (SmbiosTable.Raw == NULL) {
    DEBUG ((EFI_D_ERROR, "SmbiosTable: Type 1 (System Information) not found!\n"));
    return ;
  }

  //
  // Record Type 3
  //
  AString = GetSmbiosString (SmbiosTable, SmbiosTable.Type1->ProductName);
  UString = EfiLibAllocateZeroPool ((EfiAsciiStrLen(AString) + 1) * sizeof(CHAR16) + sizeof(FIRMWARE_PRODUCT_NAME));
  ASSERT (UString != NULL);
  EfiCopyMem (UString, FIRMWARE_PRODUCT_NAME, sizeof(FIRMWARE_PRODUCT_NAME));
  Ascii2Unicode (UString + sizeof(FIRMWARE_PRODUCT_NAME) / sizeof(CHAR16) - 1, AString);

  Token  = 0;
  Status = gHii->NewString (gHii, NULL, gStringHandle, &Token, UString);
  if (EFI_ERROR (Status)) {
    gBS->FreePool (UString);
    return ;
  }
  gBS->FreePool (UString);

  DataRecord.Header.RecordType = EFI_MISC_SYSTEM_MANUFACTURER_RECORD_NUMBER;
  DataRecord.Record.MiscSystemManufacturer.SystemManufacturer  = 0;
  DataRecord.Record.MiscSystemManufacturer.SystemProductName = Token;
  DataRecord.Record.MiscSystemManufacturer.SystemVersion  = 0;
  DataRecord.Record.MiscSystemManufacturer.SystemSerialNumber  = 0;
//  DataRecord.Record.MiscSystemManufacturer.SystemUuid  = {0};
  DataRecord.Record.MiscSystemManufacturer.SystemWakeupType  = 0;
  DataRecord.Record.MiscSystemManufacturer.SystemSKUNumber  = 0;
  DataRecord.Record.MiscSystemManufacturer.SystemFamily  = 0;

  Status = gDataHub->LogData (
                       gDataHub,
                       &gMiscSubClassName,
                       &gMiscProducerGuid,
                       EFI_DATA_RECORD_CLASS_DATA,
                       &DataRecord,
                       sizeof (DataRecord.Header) + sizeof (DataRecord.Record.MiscSystemManufacturer)
                       );

  return ;
}

EFI_DRIVER_ENTRY_POINT (DataHubGenEntrypoint);

EFI_STATUS
EFIAPI
DataHubGenEntrypoint (
  IN EFI_HANDLE           ImageHandle,
  IN EFI_SYSTEM_TABLE     *SystemTable
  )
{
  EFI_STATUS              Status;
  VOID                    *Smbios;

  EfiInitializeDriverLib (ImageHandle, SystemTable);

  Smbios = GetSmbiosTablesFromHob ();
  if (Smbios == NULL) {
    return EFI_NOT_FOUND;
  }

  Status = gBS->LocateProtocol (
                  &gEfiDataHubProtocolGuid,
                  NULL,
                  &gDataHub
                  );
  if (EFI_ERROR (Status)) {
    return Status;
  }

  Status = gBS->LocateProtocol (
                  &gEfiHiiProtocolGuid,
                  NULL,
                  &gHii
                  );
  if (EFI_ERROR (Status)) {
    return Status;
  }

  PrepareHiiPackage ();

  InstallProcessorDataHub (Smbios);
  InstallCacheDataHub     (Smbios);
  InstallMemoryDataHub    (Smbios);
  InstallMiscDataHub      (Smbios);

  return EFI_SUCCESS;
}

//
// Internal function
//

UINTN
SmbiosTableLength (
  IN SMBIOS_STRUCTURE_POINTER SmbiosTable
  )
{
  CHAR8  *AChar;
  UINTN  Length;

  AChar = (CHAR8 *)(SmbiosTable.Raw + SmbiosTable.Hdr->Length);
  while ((*AChar != 0) || (*(AChar + 1) != 0)) {
    AChar ++;
  }
  Length = ((UINTN)AChar - (UINTN)SmbiosTable.Raw + 2);
  
  return Length;
}

SMBIOS_STRUCTURE_POINTER
GetSmbiosTableFromType (
  IN SMBIOS_TABLE_STRUCTURE  *Smbios,
  IN UINT8                   Type,
  IN UINTN                   Index
  )
{
  SMBIOS_STRUCTURE_POINTER SmbiosTable;
  UINTN                    SmbiosTypeIndex;
  
  SmbiosTypeIndex = 0;
  SmbiosTable.Raw = (UINT8 *)(UINTN)Smbios->TableAddress;
  if (SmbiosTable.Raw == NULL) {
    return SmbiosTable;
  }
  while ((SmbiosTypeIndex != Index) || (SmbiosTable.Hdr->Type != Type)) {
    if (SmbiosTable.Hdr->Type == 127) {
      SmbiosTable.Raw = NULL;
      return SmbiosTable;
    }
    if (SmbiosTable.Hdr->Type == Type) {
      SmbiosTypeIndex ++;
    }
    SmbiosTable.Raw = (UINT8 *)(SmbiosTable.Raw + SmbiosTableLength (SmbiosTable));
  }

  return SmbiosTable;
}

CHAR8 *
GetSmbiosString (
  IN SMBIOS_STRUCTURE_POINTER  SmbiosTable,
  IN SMBIOS_TABLE_STRING       String
  )
{
  CHAR8      *AString;
  UINT8      Index;

  Index = 1;
  AString = (CHAR8 *)(SmbiosTable.Raw + SmbiosTable.Hdr->Length);
  while (Index != String) {
    while (*AString != 0) {
      AString ++;
    }
    AString ++;
    if (*AString == 0) {
      return AString;
    }
    Index ++;
  }

  return AString;
}

//
// Internal library
//
CHAR16 *
Ascii2Unicode (
  OUT CHAR16         *UnicodeStr,
  IN  CHAR8          *AsciiStr
  )
/*++

Routine Description:
  Converts ASCII characters to Unicode.

Arguments:
  UnicodeStr - the Unicode string to be written to. The buffer must be large enough.
  AsciiStr   - The ASCII string to be converted.

Returns:
  The address to the Unicode string - same as UnicodeStr.

--*/
{
  CHAR16  *Str;

  Str = UnicodeStr;

  while (TRUE) {

    *(UnicodeStr++) = (CHAR16) *AsciiStr;

    if (*(AsciiStr++) == '\0') {
      return Str;
    }
  }
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?