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