I386_GET_IOPERM(2)

NAME
i386_get_ioperm, i386_set_ioperm - manage i386 per-process I/O permission bitmap

SYNOPSIS
#include <sys/types.h>
#include <machine/sysarch.h>
int
i386_get_ioperm(u_long *iomap);
int
i386_set_ioperm(u_long *iomap);

DESCRIPTION
i386_get_ioperm() copies the current I/O permission bitmap into the memory referenced by iomap.

i386_set_ioperm() sets the I/O permission bitmap from the data pointed to by iomap. This call may only be made by the superuser. Additionally, it is only permitted when the securelevel(7) is less than or equal to 0 or the machdep.allowaperture sysctl has been set to a non-zero value.

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 i386_get_ioperm() and i386_set_ioperm() functions must be compiled using -li386.

RETURN VALUES
Upon successful completion, i386_get_ioperm() and i386_set_ioperm() return 0. Otherwise, a value of -1 is returned and the global variable errno is set to indicate the error.

ERRORS
i386_get_ioperm() and i386_set_ioperm() will fail if:

[EFAULT]
    iomap points outside the process's allocated address space.

Additionally i386_set_ioperm() will fail if:

[EPERM]
    The caller was not the superuser, or the securelevel is greater than zero and machdep.allowaperture has not been set to a non-zero value.

SEE ALSO
i386_iopl(2) Intel, i386 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 i386_iopl(2).