meson/gxl: Add tool to create bl31 bootable images
authorRemi Pommarel <repk@triplefau.lt>
Sat, 30 Mar 2019 14:58:45 +0000 (15:58 +0100)
committerRemi Pommarel <repk@triplefau.lt>
Tue, 2 Apr 2019 14:33:59 +0000 (16:33 +0200)
GXL platforms need to have a specific header at the beginning of bl31
image to be able to boot. This adds a tool to create that and calls it at
build time.

Signed-off-by: Remi Pommarel <repk@triplefau.lt>
.gitignore
plat/meson/gxl/platform.mk
tools/meson/Makefile [new file with mode: 0644]
tools/meson/doimage.c [new file with mode: 0644]

index 341308ca94833896d1f5cf60418ef9a06a7721a4..6b1e05774880281fd69a8eb0a655c91d08cec368 100644 (file)
@@ -22,6 +22,7 @@ tools/cert_create/src/**/*.o
 tools/cert_create/cert_create
 tools/cert_create/cert_create.exe
 tools/marvell/doimage/doimage
+tools/meson/doimage
 tools/stm32image/*.o
 tools/stm32image/stm32image
 tools/stm32image/stm32image.exe
index de6192926a3cd21ed36fd36d1deae70e0b13e97e..ea4aead72e6fc9ea590977da9badc3f5ad04616c 100644 (file)
@@ -6,6 +6,9 @@
 
 include lib/xlat_tables_v2/xlat_tables.mk
 
+DOIMAGEPATH            ?=      tools/meson
+DOIMAGETOOL            ?=      ${DOIMAGEPATH}/doimage
+
 PLAT_INCLUDES          :=      -Iinclude/drivers/meson/                \
                                -Iinclude/drivers/meson/gxl             \
                                -Iplat/meson/gxl/include
@@ -76,3 +79,16 @@ endif
 ifeq (${ARCH},aarch32)
   $(error Error: AArch32 not supported on gxl)
 endif
+
+all: ${BUILD_PLAT}/bl31.img
+distclean realclean clean: cleanimage
+
+cleanimage:
+       ${Q}${MAKE} -C ${DOIMAGEPATH} clean
+
+${DOIMAGETOOL}:
+       ${Q}${MAKE} -C ${DOIMAGEPATH}
+
+${BUILD_PLAT}/bl31.img: ${BUILD_PLAT}/bl31.bin ${DOIMAGETOOL}
+       ${DOIMAGETOOL} ${BUILD_PLAT}/bl31.bin ${BUILD_PLAT}/bl31.img
+
diff --git a/tools/meson/Makefile b/tools/meson/Makefile
new file mode 100644 (file)
index 0000000..1a1d1f8
--- /dev/null
@@ -0,0 +1,49 @@
+#
+# Copyright (C) 2019 Remi Pommarel <repk@triplefau.lt>
+#
+# SPDX-License-Identifier:     BSD-3-Clause
+# https://spdx.org/licenses
+#
+MAKE_HELPERS_DIRECTORY := ../../make_helpers/
+include ${MAKE_HELPERS_DIRECTORY}build_macros.mk
+include ${MAKE_HELPERS_DIRECTORY}build_env.mk
+
+PROJECT := doimage${BIN_EXT}
+OBJECTS := doimage.o
+V := 0
+
+HOSTCCFLAGS := -Wall -Werror -pedantic -std=c99 -D_GNU_SOURCE
+
+ifeq (${DEBUG},1)
+  HOSTCCFLAGS += -g -O0 -DDEBUG
+else
+  HOSTCCFLAGS += -O2
+endif
+
+ifeq (${V},0)
+  Q := @
+else
+  Q :=
+endif
+
+HOSTCC := gcc
+
+.PHONY: all clean distclean
+
+all: ${PROJECT}
+
+${PROJECT}: ${OBJECTS} Makefile
+       @echo "  HOSTLD  $@"
+       ${Q}${HOSTCC} ${OBJECTS} -o $@
+       @${ECHO_BLANK_LINE}
+       @echo "Built $@ successfully"
+       @${ECHO_BLANK_LINE}
+
+%.o: %.c Makefile
+       @echo "  HOSTCC  $<"
+       ${Q}${HOSTCC} -c ${HOSTCCFLAGS} $< -o $@
+
+clean:
+       $(call SHELL_DELETE_ALL, ${PROJECT} ${OBJECTS})
+
+distclean: clean
diff --git a/tools/meson/doimage.c b/tools/meson/doimage.c
new file mode 100644 (file)
index 0000000..b304038
--- /dev/null
@@ -0,0 +1,94 @@
+/*
+ * Copyright (c) 2019, Remi Pommarel <repk@triplefau.lt>
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+#include <stdlib.h>
+#include <stdio.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <stdint.h>
+#include <endian.h>
+
+#define DEFAULT_PROGNAME "doimage"
+#define PROGNAME(argc, argv) (((argc) >= 1) ? ((argv)[0]) : DEFAULT_PROGNAME)
+
+#define BL31_MAGIC 0x12348765
+#define BL31_LOADADDR 0x05100000
+#define BUFLEN 512
+
+static inline void usage(char const *prog)
+{
+       fprintf(stderr, "Usage: %s <bl31.bin> <bl31.img>\n", prog);
+}
+
+static inline int fdwrite(int fd, uint8_t *data, size_t len)
+{
+       ssize_t nr;
+       size_t l;
+       int ret = -1;
+
+       for (l = 0; l < len; l += nr) {
+               nr = write(fd, data + l, len - l);
+               if (nr < 0) {
+                       perror("Cannot write to bl31.img");
+                       goto out;
+               }
+       }
+
+       ret = 0;
+out:
+       return ret;
+}
+
+int main(int argc, char **argv)
+{
+       int fin, fout, ret = -1;
+       ssize_t len;
+       uint32_t data;
+       uint8_t buf[BUFLEN];
+
+       if (argc != 3) {
+               usage(PROGNAME(argc, argv));
+               goto out;
+       }
+
+       fin = open(argv[1], O_RDONLY);
+       if (fin < 0) {
+               perror("Cannot open bl31.bin");
+               goto out;
+       }
+
+       fout = open(argv[2], O_WRONLY | O_CREAT, 0660);
+       if (fout < 0) {
+               perror("Cannot open bl31.img");
+               goto closefin;
+       }
+
+       data = htole32(BL31_MAGIC);
+       if (fdwrite(fout, (uint8_t *)&data, sizeof(data)) < 0)
+               goto closefout;
+
+       lseek(fout, 8, SEEK_SET);
+       data = htole32(BL31_LOADADDR);
+       if (fdwrite(fout, (uint8_t *)&data, sizeof(data)) < 0)
+               goto closefout;
+
+       lseek(fout, 0x200, SEEK_SET);
+       while ((len = read(fin, buf, sizeof(buf))) > 0)
+               if (fdwrite(fout, buf, len) < 0)
+                       goto closefout;
+       if (len < 0) {
+               perror("Cannot read bl31.bin");
+               goto closefout;
+       }
+
+       ret = 0;
+
+closefout:
+       close(fout);
+closefin:
+       close(fin);
+out:
+       return ret;
+}