Home | History | Annotate | Line # | Download | only in lib
smbios.c revision 1.1
      1 /*	$NetBSD: smbios.c,v 1.1 2014/04/01 16:16:06 jakllsch Exp $	*/
      2 
      3 /*++
      4 
      5 Copyright (c) 2000  Intel Corporation
      6 
      7 Module Name:
      8 
      9     Smbios.c
     10 
     11 Abstract:
     12 
     13     Lib fucntions for SMBIOS. Used to get system serial number and GUID
     14 
     15 Revision History
     16 
     17 --*/
     18 
     19 #include "lib.h"
     20 
     21 
     22 EFI_STATUS
     23 LibGetSmbiosSystemGuidAndSerialNumber (
     24     IN  EFI_GUID    *SystemGuid,
     25     OUT CHAR8       **SystemSerialNumber
     26     )
     27 {
     28     EFI_STATUS                  Status;
     29     SMBIOS_STRUCTURE_TABLE      *SmbiosTable;
     30     SMBIOS_STRUCTURE_POINTER    Smbios;
     31     SMBIOS_STRUCTURE_POINTER    SmbiosEnd;
     32     UINT16                      Index;
     33 
     34     Status = LibGetSystemConfigurationTable(&SMBIOSTableGuid, (VOID**)&SmbiosTable);
     35     if (EFI_ERROR(Status)) {
     36         return EFI_NOT_FOUND;
     37     }
     38 
     39     Smbios.Hdr = (SMBIOS_HEADER *)SmbiosTable->TableAddress;
     40     SmbiosEnd.Raw = (UINT8 *)(SmbiosTable->TableAddress + SmbiosTable->TableLength);
     41     for (Index = 0; Index < SmbiosTable->TableLength ; Index++) {
     42         if (Smbios.Hdr->Type == 1) {
     43             if (Smbios.Hdr->Length < 0x19) {
     44                 //
     45                 // Older version did not support Guid and Serial number
     46                 //
     47                 continue;
     48             }
     49 
     50             //
     51             // SMBIOS tables are byte packed so we need to do a byte copy to
     52             //  prevend alignment faults on IA-64.
     53 
     54             CopyMem (SystemGuid, &Smbios.Type1->Uuid, sizeof(EFI_GUID));
     55             *SystemSerialNumber = LibGetSmbiosString(&Smbios, Smbios.Type1->SerialNumber);
     56             return EFI_SUCCESS;
     57         }
     58 
     59         //
     60         // Make Smbios point to the next record
     61         //
     62         LibGetSmbiosString (&Smbios, -1);
     63 
     64         if (Smbios.Raw >= SmbiosEnd.Raw) {
     65             //
     66             // SMBIOS 2.1 incorrectly stated the length of SmbiosTable as 0x1e.
     67             //  given this we must double check against the lenght of
     68             /// the structure. My home PC has this bug.ruthard
     69             //
     70             return EFI_SUCCESS;
     71         }
     72     }
     73 
     74     return EFI_SUCCESS;
     75 }
     76 
     77 CHAR8*
     78 LibGetSmbiosString (
     79     IN  SMBIOS_STRUCTURE_POINTER    *Smbios,
     80     IN  UINT16                      StringNumber
     81     )
     82 /*++
     83 
     84     Return SMBIOS string given the string number.
     85 
     86     Arguments:
     87         Smbios - Pointer to SMBIOS structure
     88         StringNumber - String number to return. -1 is used to skip all strings and
     89             point to the next SMBIOS structure.
     90 
     91     Returns:
     92         Pointer to string, or pointer to next SMBIOS strcuture if StringNumber == -1
     93 --*/
     94 {
     95     UINT16  Index;
     96     CHAR8   *String;
     97 
     98     //
     99     // Skip over formatted section
    100     //
    101     String = (CHAR8 *)(Smbios->Raw + Smbios->Hdr->Length);
    102 
    103     //
    104     // Look through unformated section
    105     //
    106     for (Index = 1; Index <= StringNumber; Index++) {
    107         if (StringNumber == Index) {
    108             return String;
    109         }
    110 
    111         //
    112         // Skip string
    113         //
    114         for (; *String != 0; String++);
    115         String++;
    116 
    117         if (*String == 0) {
    118             //
    119             // If double NULL then we are done.
    120             //  Retrun pointer to next structure in Smbios.
    121             //  if you pass in a -1 you will always get here
    122             //
    123             Smbios->Raw = (UINT8 *)++String;
    124             return NULL;
    125         }
    126     }
    127     return NULL;
    128 }
    129