ARCH(3) ARCH(3)
NAME
arch - architecture-specific information and control
SYNOPSIS
bind -a #P /dev
/dev/archctl
/dev/cputype
/dev/cputemp
/dev/ioalloc
/dev/iob
/dev/iol
/dev/iow
/dev/irqalloc
DESCRIPTION
This device presents textual information about PC hardware
and allows user-level control of the I/O ports on x86-class
and DEC Alpha machines.
Reads from cputype recover the processor type and clock rate
in MHz. Reads from cputemp recover one line containing per
processor containing two fields: the processor temperature
and precision in degrees Celsius. Reads from archctl yield
at least data of this form:
cpu AMD64 2201 pge
pge on
coherence mfence
cmpswap cmpswap486
i8253set on
cache default uc
cache 0x0 1073741824 wb
cache 0x3ff00000 1048576 uc
Where `AMD64' is the processor type, `2201' is the processor
speed in MHz, and `pge' is present only if the `page global
extension' capability is present; the next line reflects its
setting. `coherence' is followed by one of `mb386',
`mb586', `mfence' or `nop', showing the form of memory bar-
rier used by the kernel. `cmpswap' is followed by
`cmpswap386' or `cmpswap486', reflecting the form of `com-
pare and swap' used by the kernel. `i8253set' is a flag,
indicating the need to explicitly set the Intel 8253 or
equivalent timer. There may be lines starting with `cache'
that reflect the state of memory caching via MTRRs (memory-
type region registers). The second word on the line is
`default' or a C-style number which is the base physical
address of the region; the third is a C-style length of the
region; and the fourth is one of `uc' (for uncachable), `wb'
(write-back), `wc' (write-combining), `wp' (write-
Page 1 Plan 9 (printed 11/6/25)
ARCH(3) ARCH(3)
protected), or `wt' (write-through). A region may be a sub-
set of another region, and the smaller region takes prece-
dence. This may be used to make I/O registers uncachable in
the midst of a write-combining region mostly used for a
video framebuffer, for example. Control messages may be
written to archctl and use the same syntax as the data read
from archctl. Known commands include `cache', `coherence',
`i8253set', and `pge'.
Reads from ioalloc return I/O ranges used by each device,
one line per range. Each line contains three fields sepa-
rated by white space: first address in hexadecimal, last
address, name of device.
Reads from irqalloc return the enabled interrupts, one line
per interrupt. Each line contains six fields separated by
white space: the trap number, the IRQ it is assigned to, the
number of interrupts from this source, the CPU cycles spent
servicing this interrupt, the type of interrupt, and the
name of the device using it. Interrupt types are architec-
ture dependent.
Reads and writes to iob, iow, and iol cause 8-bit wide, 16-
bit wide, and 32-bit wide requests to I/O ports. The port
accessed is determined by the byte offset of the file
descriptor.
EXAMPLE
The following code reads from an x86 byte I/O port.
uchar
inportb(unsigned port)
{
uchar data;
if(iobfd == -1)
iobfd = open("#P/iob", ORDWR);
seek(iobfd, port, 0);
if(read(iobfd, &data, sizeof(data)) != sizeof(data))
sysfatal("inportb(0x%4.4ux): %r", port);
return data;
}
SOURCE
/sys/src/9/pc/devarch.c
Page 2 Plan 9 (printed 11/6/25)