Index: winbond.c
===================================================================
--- winbond.c	(revision 3697)
+++ winbond.c	(working copy)
@@ -470,18 +470,18 @@
 
 static void enter_conf_mode_winbond_88(uint16_t port)
 {
-	outb(0x88, port);
+	OUTB(0x88, port);
 }
 
 static void enter_conf_mode_winbond_89(uint16_t port)
 {
-	outb(0x89, port);
+	OUTB(0x89, port);
 }
 
 static void enter_conf_mode_winbond_86(uint16_t port)
 {
-	outb(0x86, port);
-	outb(0x86, port);
+	OUTB(0x86, port);
+	OUTB(0x86, port);
 }
 
 static void probe_idregs_winbond_helper(const char *init, uint16_t port)
Index: ite.c
===================================================================
--- ite.c	(revision 3697)
+++ ite.c	(working copy)
@@ -482,10 +482,10 @@
  */
 static void enter_conf_mode_ite(uint16_t port)
 {
-	outb(0x87, port);
-	outb(0x01, port);
-	outb(0x55, port);
-	outb((port == 0x2e) ? 0x55 : 0xaa, port);
+	OUTB(0x87, port);
+	OUTB(0x01, port);
+	OUTB(0x55, port);
+	OUTB((port == 0x2e) ? 0x55 : 0xaa, port);
 }
 
 static void exit_conf_mode_ite(uint16_t port)
Index: nsc.c
===================================================================
--- nsc.c	(revision 3697)
+++ nsc.c	(working copy)
@@ -479,21 +479,21 @@
 
 	probing_for("NSC", "", port);
 
-	outb(CHIP_ID_REG, port);
-	if (inb(port) != CHIP_ID_REG) {
+	OUTB(CHIP_ID_REG, port);
+	if (INB(port) != CHIP_ID_REG) {
 		if (verbose)
 			printf(NOTFOUND "port=0x%02x, port+1=0x%02x\n",
-			       inb(port), inb(port + 1));
+			       INB(port), INB(port + 1));
 		return;
 	}
-	id = inb(port + 1);
+	id = INB(port + 1);
 
