]> git.proxmox.com Git - mirror_edk2.git/blame - OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / OvmfPkg / SmbiosPlatformDxe / SmbiosPlatformDxe.c
CommitLineData
fb511817 1/** @file\r
2 This driver installs SMBIOS information for OVMF\r
3\r
4 Copyright (c) 2011, Bei Guan <gbtju85@gmail.com>\r
5f239ef7 5 Copyright (c) 2011 - 2015, Intel Corporation. All rights reserved.<BR>\r
fb511817 6\r
b26f0cf9 7 SPDX-License-Identifier: BSD-2-Clause-Patent\r
fb511817 8\r
9**/\r
10\r
7e25086a 11#include <IndustryStandard/SmBios.h> // SMBIOS_TABLE_TYPE0\r
4cb94f20
GH
12#include <Library/BaseLib.h>\r
13#include <Library/BaseMemoryLib.h>\r
7e25086a 14#include <Library/DebugLib.h> // ASSERT_EFI_ERROR()\r
4cb94f20
GH
15#include <Library/MemoryAllocationLib.h>\r
16#include <Library/PcdLib.h>\r
7e25086a
LE
17#include <Library/UefiBootServicesTableLib.h> // gBS\r
18#include <Protocol/Smbios.h> // EFI_SMBIOS_PROTOCOL\r
19\r
fb511817 20#include "SmbiosPlatformDxe.h"\r
21\r
4cb94f20
GH
22STATIC CONST SMBIOS_TABLE_TYPE0 mOvmfDefaultType0 = {\r
23 // SMBIOS_STRUCTURE Hdr\r
24256744 24 {\r
4cb94f20
GH
25 EFI_SMBIOS_TYPE_BIOS_INFORMATION, // UINT8 Type\r
26 sizeof (SMBIOS_TABLE_TYPE0), // UINT8 Length\r
24256744 27 },\r
4cb94f20
GH
28 1, // SMBIOS_TABLE_STRING Vendor\r
29 2, // SMBIOS_TABLE_STRING BiosVersion\r
30 0xE800, // UINT16 BiosSegment\r
31 3, // SMBIOS_TABLE_STRING BiosReleaseDate\r
32 0, // UINT8 BiosSize\r
33 { // MISC_BIOS_CHARACTERISTICS BiosCharacteristics\r
34 0, // Reserved :2\r
35 0, // Unknown :1\r
36 1, // BiosCharacteristicsNotSupported :1\r
37 // Remaining BiosCharacteristics bits left unset :60\r
38 },\r
39 { // BIOSCharacteristicsExtensionBytes[2]\r
40 0, // BiosReserved\r
41 0x1C // SystemReserved = VirtualMachineSupported |\r
42 // UefiSpecificationSupported |\r
43 // TargetContentDistributionEnabled\r
44 },\r
45 0, // UINT8 SystemBiosMajorRelease\r
46 0, // UINT8 SystemBiosMinorRelease\r
47 0xFF, // UINT8 EmbeddedControllerFirmwareMajorRelease\r
48 0xFF // UINT8 EmbeddedControllerFirmwareMinorRelease\r
24256744
GS
49};\r
50\r
fb511817 51/**\r
52 Get SMBIOS record length.\r
53\r
54 @param SmbiosTable SMBIOS pointer.\r
55\r
56**/\r
57UINTN\r
58SmbiosTableLength (\r
ac0a286f 59 IN SMBIOS_STRUCTURE_POINTER SmbiosTable\r
fb511817 60 )\r
61{\r
62 CHAR8 *AChar;\r
63 UINTN Length;\r
64\r
65 AChar = (CHAR8 *)(SmbiosTable.Raw + SmbiosTable.Hdr->Length);\r
66\r
67 //\r
68 // Each structure shall be terminated by a double-null (SMBIOS spec.7.1)\r
69 //\r
70 while ((*AChar != 0) || (*(AChar + 1) != 0)) {\r
ac0a286f 71 AChar++;\r
fb511817 72 }\r
ac0a286f 73\r
fb511817 74 Length = ((UINTN)AChar - (UINTN)SmbiosTable.Raw + 2);\r
75\r
76 return Length;\r
77}\r
78\r
fb511817 79/**\r
80 Install all structures from the given SMBIOS structures block\r
81\r
a145e28d 82 @param TableAddress SMBIOS tables starting address\r
fb511817 83\r
84**/\r
85EFI_STATUS\r
86InstallAllStructures (\r
ac0a286f 87 IN UINT8 *TableAddress\r
fb511817 88 )\r
89{\r
4db37456 90 EFI_SMBIOS_PROTOCOL *Smbios;\r
fb511817 91 EFI_STATUS Status;\r
92 SMBIOS_STRUCTURE_POINTER SmbiosTable;\r
93 EFI_SMBIOS_HANDLE SmbiosHandle;\r
24256744 94 BOOLEAN NeedSmbiosType0;\r
fb511817 95\r
4db37456
LE
96 //\r
97 // Find the SMBIOS protocol\r
98 //\r
99 Status = gBS->LocateProtocol (\r
100 &gEfiSmbiosProtocolGuid,\r
101 NULL,\r
ac0a286f 102 (VOID **)&Smbios\r
4db37456
LE
103 );\r
104 if (EFI_ERROR (Status)) {\r
105 return Status;\r
106 }\r
107\r
a145e28d 108 SmbiosTable.Raw = TableAddress;\r
fb511817 109 if (SmbiosTable.Raw == NULL) {\r
110 return EFI_INVALID_PARAMETER;\r
111 }\r
112\r
24256744
GS
113 NeedSmbiosType0 = TRUE;\r
114\r
fb511817 115 while (SmbiosTable.Hdr->Type != 127) {\r
116 //\r
117 // Log the SMBIOS data for this structure\r
118 //\r
6b23d767 119 SmbiosHandle = SmbiosTable.Hdr->Handle;\r
ac0a286f
MK
120 Status = Smbios->Add (\r
121 Smbios,\r
122 NULL,\r
123 &SmbiosHandle,\r
124 (EFI_SMBIOS_TABLE_HEADER *)SmbiosTable.Raw\r
125 );\r
fb511817 126 ASSERT_EFI_ERROR (Status);\r
127\r
24256744
GS
128 if (SmbiosTable.Hdr->Type == 0) {\r
129 NeedSmbiosType0 = FALSE;\r
130 }\r
131\r
fb511817 132 //\r
133 // Get the next structure address\r
134 //\r
135 SmbiosTable.Raw = (UINT8 *)(SmbiosTable.Raw + SmbiosTableLength (SmbiosTable));\r
136 }\r
137\r
24256744
GS
138 if (NeedSmbiosType0) {\r
139 //\r
140 // Add OVMF default Type 0 (BIOS Information) table\r
141 //\r
4cb94f20
GH
142 CHAR16 *VendStr, *VersStr, *DateStr;\r
143 UINTN VendLen, VersLen, DateLen;\r
144 CHAR8 *Type0;\r
145\r
146 VendStr = (CHAR16 *)FixedPcdGetPtr (PcdFirmwareVendor);\r
147 VendLen = StrLen (VendStr);\r
148 if (VendLen < 3) {\r
149 VendStr = L"unknown";\r
150 VendLen = StrLen (VendStr);\r
151 }\r
152\r
153 VersStr = (CHAR16 *)FixedPcdGetPtr (PcdFirmwareVersionString);\r
154 VersLen = StrLen (VersStr);\r
155 if (VersLen < 3) {\r
156 VersStr = L"unknown";\r
157 VersLen = StrLen (VersStr);\r
158 }\r
159\r
160 DateStr = (CHAR16 *)FixedPcdGetPtr (PcdFirmwareReleaseDateString);\r
161 DateLen = StrLen (DateStr);\r
162 if (DateLen < 3) {\r
163 DateStr = L"unknown";\r
164 DateLen = StrLen (DateStr);\r
165 }\r
166\r
167 DEBUG ((DEBUG_INFO, "FirmwareVendor: \"%s\" (%d chars)\n", VendStr, VendLen));\r
168 DEBUG ((DEBUG_INFO, "FirmwareVersionString: \"%s\" (%d chars)\n", VersStr, VersLen));\r
169 DEBUG ((DEBUG_INFO, "FirmwareReleaseDateString: \"%s\" (%d chars)\n", DateStr, DateLen));\r
170\r
171 Type0 = AllocateZeroPool (sizeof (mOvmfDefaultType0) + VendLen + VersLen + DateLen + 4);\r
172 if (Type0 == NULL) {\r
173 return EFI_OUT_OF_RESOURCES;\r
174 }\r
175\r
176 CopyMem (Type0, &mOvmfDefaultType0, sizeof (mOvmfDefaultType0));\r
177 UnicodeStrToAsciiStrS (VendStr, Type0 + sizeof (mOvmfDefaultType0), VendLen + 1);\r
178 UnicodeStrToAsciiStrS (VersStr, Type0 + sizeof (mOvmfDefaultType0) + VendLen + 1, VersLen + 1);\r
179 UnicodeStrToAsciiStrS (DateStr, Type0 + sizeof (mOvmfDefaultType0) + VendLen + VersLen + 2, DateLen + 1);\r
180\r
24256744 181 SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;\r
ac0a286f
MK
182 Status = Smbios->Add (\r
183 Smbios,\r
184 NULL,\r
185 &SmbiosHandle,\r
4cb94f20 186 (EFI_SMBIOS_TABLE_HEADER *)Type0\r
ac0a286f 187 );\r
24256744 188 ASSERT_EFI_ERROR (Status);\r
4cb94f20
GH
189\r
190 FreePool (Type0);\r
24256744
GS
191 }\r
192\r
fb511817 193 return EFI_SUCCESS;\r
194}\r