I was wondering how to reliably obtain the Processor Serial Number (PSN) on GNU Linux.
For now I'm using this
#include <stdio.h>
#include <cpuid.h>
unsigned int level = 1;
unsigned eax = 3 /* processor serial number */, ebx = 0, ecx = 0, edx = 0;
__get_cpuid(level, &eax, &ebx, &ecx, &edx);
// byte swap
int first = ((eax >> 24) & 0xff) | ((eax << 8) & 0xff0000) | ((eax >> 8) & 0xff00) | ((eax << 24) & 0xff000000);
int last = ((edx >> 24) & 0xff) | ((edx << 8) & 0xff0000) | ((edx >> 8) & 0xff00) | ((edx << 24) & 0xff000000);
printf("PSN: %08X%08X", first, last);
It gives me PSN: A7060200FFFBEBBF
,
which matches with
sudo dmidecode | grep -P '^\s+ID: ([0-9A-F]{2} ){7}[0-9A-F]{2}$'
output: ID: A7 06 02 00 FF FB EB BF
I only tested on Intel Core i processors, so perhaps it's only working for this type of CPU.
I know that the "Serial Number" is the same across identical CPU model, and is thus not unique.
Also, I'm looking forward for a way of achieving that, that does not rely on executing a shell command and parsing the output.