Devices cpuid(7D)
NAME
cpuid - CPU identification driver
SYNOPSIS
/dev/cpu/self/cpuid
DESCRIPTION
SPARC and x86 system
This device provides implementation-private information via
ioctls about various aspects of the implementation to
Solaris libraries and utilities.
x86 systems only
This device also provides a file-like view of the namespace
and return values of the x86 cpuid instruction. The cpuid
instruction takes a single 32-bit integer function code, and
returns four 32-bit integer values corresponding to the
input value that describe various aspects of the capabili-
ties and configuration of the processor.
The API for the character device consists of using the seek
offset to set the function code value, and using a read(2)
or pread(2) of 16 bytes to fetch the four 32-bit return
values of the instruction in the order %eax, %ebx, %ecx and
%edx.
No data can be written to the device. Like the cpuid
instruction, no special privileges are required to use the
device.
The device is useful to enable low-level configuration
information to be extracted from the CPU without having to
write any assembler code to invoke the cpuid instruction
directly. It also allows the kernel to attempt to correct
any erroneous data returned by the instruction (prompted by
occassional errors in the information exported by various
processor implementations over the years).
See the processor manufacturers documentation for further
information about the syntax and semantics of the wide
variety of information available from this instruction.
EXAMPLE
This example allows you to determine if the current x86 pro-
cessor supports "long mode," which is a necessary (but not
sufficient) condition for running the 64-bit Solaris kernel
on the processor.
SunOS 5.11 Last change: 16 Sep 2004 1
Devices cpuid(7D)
/*
#include
#include
#include
#include
#include
#include
#include
static const char devname[] = "/dev/cpu/self/cpuid";
/*ARGSUSED*/
int
main(int argc, char *argv[])
{
struct {
uint32t reax, rebx, recx, redx;
} r, *rp = &r;
int d;
char *s;
if ((d = open(devname, ORDONLY)) == -1) {
perror(devname);
return (1);
}
if (pread(d, rp, sizeof (*rp), 0) != sizeof (*rp)) {
perror(devname);
goto fail;
}
s = (char *)&rp->rebx;
if (strncmp(s, "Auth" "cAMD" "enti", 12) != 0 &&
strncmp(s, "Genu" "ntel" "ineI", 12) != 0)
goto fail;
if (pread(d, rp, sizeof (*rp), 0x80000001) == sizeof (*rp)) {
/*
* Read extended feature word; check bit 29
*/
(void) close(d);
if ((rp->redx >> 29) & 1) {
(void) printf("processor supports long mode\n");
return (0);
}
}
fail:
(void) close(d);
return (1);
}
SunOS 5.11 Last change: 16 Sep 2004 2
Devices cpuid(7D)
ERORS
ENXIO Results from attempting to read data from the dev-
ice on a system that does not support the CPU
identification interfaces
EINVAL Results from reading from an offset larger than
UINTMAX, or attempting to read with a size that
is not multiple of 16 bytes.
FILES
/dev/cpu/self/cpuid Provides access to CPU identification
data.
ATRIBUTES
See attributes(5) for descriptions of the following attri-
butes:
ATRIBUTE TYPE ATRIBUTE VALUE
Availability SUNWckr
Interface Stability Evolving
SEE ALSO
psrinfo(1M), prtconf(1M), pread(2), read(2), attributes(5)
SunOS 5.11 Last change: 16 Sep 2004 3
|