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