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>
index | next in thread | previous in thread | raw e-mail
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
help
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200508102019.15147.Danovitsch>
