]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
tests: add OP-TEE test suite
authorHeiko Stuebner <heiko.stuebner@theobroma-systems.com>
Wed, 23 Oct 2019 14:46:41 +0000 (16:46 +0200)
committerSimon Glass <sjg@chromium.org>
Thu, 14 Nov 2019 13:09:34 +0000 (07:09 -0600)
OP-TEE can get supplied with a devicetree and will then insert
its firmware node and reserved-memory sections into it.
As this devicetree often is not the one supplied to a later
loaded kernel, a previous commit added functionality to transfer
these nodes onto that new devicetree.

To make sure this functionality stays intact, also add a test
for the transfer functionality.

Signed-off-by: Heiko Stuebner <heiko.stuebner@theobroma-systems.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
Makefile
include/test/optee.h [new file with mode: 0644]
include/test/suites.h
test/Kconfig
test/cmd_ut.c
test/optee/Kconfig [new file with mode: 0644]
test/optee/Makefile [new file with mode: 0644]
test/optee/cmd_ut_optee.c [new file with mode: 0644]
test/optee/test-optee-base.dts [new file with mode: 0644]
test/optee/test-optee-no-optee.dts [new file with mode: 0644]
test/optee/test-optee-optee.dts [new file with mode: 0644]

index a9a78c30d6739d976e0fc9f14bb4031d8195826c..3e0cbd987e95e816606e7255dafac347ef809d87 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -751,6 +751,7 @@ libs-$(CONFIG_API) += api/
 libs-$(CONFIG_HAS_POST) += post/
 libs-$(CONFIG_UNIT_TEST) += test/ test/dm/
 libs-$(CONFIG_UT_ENV) += test/env/
+libs-$(CONFIG_UT_OPTEE) += test/optee/
 libs-$(CONFIG_UT_OVERLAY) += test/overlay/
 
 libs-y += $(if $(BOARDDIR),board/$(BOARDDIR)/)
diff --git a/include/test/optee.h b/include/test/optee.h
new file mode 100644 (file)
index 0000000..a8c6e63
--- /dev/null
@@ -0,0 +1,14 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * Copyright (C) 2019, Theobroma Systems Design und Consulting GmbH
+ */
+
+#ifndef __TEST_OPTEE_H__
+#define __TEST_OPTEE_H__
+
+#include <test/test.h>
+
+/* Declare a new environment test */
+#define OPTEE_TEST(_name, _flags)      UNIT_TEST(_name, _flags, optee_test)
+
+#endif /* __TEST_OPTEE_H__ */
index 01bee09346cffa7eccc567cbdd529d5ef1b304b9..20970f08d6646795ec7aaae24429f858dbd5ed88 100644 (file)
@@ -28,6 +28,7 @@ int do_ut_compression(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]);
 int do_ut_dm(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]);
 int do_ut_env(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]);
 int do_ut_lib(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]);
+int do_ut_optee(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]);
 int do_ut_overlay(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]);
 int do_ut_time(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]);
 int do_ut_unicode(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]);
index 48a0e501f88f63aff0a53a5eb67de09219f8d886..f53629aac5a14ac1a403174ac5712b94b1b7ab78 100644 (file)
@@ -33,4 +33,5 @@ config UT_UNICODE
 
 source "test/dm/Kconfig"
 source "test/env/Kconfig"
+source "test/optee/Kconfig"
 source "test/overlay/Kconfig"
