summaryrefslogtreecommitdiff
path: root/util/cbfstool
diff options
context:
space:
mode:
Diffstat (limited to 'util/cbfstool')
-rw-r--r--util/cbfstool/cbfs-mkpayload.c37
-rw-r--r--util/cbfstool/cbfs.h2
-rw-r--r--util/cbfstool/cbfstool.c9
-rw-r--r--util/cbfstool/common.h2
-rw-r--r--util/cbfstool/fdt.h34
5 files changed, 83 insertions, 1 deletions
diff --git a/util/cbfstool/cbfs-mkpayload.c b/util/cbfstool/cbfs-mkpayload.c
index fd2c4ca011..6dc163433d 100644
--- a/util/cbfstool/cbfs-mkpayload.c
+++ b/util/cbfstool/cbfs-mkpayload.c
@@ -24,6 +24,7 @@
#include "cbfs.h"
#include "fv.h"
#include "coff.h"
+#include "fdt.h"
/* serialize the seg array into the buffer.
* The buffer is assumed to be large enough.
@@ -416,3 +417,39 @@ int parse_fv_to_payload(const struct buffer *input, struct buffer *output,
return 0;
}
+
+int parse_fit_to_payload(const struct buffer *input, struct buffer *output,
+ enum comp_algo algo)
+{
+ struct fdt_header *fdt_h;
+
+ DEBUG("start: parse_fit_to_payload\n");
+
+ fdt_h = buffer_get(input);
+ if (be32toh(fdt_h->magic) != FDT_HEADER_MAGIC) {
+ INFO("Not a FIT payload.\n");
+ return -1;
+ }
+
+ /**
+ * For developers:
+ * Compress the kernel binary you're sourcing in your its-script
+ * manually with LZ4 or LZMA and add 'compression = "lz4"' or "lzma" to
+ * the kernel@1 node in the its-script before assembling the image with
+ * mkimage.
+ */
+ if (algo != CBFS_COMPRESS_NONE) {
+ ERROR("FIT images don't support whole-image compression,"
+ " compress the kernel component instead!\n")
+ return -1;
+ }
+
+ if (buffer_create(output, buffer_size(input), input->name) != 0)
+ return -1;
+
+ memcpy(buffer_get(output), buffer_get(input), buffer_size(input));
+
+ DEBUG("done\n");
+
+ return 0;
+}
diff --git a/util/cbfstool/cbfs.h b/util/cbfstool/cbfs.h
index 1a4f101b57..fd2457a573 100644
--- a/util/cbfstool/cbfs.h
+++ b/util/cbfstool/cbfs.h
@@ -172,6 +172,7 @@ struct cbfs_payload {
#define CBFS_COMPONENT_CBFSHEADER 0x02
#define CBFS_COMPONENT_STAGE 0x10
#define CBFS_COMPONENT_SELF 0x20
+#define CBFS_COMPONENT_FIT 0x21
#define CBFS_COMPONENT_OPTIONROM 0x30
#define CBFS_COMPONENT_BOOTSPLASH 0x40
#define CBFS_COMPONENT_RAW 0x50
@@ -205,6 +206,7 @@ static struct typedesc_t filetypes[] unused = {
{CBFS_COMPONENT_CBFSHEADER, "cbfs header"},
{CBFS_COMPONENT_STAGE, "stage"},
{CBFS_COMPONENT_SELF, "simple elf"},
+ {CBFS_COMPONENT_FIT, "fit"},
{CBFS_COMPONENT_OPTIONROM, "optionrom"},
{CBFS_COMPONENT_BOOTSPLASH, "bootsplash"},
{CBFS_COMPONENT_RAW, "raw"},
diff --git a/util/cbfstool/cbfstool.c b/util/cbfstool/cbfstool.c
index 08f2e32230..9b654b11b2 100644
--- a/util/cbfstool/cbfstool.c
+++ b/util/cbfstool/cbfstool.c
@@ -631,7 +631,14 @@ static int cbfstool_convert_mkpayload(struct buffer *buffer,
/* per default, try and see if payload is an ELF binary */
ret = parse_elf_to_payload(buffer, &output, param.compression);
- /* If it's not an ELF, see if it's a UEFI FV */
+ /* If it's not an ELF, see if it's a FIT */
+ if (ret != 0) {
+ ret = parse_fit_to_payload(buffer, &output, param.compression);
+ if (ret == 0)
+ header->type = htonl(CBFS_COMPONENT_FIT);
+ }
+
+ /* If it's not an FIT, see if it's a UEFI FV */
if (ret != 0)
ret = parse_fv_to_payload(buffer, &output, param.compression);
diff --git a/util/cbfstool/common.h b/util/cbfstool/common.h
index 8bae63e08e..baefc1cad0 100644
--- a/util/cbfstool/common.h
+++ b/util/cbfstool/common.h
@@ -188,6 +188,8 @@ int parse_elf_to_payload(const struct buffer *input, struct buffer *output,
enum comp_algo algo);
int parse_fv_to_payload(const struct buffer *input, struct buffer *output,
enum comp_algo algo);
+int parse_fit_to_payload(const struct buffer *input, struct buffer *output,
+ enum comp_algo algo);
int parse_bzImage_to_payload(const struct buffer *input,
struct buffer *output, const char *initrd,
char *cmdline, enum comp_algo algo);
diff --git a/util/cbfstool/fdt.h b/util/cbfstool/fdt.h
new file mode 100644
index 0000000000..387cd328ed
--- /dev/null
+++ b/util/cbfstool/fdt.h
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2013 Google Inc.
+ * Copyright 2018-present Facebook, Inc.
+ *
+ * Taken from depthcharge: src/base/device_tree.h
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ */
+
+struct fdt_header {
+ uint32_t magic;
+ uint32_t totalsize;
+ uint32_t structure_offset;
+ uint32_t strings_offset;
+ uint32_t reserve_map_offset;
+
+ uint32_t version;
+ uint32_t last_compatible_version;
+
+ uint32_t boot_cpuid_phys;
+
+ uint32_t strings_size;
+ uint32_t structure_size;
+};
+
+#define FDT_HEADER_MAGIC 0xd00dfeed