firmware-utils: mktplinkfw: add option for endianness swap
authorPiotr Dymacz <pepe2k@gmail.com>
Tue, 4 Jul 2017 13:40:43 +0000 (15:40 +0200)
committerPiotr Dymacz <pepe2k@gmail.com>
Tue, 4 Jul 2017 13:40:43 +0000 (15:40 +0200)
This adds command line option in "mktplinkfw" tool for endianness swap
in kernel load address and entry point fields. As in "mktplinkfw2" tool,
we will need this for little-endian targets, like "ramips".

Signed-off-by: Piotr Dymacz <pepe2k@gmail.com>
tools/firmware-utils/src/mktplinkfw.c

index fbf89609c22dd0fb50c4c8656141c8a8b9c29817..93db44135728dba51b0883051d67a206934ec150 100644 (file)
@@ -19,6 +19,8 @@
 #include <libgen.h>
 #include <getopt.h>     /* for getopt() */
 #include <stdarg.h>
+#include <stdbool.h>
+#include <endian.h>
 #include <errno.h>
 #include <sys/stat.h>
 
@@ -123,6 +125,7 @@ static uint32_t reserved_space;
 
 static struct file_info inspect_info;
 static int extract = 0;
+static bool endian_swap = false;
 
 static const char md5salt_normal[MD5SUM_LEN] = {
        0xdc, 0xd7, 0x3a, 0xa5, 0xc3, 0x95, 0x98, 0xfb,
@@ -256,6 +259,7 @@ static void usage(int status)
 "\n"
 "Options:\n"
 "  -c              use combined kernel image\n"
+"  -e              swap endianness in kernel load address and entry point\n"
 "  -E <ep>         overwrite kernel entry point with <ep> (hexval prefixed with 0x)\n"
 "  -L <la>         overwrite kernel load address with <la> (hexval prefixed with 0x)\n"
 "  -H <hwid>       use hardware id specified with <hwid>\n"
@@ -521,6 +525,11 @@ static void fill_header(char *buf, int len)
                );
        }
 
+       if (endian_swap) {
+               hdr->kernel_la = bswap_32(hdr->kernel_la);
+               hdr->kernel_ep = bswap_32(hdr->kernel_ep);
+       }
+
        get_md5(buf, len, hdr->md5sum1);
 }
 
@@ -805,7 +814,7 @@ int main(int argc, char *argv[])
        while ( 1 ) {
                int c;
 
-               c = getopt(argc, argv, "a:H:E:F:L:m:V:N:W:C:ci:k:r:R:o:xX:hsSjv:");
+               c = getopt(argc, argv, "a:H:E:F:L:m:V:N:W:C:ci:k:r:R:o:xX:ehsSjv:");
                if (c == -1)
                        break;
 
@@ -873,6 +882,9 @@ int main(int argc, char *argv[])
                case 'x':
                        extract = 1;
                        break;
+               case 'e':
+                       endian_swap = true;
+                       break;
                case 'h':
                        usage(EXIT_SUCCESS);
                        break;