diff --git a/server/drivers/port.h b/server/drivers/port.h index 1ed2605..f388263 100644 --- a/server/drivers/port.h +++ b/server/drivers/port.h @@ -7,27 +7,35 @@ * * FreeBSD support by Guillaume Filion and Philip Pokorny, copyright 05/2001 * - * NetBSD port by Guillaume Filion, copyright 12/2001 + * NetBSD port by Guillaume Filion, copyright 12/2001 and 02/2002 */ /* -This file defines 4 static inline functions for port I/O: +This file defines 6 static inline functions for port I/O: -// Read a byte from port -static inline int port_in (unsigned short int port); -// Returns the content of the byte. +Read a byte from port + static inline int port_in (unsigned short int port); +Returns the content of the byte. -// Write a char(byte) 'val' to port. -static inline void port_out (unsigned short int port, unsigned char val); -// Returns nothing. +Write a char(byte) 'val' to port. + static inline void port_out (unsigned short int port, unsigned char val); +Returns nothing. -// Get access to a specific port -static inline int port_access (unsigned short int port); -// Returns 0 if successful, -1 if failed +Get access to a specific port + static inline int port_access (unsigned short int port); +Returns 0 if successful, -1 if failed -// Get access 3 to ports: port (CONTROL), port+1 (STATUS) and port+2 (DATA) -static inline int port_access_full (unsigned short int port); -// Returns 0 if successful, -1 if failed +Close access to a specific port + static inline int port_deny (unsigned short int port); +Returns 0 if successful, -1 if failed + +Get access 3 to ports: port (CONTROL), port+1 (STATUS) and port+2 (DATA) + static inline int port_access_full (unsigned short int port); +Returns 0 if successful, -1 if failed + +Close access to 3 ports: port (CONTROL), port+1 (STATUS) and port+2 (DATA) + static inline int port_deny_full (unsigned short int port); +Returns 0 if successful, -1 if failed */ #ifndef PORT_H @@ -39,48 +47,54 @@ static inline int port_access_full (unsigned short int port); #include -// ------------------------------------------------------------- -// Use ioperm, inb and outb in (Linux) +/* ------------------------------------------------------------- */ +/* Use ioperm, inb and outb in (Linux) */ #if defined HAVE_IOPERM && HAVE_SYS_IO_H #include -// Read a byte from port +/* Read a byte from port */ static inline int port_in (unsigned short int port) { return inb(port); } -// Write a byte 'val' to port +/* Write a byte 'val' to port */ static inline void port_out (unsigned short int port, unsigned char val) { outb(val, port); } -// Get access to a specific port +/* Get access to a specific port */ static inline int port_access (unsigned short int port) { return ioperm(port, 1, 255); } -// Get access to 3 ports: port (CONTROL), port+1 (STATUS) and port+2 (DATA) +/* Close access to a specific port */ +static inline int port_deny (unsigned short int port) { + return ioperm(port, 1, 0); +} + +/* Get access to 3 ports: port (CONTROL), port+1 (STATUS) and port+2 (DATA) */ static inline int port_access_full (unsigned short int port) { return ioperm(port, 3, 255); } +/* Close access to 3 ports: port (CONTROL), port+1 (STATUS) and port+2 (DATA) */ static inline int port_deny_full (unsigned short int port) { return ioperm(port, 3, 0); } -// ------------------------------------------------------------- -// Use i386_get_ioperm, i386_set_ioperm, inb and outb from (NetBSD) +/* ------------------------------------------------------------- */ +/* Use i386_get_ioperm, i386_set_ioperm, inb and outb from (NetBSD) */ #elif defined HAVE_LIBI386 && defined HAVE_MACHINE_PIO_H && defined HAVE_MACHINE_SYSARCH_H #include #include #include -// Read a byte from port +/* Read a byte from port */ static inline int port_in (unsigned short int port) { return inb(port); } -// Write a byte 'val' to port +/* Write a byte 'val' to port */ static inline void port_out (unsigned short int port, unsigned char val) { outb(port, val); } @@ -100,7 +114,7 @@ static inline void setaccess(u_long * map, u_int bit, int allow) { map[word] |= mask; } -// Get access to a specific port +/* Get access to a specific port */ static inline int port_access (unsigned short int port) { u_long iomap[32]; @@ -113,7 +127,20 @@ static inline int port_access (unsigned short int port) { return 0; } -// Get access to 3 ports: port (CONTROL), port+1 (STATUS) and port+2 (DATA) +/* Close access to a specific port */ +static inline int port_deny (unsigned short int port) { + u_long iomap[32]; + + if (i386_get_ioperm(iomap) == -1) return -1; + + setaccess(iomap, port, 0); + + if (i386_set_ioperm(iomap) == -1) return -1; + + return 0; +} + +/* Get access to 3 ports: port (CONTROL), port+1 (STATUS) and port+2 (DATA) */ static inline int port_access_full (unsigned short int port) { u_long iomap[32]; @@ -128,13 +155,28 @@ static inline int port_access_full (unsigned short int port) { return 0; } -//#endif // defined HAVE_LIBI386 && defined HAVE_SYS_TYPES_H && defined HAVE_MACHINE_PIO_H +/* Close access to 3 ports: port (CONTROL), port+1 (STATUS) and port+2 (DATA) */ +static inline int port_deny_full (unsigned short int port) { + u_long iomap[32]; -// ------------------------------------------------------------- -// Last chance! Use /dev/io and i386 ASM code (BSD4.3 ?) + if (i386_get_ioperm(iomap) == -1) return -1; + + setaccess(iomap, port , 0); + setaccess(iomap, port+1, 0); + setaccess(iomap, port+2, 0); + + if (i386_set_ioperm(iomap) == -1) return -1; + + return 0; +} + +/* #endif // defined HAVE_LIBI386 && defined HAVE_SYS_TYPES_H && defined HAVE_MACHINE_PIO_H */ + +/* ------------------------------------------------------------- */ +/* Last chance! Use /dev/io and i386 ASM code (BSD4.3 ?) */ #else -// Read a byte from port +/* Read a byte from port */ static inline int port_in (unsigned short int port) { unsigned char value; __asm__ volatile ("inb %1,%0":"=a" (value) @@ -142,29 +184,39 @@ static inline int port_in (unsigned short int port) { return value; } -// Write a byte 'val' to port +/* Write a byte 'val' to port */ static inline void port_out (unsigned short int port, unsigned char val) { __asm__ volatile ("outb %0,%1\n"::"a" (val), "d" (port) ); } -// Get access to 3 ports: port (CONTROL), port+1 (STATUS) and port+2 (DATA) +/* Get access to 3 ports: port (CONTROL), port+1 (STATUS) and port+2 (DATA) */ static inline int port_access_full (unsigned short int port) { static FILE * port_access_handle = NULL ; if( port_access_handle || (port_access_handle = fopen("/dev/io", "rw")) != NULL ) { - return( 0 ); // Success + return( 0 ); /* Success */ } else { - return( -1 ); // Failure + return( -1 ); /* Failure */ }; return -1; } -// Get access to a specific port +/* Get access to a specific port */ static inline int port_access (unsigned short int port) { - return port_access_full(port); // /dev/io gives you access to all ports. + return port_access_full(port); /* /dev/io gives you access to all ports. */ +} + +/* Close access to 3 ports: port (CONTROL), port+1 (STATUS) and port+2 (DATA) */ +static inline int port_deny_full (unsigned short int port) { + /* Can't close /dev/io... */ +} + +/* Close access to a specific port */ +static inline int port_deny (unsigned short int port) { + /* Can't close /dev/io... */ } #endif @@ -189,4 +241,4 @@ port_out (unsigned int port, unsigned char val) #endif */ -#endif // PORT_H +#endif /* PORT_H */