anrieff / libcpuid

a small C library for x86 CPU detection and feature extraction
Other
429 stars 103 forks source link

libcpuid

libcpuid provides CPU identification. Project website is on SourceForge (https://libcpuid.sourceforge.net).

Support

CPU architectures

Operating systems

libcpuid support varies depending on the features:

Name Build x86 MSR ARM CPUID
DragonFly BSD :grey_question: :grey_question: (cpuctl kernel module) :x:
FreeBSD :heavy_check_mark: :heavy_check_mark: (cpuctl kernel module) :heavy_check_mark:¹ (cpuid out-of-tree kernel module)
Linux :heavy_check_mark: UNIX workflow status :heavy_check_mark: (msr kernel module) :heavy_check_mark:¹ (cpuid out-of-tree kernel module)
macOS :heavy_check_mark: UNIX workflow status :x: :x:
NetBSD :grey_question: :x: :x:
OpenBSD :grey_question: :x: :x:
Windows :heavy_check_mark: Windows workflow status :heavy_check_mark: (msr driver) :x:

Legend:

Getting started

You have two ways to get libcpuid:

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):

  1. Install a POSIX-compatible shell such as ksh93
    pkg_add ast-ksh || pkgin in ast-ksh
  2. 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):

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:

Below, the full lists of repositories:
Packaging status

Build tool

Usage

As a software developer

For details about the programming API, you might want to take a look at the short tutorial, as well as the full API reference.

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):

We'd love to hear from you if you are also using libcpuid and want your project listed above.