Skip to content
The Road to Delphi — Delphi, VCL, VCL Styles, UxTheme and WinAPI

Getting Processor Info using Object Pascal (Delphi / FPC) and the TSMBIOS

, ,

New_Core_I7 The SMBIOS expose the info about the installed processors in the table type 4. Check the next snippet that shows how obtain such data using the TSMBIOS (remember, if you are using FPC, you can use this library in Windows and Linux).

[sourcecode language=”delphi” wraplines=”false”]
{$IFDEF FPC}{$mode objfpc}{$H+}
{$ELSE}
{$APPTYPE CONSOLE}
{$ENDIF}

uses
Classes,
TypInfo,
SysUtils,
uSMBIOS;

function SetToString(Info: PTypeInfo; const Value): String;
var
LTypeInfo : PTypeInfo;
LIntegerSet: TIntegerSet;
I: Integer;

begin
Result := ”;

Integer(LIntegerSet) := 0;
case GetTypeData(Info)^.OrdType of
otSByte, otUByte: Integer(LIntegerSet) := Byte(Value);
otSWord, otUWord: Integer(LIntegerSet) := Word(Value);
otSLong, otULong: Integer(LIntegerSet) := Integer(Value);
end;

LTypeInfo := GetTypeData(Info)^.CompType{$IFNDEF FPC}^{$ENDIF};
for I := 0 to SizeOf(Integer) * 8 – 1 do
if I in LIntegerSet then
begin
if Result <> ” then Result := Result + ‘,’;
Result := Result + GetEnumName(LTypeInfo, I);
end;
end;

procedure GetProcessorInfo;
Var
SMBios : TSMBios;
LProcessorInfo : TProcessorInformation;
LSRAMTypes : TCacheSRAMTypes;
begin
SMBios:=TSMBios.Create;
try
WriteLn(‘Processor Information’);
if SMBios.HasProcessorInfo then
for LProcessorInfo in SMBios.ProcessorInfo do
begin
WriteLn(‘Manufacturer ‘+LProcessorInfo.ProcessorManufacturerStr);
WriteLn(‘Socket Designation ‘+LProcessorInfo.SocketDesignationStr);
WriteLn(‘Type ‘+LProcessorInfo.ProcessorTypeStr);
WriteLn(‘Familiy ‘+LProcessorInfo.ProcessorFamilyStr);
WriteLn(‘Version ‘+LProcessorInfo.ProcessorVersionStr);
WriteLn(Format(‘Processor ID %x’,[LProcessorInfo.RAWProcessorInformation^.ProcessorID]));
WriteLn(Format(‘Voltaje %n’,[LProcessorInfo.GetProcessorVoltaje]));
WriteLn(Format(‘External Clock %d Mhz’,[LProcessorInfo.RAWProcessorInformation^.ExternalClock]));
WriteLn(Format(‘Maximum processor speed %d Mhz’,[LProcessorInfo.RAWProcessorInformation^.MaxSpeed]));
WriteLn(Format(‘Current processor speed %d Mhz’,[LProcessorInfo.RAWProcessorInformation^.CurrentSpeed]));
WriteLn(‘Processor Upgrade ‘+LProcessorInfo.ProcessorUpgradeStr);
WriteLn(Format(‘External Clock %d Mhz’,[LProcessorInfo.RAWProcessorInformation^.ExternalClock]));

if SMBios.SmbiosVersion>=’2.3′ then
begin
WriteLn(‘Serial Number ‘+LProcessorInfo.SerialNumberStr);
WriteLn(‘Asset Tag ‘+LProcessorInfo.AssetTagStr);
WriteLn(‘Part Number ‘+LProcessorInfo.PartNumberStr);
if SMBios.SmbiosVersion>=’2.5’ then
begin
WriteLn(Format(‘Core Count %d’,[LProcessorInfo.RAWProcessorInformation^.CoreCount]));
WriteLn(Format(‘Cores Enabled %d’,[LProcessorInfo.RAWProcessorInformation^.CoreEnabled]));
WriteLn(Format(‘Threads Count %d’,[LProcessorInfo.RAWProcessorInformation^.ThreadCount]));
WriteLn(Format(‘Processor Characteristics %.4x’,[LProcessorInfo.RAWProcessorInformation^.ProcessorCharacteristics]));
end;
end;
Writeln;

