direct I/O access

Raoul MEGELAS rmgls at orange.fr
Thu May 31 12:36:51 UTC 2007


On Thu, 31 May 2007 08:44:33 +0400
Eygene Ryabinkin <rea-fbsd at codelabs.ru> wrote,
Wed, May 30, 2007 at 02:43:07AM -0400, Mike Meyer wrote:

>> I believe this should be $0x4, as you want to *set* the values, not
>> get them.

> Right.

>> You also need to open the file "/dev/io".  I believe that leaving this
>> file open for anything more than a handful of instructions would be a
>> bad thing, but I'm not going to verify it.

> I feel that the i386_set_ioperm directly manipulates the task's I/O
> bitmap referenced by the task state segment (TSS), so you don't
> need to mangle with /dev/io.  /dev/io itself is the higher-level
> semi machine-indenepdent abstraction.  Opening /dev/io grants the
> global access to all ports, while using i386_set_ioperm gives the
> fine-grained access.  When you closing /dev/io, the port I/O access
> is revoked.

> To summarise: either you open /dev/io and do all your port I/O as
> in the good old days of the real-mode programs, or you're using
> i386_set_ioperm to obtain the access permissions to the I/O port
> range and again, do all port I/O as usual.

i rewrote my code and this time, all works fine.
thanks to Mike and Eygene.

here is the code as a proof of the above explanation:

# test_io.S

	.include    "system.inc"
    
BUFSIZE = 0x80
  
     .data
params:	 .long 0x70,2,1,0
path:	 .asciz "/dev/io"

     .bss
     buffer: .fill BUFSIZE, 0

    
     .text
     .global      _start

err:
         pushl    $0x1         # return failure
         SysExit


_start:
         addl     $8,%esp      # discard argc and argv[0]

	leal	params,%eax
	pushl	%eax
	pushl	$4
	movl	$0xa5,%eax
	call	bsd_kernel
	addl	$12,%esp


	movl	$0X330,%edx
	inb	%dx,%al
# if i try to read or write another port than 0x70/0x71, i have a segbus fault.

	leal	path,%ecx
         pushl	$0         # O_RDONLY
         pushl	%ecx
         SysOpen
         jc      err             # open failed
         addl     $8,%esp
	movl	$0X330,%edx
	inb	%dx,%al
# all is ok!	

         pushl   $0         # return success
	SysExit

Thanks again.

Raoul
rmgls at wanadoo.fr



More information about the freebsd-hackers mailing list