$OpenBSD$ --- src/jtag/parport.c.orig Fri Jan 16 10:02:25 2009 +++ src/jtag/parport.c Wed May 27 11:43:45 2009 @@ -31,7 +31,7 @@ /* system includes */ /* -ino: 060521-1036 */ -#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) +#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__OpenBSD__) #include #include @@ -45,29 +45,32 @@ #include "errno.h" #endif /* _WIN32 */ -#endif /* __FreeBSD__ */ +#endif /* __FreeBSD__ || __OpenBSD__ */ #include #include #include #if PARPORT_USE_PPDEV == 1 +#ifdef __OpenBSD__ +#error "OpenBSD doesn't have ppdev. Please compile with direct i/o instead." +#endif /* __OpenBSD__ */ #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) #include #include #define PPRSTATUS PPIGSTATUS #define PPWDATA PPISDATA -#else +#else /* not __FreeBSD__ */ #include #include #endif #include #include #else /* not PARPORT_USE_PPDEV */ -#ifndef _WIN32 +#if !defined(_WIN32) && !defined(__OpenBSD__) #include +#endif /* ! _WIN32 && !__OpenBSD__ */ #endif -#endif #if PARPORT_USE_GIVEIO == 1 #if IS_CYGWIN == 1 @@ -76,6 +79,10 @@ #endif #endif +#ifdef __OpenBSD__ +#include /* inb/outb macross */ +#endif /* __OpenBSD__ */ + #include "log.h" /* parallel port cable description @@ -200,12 +207,12 @@ static __inline__ void parport_write_data(void) #if PARPORT_USE_PPDEV == 1 ioctl(device_handle, PPWDATA, &output); #else -#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) +#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__OpenBSD__) outb(dataport, output); #else outb(output, dataport); #endif -#endif +#endif /* not PARPORT_USE_PPDEV */ } void parport_write(int tck, int tms, int tdi) @@ -310,6 +317,12 @@ int parport_init(void) char buffer[256]; int i = 0; #endif +#ifdef __OpenBSD__ + u_long iopermtable[32] = {}; + + /* get current i/o permission table */ + i386_get_ioperm(iopermtable); +#endif /* __OpenBSD__ */ cur_cable = cables; @@ -403,7 +416,16 @@ int parport_init(void) #if PARPORT_USE_GIVEIO == 1 if (parport_get_giveio_access() != 0) #else /* PARPORT_USE_GIVEIO */ +#ifdef __FreeBSD__ if (ioperm(dataport, 3, 1) != 0) +#endif /* __FreeBSD__ */ +#ifdef __OpenBSD__ + /* request access to desired i/o port */ + iopermtable[parport_port / 32] &= ~(1 << parport_port % 32); + iopermtable[parport_port / 32] &= ~(1 << parport_port % 32 + 1); + iopermtable[parport_port / 32] &= ~(1 << parport_port % 32 + 2); + if (i386_set_ioperm(iopermtable) != 0) +#endif /* __OpenBSD__ */ #endif /* PARPORT_USE_GIVEIO */ { LOG_ERROR("missing privileges for direct i/o"); @@ -412,7 +434,7 @@ int parport_init(void) LOG_DEBUG("...privileges granted"); /* make sure parallel port is in right mode (clear tristate and interrupt */ - #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) + #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__OpenBSD__) outb(parport_port + 2, 0x0); #else outb(0x0, parport_port + 2); @@ -469,7 +491,7 @@ int parport_handle_parport_cable_command(struct comman if (parport_cable == 0) { parport_cable = malloc(strlen(args[0]) + sizeof(char)); - strcpy(parport_cable, args[0]); + strlcpy(parport_cable, args[0], strlen(args[0]) + sizeof(char)); } return ERROR_OK;