commit bdfcf31d2b5c53bdb27f2e7529057fb83ab572ca
Author: B��sz��rm��nyi Zolt��n <zb@cybertec.at>
Date:   Sun May 26 16:49:24 2013 +0200

    Add WinCE (mingw32ce) support for superiotool.

diff --git a/.gitignore b/.gitignore
index e57e32f..2da6cc4 100644
--- a/.gitignore
+++ b/.gitignore
@@ -78,6 +78,7 @@ util/romcc/romcc
 util/romcc/tests/fail_test*.S
 util/romcc/tests/*.S-O2-mmmx
 util/superiotool/superiotool
+util/superiotool/superiotool.exe
 util/vgabios/testbios
 
 documentation/*.aux
diff --git a/util/superiotool/Makefile b/util/superiotool/Makefile
index 900b8ae..3ebf6d5 100644
--- a/util/superiotool/Makefile
+++ b/util/superiotool/Makefile
@@ -30,7 +30,6 @@ VERSION := -D'SUPERIOTOOL_VERSION="$(shell git describe 2>/dev/null)"'
 
 CFLAGS += -O2 -Wall -Wstrict-prototypes -Wundef -Wstrict-aliasing \
          -Werror-implicit-function-declaration -ansi -pedantic $(VERSION)
-LDFLAGS += -lz
 
 OBJS = superiotool.o serverengines.o ali.o fintek.o ite.o nsc.o nuvoton.o \
        smsc.o winbond.o infineon.o
@@ -52,28 +51,32 @@ endif
 
 # Support for PCI-attached "Super I/Os" (e.g. in VIA VT82686A/B).
 CONFIG_PCI = yes
+CONFIG_PCI_ZLIB = yes
 
 ifeq ($(CONFIG_PCI), yes)
 CFLAGS += -DPCI_SUPPORT
 LIBS += -lpci
+ifeq ($(CONFIG_PCI_ZLIB), yes)
+LIBS += -lz
+endif
 OBJS += pci.o via.o amd.o
 endif
 
-all: $(PROGRAM)
+all: $(PROGRAM)$(EXEEXT)
 
 superiotool.o: *.c superiotool.h
 
-$(PROGRAM): $(OBJS) superiotool.h
-	$(CC) $(LDFLAGS) -o $(PROGRAM) $(OBJS) $(LIBS)
+$(PROGRAM)$(EXEEXT): $(OBJS) superiotool.h
+	$(CC) $(LDFLAGS) -o $(PROGRAM)$(EXEEXT) $(OBJS) $(LIBS)
 
-install: $(PROGRAM)
+install: $(PROGRAM)$(EXEEXT)
 	mkdir -p $(DESTDIR)$(PREFIX)/sbin
-	$(INSTALL) $(PROGRAM) $(DESTDIR)$(PREFIX)/sbin
+	$(INSTALL) $(PROGRAM)$(EXEEXT) $(DESTDIR)$(PREFIX)/sbin
 	mkdir -p $(DESTDIR)$(PREFIX)/share/man/man8
 	$(INSTALL) $(PROGRAM).8 $(DESTDIR)$(PREFIX)/share/man/man8
 
 clean:
-	rm -f $(PROGRAM) *.o
+	rm -f $(PROGRAM)$(EXEEXT) *.o
 
 .PHONY: all install clean
 
diff --git a/util/superiotool/compile-mingwce.sh b/util/superiotool/compile-mingwce.sh
new file mode 100755
index 0000000..17da968
--- /dev/null
+++ b/util/superiotool/compile-mingwce.sh
@@ -0,0 +1,3 @@
+#!/bin/bash
+
+make CC=/opt/x86mingw32ce/bin/i386-mingw32ce-gcc CONFIG_PCI=yes CONFIG_PCI_ZLIB=yes EXEEXT=.exe $1
diff --git a/util/superiotool/mingwce-io.h b/util/superiotool/mingwce-io.h
new file mode 100644
index 0000000..b23b0bd
--- /dev/null
+++ b/util/superiotool/mingwce-io.h
@@ -0,0 +1,201 @@
+/*
+ * This file was copied from GLIBC on Fedora 18 and slightly modified.
+ * Windows CE allows direct I/O access and doesn't have/need iopl()/ioperm().
+ */
+
+/* Copyright (C) 1996-2012 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#ifndef	_SYS_IO_H
+#define	_SYS_IO_H	1
+
+/*
+ * There is no <features.h> in mingw32ce
+#include <features.h>
+ */
+
+/* __BEGIN_DECLS */
+
+#ifndef DONT_DEFINE_IOPL
+
+/* If TURN_ON is TRUE, request for permission to do direct i/o on the
+   port numbers in the range [FROM,FROM+NUM-1].  Otherwise, turn I/O
+   permission off for that range.  This call requires root privileges.
+
+   Portability note: not all Linux platforms support this call.  Most
+   platforms based on the PC I/O architecture probably will, however.
+   E.g., Linux/Alpha for Alpha PCs supports this.  */
+static inline int ioperm (unsigned long int __from, unsigned long int __num,
+                   int __turn_on)
+{
+	return 0;
+}
+
+/* Set the I/O privilege level to LEVEL.  If LEVEL>3, permission to
+   access any I/O port is granted.  This call requires root
+   privileges. */
+static inline int iopl (int __level)
+{
+	return 0;
+}
+
+#endif
+
+#if defined __GNUC__ && __GNUC__ >= 2
+
+static __inline unsigned char
+inb (unsigned short int __port)
+{
+  unsigned char _v;
+
+  __asm__ __volatile__ ("inb %w1,%0":"=a" (_v):"Nd" (__port));
+  return _v;
+}
+
+static __inline unsigned char
+inb_p (unsigned short int __port)
+{
+  unsigned char _v;
+
+  __asm__ __volatile__ ("inb %w1,%0\noutb %%al,$0x80":"=a" (_v):"Nd" (__port));
+  return _v;
+}
+
+static __inline unsigned short int
+inw (unsigned short int __port)
+{
+  unsigned short _v;
+
+  __asm__ __volatile__ ("inw %w1,%0":"=a" (_v):"Nd" (__port));
+  return _v;
+}
+
+static __inline unsigned short int
+inw_p (unsigned short int __port)
+{
+  unsigned short int _v;
+
+  __asm__ __volatile__ ("inw %w1,%0\noutb %%al,$0x80":"=a" (_v):"Nd" (__port));
+  return _v;
+}
+
+static __inline unsigned int
+inl (unsigned short int __port)
+{
+  unsigned int _v;
+
+  __asm__ __volatile__ ("inl %w1,%0":"=a" (_v):"Nd" (__port));
+  return _v;
+}
+
+static __inline unsigned int
+inl_p (unsigned short int __port)
+{
+  unsigned int _v;
+  __asm__ __volatile__ ("inl %w1,%0\noutb %%al,$0x80":"=a" (_v):"Nd" (__port));
+  return _v;
+}
+
+static __inline void
+outb (unsigned char __value, unsigned short int __port)
+{
+  __asm__ __volatile__ ("outb %b0,%w1": :"a" (__value), "Nd" (__port));
+}
+
+static __inline void
+outb_p (unsigned char __value, unsigned short int __port)
+{
+  __asm__ __volatile__ ("outb %b0,%w1\noutb %%al,$0x80": :"a" (__value),
+			"Nd" (__port));
+}
+
+static __inline void
+outw (unsigned short int __value, unsigned short int __port)
+{
+  __asm__ __volatile__ ("outw %w0,%w1": :"a" (__value), "Nd" (__port));
+
+}
+
+static __inline void
+outw_p (unsigned short int __value, unsigned short int __port)
+{
+  __asm__ __volatile__ ("outw %w0,%w1\noutb %%al,$0x80": :"a" (__value),
+			"Nd" (__port));
+}
+
+static __inline void
+outl (unsigned int __value, unsigned short int __port)
+{
+  __asm__ __volatile__ ("outl %0,%w1": :"a" (__value), "Nd" (__port));
+}
+
+static __inline void
+outl_p (unsigned int __value, unsigned short int __port)
+{
+  __asm__ __volatile__ ("outl %0,%w1\noutb %%al,$0x80": :"a" (__value),
+			"Nd" (__port));
+}
+
+static __inline void
+insb (unsigned short int __port, void *__addr, unsigned long int __count)
+{
+  __asm__ __volatile__ ("cld ; rep ; insb":"=D" (__addr), "=c" (__count)
+			:"d" (__port), "0" (__addr), "1" (__count));
+}
+
+static __inline void
+insw (unsigned short int __port, void *__addr, unsigned long int __count)
+{
+  __asm__ __volatile__ ("cld ; rep ; insw":"=D" (__addr), "=c" (__count)
+			:"d" (__port), "0" (__addr), "1" (__count));
+}
+
+static __inline void
+insl (unsigned short int __port, void *__addr, unsigned long int __count)
+{
+  __asm__ __volatile__ ("cld ; rep ; insl":"=D" (__addr), "=c" (__count)
+			:"d" (__port), "0" (__addr), "1" (__count));
+}
+
+static __inline void
+outsb (unsigned short int __port, const void *__addr,
+       unsigned long int __count)
+{
+  __asm__ __volatile__ ("cld ; rep ; outsb":"=S" (__addr), "=c" (__count)
+			:"d" (__port), "0" (__addr), "1" (__count));
+}
+
+static __inline void
+outsw (unsigned short int __port, const void *__addr,
+       unsigned long int __count)
+{
+  __asm__ __volatile__ ("cld ; rep ; outsw":"=S" (__addr), "=c" (__count)
+			:"d" (__port), "0" (__addr), "1" (__count));
+}
+
+static __inline void
+outsl (unsigned short int __port, const void *__addr,
+       unsigned long int __count)
+{
+  __asm__ __volatile__ ("cld ; rep ; outsl":"=S" (__addr), "=c" (__count)
+			:"d" (__port), "0" (__addr), "1" (__count));
+}
+
+#endif	/* GNU C */
+
+/* __END_DECLS */
+#endif /* _SYS_IO_H */
diff --git a/util/superiotool/superiotool.c b/util/superiotool/superiotool.c
index 5869cbf..2813334 100644
--- a/util/superiotool/superiotool.c
+++ b/util/superiotool/superiotool.c
@@ -313,6 +313,7 @@ int main(int argc, char *argv[])
 		}
 	}
 
+#ifndef __COREDLL__
 #if defined(__FreeBSD__)
 	if ((io_fd = open("/dev/io", O_RDWR)) < 0) {
 		perror("/dev/io");
@@ -323,6 +324,7 @@ int main(int argc, char *argv[])
 		printf("Superiotool must be run as root.\n");
 		exit(1);
 	}
+#endif
 
 	print_version();
 
diff --git a/util/superiotool/superiotool.h b/util/superiotool/superiotool.h
index d8dd928..624b933 100644
--- a/util/superiotool/superiotool.h
+++ b/util/superiotool/superiotool.h
@@ -29,7 +29,10 @@
 #include <stdint.h>
 #include <string.h>
 #include <getopt.h>
-#if defined(__GLIBC__)
+#if defined(__COREDLL__)
+#define DONT_DEFINE_IOPL 1
+#include "mingwce-io.h"
+#elif defined(__GLIBC__)
 #include <sys/io.h>
 #endif
 #if (defined(__MACH__) && defined(__APPLE__))
