cpuctl — cpuctl pseudo device
Contents
Bugs
Yes, probably, report if any.
Debian June 20, 2014 CPUCTL(4)
Description
The special device /dev/cpuctl presents interface to the system CPU. It provides functionality to
retrieve CPUID information, read/write machine specific registers (MSR) and perform CPU firmware updates.
For each CPU present in the system, the special device /dev/cpuctl%d with the appropriate index will be
created. For multicore CPUs such a special device will be created for each core.
Currently, only i386 and amd64 processors are supported.
Errors
[ENXIO] The operation requested is not supported by the device (e.g., unsupported architecture
or the CPU is disabled).
[EINVAL] Incorrect request was supplied, or microcode image is not correct.
[ENOMEM] No physical memory was available to complete the request.
[EFAULT] The firmware image address points outside the process address space.
Files
/dev/cpuctl
History
The cpuctl driver first appeared in FreeBSD 7.2.
Ioctl Interface
All of the supported operations are invoked using the ioctl(2) system call. Currently, the following
ioctls are defined:
CPUCTL_RDMSR cpuctl_msr_args_t*args
CPUCTL_WRMSR cpuctl_msr_args_t*args
Read/write CPU machine specific register. The cpuctl_msr_args_t structure is defined
in <sys/cpuctl.h> as:
typedef struct {
int msr; /* MSR to read */
uint64_t data;
} cpuctl_msr_args_t;
CPUCTL_MSRSBIT cpuctl_msr_args_t*args
CPUCTL_MSRCBIT cpuctl_msr_args_t*args
Set/clear MSR bits according to the mask given in the data field.
CPUCTL_CPUID cpuctl_cpuid_args_t*args
Retrieve CPUID information. Arguments are supplied in the following structure:
typedef struct {
int level; /* CPUID level */
uint32_t data[4];
} cpuctl_cpuid_args_t;
It is equivalent to the CPUCTL_CPUID_COUNT request with level_type set to 0.
CPUCTL_CPUID_COUNT cpuctl_cpuid_count_args_t*args
Retrieve CPUID information. Arguments are supplied in the following structure:
typedef struct {
int level; /* CPUID level */
int level_type; /* CPUID level type */
uint32_t data[4];
} cpuctl_cpuid_count_args_t;
The level field indicates the CPUID level to retrieve, it is loaded into the %eax
register before the CPUID instruction is executed, The level_type field indicates the
CPUID level type to retrieve, it is loaded into the %ecx register.
The data field is used to store the received CPUID data. That is, data[0] contains
the value of %eax register after the CPUID instruction is executed, data[1] is for
%ebx, data[2] for %ecx, and data[3] for %edx.
CPUCTL_UPDATE cpuctl_update_args_t *args
Update CPU firmware (microcode). The structure is defined in <sys/cpuctl.h> as:
typedef struct {
void *data;
size_t size;
} cpuctl_update_args_t;
The data field should point to the firmware image of size size.
For additional information refer to cpuctl.h.
Name
cpuctl — cpuctl pseudo device
See Also
hwpmc(4), cpucontrol(8)
Synopsis
To compile this driver into the kernel, place the following lines in your kernel configuration file:
devicecpuctl
Alternatively, to load the driver as a module at boot time, place the following in loader.conf(5):
cpuctl_load="YES"
