]> git.proxmox.com Git - mirror_edk2.git/blob - ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/LibSmbiosView.c
Update SmbiosView Shell command to display additional CPU Family
[mirror_edk2.git] / ShellPkg / Library / UefiShellDebug1CommandsLib / SmbiosView / LibSmbiosView.c
1 /** @file
2 API for SMBIOS table.
3
4 Copyright (c) 2005 - 2012, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
9
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12
13 **/
14
15
16 #include "../UefiShellDebug1CommandsLib.h"
17 #include <Guid/SmBios.h>
18 #include "LibSmbiosView.h"
19 #include "SmbiosView.h"
20
21 STATIC UINT8 mInit = 0;
22 STATIC SMBIOS_TABLE_ENTRY_POINT *mSmbiosTable = NULL;
23 STATIC SMBIOS_STRUCTURE_POINTER m_SmbiosStruct;
24 STATIC SMBIOS_STRUCTURE_POINTER *mSmbiosStruct = &m_SmbiosStruct;
25
26 /**
27 Init the SMBIOS VIEW API's environment.
28
29 @retval EFI_SUCCESS Successful to init the SMBIOS VIEW Lib.
30 **/
31 EFI_STATUS
32 LibSmbiosInit (
33 VOID
34 )
35 {
36 EFI_STATUS Status;
37
38 //
39 // Init only once
40 //
41 if (mInit == 1) {
42 return EFI_SUCCESS;
43 }
44 //
45 // Get SMBIOS table from System Configure table
46 //
47 Status = GetSystemConfigurationTable (&gEfiSmbiosTableGuid, (VOID**)&mSmbiosTable);
48
49 if (mSmbiosTable == NULL) {
50 ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_LIBSMBIOSVIEW_CANNOT_GET_TABLE), gShellDebug1HiiHandle);
51 return EFI_NOT_FOUND;
52 }
53
54 if (EFI_ERROR (Status)) {
55 ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_LIBSMBIOSVIEW_GET_TABLE_ERROR), gShellDebug1HiiHandle, Status);
56 return Status;
57 }
58 //
59 // Init SMBIOS structure table address
60 //
61 mSmbiosStruct->Raw = (UINT8 *) (UINTN) (mSmbiosTable->TableAddress);
62
63 mInit = 1;
64 return EFI_SUCCESS;
65 }
66
67 /**
68 Cleanup the Smbios information.
69 **/
70 VOID
71 LibSmbiosCleanup (
72 VOID
73 )
74 {
75 //
76 // Release resources
77 //
78 if (mSmbiosTable != NULL) {
79 mSmbiosTable = NULL;
80 }
81
82 mInit = 0;
83 }
84
85 /**
86 Get the entry point structure for the table.
87
88 @param[out] EntryPointStructure The pointer to populate.
89 **/
90 VOID
91 LibSmbiosGetEPS (
92 OUT SMBIOS_TABLE_ENTRY_POINT **EntryPointStructure
93 )
94 {
95 //
96 // return SMBIOS Table address
97 //
98 *EntryPointStructure = mSmbiosTable;
99 }
100
101 /**
102 Return SMBIOS string for the given string number.
103
104 @param[in] Smbios Pointer to SMBIOS structure.
105 @param[in] StringNumber String number to return. -1 is used to skip all strings and
106 point to the next SMBIOS structure.
107
108 @return Pointer to string, or pointer to next SMBIOS strcuture if StringNumber == -1
109 **/
110 CHAR8*
111 LibGetSmbiosString (
112 IN SMBIOS_STRUCTURE_POINTER *Smbios,
113 IN UINT16 StringNumber
114 )
115 {
116 UINT16 Index;
117 CHAR8 *String;
118
119 ASSERT (Smbios != NULL);
120
121 //
122 // Skip over formatted section
123 //
124 String = (CHAR8 *) (Smbios->Raw + Smbios->Hdr->Length);
125
126 //
127 // Look through unformated section
128 //
129 for (Index = 1; Index <= StringNumber; Index++) {
130 if (StringNumber == Index) {
131 return String;
132 }
133 //
134 // Skip string
135 //
136 for (; *String != 0; String++);
137 String++;
138
139 if (*String == 0) {
140 //
141 // If double NULL then we are done.
142 // Return pointer to next structure in Smbios.
143 // if you pass in a -1 you will always get here
144 //
145 Smbios->Raw = (UINT8 *)++String;
146 return NULL;
147 }
148 }
149
150 return NULL;
151 }
152
153 /**
154 Get SMBIOS structure for the given Handle,
155 Handle is changed to the next handle or 0xFFFF when the end is
156 reached or the handle is not found.
157
158 @param[in, out] Handle 0xFFFF: get the first structure
159 Others: get a structure according to this value.
160 @param[out] Buffer The pointer to the pointer to the structure.
161 @param[out] Length Length of the structure.
162
163 @retval DMI_SUCCESS Handle is updated with next structure handle or
164 0xFFFF(end-of-list).
165
166 @retval DMI_INVALID_HANDLE Handle is updated with first structure handle or
167 0xFFFF(end-of-list).
168 **/
169 EFI_STATUS
170 LibGetSmbiosStructure (
171 IN OUT UINT16 *Handle,
172 OUT UINT8 **Buffer,
173 OUT UINT16 *Length
174 )
175 {
176 SMBIOS_STRUCTURE_POINTER Smbios;
177 SMBIOS_STRUCTURE_POINTER SmbiosEnd;
178 UINT8 *Raw;
179
180 if (*Handle == INVALID_HANDLE) {
181 *Handle = mSmbiosStruct->Hdr->Handle;
182 return DMI_INVALID_HANDLE;
183 }
184
185 if ((Buffer == NULL) || (Length == NULL)) {
186 ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_LIBSMBIOSVIEW_NO_BUFF_LEN_SPEC), gShellDebug1HiiHandle);
187 return DMI_INVALID_HANDLE;
188 }
189
190 *Length = 0;
191 Smbios.Hdr = mSmbiosStruct->Hdr;
192 SmbiosEnd.Raw = Smbios.Raw + mSmbiosTable->TableLength;
193 while (Smbios.Raw < SmbiosEnd.Raw) {
194 if (Smbios.Hdr->Handle == *Handle) {
195 Raw = Smbios.Raw;
196 //
197 // Walk to next structure
198 //
199 LibGetSmbiosString (&Smbios, (UINT16) (-1));
200 //
201 // Length = Next structure head - this structure head
202 //
203 *Length = (UINT16) (Smbios.Raw - Raw);
204 *Buffer = Raw;
205 //
206 // update with the next structure handle.
207 //
208 if (Smbios.Raw < SmbiosEnd.Raw) {
209 *Handle = Smbios.Hdr->Handle;
210 } else {
211 *Handle = INVALID_HANDLE;
212 }
213 return DMI_SUCCESS;
214 }
215 //
216 // Walk to next structure
217 //
218 LibGetSmbiosString (&Smbios, (UINT16) (-1));
219 }
220
221 *Handle = INVALID_HANDLE;
222 return DMI_INVALID_HANDLE;
223 }
224