if (LProcessorInfo.RAWProcessorInformation^.L1CacheHandle>0) and (LProcessorInfo.L2Chache<>nil) then
begin
WriteLn(‘L1 Cache Handle Info’);
WriteLn(‘——————–‘);
WriteLn(‘ Socket Designation ‘+LProcessorInfo.L1Chache.SocketDesignationStr);
WriteLn(Format(‘ Cache Configuration %.4x’,[LProcessorInfo.L1Chache.RAWCacheInformation^.CacheConfiguration]));
WriteLn(Format(‘ Maximum Cache Size %d Kb’,[LProcessorInfo.L1Chache.GetMaximumCacheSize]));
WriteLn(Format(‘ Installed Cache Size %d Kb’,[LProcessorInfo.L1Chache.GetInstalledCacheSize]));
LSRAMTypes:=LProcessorInfo.L1Chache.GetSupportedSRAMType;
WriteLn(Format(‘ Supported SRAM Type [%s]’,[SetToString(TypeInfo(TCacheSRAMTypes), LSRAMTypes)]));
LSRAMTypes:=LProcessorInfo.L1Chache.GetCurrentSRAMType;
WriteLn(Format(‘ Current SRAM Type [%s]’,[SetToString(TypeInfo(TCacheSRAMTypes), LSRAMTypes)]));

WriteLn(Format(‘ Error Correction Type %s’,[ErrorCorrectionTypeStr[LProcessorInfo.L1Chache.GetErrorCorrectionType]]));
WriteLn(Format(‘ System Cache Type %s’,[SystemCacheTypeStr[LProcessorInfo.L1Chache.GetSystemCacheType]]));
WriteLn(Format(‘ Associativity %s’,[LProcessorInfo.L1Chache.AssociativityStr]));
end;

if (LProcessorInfo.RAWProcessorInformation^.L2CacheHandle>0) and (LProcessorInfo.L2Chache<>nil) then
begin
WriteLn(‘L2 Cache Handle Info’);
WriteLn(‘——————–‘);
WriteLn(‘ Socket Designation ‘+LProcessorInfo.L2Chache.SocketDesignationStr);
WriteLn(Format(‘ Cache Configuration %.4x’,[LProcessorInfo.L2Chache.RAWCacheInformation^.CacheConfiguration]));
WriteLn(Format(‘ Maximum Cache Size %d Kb’,[LProcessorInfo.L2Chache.GetMaximumCacheSize]));
WriteLn(Format(‘ Installed Cache Size %d Kb’,[LProcessorInfo.L2Chache.GetInstalledCacheSize]));
LSRAMTypes:=LProcessorInfo.L2Chache.GetSupportedSRAMType;
WriteLn(Format(‘ Supported SRAM Type [%s]’,[SetToString(TypeInfo(TCacheSRAMTypes), LSRAMTypes)]));
LSRAMTypes:=LProcessorInfo.L2Chache.GetCurrentSRAMType;
WriteLn(Format(‘ Current SRAM Type [%s]’,[SetToString(TypeInfo(TCacheSRAMTypes), LSRAMTypes)]));

WriteLn(Format(‘ Error Correction Type %s’,[ErrorCorrectionTypeStr[LProcessorInfo.L2Chache.GetErrorCorrectionType]]));
WriteLn(Format(‘ System Cache Type %s’,[SystemCacheTypeStr[LProcessorInfo.L2Chache.GetSystemCacheType]]));
WriteLn(Format(‘ Associativity %s’,[LProcessorInfo.L2Chache.AssociativityStr]));
end;

