*BSD News Article 46197


Return to BSD News archive

Xref: sserve comp.unix.bsd.freebsd.misc:2707 comp.unix.programmer:26660
Path: sserve!newshost.anu.edu.au!harbinger.cc.monash.edu.au!nexus.coast.net!news.kei.com!news.mathworks.com!news.ultranet.com!news.sprintlink.net!howland.reston.ans.net!Germany.EU.net!zib-berlin.de!news.tu-chemnitz.de!irz401!uriah.heep!bonnie.heep!not-for-mail
From: j@bonnie.heep.sax.de (J Wunsch)
Newsgroups: comp.unix.bsd.freebsd.misc,comp.unix.programmer
Subject: Re: Direct access to I/O ports
Date: 22 Jun 1995 12:20:42 +0200
Organization: Private U**x site, Dresden.
Lines: 53
Message-ID: <3sbg5q$snj@bonnie.tcd-dresden.de>
References: <3s75qm$fn@spice.eppet.pt> <JKH.95Jun21143629@whisker.internet-eireann.ie>
Reply-To: joerg_wunsch@uriah.heep.sax.de
NNTP-Posting-Host: 192.109.108.139
Mime-Version: 1.0
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 8bit

Jordan K. Hubbard <jkh@whisker.internet-eireann.ie> wrote:

>   I'm currently running FreeBSD 2.x and I'd like to develop some C
>   applications that directely access specific hardware ports.
>
>No problem.  Just open /dev/io in your application and you'll then
>be granted the priviledge of executing the inb/outb instructions
>directly.

Umm Jordan, are you sure it's actually working right now?  This one
used to be commented out with a /* broken */ comment in
sys/i386/i386/mem.c.

Anyway, one thing you can always do (as long as the machine has some
sort of video card and a configured syscons or pcvt driver) is the
following (basically also what the X server is doing):

#include <sys/file.h>
#include <machine/console.h>
#include <stdio.h>

#define GRFX_DEVICE "/dev/ttyv0"

int main(void)
{
	int fd;

	if((fd = open(GRFX_DEVICE, O_RDWR)) == 1) {
		perror("open(GRFX_DEVICE)");
		return 1;
	}
	if(ioctl(fd, KDENABIO, 0) == -1) {
		perror("ioctl(KDENABIO)");
		return 1;
	}
	printf("got IO privilege now, wow!\n");

	return 0;
}


Of course, this process requires an effective UID of 0 (i.e. root
privilege), otherwise you'll get an ``Operation not permitted'' error
for the ioctl.

I'd also ask you to think about your problem; it's normally no good
practice to program IO ports directly from userland, this is rather
restricted to kernel drivers.
-- 
cheers, J"org                      private:   joerg_wunsch@uriah.heep.sax.de
                                   http://www.sax.de/~joerg/

Never trust an operating system you don't have sources for. ;-)