-	outb(CHIP_REV_REG, port);
-	if (inb(port) != CHIP_REV_REG) {
+	OUTB(CHIP_REV_REG, port);
+	if (INB(port) != CHIP_REV_REG) {
 		printf("Warning: Can't get chip revision. Setting to 0xff.\n");
 		rev = 0xff;
 	} else {
-		rev = inb(port + 1);
+		rev = INB(port + 1);
 	}
 
 	if (superio_unknown(reg_table, id)) {
Index: superiotool.c
===================================================================
--- superiotool.c	(revision 3697)
+++ superiotool.c	(working copy)
@@ -23,6 +23,11 @@
 
 #include "superiotool.h"
 
+#if defined(__FreeBSD__)
+#include <fcntl.h>
+#include <unistd.h>
+#endif
+
 /* Command line options. */
 int dump = 0, verbose = 0, extra_dump = 0;
 
@@ -31,25 +36,25 @@
 
 uint8_t regval(uint16_t port, uint8_t reg)
 {
-	outb(reg, port);
-	return inb(port + ((port == 0x3bd) ? 2 : 1)); /* 0x3bd is special. */
+	OUTB(reg, port);
+	return INB(port + ((port == 0x3bd) ? 2 : 1)); /* 0x3bd is special. */
 }
 
 void regwrite(uint16_t port, uint8_t reg, uint8_t val)
 {
-	outb(reg, port);
-	outb(val, port + 1);
+	OUTB(reg, port);
+	OUTB(val, port + 1);
 }
 
 void enter_conf_mode_winbond_fintek_ite_8787(uint16_t port)
 {
-	outb(0x87, port);
-	outb(0x87, port);
+	OUTB(0x87, port);
+	OUTB(0x87, port);
 }
 
 void exit_conf_mode_winbond_fintek_ite_8787(uint16_t port)
 {
-	outb(0xaa, port);		/* Fintek, Winbond */
+	OUTB(0xaa, port);		/* Fintek, Winbond */
 	regwrite(port, 0x02, 0x02);	/* ITE */
 }
 
@@ -204,6 +209,9 @@
 int main(int argc, char *argv[])
 {
 	int i, j, opt, option_index;
+#ifdef __FreeBSD__
+	int io_fd;
+#endif
 
 	static const struct option long_options[] = {
 		{"dump",		no_argument, NULL, 'd'},
@@ -247,8 +255,13 @@
 		}
 	}
 
+#if defined(__FreeBSD__)
+	if ((io_fd = open("/dev/io", O_RDWR)) < 0) {
+		perror("/dev/io");
+#else
 	if (iopl(3) < 0) {
 		perror("iopl");
+#endif
 		printf("Superiotool must be run as root.\n");
 		exit(1);
 	}
@@ -264,5 +277,8 @@
 	if (!chip_found)
 		printf("No Super I/O found\n");
 
+#ifdef __FreeBSD__
+	close(io_fd);
+#endif
 	return 0;
 }
Index: ali.c
===================================================================
--- ali.c	(revision 3697)
+++ ali.c	(working copy)
@@ -60,13 +60,13 @@
 
 static void enter_conf_mode_ali(uint16_t port)
 {
-	outb(0x51, port);
-	outb(0x23, port);
+	OUTB(0x51, port);
+	OUTB(0x23, port);
 }
 
 static void exit_conf_mode_ali(uint16_t port)
 {
-	outb(0xbb, port);
+	OUTB(0xbb, port);
 }
 
 void probe_idregs_ali(uint16_t port)
Index: smsc.c
===================================================================
--- smsc.c	(revision 3697)
+++ smsc.c	(working copy)
@@ -608,13 +608,13 @@
 	 * in the assumption that the extra 0x55 won't hurt the other
 	 * Super I/Os. This is verified to be true on (at least) the FDC37N769.
 	 */
-	outb(0x55, port);
-	outb(0x55, port);
+	OUTB(0x55, port);
+	OUTB(0x55, port);
 }
 
 static void exit_conf_mode_smsc(uint16_t port)
 {
-	outb(0xaa, port);
+	OUTB(0xaa, port);
 }
 
 static void probe_idregs_smsc_helper(uint16_t port, uint8_t idreg,
Index: superiotool.h
===================================================================
--- superiotool.h	(revision 3697)
+++ superiotool.h	(working copy)
@@ -28,8 +28,29 @@
 #include <stdint.h>
 #include <string.h>
 #include <getopt.h>
+#if defined(__GLIBC__)
 #include <sys/io.h>
+#endif
 
+#ifdef __FreeBSD__
+  #include <sys/types.h>
+  #include <machine/cpufunc.h>
+
+  #define OUTB(x, y) do { u_int tmp = (y); outb(tmp, (x)); } while (0)
+  #define OUTW(x, y) do { u_int tmp = (y); outw(tmp, (x)); } while (0)
+  #define OUTL(x, y) do { u_int tmp = (y); outl(tmp, (x)); } while (0)
+  #define INB(x) __extension__ ({ u_int tmp = (x); inb(tmp); })
+  #define INW(x) __extension__ ({ u_int tmp = (x); inw(tmp); })
+  #define INL(x) __extension__ ({ u_int tmp = (x); inl(tmp); })
+#else
+  #define OUTB outb
+  #define OUTW outw
+  #define OUTL outl
+  #define INB  inb
+  #define INW  inw
+  #define INL  inl
+#endif
+
 #define USAGE "Usage: superiotool [-d] [-e] [-l] [-V] [-v] [-h]\n\n\
   -d | --dump            Dump Super I/O register contents\n\
   -e | --extra-dump      Dump secondary registers too (e.g. EC registers)\n\
