[U-Boot] [PATCH v2][RFC] Add native win32 mkimage support

Add a mkimage_win32.exe build target which can produce a native win32 mkimage executable using the MinGW toolchain. The mkimage_win32.exe binary is generated when the MINGW_COMPILE environment variable is defined. The mkimage_win32.exe binary can be used by those who use Windows as an OS build environment but don't use cygwin.
Signed-off-by: Peter Tyser ptyser@xes-inc.com --- I'm not sure what the odds of this being picked up, but I thought others might find this useful.
Changes since v1: - Fixed "Engineering" typos
Makefile | 5 ++- README | 6 +++ include/image.h | 2 + include/libfdt_env.h | 6 +++ include/linux/types.h | 5 ++- tools/Makefile | 13 ++++++- tools/mingw_support.c | 95 +++++++++++++++++++++++++++++++++++++++++++++++++ tools/mingw_support.h | 48 +++++++++++++++++++++++++ tools/mkimage.c | 4 ++ tools/mkimage.h | 5 +++ 10 files changed, 185 insertions(+), 4 deletions(-) create mode 100644 tools/mingw_support.c create mode 100644 tools/mingw_support.h
diff --git a/Makefile b/Makefile index 84e6125..8fb59de 100644 --- a/Makefile +++ b/Makefile @@ -3447,8 +3447,9 @@ clean: $(obj)tools/envcrc \ $(obj)tools/gdb/{astest,gdbcont,gdbsend} \ $(obj)tools/gen_eth_addr $(obj)tools/img2srec \ - $(obj)tools/mkimage $(obj)tools/mpc86x_clk \ - $(obj)tools/ncb $(obj)tools/ubsha1 + $(obj)tools/mkimage $(obj)tools/mkimage_win32.exe \ + $(obj)tools/mpc86x_clk $(obj)tools/ncb \ + $(obj)tools/ubsha1 \ @rm -f $(obj)board/cray/L1/{bootscript.c,bootscript.image} \ $(obj)board/netstar/{eeprom,crcek,crcit,*.srec,*.bin} \ $(obj)board/trab/trab_fkt $(obj)board/voiceblue/eeprom \ diff --git a/README b/README index 522471c..96b8db7 100644 --- a/README +++ b/README @@ -2695,6 +2695,12 @@ 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 a WIN32 version of the mkimage tool + using the MinGW toolchain (see http://www.mingw.org) you must + also set the MINGW_COMPILE environment variable, for example: + + $ export MINGW_COMPILE=i586-mingw32msvc- + 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 4609200..ec6bb1a 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 ea474a5..bdc7a58 100644 --- a/include/libfdt_env.h +++ b/include/libfdt_env.h @@ -24,8 +24,10 @@ #ifdef USE_HOSTCC #include <stdint.h> #include <string.h> +#ifndef __MINGW32__ #include <endian.h> #include <byteswap.h> +#endif /* __MINGW32__ */ #else #include <linux/string.h> #include <linux/types.h> @@ -36,6 +38,10 @@ extern struct fdt_header *working_fdt; /* Pointer to the working fdt */
#if __BYTE_ORDER == __LITTLE_ENDIAN +#ifdef __MINGW32__ +extern uint32_t bswap_32(uint32_t x); +extern uint64_t bswap_64(uint64_t x); +#endif #define fdt32_to_cpu(x) bswap_32(x) #define cpu_to_fdt32(x) bswap_32(x) #define fdt64_to_cpu(x) bswap_64(x) diff --git a/include/linux/types.h b/include/linux/types.h index 1b0b4a4..90c0695 100644 --- a/include/linux/types.h +++ b/include/linux/types.h @@ -10,10 +10,13 @@
#ifndef __KERNEL_STRICT_NAMES
+#ifndef __MINGW32__ +/* prevent mingw overlaps for certain typedefs */ typedef __kernel_fd_set fd_set; typedef __kernel_dev_t dev_t; typedef __kernel_ino_t ino_t; typedef __kernel_mode_t mode_t; +#endif typedef __kernel_nlink_t nlink_t; typedef __kernel_off_t off_t; typedef __kernel_pid_t pid_t; @@ -54,7 +57,7 @@ typedef __kernel_loff_t loff_t; typedef __kernel_size_t size_t; #endif
-#ifndef _SSIZE_T +#if !defined(_SSIZE_T) && !defined(__MINGW32__) #define _SSIZE_T typedef __kernel_ssize_t ssize_t; #endif diff --git a/tools/Makefile b/tools/Makefile index 9e9ee15..64d4a3f 100644 --- a/tools/Makefile +++ b/tools/Makefile @@ -21,7 +21,8 @@ # MA 02111-1307 USA #
-BIN_FILES = img2srec$(SFX) mkimage$(SFX) envcrc$(SFX) ubsha1$(SFX) gen_eth_addr$(SFX) bmp_logo$(SFX) +BIN_FILES = img2srec$(SFX) mkimage$(SFX) mkimage_win32.exe envcrc$(SFX) \ + ubsha1$(SFX) gen_eth_addr$(SFX) bmp_logo$(SFX)
OBJ_LINKS = env_embedded.o crc32.o md5.o sha1.o image.o OBJ_FILES = img2srec.o mkimage.o envcrc.o ubsha1.o gen_eth_addr.o bmp_logo.o @@ -39,6 +40,9 @@ endif
LIBFDT_OBJ_FILES = $(obj)fdt.o $(obj)fdt_ro.o $(obj)fdt_rw.o $(obj)fdt_strerror.o $(obj)fdt_wip.o
+MKIMAGE_WIN32_SRC_FILES = $(src)mkimage.c $(src)mingw_support.c $(obj)crc32.c \ + $(obj)image.c $(obj)md5.c $(obj)sha1.c $(LIBFDT_OBJ_FILES:%.o=%.c) + LOGO_H = $(OBJTREE)/include/bmp_logo.h
ifeq ($(LOGO_BMP),) @@ -151,6 +155,13 @@ $(obj)mkimage$(SFX): $(obj)mkimage.o $(obj)crc32.o $(obj)image.o $(obj)md5.o $(o $(CC) $(CFLAGS) $(HOST_LDFLAGS) -o $@ $^ $(STRIP) $@
+# Build native win32 mkimage if mingw compiler is specified +ifneq ($(MINGW_COMPILE),) +$(obj)mkimage_win32.exe: $(MKIMAGE_WIN32_SRC_FILES) + $(MINGW_COMPILE)gcc $(FIT_CFLAGS) $(HOST_LDFLAGS) -o $@ $^ + $(MINGW_COMPILE)strip $@ +endif + $(obj)ncb$(SFX): $(obj)ncb.o $(CC) $(CFLAGS) $(HOST_LDFLAGS) -o $@ $^ $(STRIP) $@ diff --git a/tools/mingw_support.c b/tools/mingw_support.c new file mode 100644 index 0000000..237914b --- /dev/null +++ b/tools/mingw_support.c @@ -0,0 +1,95 @@ +/* + * 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> + +uint16_t bswap_16(uint16_t __x) +{ + return (__x >> 8) | (__x << 8); +} + +uint32_t bswap_32(uint32_t __x) +{ + return (bswap_16(__x & 0xffff) << 16) | (bswap_16(__x >> 16)); +} + +uint64_t bswap_64(uint64_t __x) +{ + return (((uint64_t) bswap_32(__x & 0xffffffff)) << 32) | + (bswap_32(__x >> 32)); +} + +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 0000000..b4011a6 --- /dev/null +++ b/tools/mingw_support.h @@ -0,0 +1,48 @@ +/* + * 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(l) ((DWORD)((DWORDLONG)(l))) +#define HIDWORD(l) ((DWORD)(((DWORDLONG)(l)>>32)&0xFFFFFFFF)) + +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.c b/tools/mkimage.c index 967fe9a..380b535 100644 --- a/tools/mkimage.c +++ b/tools/mkimage.c @@ -25,6 +25,10 @@ #include "mkimage.h" #include <image.h>
+#ifdef __MINGW32__ +#include "mingw_support.h" +#endif + extern int errno;
#ifndef MAP_FAILED diff --git a/tools/mkimage.h b/tools/mkimage.h index a2d5248..6974fa4 100644 --- a/tools/mkimage.h +++ b/tools/mkimage.h @@ -28,7 +28,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> @@ -65,6 +69,7 @@ typedef unsigned int __u32; typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned int uint32_t; +typedef unsigned long ulong;
#define ntohl(a) SWAP_LONG(a) #define htonl(a) SWAP_LONG(a)

On Friday 06 February 2009 16:22:01 Peter Tyser wrote:
Add a mkimage_win32.exe build target which can produce a native win32 mkimage executable using the MinGW toolchain. The mkimage_win32.exe binary is generated when the MINGW_COMPILE environment variable is defined. The mkimage_win32.exe binary can be used by those who use Windows as an OS build environment but don't use cygwin.
having to set magic env vars for one specific target kind of sucks. isnt there another way to do this ?
+uint16_t bswap_16(uint16_t __x) +{
- return (__x >> 8) | (__x << 8);
+}
+uint32_t bswap_32(uint32_t __x) +{
- return (bswap_16(__x & 0xffff) << 16) | (bswap_16(__x >> 16));
+}
+uint64_t bswap_64(uint64_t __x) +{
- return (((uint64_t) bswap_32(__x & 0xffffffff)) << 32) |
(bswap_32(__x >> 32));
+}
we already have random duplicate copies of these floating around, and not related to Windows. these funcs are really only reliable on Linux. like the attached i'm using in my own tree. -mike

On Fri, 2009-02-06 at 16:40 -0500, Mike Frysinger wrote:
On Friday 06 February 2009 16:22:01 Peter Tyser wrote:
Add a mkimage_win32.exe build target which can produce a native win32 mkimage executable using the MinGW toolchain. The mkimage_win32.exe binary is generated when the MINGW_COMPILE environment variable is defined. The mkimage_win32.exe binary can be used by those who use Windows as an OS build environment but don't use cygwin.
having to set magic env vars for one specific target kind of sucks. isnt there another way to do this ?
If others have a more clever way to do it I'd be happy to implement. I couldn't think of a way to cross compile for 2 non-native targets (u-boot target and windows) without setting 2 variables. I agree its a bit hokey though:) FWIW I generally only have CROSS_COMPILE set in my environment and then run "make MINGW_COMPILE=i586-mingw32msvc-" when I want to generate a new mkimage_win32.exe.
+uint16_t bswap_16(uint16_t __x) +{
- return (__x >> 8) | (__x << 8);
+}
+uint32_t bswap_32(uint32_t __x) +{
- return (bswap_16(__x & 0xffff) << 16) | (bswap_16(__x >> 16));
+}
+uint64_t bswap_64(uint64_t __x) +{
- return (((uint64_t) bswap_32(__x & 0xffffffff)) << 32) |
(bswap_32(__x >> 32));
+}
we already have random duplicate copies of these floating around, and not related to Windows. these funcs are really only reliable on Linux. like the attached i'm using in my own tree.
I don't follow. Are you suggesting I include a generic version in a header similar to the uswap.h you mentioned? Or are you suggesting the current implementation is prone to break? Or both?
Best, Peter

On Friday 06 February 2009 16:53:03 Peter Tyser wrote:
On Fri, 2009-02-06 at 16:40 -0500, Mike Frysinger wrote:
On Friday 06 February 2009 16:22:01 Peter Tyser wrote:
+uint16_t bswap_16(uint16_t __x) +{
- return (__x >> 8) | (__x << 8);
+}
+uint32_t bswap_32(uint32_t __x) +{
- return (bswap_16(__x & 0xffff) << 16) | (bswap_16(__x >> 16));
+}
+uint64_t bswap_64(uint64_t __x) +{
- return (((uint64_t) bswap_32(__x & 0xffffffff)) << 32) |
(bswap_32(__x >> 32));
+}
we already have random duplicate copies of these floating around, and not related to Windows. these funcs are really only reliable on Linux. like the attached i'm using in my own tree.
I don't follow. Are you suggesting I include a generic version in a header similar to the uswap.h you mentioned? Or are you suggesting the current implementation is prone to break? Or both?
i'm saying creating yet another duplicate copy of the swap macros is wasteful. create a common version already and use it. -mike
participants (2)
-
Mike Frysinger
-
Peter Tyser