if (LProcessorInfo.RAWProcessorInformation^.L3CacheHandle>0) and (LProcessorInfo.L3Chache<>nil) then
begin
WriteLn(‘L3 Cache Handle Info’);
WriteLn(‘——————–‘);
WriteLn(‘ Socket Designation ‘+LProcessorInfo.L3Chache.SocketDesignationStr);
WriteLn(Format(‘ Cache Configuration %.4x’,[LProcessorInfo.L3Chache.RAWCacheInformation^.CacheConfiguration]));
WriteLn(Format(‘ Maximum Cache Size %d Kb’,[LProcessorInfo.L3Chache.GetMaximumCacheSize]));
WriteLn(Format(‘ Installed Cache Size %d Kb’,[LProcessorInfo.L3Chache.GetInstalledCacheSize]));
LSRAMTypes:=LProcessorInfo.L3Chache.GetSupportedSRAMType;
WriteLn(Format(‘ Supported SRAM Type [%s]’,[SetToString(TypeInfo(TCacheSRAMTypes), LSRAMTypes)]));
LSRAMTypes:=LProcessorInfo.L3Chache.GetCurrentSRAMType;
WriteLn(Format(‘ Current SRAM Type [%s]’,[SetToString(TypeInfo(TCacheSRAMTypes), LSRAMTypes)]));

WriteLn(Format(‘ Error Correction Type %s’,[ErrorCorrectionTypeStr[LProcessorInfo.L3Chache.GetErrorCorrectionType]]));
WriteLn(Format(‘ System Cache Type %s’,[SystemCacheTypeStr[LProcessorInfo.L3Chache.GetSystemCacheType]]));
WriteLn(Format(‘ Associativity %s’,[LProcessorInfo.L3Chache.AssociativityStr]));
end;

Readln;
end
else
Writeln(‘No Processor Info was found’);
finally
SMBios.Free;
end;
end;
[/sourcecode]

ProcessorInfo2

12 responses

  1. Why “Processor ID ” is always the same on my two computer?

    1. This is perfect fine, the ProcessorID is not a unique number check the description of this property

      The Processor ID field contains processor-specific information that describes the processors features. x86-Class CPUs For x86 class CPUs, the fields format depends on the processors support of the CPUID instruction. If the instruction is supported, the Processor ID field contains two DWORD-formatted values. The first (offsets 08h-0Bh) is the EAX value returned by a CPUID instruction with input EAX set to 1; the second (offsets 0Ch-0Fh) is the EDX value returned by that instruction. Otherwise, only the first two bytes of the Processor ID field are significant (all others are set to 0) and contain (in WORD-format) the contents of the DX register at CPU reset.

      For a unique number try the SerialNumberStr function.

  2. mca64 Avatar
    mca64

    Hey! I have Intel Core i3 processor but LProcessorInfo.ProcessorFamilyStr says “Intel Core i7”

    1. Try dumping your SMBIOS data using the TSMBios.SaveToFile method and send me the file to check the content.

  3. thanks alot for share…

  4. Santosh Kuamr nayak Avatar
    Santosh Kuamr nayak

    I’m getting error as “cannot open file “/private/var/vm/sleepimage”. permission denied.” on the line while creating the object of TSMBios, like SMBios:=TSMBios.Create;

    1. Hi, the TSMBIOS read the SMBIOS info using the /dev/mem device file which provides access to system physical memory, so the code must be executed using a user with the proper permissions like the root user. Also you can use the page of the project to report any issues.

      1. Santosh Nayak Avatar
        Santosh Nayak

        Hi, Rodrigo
        I tried to enable the root user on my Mac machine. But still the bug is getting popup as “cannot open file “/private/var/vm/sleepimage”. permission denied.” . Please let me know if I’m missing anything.

        1. Ok, I was thinking which you are using FPC with Linux. Unfortunately OSX is not supported for the library.

  5. Hi Rodrigo, I want to know if the TSMBIOS works in ARM Processors, with WINCE, THX

    1. Sorry but is not available in WinCE, because the library uses the GetSystemFirmwareTable method and the WMI to get the SMBIOS info and those are not present in WinCE.

  6. Hi bro …
    thanks for the library

Leave a Reply