On Wednesday 10 August 2005 15:09, alexander wrote: > I tried to write a little C app that uses sysarch and i386_set_ioperm to > gain access to certain ports and after a bit of testing I'm pretty sure > that there is a bug or better a timing issue with the sysarch syscall or > the > i386_set_ioperm procedure. Please have a look at the following code: > > //CODE START > > #include <machine/sysarch.h> > > int main (void) { > > unsigned int port = 0x378; > unsigned char val = 'A'; > int number = 4; > > static inline void outb (unsigned short int port, unsigned char val) { > __asm__ volatile ("outb %0,%1\n"::"a" (val), "d" (port) ); > } > > struct i386_ioperm_args { > unsigned int start; > unsigned int length; > int enable; > }; > > struct i386_ioperm_args *args; > struct i386_ioperm_args arg; > args = &arg; > > args->start = 0x378; > args->length = 1; > args->enable = 1; > > if(sysarch(number,args) == 0) { > /* int i; > for(i=0; i < 100; i++) { > printf("DELAY\n"); > } > */ > outb(0x378,0xF); > exit(0); > } > > else { > printf("Error during syscall"); > exit(1); > } > } > > //eof > > //CODE END > > On my PC this code will cause a core dump (Bus error: 10). If I however add > a delay (the code that's commented out) the app will end without any > errors. > > It seems FBSD needs some time to set the I/O permissions for an app. Can > somebody test this code on his computer? Maybe this is a bug in RELENG_6. > I'm running: > > FreeBSD 6.0-BETA1 #0: Mon Jul 18 03:00:45 CEST 2005
I can confirm that. I have tested the program on 5.4-RELEASE here. Testing your program (I called it "p") 10 times gives the following output : [EMAIL PROTECTED] for a in 0 1 2 3 4 5 6 7 8 9;do echo "starting p"; ./p ;done starting p starting p starting p Bus error (core dumped) starting p Bus error (core dumped) starting p starting p starting p Bus error (core dumped) starting p Bus error (core dumped) starting p starting p [EMAIL PROTECTED] However, opening /dev/io to gain IO privileges instead of using sysarch always works. I tested that with the following program : #include <fcntl.h> static inline void outb (unsigned short int port, unsigned char val) { __asm__ volatile ("outb %0,%1\n"::"a" (val), "d" (port) ); } int main (void) { if (open("/dev/io", O_RDONLY) == -1) { printf("EEK!\n"); exit(1); } outb(0x378, 0xff); } --- EOF --- grtz, Daan _______________________________________________ freebsd-hackers@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-hackers To unsubscribe, send any mail to "[EMAIL PROTECTED]"