The iopl(3) followed by 'in' works fine for me (both, when compiled
-m32 or without)
till@tillbook:~/tmp$ uname -a
Linux tillbook 2.6.28-13-generic #45-Ubuntu SMP Tue Jun 30 22:12:12
UTC 2009 x86_64 GNU/Linux
#include <stdio.h>
#include <sys/io.h>
int main(int argc, char **argv)
{
unsigned char v;
unsigned short p;
if ( argc < 2 || 1 != sscanf(argv[1],"%hi",&p) ) {
fprintf(stderr,"Usage: %s <port>\n",argv[0]);
return 1;
}
if ( iopl(3) ) {
perror("iopl");
return 1;
}
asm volatile ( "inb %1,%0" : "=a" (v) : "d"(p));
printf("0x%02x\n",v);
return 0;
}
-- Till
Mark Rivers wrote:
Folks,
I have an EPICS application that directly accesses the parallel port
(EPP) registers from user space on Linux. This is to communicate
with an XIA Saturn spectroscopy module.
In order versions of Linux this worked fine if I ran the application
as root, or by calling iopl(3) as root before exec-ing the EPICS
application.
I am now trying to run this under a recent Linux (Redhat Fedora) version
baja:~>more /proc/version
Linux version 2.6.26.8-57.fc8 ([email protected])
(gcc version 4.1.2 20070925 (Red Hat 4.1.2-33))
#1 SMP Thu Dec 18 18:59:49 EST 2008
The EPICS IOC now crashes with a segmentation fault when trying to
access the EPP port, even when running as root, and the following
entry appears in /var/log/messages
Jul 9 11:43:44 baja kernel: dxpApp[27837] general protection
ip:80a90a6 sp:ff8ea8ac error:0 in dxpApp[8048000+1f7000]
Does anyone know what one needs to do in recent Linux versions to get
access to the IO registers from user-space?
Thanks,
Mark