[PATCH v7 4/4] test: dm: tee: extend with RPC test
Etienne Carriere
etienne.carriere at linaro.org
Sat Jan 23 10:29:57 CET 2021
by the way,
Acked-by: Etienne Carriere <etienne.carriere at linaro.org>
fwiw
br,
etienne
On Fri, 22 Jan 2021 at 18:06, Igor Opaniuk <igor.opaniuk at foundries.io> wrote:
>
> From: Igor Opaniuk <igor.opaniuk at foundries.io>
>
> Extend existing DM tee tests adding test coverage for reverse RPC calls.
> Currently this commit only adds tests for I2C requests from TEE driver
> to TEE supplicant, for instance reading/writing data to emulated i2c
> eeprom defines in standard sandbox test device tree
> (arch/sandbox/dts/test.dtb):
>
> => i2c bus
> Bus 0: i2c at 0 (active 0)
> 2c: eeprom at 2c, offset len 1, flags 0
> ...
>
> Running TEE tests:
> => ut dm tee
> Test: dm_test_tee: tee.c
> Test: dm_test_tee: tee.c (flat tree)
> Failures: 0
>
> Signed-off-by: Igor Opaniuk <igor.opaniuk at foundries.io>
> Reviewed-by: Simon Glass <sjg at chromium.org>
>
> ---
>
> test/dm/tee.c | 116 +++++++++++++++++++++++++++++++++++++++++++++++---
> 1 file changed, 109 insertions(+), 7 deletions(-)
>
> diff --git a/test/dm/tee.c b/test/dm/tee.c
> index ddbdcfb0cf..7a11bf8913 100644
> --- a/test/dm/tee.c
> +++ b/test/dm/tee.c
> @@ -13,15 +13,16 @@
> #include <test/test.h>
> #include <test/ut.h>
> #include <tee/optee_ta_avb.h>
> +#include <tee/optee_ta_rpc_test.h>
>
> -static int open_session(struct udevice *dev, u32 *session)
> +static int open_session(struct udevice *dev, u32 *session,
> + struct tee_optee_ta_uuid *uuid)
> {
> struct tee_open_session_arg arg;
> - const struct tee_optee_ta_uuid uuid = TA_AVB_UUID;
> int rc;
>
> memset(&arg, 0, sizeof(arg));
> - tee_optee_ta_uuid_to_octets(arg.uuid, &uuid);
> + tee_optee_ta_uuid_to_octets(arg.uuid, uuid);
> rc = tee_open_session(dev, &arg, 0, NULL);
> if (rc)
> return rc;
> @@ -32,7 +33,7 @@ static int open_session(struct udevice *dev, u32 *session)
> return 0;
> }
>
> -static int invoke_func(struct udevice *dev, u32 session)
> +static int invoke_func_avb(struct udevice *dev, u32 session)
> {
> struct tee_param param = { .attr = TEE_PARAM_ATTR_TYPE_VALUE_OUTPUT };
> struct tee_invoke_arg arg;
> @@ -47,6 +48,48 @@ static int invoke_func(struct udevice *dev, u32 session)
> return 0;
> }
>
> +static int invoke_func_rpc_test(struct udevice *dev, u32 session,
> + u64 op, u64 busnum, u64 chip_addr,
> + u64 xfer_flags, u8 *buf, size_t buf_size)
> +{
> + struct tee_param param[2];
> + struct tee_invoke_arg arg;
> + struct tee_shm *shm_buf;
> + int rc;
> +
> + memset(&arg, 0, sizeof(arg));
> + arg.session = session;
> + arg.func = op;
> +
> + rc = tee_shm_alloc(dev, buf_size,
> + TEE_SHM_ALLOC, &shm_buf);
> + if (rc)
> + return rc;
> +
> + if (op == TA_RPC_TEST_CMD_I2C_WRITE)
> + memcpy(shm_buf->addr, buf, buf_size);
> +
> + memset(param, 0, sizeof(param));
> + param[0].attr = TEE_PARAM_ATTR_TYPE_VALUE_INPUT;
> + param[0].u.value.a = busnum;
> + param[0].u.value.b = chip_addr;
> + param[0].u.value.c = xfer_flags;
> + param[1].attr = TEE_PARAM_ATTR_TYPE_MEMREF_INOUT;
> + param[1].u.memref.shm = shm_buf;
> + param[1].u.memref.size = buf_size;
> +
> + if (tee_invoke_func(dev, &arg, 2, param) || arg.ret) {
> + rc = -1;
> + goto out;
> + }
> +
> + if (op == TA_RPC_TEST_CMD_I2C_READ)
> + memcpy(buf, shm_buf->addr, buf_size);
> +out:
> + tee_shm_free(shm_buf);
> + return rc;
> +}
> +
> static int match(struct tee_version_data *vers, const void *data)
> {
> return vers->gen_caps & TEE_GEN_CAP_GP;
> @@ -62,6 +105,7 @@ static int test_tee(struct unit_test_state *uts, struct test_tee_vars *vars)
> struct tee_version_data vers;
> struct udevice *dev;
> struct sandbox_tee_state *state;
> + struct tee_optee_ta_uuid avb_uuid = TA_AVB_UUID;
> u32 session = 0;
> int rc;
> u8 data[128];
> @@ -71,11 +115,11 @@ static int test_tee(struct unit_test_state *uts, struct test_tee_vars *vars)
> state = dev_get_priv(dev);
> ut_assert(!state->session);
>
> - rc = open_session(dev, &session);
> + rc = open_session(dev, &session, &avb_uuid);
> ut_assert(!rc);
> ut_assert(session == state->session);
>
> - rc = invoke_func(dev, session);
> + rc = invoke_func_avb(dev, session);
> ut_assert(!rc);
>
> rc = tee_close_session(dev, session);
> @@ -100,7 +144,59 @@ static int test_tee(struct unit_test_state *uts, struct test_tee_vars *vars)
> vars->alloc_shm = NULL;
> ut_assert(!state->num_shms);
>
> - return 0;
> + return rc;
> +}
> +
> +#define I2C_BUF_SIZE 64
> +
> +static int test_tee_rpc(struct unit_test_state *uts)
> +{
> + struct tee_version_data vers;
> + struct udevice *dev;
> + struct sandbox_tee_state *state;
> + struct tee_optee_ta_uuid rpc_test_uuid = TA_RPC_TEST_UUID;
> + u32 session = 0;
> + int rc;
> +
> + char *test_str = "Test string";
> + u8 data[I2C_BUF_SIZE] = {0};
> + u8 data_from_eeprom[I2C_BUF_SIZE] = {0};
> +
> + /* Use sandbox I2C EEPROM emulation; bus: 0, chip: 0x2c */
> + u64 bus = 0;
> + u64 chip = 0x2c;
> + u64 xfer_flags = 0;
> +
> + dev = tee_find_device(NULL, match, NULL, &vers);
> + ut_assert(dev);
> + state = dev_get_priv(dev);
> + ut_assert(!state->session);
> +
> + /* Test RPC call asking for I2C service */
> + rc = open_session(dev, &session, &rpc_test_uuid);
> + ut_assert(!rc);
> + ut_assert(session == state->session);
> +
> + /* Write buffer */
> + strncpy((char *)data, test_str, strlen(test_str));
> + rc = invoke_func_rpc_test(dev, session, TA_RPC_TEST_CMD_I2C_WRITE,
> + bus, chip, xfer_flags, data, sizeof(data));
> + ut_assert(!rc);
> +
> + /* Read buffer */
> + rc = invoke_func_rpc_test(dev, session, TA_RPC_TEST_CMD_I2C_READ,
> + bus, chip, xfer_flags, data_from_eeprom,
> + sizeof(data_from_eeprom));
> + ut_assert(!rc);
> +
> + /* Compare */
> + ut_assert(!memcmp(data, data_from_eeprom, sizeof(data)));
> +
> + rc = tee_close_session(dev, session);
> + ut_assert(!rc);
> + ut_assert(!state->session);
> +
> + return rc;
> }
>
> static int dm_test_tee(struct unit_test_state *uts)
> @@ -108,6 +204,12 @@ static int dm_test_tee(struct unit_test_state *uts)
> struct test_tee_vars vars = { NULL, NULL };
> int rc = test_tee(uts, &vars);
>
> + if (rc)
> + goto out;
> +
> + if (IS_ENABLED(CONFIG_OPTEE_TA_RPC_TEST))
> + rc = test_tee_rpc(uts);
> +out:
> /* In case test_tee() asserts these may still remain allocated */
> tee_shm_free(vars.reg_shm);
> tee_shm_free(vars.alloc_shm);
> --
> 2.25.1
>
More information about the U-Boot
mailing list