Date: Wed, 10 Aug 2005 20:19:14 +0200 From: "Daan Vreeken [PA4DAN]" <Danovitsch@Vitsch.net> To: Alexander <arundel@h3c.de>, freebsd-hackers@freebsd.org Subject: Re: Using sysarch specific syscalls in assembly? Message-ID: <200508102019.15147.Danovitsch@Vitsch.net> In-Reply-To: <20050810130928.GA2027@skatecity> References: <20050809133109.GA15300@skatecity> <20050809192530.GA19230@skatecity> <20050810130928.GA2027@skatecity>
next in thread | previous in thread | raw e-mail | index | archive | help
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 : root@Racebeest# 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 root@Racebeest# 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
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200508102019.15147.Danovitsch>