diff --git a/README b/README
index fcc4d7c5f377b9ce5369df35f4039aa096024236..142dbccec1a5ad76d8ff0ce8a8fa540c0fa4a58b 100644
--- a/README
+++ b/README
@@ -2716,6 +2716,16 @@ necessary. For example using the ELDK on a 4xx CPU, please enter:
 	$ CROSS_COMPILE=ppc_4xx-
 	$ export CROSS_COMPILE
 
+Note: If you wish to generate Windows versions of the utilities in
+      the tools directory you can use the MinGW toolchain
+      (http://www.mingw.org).  Set your HOST tools to the MinGW
+      toolchain and execute 'make tools'.  For example:
+
+       $ make HOSTCC=i586-mingw32msvc-gcc HOSTSTRIP=i586-mingw32msvc-strip tools
+
+      Binaries such as tools/mkimage.exe will be created which can
+      be executed on computers running Windows.
+
 U-Boot is intended to be simple to build. After installing the
 sources you must configure U-Boot for one specific board type. This
 is done by typing:
diff --git a/include/image.h b/include/image.h
index 74a1240069927220947bf6075deffe806bcf3b63..f183757c8530c44faf8f5edac95b95df26f92f17 100644
--- a/include/image.h
+++ b/include/image.h
@@ -34,7 +34,9 @@
 #define __IMAGE_H__
 
 #if USE_HOSTCC
+#ifndef __MINGW32__
 #include <endian.h>
+#endif
 
 /* new uImage format support enabled on host */
 #define CONFIG_FIT		1
diff --git a/include/libfdt_env.h b/include/libfdt_env.h
index ea474a56b1299e46f3948835fbcab1e2786c65ae..1c67015a4a9a349a9301084fa32dae98e09421db 100644
--- a/include/libfdt_env.h
+++ b/include/libfdt_env.h
@@ -24,8 +24,13 @@
 #ifdef USE_HOSTCC
 #include <stdint.h>
 #include <string.h>
+#ifdef __MINGW32__
+#include <linux/types.h>
+#include <linux/byteorder/swab.h>
+#else
 #include <endian.h>
 #include <byteswap.h>
+#endif /* __MINGW32__ */
 #else
 #include <linux/string.h>
 #include <linux/types.h>
@@ -36,10 +41,17 @@
 extern struct fdt_header *working_fdt;  /* Pointer to the working fdt */
 
 #if __BYTE_ORDER == __LITTLE_ENDIAN
+#ifdef __MINGW32__
+#define fdt32_to_cpu(x)		___swab32(x)
+#define cpu_to_fdt32(x)		___swab32(x)
+#define fdt64_to_cpu(x)		___swab64(x)
+#define cpu_to_fdt64(x)		___swab64(x)
+#else
 #define fdt32_to_cpu(x)		bswap_32(x)
 #define cpu_to_fdt32(x)		bswap_32(x)
 #define fdt64_to_cpu(x)		bswap_64(x)
 #define cpu_to_fdt64(x)		bswap_64(x)
+#endif
 #else
 #define fdt32_to_cpu(x)		(x)
 #define cpu_to_fdt32(x)		(x)
diff --git a/tools/Makefile b/tools/Makefile
index 9fe5b1a0f9baec9f8bd592c0c0300238e5a90a96..122e5bb7bb31bd8607cd7a029dea4a89a1d6b602 100644
--- a/tools/Makefile
+++ b/tools/Makefile
@@ -46,12 +46,15 @@ else
 HOST_CFLAGS += -pedantic
 endif
 
+ifeq ($(HOSTOS),cygwin)
+HOST_CFLAGS += -ansi
+endif
+
 #
-# Cygwin needs .exe files :-(
+# toolchains targeting win32 generate .exe files
 #
-ifeq ($(HOSTOS),cygwin)
+ifneq (,$(findstring WIN32 ,$(shell $(HOSTCC) -E -dM -xc /dev/null)))
 SFX = .exe
-HOST_CFLAGS += -ansi
 else
 SFX =
 endif
@@ -90,6 +93,7 @@ OBJ_FILES-$(CONFIG_LCD_LOGO) += bmp_logo.o
 OBJ_FILES-$(CONFIG_VIDEO_LOGO) += bmp_logo.o
 OBJ_FILES-$(CONFIG_INCA_IP) += inca-swap-bytes.o
 OBJ_FILES-$(CONFIG_NETCONSOLE) += ncb.o
+OBJ_FILES-y += os_support.o
 
 # Don't build by default
 #ifeq ($(ARCH),ppc)
@@ -125,13 +129,15 @@ LIBFDT_OBJS	:= $(addprefix $(obj),$(LIBFDT_OBJ_FILES-y))
 
 #
 # Use native tools and options
+# Define __KERNEL_STRICT_NAMES to prevent typedef overlaps
 #
 CPPFLAGS   = -idirafter $(SRCTREE)/include \
 		-idirafter $(OBJTREE)/include2 \
 		-idirafter $(OBJTREE)/include \
 	        -I $(SRCTREE)/libfdt \
 		-I $(SRCTREE)/tools \
-		-DTEXT_BASE=$(TEXT_BASE) -DUSE_HOSTCC
+		-DTEXT_BASE=$(TEXT_BASE) -DUSE_HOSTCC \
+		-D__KERNEL_STRICT_NAMES
 CFLAGS     = $(HOST_CFLAGS) $(CPPFLAGS) -O
 
 # No -pedantic switch to avoid libfdt compilation warnings
@@ -147,7 +153,7 @@ all:	$(obj).depend $(BINS) $(LOGO-y) subdirs
 $(obj)envcrc$(SFX):	$(obj)envcrc.o $(obj)crc32.o $(obj)env_embedded.o $(obj)sha1.o
 	$(CC) $(CFLAGS) -o $@ $^
 
-$(obj)ubsha1$(SFX):	$(obj)ubsha1.o $(obj)sha1.o
+$(obj)ubsha1$(SFX):	$(obj)ubsha1.o $(obj)sha1.o $(obj)os_support.o
 	$(CC) $(CFLAGS) -o $@ $^
 
 $(obj)img2srec$(SFX):	$(obj)img2srec.o
@@ -155,7 +161,7 @@ $(obj)img2srec$(SFX):	$(obj)img2srec.o
 	$(STRIP) $@
 
 $(obj)mkimage$(SFX):	$(obj)mkimage.o $(obj)crc32.o $(obj)image.o $(obj)md5.o \
-			$(obj)sha1.o $(LIBFDT_OBJS)
+			$(obj)sha1.o $(LIBFDT_OBJS) $(obj)os_support.o
 	$(CC) $(CFLAGS) $(HOST_LDFLAGS) -o $@ $^
 	$(STRIP) $@
 
@@ -183,13 +189,16 @@ $(obj)bin2header$(SFX): $(obj)bin2header.o
 	$(CC) $(CFLAGS) $(HOST_LDFLAGS) -o $@ $^
 	$(STRIP) $@
 
-# image.c and mkimage.c require FIT_CFLAGS instead of standard CFLAGS
+# Some files complain if compiled with -pedantic, use FIT_CFLAGS
 $(obj)image.o: $(SRCTREE)/tools/image.c
 	$(CC) -g $(FIT_CFLAGS) -c -o $@ $<
 
 $(obj)mkimage.o: $(SRCTREE)/tools/mkimage.c
 	$(CC) -g $(FIT_CFLAGS) -c -o $@ $<
 
+$(obj)os_support.o: $(SRCTREE)/tools/os_support.c
+	$(CC) -g $(FIT_CFLAGS) -c -o $@ $<
+
 # Some of the tool objects need to be accessed from outside the tools directory
 $(obj)%.o: $(SRCTREE)/common/%.c
 	$(CC) -g $(FIT_CFLAGS) -c -o $@ $<
diff --git a/tools/mingw_support.c b/tools/mingw_support.c
new file mode 100644
index 0000000000000000000000000000000000000000..67cd6e115f482297052f121f82b0e0076a345008
--- /dev/null
+++ b/tools/mingw_support.c
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2008 Extreme Engineering Solutions, Inc.
+ *
+ * mmap/munmap implementation derived from:
+ * Clamav Native Windows Port : mmap win32 compatibility layer
+ * Copyright (c) 2005-2006 Gianluigi Tiesi <sherpya@netfarm.it>
+ * Parts by Kees Zeelenberg <kzlg@users.sourceforge.net> (LibGW32C)
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this software; if not, write to the
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "mingw_support.h"
+#include <stdio.h>
+#include <stdint.h>
+#include <errno.h>
+#include <io.h>
+
+int fsync(int fd)
+{
+	return _commit(fd);
+}
+
+void *mmap(void *addr, size_t len, int prot, int flags, int fd, int offset)
+{
+	void *map = NULL;
+	HANDLE handle = INVALID_HANDLE_VALUE;
+	DWORD cfm_flags = 0, mvf_flags = 0;
+
+	switch (prot) {
+	case PROT_READ | PROT_WRITE:
+		cfm_flags = PAGE_READWRITE;
+		mvf_flags = FILE_MAP_ALL_ACCESS;
+		break;
+	case PROT_WRITE:
+		cfm_flags = PAGE_READWRITE;
+		mvf_flags = FILE_MAP_WRITE;
+		break;
+	case PROT_READ:
+		cfm_flags = PAGE_READONLY;
+		mvf_flags = FILE_MAP_READ;
+		break;
+	default:
+		return MAP_FAILED;
+	}
+
+	handle = CreateFileMappingA((HANDLE) _get_osfhandle(fd), NULL,
+				cfm_flags, HIDWORD(len), LODWORD(len), NULL);
+	if (!handle)
+		return MAP_FAILED;
+
+	map = MapViewOfFile(handle, mvf_flags, HIDWORD(offset),
+			LODWORD(offset), len);
+	CloseHandle(handle);
+
+	if (!map)
+		return MAP_FAILED;
+
+	return map;
+}
+
+int munmap(void *addr, size_t len)
+{
+	if (!UnmapViewOfFile(addr))
+		return -1;
+
+	return 0;
+}
diff --git a/tools/mingw_support.h b/tools/mingw_support.h
new file mode 100644
index 0000000000000000000000000000000000000000..1fb6c93824cb56c355d868c49788caef33b925e1
--- /dev/null
+++ b/tools/mingw_support.h
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2008 Extreme Engineering Solutions, Inc.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this software; if not, write to the
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef __MINGW_SUPPORT_H_
+#define __WINGW_SUPPORT_H_	1
+
+/* Defining __INSIDE_MSYS__ helps to prevent u-boot/mingw overlap */
+#define __INSIDE_MSYS__	1
+
+#include <windows.h>
+
+/* mmap protections */
+#define PROT_READ	0x1		/* Page can be read */
+#define PROT_WRITE	0x2		/* Page can be written */
+#define PROT_EXEC	0x4		/* Page can be executed */
+#define PROT_NONE	0x0		/* Page can not be accessed */
+
+/* Sharing types (must choose one and only one of these) */
+#define MAP_SHARED	0x01		/* Share changes */
+#define MAP_PRIVATE	0x02		/* Changes are private */
+
+/* Return value of `mmap' in case of an error */
+#define MAP_FAILED	((void *) -1)
+
+/* Windows 64-bit access macros */
+#define LODWORD(x) ((DWORD)((DWORDLONG)(x)))
+#define HIDWORD(x) ((DWORD)(((DWORDLONG)(x) >> 32) & 0xffffffff))
+
+typedef	UINT	uint;
+typedef	ULONG	ulong;
+
+int fsync(int fd);
+void *mmap(void *, size_t, int, int, int, int);
+int munmap(void *, size_t);
+
+#endif /* __MINGW_SUPPORT_H_ */
diff --git a/tools/mkimage.h b/tools/mkimage.h
index a2d5248943d578c809e200f01c90591753a068ea..c8df6e1f64f95282fb35207090b542816ff54f9e 100644
--- a/tools/mkimage.h
+++ b/tools/mkimage.h
@@ -20,6 +20,7 @@
  * MA 02111-1307 USA
  */
 
+#include "os_support.h"
 #include <errno.h>
 #include <fcntl.h>
 #include <stdio.h>
@@ -28,7 +29,11 @@
 #ifndef __WIN32__
 #include <netinet/in.h>		/* for host / network byte order conversions	*/
 #endif
+#ifdef __MINGW32__
+#include <stdint.h>
+#else
 #include <sys/mman.h>
+#endif
 #include <sys/stat.h>
 #include <time.h>
 #include <unistd.h>
diff --git a/tools/os_support.c b/tools/os_support.c
new file mode 100644
index 0000000000000000000000000000000000000000..001fe6476436db9e3022df5de465c35772a03076
--- /dev/null
+++ b/tools/os_support.c
@@ -0,0 +1,24 @@
+/*
+ * Copyright 2009 Extreme Engineering Solutions, Inc.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this software; if not, write to the
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/*
+ * Include additional files required for supporting different operating systems
+ */
+#ifdef __MINGW32__
+#include "mingw_support.c"
+#endif
diff --git a/tools/os_support.h b/tools/os_support.h
new file mode 100644
index 0000000000000000000000000000000000000000..f6f86b04d5749e70dbfc3375623135f4bb79f043
--- /dev/null
+++ b/tools/os_support.h
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2009 Extreme Engineering Solutions, Inc.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this software; if not, write to the
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef __OS_SUPPORT_H_
+#define __OS_SUPPORT_H_
+
+/*
+ * Include additional files required for supporting different operating systems
+ */
+#ifdef __MINGW32__
+#include "mingw_support.h"
+#endif
+
+#endif /* __OS_SUPPORT_H_ */
diff --git a/tools/ubsha1.c b/tools/ubsha1.c
index b37b2b72242ad561d568878f62c470ab6f5eea55..c4203ed99e3da8e55fcb93c4a1edd09d132530e6 100644
--- a/tools/ubsha1.c
+++ b/tools/ubsha1.c
@@ -21,13 +21,16 @@
  * MA 02111-1307 USA
  */
 
+#include "os_support.h"
 #include <stdio.h>
 #include <stdlib.h>
 #include <unistd.h>
 #include <fcntl.h>
 #include <errno.h>
 #include <string.h>
+#ifndef __MINGW32__
 #include <sys/mman.h>
+#endif
 #include <sys/stat.h>
 #include "sha1.h"