Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F140045983
D14056.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
25 KB
Referenced Files
None
Subscribers
None
D14056.diff
View Options
Index: tools/tools/mkubootimage/Makefile
===================================================================
--- /dev/null
+++ tools/tools/mkubootimage/Makefile
@@ -0,0 +1,9 @@
+# $NetBSD: Makefile,v 1.3 2012/12/02 02:21:29 reed Exp $
+# $FreeBSD$
+
+PROG= mkubootimage
+SRCS= mkubootimage.c crc32.c
+
+CWARNFLAGS.clang+= -Wno-conversion
+
+.include <bsd.prog.mk>
Index: tools/tools/mkubootimage/crc32.c
===================================================================
--- /dev/null
+++ tools/tools/mkubootimage/crc32.c
@@ -0,0 +1,119 @@
+/* $NetBSD: crc32.c,v 1.4 2012/12/29 16:18:08 jmcneill Exp $ */
+
+/*-
+ * Copyright (c) 2002 Marcel Moolenaar
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * CRC32 code derived from work by Gary S. Brown.
+ */
+
+#if HAVE_NBTOOL_CONFIG_H
+#include "nbtool_config.h"
+#endif
+
+#include <sys/cdefs.h>
+__RCSID("$NetBSD: crc32.c,v 1.4 2012/12/29 16:18:08 jmcneill Exp $");
+
+#include <sys/types.h>
+#include <sys/uio.h>
+#include <stdint.h>
+
+uint32_t crc32(const void *, size_t);
+uint32_t crc32v(const struct iovec *, int);
+
+static uint32_t crc32_tab[] = {
+ 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
+ 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
+ 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
+ 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
+ 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
+ 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
+ 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,
+ 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
+ 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
+ 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
+ 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,
+ 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
+ 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,
+ 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
+ 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
+ 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
+ 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,
+ 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
+ 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,
+ 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
+ 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
+ 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
+ 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,
+ 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
+ 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
+ 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
+ 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,
+ 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
+ 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
+ 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
+ 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
+ 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
+ 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,
+ 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
+ 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
+ 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
+ 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,
+ 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
+ 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
+ 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
+ 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
+ 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
+ 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
+};
+
+uint32_t
+crc32v(const struct iovec *iov, int cnt)
+{
+ const uint8_t *p;
+ uint32_t crc;
+ int i, len;
+
+ crc = ~0U;
+
+ for (i = 0; i < cnt; i++) {
+ p = iov[i].iov_base;
+ len = iov[i].iov_len;
+ while (len--)
+ crc = crc32_tab[(crc ^ *p++) & 0xFF] ^ (crc >> 8);
+ }
+
+ return crc ^ ~0U;
+}
+
+uint32_t
+crc32(const void *buf, size_t size)
+{
+ struct iovec iov[1];
+
+ iov[0].iov_base = __DECONST(void *, buf);
+ iov[0].iov_len = size;
+
+ return crc32v(iov, 1);
+}
Index: tools/tools/mkubootimage/mkubootimage.1
===================================================================
--- /dev/null
+++ tools/tools/mkubootimage/mkubootimage.1
@@ -0,0 +1,169 @@
+.\" $NetBSD: mkubootimage.1,v 1.8 2014/09/30 10:30:35 wiz Exp $
+.\"
+.\" Copyright (c) 2012 The NetBSD Foundation, Inc.
+.\" All rights reserved.
+.\"
+.\" This code is derived from software contributed to The NetBSD Foundation
+.\" by Jeremy C. Reed
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\" notice, this list of conditions and the following disclaimer in the
+.\" documentation and/or other materials provided with the distribution.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+.\" PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+.\" BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+.\" POSSIBILITY OF SUCH DAMAGE.
+.\"
+.Dd September 30, 2014
+.Dt MKUBOOTIMAGE 1
+.Os
+.Sh NAME
+.Nm mkubootimage
+.Nd create U-Boot loader image
+.Sh SYNOPSIS
+.Nm
+.Op Fl h
+.Fl A No ( arm Ns | Ns arm64 Ns | Ns i386 Ns | Ns mips Ns | Ns mips64 Ns | Ns or1k Ns | Ns powerpc )
+.Fl a Ar address
+.Op Fl C No Po bz2 Ns | Ns gz Ns | Ns lzma Ns | Ns lzo Ns | Ns none Pc
+.Op Fl E Ar address
+.Op Fl e Ar address
+.Op Fl m Ar magic
+.Fl n Ar image
+.Op Fl O No Po freebsd Ns | Ns linux Ns | Ns netbsd Ns | Ns openbsd Pc
+.Fl T No ( fs Ns | Ns kernel Ns | Ns ramdisk Ns | Ns standalone )
+.Ar source destination
+.\"
+.Sh DESCRIPTION
+The
+.Nm
+utility is used to create an image for Das U-Boot, the
+.Qq Universal Boot Loader .
+.Pp
+The arguments are as follows:
+.Bl -tag -width indent
+.It Fl A No ( arm Ns | Ns arm64 Ns | Ns i386 Ns | Ns mips Ns | Ns mips64 Ns | Ns or1k Ns | Ns powerpc )
+Defines the architecture.
+This is required.
+.It Fl a Ar address
+Sets the image load address.
+This is an integer between 0 and
+.Dv UINT32_MAX .
+This is required.
+.It Fl C No ( bz2 Ns | Ns gz Ns | Ns lzma Ns | Ns lzo Ns | Ns none )
+Defines the compression.
+The default is
+.Qq none .
+.It Fl E Ar address
+Define the entry point.
+This is an integer between 0 and
+.Dv UINT32_MAX .
+This option is the same as
+.Fl e
+but it inverts the bytes to convert the 32 bit integer
+from little to big endian (or vice versa).
+If
+.Fl E
+or
+.Fl e
+are not set, the entry point defaults to the
+image load address
+.Pq Fl a .
+.It Fl e Ar address
+Define the entry point.
+This is an integer between 0 and
+.Dv UINT32_MAX .
+If
+.Fl E
+or
+.Fl e
+are not set, the entry point defaults to the
+image load address
+.Pq Fl a .
+.It Fl h
+Display the usage and exit.
+.It Fl m Ar magic
+Set the magic.
+This is an integer between 0 and
+.Dv UINT32_MAX .
+The default is
+.Qq 0x27051956 .
+.It Fl n Ar image
+Defines the image name.
+This is required.
+.It Fl O No ( freebsd Ns | Ns linux Ns | Ns netbsd Ns | Ns openbsd )
+Defines the operating system type.
+The default OS name is
+.Qq netbsd .
+.It Fl T No ( fs Ns | Ns kernel Ns | Ns ramdisk Ns | Ns standalone Ns | Ns script )
+Defines the image type.
+This is required.
+.El
+.Pp
+The required
+.Ar source
+argument is the filename of the kernel that is read.
+The required
+.Ar destination
+argument is the filename of the image file that is created.
+.\"
+.Sh RETURN VALUES
+.Nm
+returns 1 on failure to read the kernel,
+generate a header, or create the image.
+.\"
+.Sh EXAMPLES
+Before the image is written, the header is displayed to standard out;
+for example:
+.Bd -literal -offset 0
+ magic: 0x27051956
+ time: Tue Jun 7 15:58:41 2011
+ size: 2482203
+ load addr: 0x00020000
+ entry point: 0x00020000
+ data crc: 0x700fdf53
+ os: 2 (netbsd)
+ arch: 7 (powerpc)
+ type: 2 (kernel)
+ comp: 1 (gz)
+ name: NetBSD/evbppc 5.99.52 (INSTALL_PMPPC)
+ header crc: 0x94ea96cf
+.Ed
+.\" TODO: check the name line above
+.\" .Sh FILES
+.Sh SEE ALSO
+.Qq Das U-Boot - the Universal Boot Loader
+.Pa http://www.denx.de/wiki/U-Boot/
+.\"
+.\" .Sh STANDARDS
+.\"
+.Sh HISTORY
+The
+.Nm
+command first appeared in
+.Nx 6.0 .
+.\"
+.Sh AUTHORS
+.An -nosplit
+The
+.Nm
+utility was originally written by
+.An Jared D. McNeill .
+This manual page was written by
+.An Jeremy C. Reed .
+.\" .Sh CAVEATS
+.\" .Sh BUGS
+.\" .Sh SECURITY CONSIDERATIONS
Index: tools/tools/mkubootimage/mkubootimage.c
===================================================================
--- /dev/null
+++ tools/tools/mkubootimage/mkubootimage.c
@@ -0,0 +1,460 @@
+/* $NetBSD: mkubootimage.c,v 1.18 2014/09/30 10:21:50 msaitoh Exp $ */
+
+/*-
+ * Copyright (c) 2010 Jared D. McNeill <jmcneill@invisible.ca>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#if HAVE_NBTOOL_CONFIG_H
+#include "nbtool_config.h"
+#endif
+
+#include <sys/cdefs.h>
+__RCSID("$NetBSD: mkubootimage.c,v 1.18 2014/09/30 10:21:50 msaitoh Exp $");
+
+#include <sys/mman.h>
+#include <sys/stat.h>
+#include <sys/endian.h>
+#include <sys/uio.h>
+#include <err.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <limits.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <unistd.h>
+
+#include "uboot.h"
+
+#ifndef __arraycount
+#define __arraycount(__x) (sizeof(__x) / sizeof(__x[0]))
+#endif
+
+extern uint32_t crc32(const void *, size_t);
+extern uint32_t crc32v(const struct iovec *, int);
+
+static enum uboot_image_os image_os = IH_OS_NETBSD;
+static enum uboot_image_arch image_arch = IH_ARCH_UNKNOWN;
+static enum uboot_image_type image_type = IH_TYPE_UNKNOWN;
+static enum uboot_image_comp image_comp = IH_COMP_NONE;
+static uint32_t image_loadaddr = 0;
+static uint32_t image_entrypoint = 0;
+static char *image_name;
+static uint32_t image_magic = IH_MAGIC;
+
+static const struct uboot_os {
+ enum uboot_image_os os;
+ const char *name;
+} uboot_os[] = {
+ { IH_OS_OPENBSD, "openbsd" },
+ { IH_OS_NETBSD, "netbsd" },
+ { IH_OS_FREEBSD, "freebsd" },
+ { IH_OS_LINUX, "linux" },
+};
+
+static enum uboot_image_os
+get_os(const char *name)
+{
+ unsigned int i;
+
+ for (i = 0; i < __arraycount(uboot_os); i++) {
+ if (strcmp(uboot_os[i].name, name) == 0)
+ return uboot_os[i].os;
+ }
+
+ return IH_OS_UNKNOWN;
+}
+
+static const char *
+get_os_name(enum uboot_image_os os)
+{
+ unsigned int i;
+
+ for (i = 0; i < __arraycount(uboot_os); i++) {
+ if (uboot_os[i].os == os)
+ return uboot_os[i].name;
+ }
+
+ return "Unknown";
+}
+
+static const struct uboot_arch {
+ enum uboot_image_arch arch;
+ const char *name;
+} uboot_arch[] = {
+ { IH_ARCH_ARM, "arm" },
+ { IH_ARCH_I386, "i386" },
+ { IH_ARCH_MIPS, "mips" },
+ { IH_ARCH_MIPS64, "mips64" },
+ { IH_ARCH_PPC, "powerpc" },
+ { IH_ARCH_OPENRISC, "or1k" },
+ { IH_ARCH_ARM64, "arm64" },
+};
+
+static enum uboot_image_arch
+get_arch(const char *name)
+{
+ unsigned int i;
+
+ for (i = 0; i < __arraycount(uboot_arch); i++) {
+ if (strcmp(uboot_arch[i].name, name) == 0)
+ return uboot_arch[i].arch;
+ }
+
+ return IH_ARCH_UNKNOWN;
+}
+
+static const char *
+get_arch_name(enum uboot_image_arch arch)
+{
+ unsigned int i;
+
+ for (i = 0; i < __arraycount(uboot_arch); i++) {
+ if (uboot_arch[i].arch == arch)
+ return uboot_arch[i].name;
+ }
+
+ return "Unknown";
+}
+
+static const struct uboot_type {
+ enum uboot_image_type type;
+ const char *name;
+} uboot_type[] = {
+ { IH_TYPE_STANDALONE, "standalone" },
+ { IH_TYPE_KERNEL, "kernel" },
+ { IH_TYPE_RAMDISK, "ramdisk" },
+ { IH_TYPE_FILESYSTEM, "fs" },
+ { IH_TYPE_SCRIPT, "script" },
+};
+
+static enum uboot_image_type
+get_type(const char *name)
+{
+ unsigned int i;
+
+ for (i = 0; i < __arraycount(uboot_type); i++) {
+ if (strcmp(uboot_type[i].name, name) == 0)
+ return uboot_type[i].type;
+ }
+
+ return IH_TYPE_UNKNOWN;
+}
+
+static const char *
+get_type_name(enum uboot_image_type type)
+{
+ unsigned int i;
+
+ for (i = 0; i < __arraycount(uboot_type); i++) {
+ if (uboot_type[i].type == type)
+ return uboot_type[i].name;
+ }
+
+ return "Unknown";
+}
+
+static const struct uboot_comp {
+ enum uboot_image_comp comp;
+ const char *name;
+} uboot_comp[] = {
+ { IH_COMP_NONE, "none" },
+ { IH_COMP_GZIP, "gz" },
+ { IH_COMP_BZIP2, "bz2" },
+ { IH_COMP_LZMA, "lzma" },
+ { IH_COMP_LZO, "lzo" },
+};
+
+static enum uboot_image_comp
+get_comp(const char *name)
+{
+ unsigned int i;
+
+ for (i = 0; i < __arraycount(uboot_comp); i++) {
+ if (strcmp(uboot_comp[i].name, name) == 0)
+ return uboot_comp[i].comp;
+ }
+
+ return IH_TYPE_UNKNOWN;
+}
+
+static const char *
+get_comp_name(enum uboot_image_comp comp)
+{
+ unsigned int i;
+
+ for (i = 0; i < __arraycount(uboot_comp); i++) {
+ if (uboot_comp[i].comp == comp)
+ return uboot_comp[i].name;
+ }
+
+ return "Unknown";
+}
+
+__dead2 static void
+usage(void)
+{
+ fprintf(stderr, "usage: mkubootimage -A "
+ "<arm|arm64|i386|mips|mips64|or1k|powerpc>");
+ fprintf(stderr, " -C <none|bz2|gz|lzma|lzo>");
+ fprintf(stderr, " -O <openbsd|netbsd|freebsd|linux>");
+ fprintf(stderr, " -T <standalone|kernel|ramdisk|fs|script>");
+ fprintf(stderr, " -a <addr> [-e <ep>] [-m <magic>] -n <name>");
+ fprintf(stderr, " <srcfile> <dstfile>\n");
+
+ exit(EXIT_FAILURE);
+}
+
+static void
+dump_header(struct uboot_image_header *hdr)
+{
+ time_t tm = be32toh(hdr->ih_time);
+
+ printf(" magic: 0x%08x\n", be32toh(hdr->ih_magic));
+ printf(" time: %s", ctime(&tm));
+ printf(" size: %u\n", be32toh(hdr->ih_size));
+ printf(" load addr: 0x%08x\n", be32toh(hdr->ih_load));
+ printf(" entry point: 0x%08x\n", be32toh(hdr->ih_ep));
+ printf(" data crc: 0x%08x\n", be32toh(hdr->ih_dcrc));
+ printf(" os: %d (%s)\n", hdr->ih_os,
+ get_os_name(hdr->ih_os));
+ printf(" arch: %d (%s)\n", hdr->ih_arch,
+ get_arch_name(hdr->ih_arch));
+ printf(" type: %d (%s)\n", hdr->ih_type,
+ get_type_name(hdr->ih_type));
+ printf(" comp: %d (%s)\n", hdr->ih_comp,
+ get_comp_name(hdr->ih_comp));
+ printf(" name: %s\n", hdr->ih_name);
+ printf(" header crc: 0x%08x\n", hdr->ih_hcrc);
+}
+
+static int
+generate_header(struct uboot_image_header *hdr, int kernel_fd)
+{
+ uint8_t *p;
+ struct stat st;
+ uint32_t crc, dsize, size_buf[2];
+ int error;
+
+ error = fstat(kernel_fd, &st);
+ if (error == -1) {
+ perror("stat");
+ return errno;
+ }
+
+ if (st.st_size + sizeof(*hdr) > UINT32_MAX) {
+ fprintf(stderr, "fatal: kernel too big\n");
+ return EINVAL;
+ }
+
+ p = mmap(0, st.st_size, PROT_READ, MAP_FILE|MAP_SHARED, kernel_fd, 0);
+ if (p == MAP_FAILED) {
+ perror("mmap kernel");
+ return EINVAL;
+ }
+ if (image_type == IH_TYPE_SCRIPT) {
+ struct iovec iov[3];
+ dsize = st.st_size + (sizeof(uint32_t) * 2);
+ size_buf[0] = htobe32(st.st_size);
+ size_buf[1] = htobe32(0);
+ iov[0].iov_base = &size_buf[0];
+ iov[0].iov_len = sizeof(size_buf[0]);
+ iov[1].iov_base = &size_buf[1];
+ iov[1].iov_len = sizeof(size_buf[1]);
+ iov[2].iov_base = p;
+ iov[2].iov_len = st.st_size;
+ crc = crc32v(iov, 3);
+ } else {
+ dsize = st.st_size;
+ crc = crc32(p, st.st_size);
+ }
+ munmap(p, st.st_size);
+
+ memset(hdr, 0, sizeof(*hdr));
+ hdr->ih_magic = htobe32(image_magic);
+ hdr->ih_time = htobe32(st.st_mtime);
+ hdr->ih_size = htobe32(dsize);
+ hdr->ih_load = htobe32(image_loadaddr);
+ hdr->ih_ep = htobe32(image_entrypoint);
+ hdr->ih_dcrc = htobe32(crc);
+ hdr->ih_os = image_os;
+ hdr->ih_arch = image_arch;
+ hdr->ih_type = image_type;
+ hdr->ih_comp = image_comp;
+ strlcpy((char *)hdr->ih_name, image_name, sizeof(hdr->ih_name));
+ crc = crc32((void *)hdr, sizeof(*hdr));
+ hdr->ih_hcrc = htobe32(crc);
+
+ dump_header(hdr);
+
+ return 0;
+}
+
+static int
+write_image(struct uboot_image_header *hdr, int kernel_fd, int image_fd)
+{
+ uint8_t buf[4096];
+ ssize_t rlen, wlen;
+ struct stat st;
+ uint32_t size_buf[2];
+ int error;
+
+ error = fstat(kernel_fd, &st);
+ if (error == -1) {
+ perror("stat");
+ return errno;
+ }
+
+ wlen = write(image_fd, hdr, sizeof(*hdr));
+ if (wlen != sizeof(*hdr)) {
+ perror("short write");
+ return errno;
+ }
+
+ if (image_type == IH_TYPE_SCRIPT) {
+ size_buf[0] = htobe32(st.st_size);
+ size_buf[1] = htobe32(0);
+ wlen = write(image_fd, &size_buf, sizeof(size_buf));
+ if (wlen != sizeof(size_buf)) {
+ perror("short write");
+ return errno;
+ }
+ }
+
+ while ((rlen = read(kernel_fd, buf, sizeof(buf))) > 0) {
+ wlen = write(image_fd, buf, rlen);
+ if (wlen != rlen) {
+ perror("short write");
+ return errno;
+ }
+ }
+
+ return 0;
+}
+
+int
+main(int argc, char *argv[])
+{
+ struct uboot_image_header hdr;
+ const char *src, *dest;
+ char *ep;
+ int kernel_fd, image_fd;
+ int ch;
+ unsigned long long num;
+
+ while ((ch = getopt(argc, argv, "A:C:E:O:T:a:e:hm:n:")) != -1) {
+ switch (ch) {
+ case 'A': /* arch */
+ image_arch = get_arch(optarg);
+ break;
+ case 'C': /* comp */
+ image_comp = get_comp(optarg);
+ break;
+ case 'O': /* os */
+ image_os = get_os(optarg);
+ break;
+ case 'T': /* type */
+ image_type = get_type(optarg);
+ break;
+ case 'a': /* addr */
+ errno = 0;
+ num = strtoull(optarg, &ep, 0);
+ if (*ep != '\0' || (errno == ERANGE &&
+ (num == ULLONG_MAX || num == 0)) ||
+ ((signed long long)num != (int32_t)num &&
+ num != (uint32_t)num))
+ errx(1, "illegal number -- %s", optarg);
+ image_loadaddr = (uint32_t)num;
+ break;
+ case 'E': /* ep (byte swapped) */
+ case 'e': /* ep */
+ errno = 0;
+ num = strtoull(optarg, &ep, 0);
+ if (*ep != '\0' || (errno == ERANGE &&
+ (num == ULLONG_MAX || num == 0)) ||
+ ((signed long long)num != (int32_t)num &&
+ num != (uint32_t)num))
+ errx(1, "illegal number -- %s", optarg);
+ image_entrypoint = (uint32_t)num;
+ if (ch == 'E')
+ image_entrypoint = bswap32(image_entrypoint);
+ break;
+ case 'm': /* magic */
+ errno = 0;
+ num = strtoul(optarg, &ep, 0);
+ if (*ep != '\0' || (errno == ERANGE &&
+ (num == ULONG_MAX || num == 0)))
+ errx(1, "illegal number -- %s", optarg);
+ image_magic = (uint32_t)num;
+ case 'n': /* name */
+ image_name = strdup(optarg);
+ break;
+ case 'h':
+ default:
+ usage();
+ /* NOTREACHED */
+ }
+ }
+ argc -= optind;
+ argv += optind;
+
+ if (argc != 2)
+ usage();
+
+ if (image_entrypoint == 0)
+ image_entrypoint = image_loadaddr;
+
+ if (image_arch == IH_ARCH_UNKNOWN ||
+ image_type == IH_TYPE_UNKNOWN ||
+ (image_type != IH_TYPE_SCRIPT && image_loadaddr == 0) ||
+ image_name == NULL)
+ usage();
+
+ src = argv[0];
+ dest = argv[1];
+
+ kernel_fd = open(src, O_RDONLY);
+ if (kernel_fd == -1) {
+ perror("open kernel");
+ return EXIT_FAILURE;
+ }
+ image_fd = open(dest, O_WRONLY|O_CREAT|O_TRUNC, 0666);
+ if (image_fd == -1) {
+ perror("open image");
+ return EXIT_FAILURE;
+ }
+
+ if (generate_header(&hdr, kernel_fd) != 0)
+ return EXIT_FAILURE;
+
+ if (write_image(&hdr, kernel_fd, image_fd) != 0)
+ return EXIT_FAILURE;
+
+ close(image_fd);
+ close(kernel_fd);
+
+ return EXIT_SUCCESS;
+}
Index: tools/tools/mkubootimage/uboot.h
===================================================================
--- /dev/null
+++ tools/tools/mkubootimage/uboot.h
@@ -0,0 +1,85 @@
+/* $NetBSD: uboot.h,v 1.6 2014/09/30 10:21:50 msaitoh Exp $ */
+
+/*-
+ * Copyright (c) 2010 Jared D. McNeill <jmcneill@invisible.ca>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef _HAVE_UBOOT_H
+#define _HAVE_UBOOT_H
+
+enum uboot_image_os {
+ IH_OS_UNKNOWN = 0,
+ IH_OS_OPENBSD = 1,
+ IH_OS_NETBSD = 2,
+ IH_OS_FREEBSD = 3,
+ IH_OS_LINUX = 5
+};
+
+enum uboot_image_arch {
+ IH_ARCH_UNKNOWN = 0,
+ IH_ARCH_ARM = 2,
+ IH_ARCH_I386 = 3,
+ IH_ARCH_MIPS = 5,
+ IH_ARCH_MIPS64 = 6,
+ IH_ARCH_PPC = 7,
+ IH_ARCH_OPENRISC = 21,
+ IH_ARCH_ARM64 = 22
+};
+
+enum uboot_image_type {
+ IH_TYPE_UNKNOWN = 0,
+ IH_TYPE_STANDALONE = 1,
+ IH_TYPE_KERNEL = 2,
+ IH_TYPE_RAMDISK = 3,
+ IH_TYPE_SCRIPT = 6,
+ IH_TYPE_FILESYSTEM = 7,
+};
+
+enum uboot_image_comp {
+ IH_COMP_NONE = 0,
+ IH_COMP_GZIP = 1,
+ IH_COMP_BZIP2 = 2,
+ IH_COMP_LZMA = 3,
+ IH_COMP_LZO = 4,
+};
+
+#define IH_MAGIC 0x27051956
+#define IH_NMLEN 32
+
+struct uboot_image_header {
+ uint32_t ih_magic;
+ uint32_t ih_hcrc;
+ uint32_t ih_time;
+ uint32_t ih_size;
+ uint32_t ih_load;
+ uint32_t ih_ep;
+ uint32_t ih_dcrc;
+ uint8_t ih_os;
+ uint8_t ih_arch;
+ uint8_t ih_type;
+ uint8_t ih_comp;
+ uint8_t ih_name[IH_NMLEN];
+};
+
+#endif /* !_HAVE_UBOOT_H */
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sat, Dec 20, 11:57 AM (13 h, 27 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
27096841
Default Alt Text
D14056.diff (25 KB)
Attached To
Mode
D14056: Import the NetBSD mkubootimage tool for building uboot kernel images
Attached
Detach File
Event Timeline
Log In to Comment