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