Subject: How to port inportb/outportb to NetBSD ???
To: None <port-i386@netbsd.org>
From: Brian Stark <bstark@uswest.net>
List: port-i386
Date: 11/26/1999 05:35:29
Hello,

I'm having some trouble porting some code from a MS-DOS system to NetBSD
and I hope someone can tell me what I might be doing wrong.

I wrote some code using Borland C++ 3.10 on a to NetBSD and my code made 
use of the following Borland functions for reading and writing ports:

  unsigned      inport  (unsigned portid);
  unsigned char inportb (unsigned portid);
  void          outport (unsigned portid, unsigned      value);
  void          outportb(unsigned portid, unsigned char value);

I found the header file /usr/include/machine/pio.h, and it looks like
it contains some definitions that will work for me (inw, inb, outw, outb),
so I modified my code to be like this:

#include <machine/types.h>
#include <machine/pio.h>

/* This function will read a 16-bit word */
u_int16_t inport (int portid)
{
  return (inw(portid));
}

/* This function will read a 8-bit byte */
u_int8_t inportb (int portid)
{
  return (inb(portid));
}

/* This function will write a 16-bit word */
void outport(int portid, u_int16_t value)
{
  outw(portid,value);
}

/* This function will write a 8-bit word */
void outportb(int portid, u_int8_t value)
{
  outb(portid,value);
}

int DetectESP(int EIO)
/* Look for a Hayes ESP signature at port EIO */
{
  if (0xF3 == inportb(EIO))
    return 1; 
  else      
    return 0; 
}


But, when I attempt to run my program it crashes inside the inb()
function:

callisto:bstark$ ./esic check 0x300
Hayes Enhanced Serial Interface (ESI) Utility
Copyright 1996-1999 by Brian P. Stark. All rights reserved.

Bus error (core dumped) 
callisto:bstark$ gdb esic esic.core
GNU gdb 4.17
Copyright 1998 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you
are
welcome to change it and/or distribute copies of it under certain
conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for
details.
This GDB was configured as "i386--netbsd"...
Core was generated by `esic'.
Program terminated with signal 10, Bus error.
Reading symbols from /usr/libexec/ld.so...done.
Reading symbols from /usr/lib/libc.so.12.40...done.
#0  0x37a2 in inportb (portid=768) at /usr/include/i386/pio.h:79
79              return data;
(gdb) where
#0  0x37a2 in inportb (portid=768) at /usr/include/i386/pio.h:79
#1  0x30a7 in DetectESP (EIO=768) at ../s/esi.c:639
#2  0x1e04 in DoCheck (EIO=768) at ../s/esic.c:134
#3  0x23fd in main (argc=3, argv=0xefbfd3e8) at ../s/esic.c:275
(gdb) list
74      static __inline u_int8_t
75      __inb(int port)
76      {
77              u_int8_t data;
78              __asm __volatile("inb %w1,%0" : "=a" (data) : "d" (port));
79              return data;
80      }
81      
82      static __inline void
83      insb(int port, void *addr, int cnt)
(gdb) 


Since this is the first program I've worked on for NetBSD that needs to
read and write a port, I'm not sure if what I am doing is correct. 
Should I be able to read and write the ports from inside my program
by calling these functions? Is there any special setup/initialization
code I am missing here?

Thanks,


Brian
bstark@uswest.net