NAME
amd64_get_ioperm
,
amd64_set_ioperm
—
manage amd64 per-process I/O permission
bitmap
SYNOPSIS
#include
<sys/types.h>
#include
<machine/sysarch.h>
int
amd64_get_ioperm
(u_long
*iomap);
int
amd64_set_ioperm
(u_long
*iomap);
DESCRIPTION
amd64_get_ioperm
()
copies the current I/O permission bitmap into the memory referenced by
iomap.
amd64_set_ioperm
()
sets the I/O permission bitmap from the data pointed to by
iomap. This call is restricted to the superuser.
The permission bitmap contains 1024 bits in 32 longwords. If bit
n is clear in the bitmap, then access is granted to
I/O port n. If bit n is set in
the bitmap, then an attempt to access I/O port n
results in delivery of a SIGBUS
signal unless the
process's I/O permission level would grant I/O access.
Note:
Code using the
amd64_get_ioperm
()
and amd64_set_ioperm
() functions must be compiled
using -lamd64
.
RETURN VALUES
Upon successful completion,
amd64_get_ioperm
() and
amd64_set_ioperm
() return 0. Otherwise, a value of
-1 is returned and the global variable errno is set to
indicate the error.
ERRORS
amd64_get_ioperm
() and
amd64_set_ioperm
() will fail if:
- [
EFAULT
] - iomap points outside the process's allocated address space.
- [
EPERM
] - The caller was not the superuser.
SEE ALSO
Intel, AMD64 Microprocessor Programmer's Reference Manual.
WARNING
You can really hose your machine if you enable user-level I/O and write to hardware ports without care.
BUGS
The bitmap should really cover 65536 bits, but that's just too big for allocation in a kernel structure. If you need access to ports beyond 1024, use amd64_iopl(2).