Home | History | Annotate | Download | only in SmbiosGenDxe
      1 /** @file
      2 
      3 Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.<BR>
      4 This program and the accompanying materials
      5 are licensed and made available under the terms and conditions of the BSD License
      6 which accompanies this distribution.  The full text of the license may be found at
      7 http://opensource.org/licenses/bsd-license.php
      8 
      9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     11 
     12 Module Name:
     13 
     14   SmbiosGen.c
     15 
     16 Abstract:
     17 
     18 **/
     19 
     20 #include "SmbiosGen.h"
     21 extern UINT8                SmbiosGenDxeStrings[];
     22 EFI_SMBIOS_PROTOCOL         *gSmbios;
     23 EFI_HII_HANDLE              gStringHandle;
     24 
     25 VOID *
     26 GetSmbiosTablesFromHob (
     27   VOID
     28   )
     29 {
     30   EFI_PHYSICAL_ADDRESS       *Table;
     31   EFI_PEI_HOB_POINTERS        GuidHob;
     32 
     33   GuidHob.Raw = GetFirstGuidHob (&gEfiSmbiosTableGuid);
     34   if (GuidHob.Raw != NULL) {
     35     Table = GET_GUID_HOB_DATA (GuidHob.Guid);
     36     if (Table != NULL) {
     37       return (VOID *)(UINTN)*Table;
     38     }
     39   }
     40 
     41   return NULL;
     42 }
     43 
     44 
     45 VOID
     46 InstallProcessorSmbios (
     47   IN VOID                  *Smbios
     48   )
     49 {
     50   SMBIOS_STRUCTURE_POINTER          SmbiosTable;
     51   CHAR8                             *AString;
     52   CHAR16                            *UString;
     53   STRING_REF                        Token;
     54 
     55   //
     56   // Processor info (TYPE 4)
     57   //
     58   SmbiosTable = GetSmbiosTableFromType ((SMBIOS_TABLE_ENTRY_POINT *)Smbios, 4, 0);
     59   if (SmbiosTable.Raw == NULL) {
     60     DEBUG ((EFI_D_ERROR, "SmbiosTable: Type 4 (Processor Info) not found!\n"));
     61     return ;
     62   }
     63 
     64   //
     65   // Log Smbios Record Type4
     66   //
     67   LogSmbiosData(gSmbios,(UINT8*)SmbiosTable.Type4);
     68 
     69   //
     70   // Set ProcessorVersion string
     71   //
     72   AString = GetSmbiosString (SmbiosTable, SmbiosTable.Type4->ProcessorVersion);
     73   UString = AllocateZeroPool ((AsciiStrLen(AString) + 1) * sizeof(CHAR16));
     74   ASSERT (UString != NULL);
     75   AsciiStrToUnicodeStr (AString, UString);
     76 
     77   Token = HiiSetString (gStringHandle, 0, UString, NULL);
     78   if (Token == 0) {
     79     gBS->FreePool (UString);
     80     return ;
     81   }
     82   gBS->FreePool (UString);
     83   return ;
     84 }
     85 
     86 VOID
     87 InstallCacheSmbios (
     88   IN VOID                  *Smbios
     89   )
     90 {
     91   return ;
     92 }
     93 
     94 VOID
     95 InstallMemorySmbios (
     96   IN VOID                  *Smbios
     97   )
     98 {
     99   SMBIOS_STRUCTURE_POINTER          SmbiosTable;
    100 
    101   //
    102   // Generate Memory Array Mapped Address info (TYPE 19)
    103   //
    104   SmbiosTable = GetSmbiosTableFromType ((SMBIOS_TABLE_ENTRY_POINT *)Smbios, 19, 0);
    105   if (SmbiosTable.Raw == NULL) {
    106     DEBUG ((EFI_D_ERROR, "SmbiosTable: Type 19 (Memory Array Mapped Address Info) not found!\n"));
    107     return ;
    108   }
    109 
    110   //
    111   // Record Smbios Type 19
    112   //
    113   LogSmbiosData(gSmbios, (UINT8*)SmbiosTable.Type19);
    114   return ;
    115 }
    116 
    117 VOID
    118 InstallMiscSmbios (
    119   IN VOID                  *Smbios
    120   )
    121 {
    122   SMBIOS_STRUCTURE_POINTER          SmbiosTable;
    123   CHAR8                             *AString;
    124   CHAR16                            *UString;
    125   STRING_REF                        Token;
    126 
    127   //
    128   // BIOS information (TYPE 0)
    129   //
    130   SmbiosTable = GetSmbiosTableFromType ((SMBIOS_TABLE_ENTRY_POINT *)Smbios, 0, 0);
    131   if (SmbiosTable.Raw == NULL) {
    132     DEBUG ((EFI_D_ERROR, "SmbiosTable: Type 0 (BIOS Information) not found!\n"));
    133     return ;
    134   }
    135 
    136   //
    137   // Record Type 2
    138   //
    139   AString = GetSmbiosString (SmbiosTable, SmbiosTable.Type0->BiosVersion);
    140   UString = AllocateZeroPool ((AsciiStrLen(AString) + 1) * sizeof(CHAR16) + sizeof(FIRMWARE_BIOS_VERSIONE));
    141   ASSERT (UString != NULL);
    142   CopyMem (UString, FIRMWARE_BIOS_VERSIONE, sizeof(FIRMWARE_BIOS_VERSIONE));
    143   AsciiStrToUnicodeStr (AString, UString + sizeof(FIRMWARE_BIOS_VERSIONE) / sizeof(CHAR16) - 1);
    144 
    145   Token = HiiSetString (gStringHandle, 0, UString, NULL);
    146   if (Token == 0) {
    147     gBS->FreePool (UString);
    148     return ;
    149   }
    150   gBS->FreePool (UString);
    151 
    152   //
    153   // Log Smios Type 0
    154   //
    155   LogSmbiosData(gSmbios, (UINT8*)SmbiosTable.Type0);
    156 
    157   //
    158   // System information (TYPE 1)
    159   //
    160   SmbiosTable = GetSmbiosTableFromType ((SMBIOS_TABLE_ENTRY_POINT *)Smbios, 1, 0);
    161   if (SmbiosTable.Raw == NULL) {
    162     DEBUG ((EFI_D_ERROR, "SmbiosTable: Type 1 (System Information) not found!\n"));
    163     return ;
    164   }
    165 
    166   //
    167   // Record Type 3
    168   //
    169   AString = GetSmbiosString (SmbiosTable, SmbiosTable.Type1->ProductName);
    170   UString = AllocateZeroPool ((AsciiStrLen(AString) + 1) * sizeof(CHAR16) + sizeof(FIRMWARE_PRODUCT_NAME));
    171   ASSERT (UString != NULL);
    172   CopyMem (UString, FIRMWARE_PRODUCT_NAME, sizeof(FIRMWARE_PRODUCT_NAME));
    173   AsciiStrToUnicodeStr (AString, UString + sizeof(FIRMWARE_PRODUCT_NAME) / sizeof(CHAR16) - 1);
    174 
    175   Token = HiiSetString (gStringHandle, 0, UString, NULL);
    176   if (Token == 0) {
    177     gBS->FreePool (UString);
    178     return ;
    179   }
    180   gBS->FreePool (UString);
    181 
    182   //
    183   // Log Smbios Type 1
    184   //
    185   LogSmbiosData(gSmbios, (UINT8*)SmbiosTable.Type1);
    186 
    187   return ;
    188 }
    189 
    190 EFI_STATUS
    191 EFIAPI
    192 SmbiosGenEntrypoint (
    193   IN EFI_HANDLE           ImageHandle,
    194   IN EFI_SYSTEM_TABLE     *SystemTable
    195   )
    196 {
    197   EFI_STATUS              Status;
    198   VOID                    *Smbios;
    199 
    200   Smbios = GetSmbiosTablesFromHob ();
    201   if (Smbios == NULL) {
    202     return EFI_NOT_FOUND;
    203   }
    204 
    205   Status = gBS->LocateProtocol (
    206                   &gEfiSmbiosProtocolGuid,
    207                   NULL,
    208                   (VOID**)&gSmbios
    209                   );
    210   if (EFI_ERROR (Status)) {
    211     return Status;
    212   }
    213 
    214   gStringHandle = HiiAddPackages (
    215                     &gEfiCallerIdGuid,
    216                     NULL,
    217                     SmbiosGenDxeStrings,
    218                     NULL
    219                     );
    220   ASSERT (gStringHandle != NULL);
    221 
    222   InstallProcessorSmbios (Smbios);
    223   InstallCacheSmbios     (Smbios);
    224   InstallMemorySmbios    (Smbios);
    225   InstallMiscSmbios      (Smbios);
    226 
    227   return EFI_SUCCESS;
    228 }
    229 
    230 //
    231 // Internal function
    232 //
    233 
    234 UINTN
    235 SmbiosTableLength (
    236   IN SMBIOS_STRUCTURE_POINTER SmbiosTable
    237   )
    238 {
    239   CHAR8  *AChar;
    240   UINTN  Length;
    241 
    242   AChar = (CHAR8 *)(SmbiosTable.Raw + SmbiosTable.Hdr->Length);
    243   while ((*AChar != 0) || (*(AChar + 1) != 0)) {
    244     AChar ++;
    245   }
    246   Length = ((UINTN)AChar - (UINTN)SmbiosTable.Raw + 2);
    247 
    248   return Length;
    249 }
    250 
    251 SMBIOS_STRUCTURE_POINTER
    252 GetSmbiosTableFromType (
    253   IN SMBIOS_TABLE_ENTRY_POINT  *Smbios,
    254   IN UINT8                     Type,
    255   IN UINTN                     Index
    256   )
    257 {
    258   SMBIOS_STRUCTURE_POINTER SmbiosTable;
    259   UINTN                    SmbiosTypeIndex;
    260 
    261   SmbiosTypeIndex = 0;
    262   SmbiosTable.Raw = (UINT8 *)(UINTN)Smbios->TableAddress;
    263   if (SmbiosTable.Raw == NULL) {
    264     return SmbiosTable;
    265   }
    266   while ((SmbiosTypeIndex != Index) || (SmbiosTable.Hdr->Type != Type)) {
    267     if (SmbiosTable.Hdr->Type == 127) {
    268       SmbiosTable.Raw = NULL;
    269       return SmbiosTable;
    270     }
    271     if (SmbiosTable.Hdr->Type == Type) {
    272       SmbiosTypeIndex ++;
    273     }
    274     SmbiosTable.Raw = (UINT8 *)(SmbiosTable.Raw + SmbiosTableLength (SmbiosTable));
    275   }
    276 
    277   return SmbiosTable;
    278 }
    279 
    280 CHAR8 *
    281 GetSmbiosString (
    282   IN SMBIOS_STRUCTURE_POINTER  SmbiosTable,
    283   IN SMBIOS_TABLE_STRING       String
    284   )
    285 {
    286   CHAR8      *AString;
    287   UINT8      Index;
    288 
    289   Index = 1;
    290   AString = (CHAR8 *)(SmbiosTable.Raw + SmbiosTable.Hdr->Length);
    291   while (Index != String) {
    292     while (*AString != 0) {
    293       AString ++;
    294     }
    295     AString ++;
    296     if (*AString == 0) {
    297       return AString;
    298     }
    299     Index ++;
    300   }
    301 
    302   return AString;
    303 }
    304 
    305 
    306 /**
    307   Logs SMBIOS record.
    308 
    309   @param  Smbios   Pointer to SMBIOS protocol instance.
    310   @param  Buffer   Pointer to the data buffer.
    311 
    312 **/
    313 VOID
    314 LogSmbiosData (
    315   IN   EFI_SMBIOS_PROTOCOL        *Smbios,
    316   IN   UINT8                      *Buffer
    317   )
    318 {
    319   EFI_STATUS         Status;
    320   EFI_SMBIOS_HANDLE  SmbiosHandle;
    321 
    322   SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;
    323   Status = Smbios->Add (
    324                      Smbios,
    325                      NULL,
    326                      &SmbiosHandle,
    327                      (EFI_SMBIOS_TABLE_HEADER*)Buffer
    328                      );
    329   ASSERT_EFI_ERROR (Status);
    330 }
    331