logo
Free, unlimited AI code reviews that run on commit
git-lrc git-lrc GitHub Install Now We'd appreciate a star git-lrc - Free, unlimited AI code reviews that run on commit | Product Hunt git-lrc - Free, unlimited AI code reviews that run on commit | Product Hunt

cpuctl — cpuctl pseudo device

Authors

       The cpuctl module and this manual page were written by Stanislav Sedov <stas@FreeBSD.org>.

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"

See Also