0d8cf47ee4
recog_arm.c: In function 'cpuid_identify_arm': recog_arm.c:2548:9: warning: 'strncpy' specified bound 16 equals destination size [-Wstringop-truncation] 2548 | strncpy(data->vendor_str, hw_impl->name, VENDOR_STR_MAX); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ recog_arm.c:2549:9: warning: 'strncpy' specified bound 64 equals destination size [-Wstringop-truncation] 2549 | strncpy(data->brand_str, id_part->name, BRAND_STR_MAX); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ recog_arm.c:2550:9: warning: 'strncpy' specified bound 64 equals destination size [-Wstringop-truncation] 2550 | strncpy(data->cpu_codename, id_part->codename, CODENAME_STR_MAX); |
||
---|---|---|
.github/workflows | ||
cmake | ||
cpuid_tool | ||
drivers | ||
libcpuid | ||
python | ||
tests | ||
utils | ||
.gitignore | ||
.readthedocs.yml | ||
AUTHORS | ||
ChangeLog | ||
cmake-format.py | ||
CMakeLists.txt | ||
configure.ac | ||
CONTRIBUTING.md | ||
COPYING | ||
libcpuid.dsw | ||
libcpuid.pc.in | ||
libcpuid_vc10.sln | ||
libcpuid_vc71.sln | ||
Makefile.am | ||
Readme.md |
libcpuid
libcpuid provides CPU identification. Project website is on SourceForge (https://libcpuid.sourceforge.net).
Support
CPU architectures
- x86:
- 32-bit CPUs (IA-32, also known as i386, i486, i586 and i686)
- 64-bit CPUs (x86_64, also known as x64, AMD64, and Intel 64)
- ARM (since v0.7.0):
- 32-bit CPUs (ARM32, also known as AArch32)
- 64-bit CPUs (ARM64, also known as AArch64)
Operating systems
libcpuid support varies depending on the features:
- build: code build, generate libraries and binaries
- x86 MSR : access to x86 model-specific registers
- ARM CPUID : access to ARM registers
Name | Build | x86 MSR | ARM CPUID |
---|---|---|---|
DragonFly BSD | ❔ (cpuctl kernel module) |
❌ | |
FreeBSD | ✔️ (cpuctl kernel module) |
✔️¹ (cpuid out-of-tree kernel module) |
|
Linux | ✔️ (msr kernel module) |
✔️¹ (cpuid out-of-tree kernel module) |
|
macOS | ❌ | ❌ | |
NetBSD | ❌ | ❌ | |
OpenBSD | ❌ | ❌ | |
Windows | ✔️ (msr driver) |
❌ |
Legend:
- ✔️ Supported
- ❔ Likely supported, not heavily tested
- ❌ Not supported
- ¹ On AArch32 state, the kernel module is required. On AArch64 state, the kernel module is optional, because the kernel can trap the
MRS
instruction
Getting started
You have two ways to get libcpuid:
- build it from sources
- download a pre-compiled binary
Sources
Prerequisites
Using libcpuid requires no dependencies on any of the supported OSes. Building it requires build tool commands to be available, which is a matter of installing a few common packages with related names (e.g. automake, autoconf, libtool, cmake). It also requires a POSIX-compatible shell. On NetBSD, you may need to install one (credits to @brucelilly):
- Install a POSIX-compatible shell such as ksh93
pkg_add ast-ksh || pkgin in ast-ksh
- Export
CONFIG_SHELL
with correct path if required:
export CONFIG_SHELL=/usr/pkg/bin/ksh93
Configuring after checkout
Two build systems are supported, use the one you prefer.
By using autotools
Under POSIX systems, where you download the sources, there's no configure script to run. This is because it isn't a good practice to keep such scripts in a source control system. To create it, you need to run the following commands once, after you checkout the libcpuid sources from GitHub:
libtoolize
autoreconf --install
You need to have autoconf
, automake
and libtool
installed.
After that you can run ./configure
and make
- this will build
the library.
make dist
will create a tarball (with "configure" inside) with the
sources.
By using CMake
CMake options for libcpuid (use cmake -LH
to list all options):
LIBCPUID_ENABLE_DOCS
: enable building documentation by using Doxyen (ON by default)LIBCPUID_ENABLE_TESTS
: enable tests targets, liketest-fast
,test-old
andfix-tests
(OFF by default)LIBCPUID_BUILD_DEPRECATED
: build support of deprecated attributes (ON by default to guarantee backward compatibility)LIBCPUID_BUILD_DRIVERS
: enable building kernel drivers (ON by default)LIBCPUID_DRIVER_DEBUG
: enable debug mode flr kernel drivers (OFF by default)LIBCPUID_DRIVER_ARM_LINUX_DKMS
: use DKMS for CPUID Linux kernel module for ARM (ON by default), switch off to build the kernel module in thebuild
directory
Basic example to build and install libcpuid by using CMake:
cmake -S . -B build -DCMAKE_BUILD_TYPE=RelWithDebInfo -DLIBCPUID_ENABLE_TESTS=ON
cmake --build build
cmake --install build # may need administrative privileges, install under /usr/local by default
Downloads
You can find latest versioned archives here, with binaries for macOS and Windows.
Binary packages
Also, libcpuid is available for following systems in official repositories:
- Arch Linux:
pacman -S libcpuid
- Debian (since version 11 "Bullseye"):
apt install cpuidtool libcpuid-dev
- Fedora (since version 25):
dnf install libcpuid libcpuid-devel
- FreeBSD (since version 11):
pkg install libcpuid
- OpenMandriva Lx (since version 4.0 "Nitrogen"):
dnf install libcpuid-tools libcpuid-devel
- openSUSE Leap (since version 15.1):
zypper install libcpuid-tools libcpuid-devel
- Solus:
eopkg install libcpuid libcpuid-devel
- Ubuntu (since version 20.04 "Focal Fossa") :
apt install cpuidtool libcpuid-dev
Below, the full lists of repositories:
Build tool
- Vcpkg:
vcpkg install cpuid
Usage
As a software developer
Native C library
For details about the programming API, you might want to take a look at the short tutorial, as well as the full API reference.
Python bindings
The libcpuid library features Python bindings, which can be installed as a library
using python -m pip install libcpuid
. Visit the
documentation at Read the Docs
to see how the library is used.
As an end-user
You can use the cpuid_tool
command. Pass the --help
argument to display usage:
Usage: cpuid_tool [options]
Options:
-h, --help - Show this help
--load=<file> - Load raw CPUID data from file
--save=<file> - Acquire raw CPUID data and write it to file
--report, --all - Report all decoded CPU info (w/o clock)
--clock - in conjunction to --report: print CPU clock as well
--clock-rdtsc - same as --clock, but use RDTSC for clock detection
--cpulist - list all known CPUs
--sgx - list SGX leaf data, if SGX is supported.
--hypervisor - print hypervisor vendor if detected.
--quiet - disable warnings
--outfile=<file> - redirect all output to this file, instead of stdout
--verbose, -v - be extra verbose (more keys increase verbosiness level)
--version - print library version
Query switches (generate 1 line of output per switch; in order of appearance):
--cpuid, --architecture, --feature-level, --purpose, --vendorstr,
--vendorid, --brandstr, --family, --model, --stepping, --extfamily,
--extmodel, --implementer, --variant, --part-num, --revision, --cores,
--logical, --total-cpus, --affi-mask, --l1d-cache, --l1i-cache, --cache,
--l2-cache, --l3-cache, --l4-cache, --l1d-assoc, --l1i-assoc, --l2-assoc,
--l3-assoc, --l4-assoc, --l1d-cacheline, --l1i-cacheline, --l2-cacheline,
--l3-cacheline, --l4-cacheline, --l1d-instances, --l1i-instances,
--l2-instances, --l3-instances, --l4-instances, --codename, --flags,
--clock, --clock-os, --clock-rdtsc, --clock-ic, --rdmsr, --rdmsr-raw,
--sse-size
If `-' is used for <file>, then stdin/stdout will be used instead of files.
When no options are present, the program behaves as if it was invoked with
cpuid_tool "--save=raw.txt --outfile=report.txt --report --verbose"
Contributing
Refer to the dedicated page.
Users
So far, I'm aware of the following projects which utilize libcpuid (listed alphabetically):
- CPU-X (https://github.com/TheTumultuousUnicornOfDarkness/CPU-X)
- fre:ac (https://www.freac.org/)
- I-Nex (https://github.com/i-nex/I-Nex)
- Multiprecision Computing Toolbox for MATLAB (https://www.advanpix.com/)
- ucbench (http://anrieff.net/ucbench)
We'd love to hear from you if you are also using libcpuid and want your project listed above.