+SMBIOS_TABLE_TYPE4 mCpuSmbiosType4 = {\r
+ { EFI_SMBIOS_TYPE_PROCESSOR_INFORMATION, sizeof (SMBIOS_TABLE_TYPE4), 0},\r
+ 1, // Socket String\r
+ ProcessorOther, // ProcessorType; ///< The enumeration value from PROCESSOR_TYPE_DATA.\r
+ ProcessorFamilyOther, // ProcessorFamily; ///< The enumeration value from PROCESSOR_FAMILY_DATA.\r
+ 2, // ProcessorManufacture String;\r
+ { // ProcessorId;\r
+ { // PROCESSOR_SIGNATURE\r
+ 0, // ProcessorSteppingId:4;\r
+ 0, // ProcessorModel: 4;\r
+ 0, // ProcessorFamily: 4;\r
+ 0, // ProcessorType: 2;\r
+ 0, // ProcessorReserved1: 2;\r
+ 0, // ProcessorXModel: 4;\r
+ 0, // ProcessorXFamily: 8;\r
+ 0, // ProcessorReserved2: 4;\r
+ }, \r
+ { // PROCESSOR_FEATURE_FLAGS\r
+ 0, // ProcessorFpu :1;\r
+ 0, // ProcessorVme :1;\r
+ 0, // ProcessorDe :1;\r
+ 0, // ProcessorPse :1;\r
+ 0, // ProcessorTsc :1;\r
+ 0, // ProcessorMsr :1;\r
+ 0, // ProcessorPae :1;\r
+ 0, // ProcessorMce :1;\r
+ 0, // ProcessorCx8 :1;\r
+ 0, // ProcessorApic :1;\r
+ 0, // ProcessorReserved1 :1;\r
+ 0, // ProcessorSep :1;\r
+ 0, // ProcessorMtrr :1;\r
+ 0, // ProcessorPge :1;\r
+ 0, // ProcessorMca :1;\r
+ 0, // ProcessorCmov :1;\r
+ 0, // ProcessorPat :1;\r
+ 0, // ProcessorPse36 :1;\r
+ 0, // ProcessorPsn :1;\r
+ 0, // ProcessorClfsh :1;\r
+ 0, // ProcessorReserved2 :1;\r
+ 0, // ProcessorDs :1;\r
+ 0, // ProcessorAcpi :1;\r
+ 0, // ProcessorMmx :1;\r
+ 0, // ProcessorFxsr :1;\r
+ 0, // ProcessorSse :1;\r
+ 0, // ProcessorSse2 :1;\r
+ 0, // ProcessorSs :1;\r
+ 0, // ProcessorReserved3 :1;\r
+ 0, // ProcessorTm :1;\r
+ 0, // ProcessorReserved4 :2;\r
+ }\r
+ },\r
+ 3, // ProcessorVersion String;\r
+ { // Voltage;\r
+ 1, // ProcessorVoltageCapability5V :1; \r
+ 1, // ProcessorVoltageCapability3_3V :1; \r
+ 1, // ProcessorVoltageCapability2_9V :1; \r
+ 0, // ProcessorVoltageCapabilityReserved :1; ///< Bit 3, must be zero.\r
+ 0, // ProcessorVoltageReserved :3; ///< Bits 4-6, must be zero.\r
+ 0 // ProcessorVoltageIndicateLegacy :1;\r
+ }, \r
+ 0, // ExternalClock;\r
+ 0, // MaxSpeed;\r
+ 0, // CurrentSpeed;\r
+ 0x41, // Status;\r
+ ProcessorUpgradeOther, // ProcessorUpgrade; ///< The enumeration value from PROCESSOR_UPGRADE.\r
+ 0, // L1CacheHandle;\r
+ 0, // L2CacheHandle;\r
+ 0, // L3CacheHandle;\r
+ 4, // SerialNumber;\r
+ 5, // AssetTag;\r
+ 6, // PartNumber;\r
+ 0, // CoreCount;\r
+ 0, // EnabledCoreCount;\r
+ 0, // ThreadCount;\r
+ 0, // ProcessorCharacteristics;\r
+ 0, // ProcessorFamily2;\r
+};\r
+\r
+CHAR8 *mCpuSmbiosType4Strings[] = {\r
+ "Socket",\r
+ "edk2.svn.sourceforge.net",\r
+ "Emulated Processor",\r
+ "1.0",\r
+ "1.0",\r
+ "1.0",\r
+ NULL\r
+};\r
+\r
+\r
+/**\r
+ Create SMBIOS record.\r
+\r
+ Converts a fixed SMBIOS structure and an array of pointers to strings into\r
+ an SMBIOS record where the strings are cat'ed on the end of the fixed record\r
+ and terminated via a double NULL and add to SMBIOS table.\r
+\r
+ SMBIOS_TABLE_TYPE32 gSmbiosType12 = {\r
+ { EFI_SMBIOS_TYPE_SYSTEM_CONFIGURATION_OPTIONS, sizeof (SMBIOS_TABLE_TYPE12), 0 },\r
+ 1 // StringCount\r
+ };\r
+ CHAR8 *gSmbiosType12Strings[] = {\r
+ "Not Found",\r
+ NULL\r
+ };\r
+ \r
+ ...\r
+ LogSmbiosData (\r
+ (EFI_SMBIOS_TABLE_HEADER*)&gSmbiosType12, \r
+ gSmbiosType12Strings\r
+ );\r
+\r
+ @param Template Fixed SMBIOS structure, required.\r
+ @param StringArray Array of strings to convert to an SMBIOS string pack. \r
+ NULL is OK.\r
+\r
+**/\r
+EFI_STATUS\r
+LogSmbiosData (\r
+ IN EFI_SMBIOS_TABLE_HEADER *Template,\r
+ IN CHAR8 **StringPack \r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ EFI_SMBIOS_PROTOCOL *Smbios; \r
+ EFI_SMBIOS_HANDLE SmbiosHandle;\r
+ EFI_SMBIOS_TABLE_HEADER *Record;\r
+ UINTN Index;\r
+ UINTN StringSize;\r
+ UINTN Size;\r
+ CHAR8 *Str;\r
+\r
+ //\r
+ // Locate Smbios protocol.\r
+ //\r
+ Status = gBS->LocateProtocol (&gEfiSmbiosProtocolGuid, NULL, (VOID **)&Smbios);\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+\r
+ // Calculate the size of the fixed record and optional string pack\r
+ Size = Template->Length;\r
+ if (StringPack == NULL) {\r
+ // At least a double null is required\r
+ Size += 2;\r
+ } else {\r
+ for (Index = 0; StringPack[Index] != NULL; Index++) {\r
+ StringSize = AsciiStrSize (StringPack[Index]);\r
+ Size += StringSize;\r
+ }\r
+ if (StringPack[0] == NULL) {\r
+ // At least a double null is required\r
+ Size += 1;\r
+ }\r
+ // Don't forget the terminating double null\r
+ Size += 1;\r
+ }\r
+\r
+ // Copy over Template\r
+ Record = (EFI_SMBIOS_TABLE_HEADER *)AllocateZeroPool (Size);\r
+ if (Record == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+ CopyMem (Record, Template, Template->Length);\r
+\r
+ // Append string pack\r
+ Str = ((CHAR8 *)Record) + Record->Length;\r
+ for (Index = 0; StringPack[Index] != NULL; Index++) {\r
+ StringSize = AsciiStrSize (StringPack[Index]);\r
+ CopyMem (Str, StringPack[Index], StringSize);\r
+ Str += StringSize;\r
+ }\r
+ *Str = 0;\r
+ \r
+ SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;\r
+ Status = Smbios->Add (\r
+ Smbios,\r
+ gImageHandle,\r
+ &SmbiosHandle,\r
+ Record\r
+ );\r
+ ASSERT_EFI_ERROR (Status);\r
+ \r
+ FreePool (Record);\r
+ return Status;\r
+}\r
+\r
+\r
+\r
+\r
+VOID\r
+CpuUpdateSmbios (\r
+ IN UINTN MaxCpus\r
+ )\r
+{\r
+ mCpuSmbiosType4.CoreCount = (UINT8) MaxCpus;\r
+ mCpuSmbiosType4.EnabledCoreCount = (UINT8) MaxCpus;\r
+ mCpuSmbiosType4.ThreadCount = (UINT8) MaxCpus;\r
+\r
+ LogSmbiosData ((EFI_SMBIOS_TABLE_HEADER *)&mCpuSmbiosType4, mCpuSmbiosType4Strings);\r
+}\r