index e3b89504e775b8fe4ff6d6277de12dd1de0d6ffc..2781f8bd5668cafdde519bb1653cdc3e8a7f8172 100644 (file)
@@ -43,6 +43,9 @@ static cmd_tbl_t cmd_ut_sub[] = {
 #if defined(CONFIG_UT_ENV)
        U_BOOT_CMD_MKENT(env, CONFIG_SYS_MAXARGS, 1, do_ut_env, "", ""),
 #endif
+#ifdef CONFIG_UT_OPTEE
+       U_BOOT_CMD_MKENT(optee, CONFIG_SYS_MAXARGS, 1, do_ut_optee, "", ""),
+#endif
 #ifdef CONFIG_UT_OVERLAY
        U_BOOT_CMD_MKENT(overlay, CONFIG_SYS_MAXARGS, 1, do_ut_overlay, "", ""),
 #endif
@@ -114,6 +117,9 @@ static char ut_help_text[] =
 #ifdef CONFIG_UT_LIB
        "ut lib [test-name] - test library functions\n"
 #endif
+#ifdef CONFIG_UT_OPTEE
+       "ut optee [test-name]\n"
+#endif
 #ifdef CONFIG_UT_OVERLAY
        "ut overlay [test-name]\n"
 #endif
diff --git a/test/optee/Kconfig b/test/optee/Kconfig
new file mode 100644 (file)
index 0000000..2f6834a
--- /dev/null
@@ -0,0 +1,7 @@
+config UT_OPTEE
+       bool "Enable OP-TEE Unit Tests"
+       depends on UNIT_TEST && OF_CONTROL && OPTEE
+       default y
+       help
+         This enables the 'ut optee' command which runs a series of unit
+         tests on the optee library code..
diff --git a/test/optee/Makefile b/test/optee/Makefile
new file mode 100644 (file)
index 0000000..8793fd7
--- /dev/null
@@ -0,0 +1,13 @@
+# SPDX-License-Identifier: GPL-2.0+
+#
+# Copyright (C) 2019, Theobroma Systems Design und Consulting GmbH
+
+# Test files
+obj-y += cmd_ut_optee.o
+
+DTC_FLAGS += -@
+
+# DT overlays
+obj-y += test-optee-base.dtb.o
+obj-y += test-optee-optee.dtb.o
+obj-y += test-optee-no-optee.dtb.o
diff --git a/test/optee/cmd_ut_optee.c b/test/optee/cmd_ut_optee.c
new file mode 100644 (file)
index 0000000..670682f
--- /dev/null
@@ -0,0 +1,149 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2019, Theobroma Systems Design und Consulting GmbH
+ */
+
+#include <common.h>
+#include <command.h>
+#include <errno.h>
+#include <fdt_support.h>
+#include <malloc.h>
+#include <tee/optee.h>
+
+#include <linux/sizes.h>
+
+#include <test/ut.h>
+#include <test/optee.h>
+#include <test/suites.h>
+
+/* 4k ought to be enough for anybody */
+#define FDT_COPY_SIZE  (4 * SZ_1K)
+
+extern u32 __dtb_test_optee_base_begin;
+extern u32 __dtb_test_optee_optee_begin;
+extern u32 __dtb_test_optee_no_optee_begin;
+
+static void *fdt;
+static bool expect_success;
+
+static int optee_fdt_firmware(struct unit_test_state *uts)
+{
+       const void *prop;
+       int offs, len;
+
+       offs = fdt_path_offset(fdt, "/firmware/optee");
+       ut_assert(expect_success ? offs >= 0 : offs < 0);
+
+       /* only continue if we have an optee node */
+       if (offs < 0)
+               return CMD_RET_SUCCESS;
+
+       prop = fdt_getprop(fdt, offs, "compatible", &len);
+       ut_assertok(strncmp((const char *)prop, "linaro,optee-tz", len));
+
+       prop = fdt_getprop(fdt, offs, "method", &len);
+       ut_assert(strncmp(prop, "hvc", 3) == 0 || strncmp(prop, "smc", 3) == 0);
+
+       return CMD_RET_SUCCESS;
+}
+OPTEE_TEST(optee_fdt_firmware, 0);
+
+static int optee_fdt_protected_memory(struct unit_test_state *uts)
+{
+       int offs, subnode;
+       bool found;
+
+       offs = fdt_path_offset(fdt, "/firmware/optee");
+       ut_assert(expect_success ? offs >= 0 : offs < 0);
+
+       /* only continue if we have an optee node */
+       if (offs < 0)
+               return CMD_RET_SUCCESS;
+
+       /* optee inserts its memory regions as reserved-memory nodes */
+       offs = fdt_subnode_offset(fdt, 0, "reserved-memory");
+       ut_assert(offs >= 0);
+
+       subnode = fdt_first_subnode(fdt, offs);
+       ut_assert(subnode);
+
+       found = 0;
+       while (subnode >= 0) {
+               const char *name = fdt_get_name(fdt, subnode, NULL);
+               struct fdt_resource res;
+
+               ut_assert(name);
+
+               /* only handle optee reservations */
+               if (strncmp(name, "optee", 5))
+                       continue;
+
+               found = true;
+
+               /* check if this subnode has a reg property */
+               ut_assertok(fdt_get_resource(fdt, subnode, "reg", 0, &res));
+               subnode = fdt_next_subnode(fdt, subnode);
+       }
+
+       ut_assert(found);
+
+       return CMD_RET_SUCCESS;
+}
+OPTEE_TEST(optee_fdt_protected_memory, 0);
+
+int do_ut_optee(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+{
+       struct unit_test *tests = ll_entry_start(struct unit_test,
+                                                optee_test);
+       const int n_ents = ll_entry_count(struct unit_test, optee_test);
+       struct unit_test_state *uts;
+       void *fdt_optee = &__dtb_test_optee_optee_begin;
+       void *fdt_no_optee = &__dtb_test_optee_no_optee_begin;
+       void *fdt_base = &__dtb_test_optee_base_begin;
+       int ret = -ENOMEM;
+
+       uts = calloc(1, sizeof(*uts));
+       if (!uts)
+               return -ENOMEM;
+
+       ut_assertok(fdt_check_header(fdt_base));
+       ut_assertok(fdt_check_header(fdt_optee));
+       ut_assertok(fdt_check_header(fdt_no_optee));
+
+       fdt = malloc(FDT_COPY_SIZE);
+       if (!fdt)
+               return ret;
+
+       /*
+        * Resize the FDT to 4k so that we have room to operate on
+        *
+        * (and relocate it since the memory might be mapped
+        * read-only)
+        */
+       ut_assertok(fdt_open_into(fdt_base, fdt, FDT_COPY_SIZE));
+
+       /*
+        * (1) Try to copy optee nodes from empty dt.
+        * This should still run successfully.
+        */
+       ut_assertok(optee_copy_fdt_nodes(fdt_no_optee, fdt));
+
+       expect_success = false;
+       ret = cmd_ut_category("optee", tests, n_ents, argc, argv);
+
+       /* (2) Try to copy optee nodes from prefilled dt */
+       ut_assertok(optee_copy_fdt_nodes(fdt_optee, fdt));
+
+       expect_success = true;
+       ret = cmd_ut_category("optee", tests, n_ents, argc, argv);
+
+       /* (3) Try to copy OP-TEE nodes into a already filled DT */
+       ut_assertok(fdt_open_into(fdt_optee, fdt, FDT_COPY_SIZE));
+       ut_assertok(optee_copy_fdt_nodes(fdt_optee, fdt));
+
+       expect_success = true;
+       ret = cmd_ut_category("optee", tests, n_ents, argc, argv);
+
+       free(fdt);
+       return ret;
+}
diff --git a/test/optee/test-optee-base.dts b/test/optee/test-optee-base.dts
new file mode 100644 (file)
index 0000000..3c1d0c6
--- /dev/null
@@ -0,0 +1,13 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2019, Theobroma Systems Design und Consulting GmbH
+ */
+
+/dts-v1/;
+
+/ {
+       #address-cells = <2>;
+       #size-cells = <2>;
+};
+
+
diff --git a/test/optee/test-optee-no-optee.dts b/test/optee/test-optee-no-optee.dts
new file mode 100644 (file)
index 0000000..3c1d0c6
--- /dev/null
@@ -0,0 +1,13 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2019, Theobroma Systems Design und Consulting GmbH
+ */
+
+/dts-v1/;
+
+/ {
+       #address-cells = <2>;
+       #size-cells = <2>;
+};
+
+
diff --git a/test/optee/test-optee-optee.dts b/test/optee/test-optee-optee.dts
new file mode 100644 (file)
index 0000000..11e26a2
--- /dev/null
@@ -0,0 +1,32 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2019, Theobroma Systems Design und Consulting GmbH
+ */
+
+/dts-v1/;
+
+/ {
+       #address-cells = <2>;
+       #size-cells = <2>;
+
+       firmware {
+               optee {
+                       compatible = "linaro,optee-tz";
+                       method = "smc";
+               };
+       };
+
+       reserved-memory {
+               #address-cells = <2>;
+               #size-cells = <2>;
+               ranges;
+
+               optee_shm@32000000 {
+                       reg = <0x00 0x32000000 0x00 0x400000>;
+               };
+
+               optee_core@30000000 {
+                       reg = <0x00 0x30000000 0x00 0x2000000>;
+               };
+       };
+};