]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
spl: test: Add a test for spl_load_simple_fit()
authorSimon Glass <sjg@chromium.org>
Mon, 8 Mar 2021 00:35:15 +0000 (17:35 -0700)
committerTom Rini <trini@konsulko.com>
Fri, 12 Mar 2021 14:57:31 +0000 (09:57 -0500)
As an example of an SPL test, add a new test for loading a FIT within
SPL. This runs on sandbox_spl. For this to work, the text base is adjusted
so that there is plenty of space available.

While we are here, document struct spl_load_info properly, since this is
currently ambiguous.

This test only verifies the logic path. It does not actually check that
the image is loaded correctly. It is not possible for sandbox's SPL to
actually run u-boot.img since it currently includes u-boot.bin rather than
u-boot. Further work could expand the test in that direction.

The need for this was noted at:

   http://patchwork.ozlabs.org/project/uboot/patch/20201216000944.2832585-3-mr.nuke.me@gmail.com/

Signed-off-by: Simon Glass <sjg@chromium.org>
configs/sandbox_spl_defconfig
doc/arch/sandbox.rst
include/spl.h
test/Makefile
test/image/Makefile [new file with mode: 0644]
test/image/spl_load.c [new file with mode: 0644]

index c0118702a81e943d9f1fc1461a5fd70710325db4..2696d0b6cdd54a25df4f3fbf8476e93e4298939d 100644 (file)
@@ -1,4 +1,4 @@
-CONFIG_SYS_TEXT_BASE=0
+CONFIG_SYS_TEXT_BASE=0x200000
 CONFIG_SPL_LIBCOMMON_SUPPORT=y
 CONFIG_SPL_LIBGENERIC_SUPPORT=y
 CONFIG_NR_DRAM_BANKS=1
index 60ee1e0741aba6a7574d815d30beb02d361273af..1ccb5344ac6a986f5ddf63997d58a56386c29e00 100644 (file)
@@ -537,5 +537,7 @@ Addr      Config                     Usage
    e000   CONFIG_BLOBLIST_ADDR       Blob list
   10000   CONFIG_MALLOC_F_ADDR       Early memory allocation
   f0000   CONFIG_PRE_CON_BUF_ADDR    Pre-console buffer
- 100000   CONFIG_TRACE_EARLY_ADDR    Early trace buffer (if enabled)
+ 100000   CONFIG_TRACE_EARLY_ADDR    Early trace buffer (if enabled). Also used
+                                     as the SPL load buffer in spl_test_load().
+ 200000   CONFIG_SYS_TEXT_BASE       Load buffer for U-Boot (sandbox_spl only)
 =======   ========================   ===============================
index 0d134587de2a162a3746ecddda5d8a02391cef18..4f6e0e53f5d4f67a18c94e276162ca3c5c7a4faf 100644 (file)
@@ -222,6 +222,15 @@ struct spl_load_info {
        void *priv;
        int bl_len;
        const char *filename;
+       /**
+        * read() - Read from device
+        *
+        * @load: Information about the load state
+        * @sector: Sector number to read from (each @load->bl_len bytes)
+        * @count: Number of sectors to read
+        * @buf: Buffer to read into
+        * @return number of sectors read, 0 on error
+        */
        ulong (*read)(struct spl_load_info *load, ulong sector, ulong count,
                      void *buf);
 };
index 5cd284e322e099af8a9a7d2a5364e7289d1a9e58..a26e915e0508974fb31f0967594a7b33166949e0 100644 (file)
@@ -3,6 +3,7 @@
 # (C) Copyright 2012 The Chromium Authors
 
 obj-y += test-main.o
+obj-$(CONFIG_SANDBOX) += image/
 
 ifneq ($(CONFIG_$(SPL_)BLOBLIST),)
 obj-$(CONFIG_$(SPL_)CMDLINE) += bloblist.o
diff --git a/test/image/Makefile b/test/image/Makefile
new file mode 100644 (file)
index 0000000..c4039df
--- /dev/null
@@ -0,0 +1,5 @@
+# SPDX-License-Identifier: GPL-2.0+
+#
+# Copyright 2021 Google LLC
+
+obj-$(CONFIG_SPL_BUILD) += spl_load.o
diff --git a/test/image/spl_load.c b/test/image/spl_load.c
new file mode 100644 (file)
index 0000000..851603d
--- /dev/null
@@ -0,0 +1,91 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright 2021 Google LLC
+ * Written by Simon Glass <sjg@chromium.org>
+ */
+
+#include <common.h>
+#include <image.h>
+#include <mapmem.h>
+#include <os.h>
+#include <spl.h>
+#include <test/ut.h>
+
+/* Declare a new SPL test */
+#define SPL_TEST(_name, _flags)                UNIT_TEST(_name, _flags, spl_test)
+
+/* Context used for this test */
+struct text_ctx {
+       int fd;
+};
+
+static ulong read_fit_image(struct spl_load_info *load, ulong sector,
+                           ulong count, void *buf)
+{
+       struct text_ctx *text_ctx = load->priv;
+       off_t offset, ret;
+       ssize_t res;
+
+       offset = sector * load->bl_len;
+       ret = os_lseek(text_ctx->fd, offset, OS_SEEK_SET);
+       if (ret != offset) {
+               printf("Failed to seek to %zx, got %zx (errno=%d)\n", offset,
+                      ret, errno);
+               return 0;
+       }
+
+       res = os_read(text_ctx->fd, buf, count * load->bl_len);
+       if (res == -1) {
+               printf("Failed to read %lx bytes, got %ld (errno=%d)\n",
+                      count * load->bl_len, res, errno);
+               return 0;
+       }
+
+       return count;
+}
+
+int board_fit_config_name_match(const char *name)
+{
+       return 0;
+}
+
+struct image_header *spl_get_load_buffer(ssize_t offset, size_t size)
+{
+       return map_sysmem(0x100000, 0);
+}
+
+static int spl_test_load(struct unit_test_state *uts)
+{
+       struct spl_image_info image;
+       struct image_header *header;
+       struct text_ctx text_ctx;
+       struct spl_load_info load;
+       char fname[256];
+       int ret;
+       int fd;
+
+       memset(&load, '\0', sizeof(load));
+       load.bl_len = 512;
+       load.read = read_fit_image;
+
+       ret = os_find_u_boot(fname, sizeof(fname), true);
+       if (ret) {
+               printf("(%s not found, error %d)\n", fname, ret);
+               return ret;
+       }
+       load.filename = fname;
+
+       header = spl_get_load_buffer(-sizeof(*header), sizeof(*header));
+
+       fd = os_open(fname, OS_O_RDONLY);
+       ut_assert(fd >= 0);
+       ut_asserteq(512, os_read(fd, header, 512));
+       text_ctx.fd = fd;
+
+       load.priv = &text_ctx;
+
+       ut_assertok(spl_load_simple_fit(&image, &load, 0, header));
+
+       return 0;
+}
+SPL_TEST(spl_test_load, 0);