diff options
Diffstat (limited to 'host/main.c')
-rw-r--r-- | host/main.c | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/host/main.c b/host/main.c new file mode 100644 index 0000000..d433e4a --- /dev/null +++ b/host/main.c @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2016, Linaro Limited + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include <err.h> +#include <stdio.h> +#include <string.h> + +/* OP-TEE TEE client API (built by optee_client) */ +#include <tee_client_api.h> + +/* To the the UUID (found the the TA's h-file(s)) */ +#include <logger_ta.h> + +int main(int argc, char *argv[]) +{ + TEEC_Result res; + TEEC_Context ctx; + TEEC_Session sess; + TEEC_Operation op; + TEEC_UUID uuid = TA_LOGGER_UUID; + uint32_t err_origin; + + /* Initialize a context connecting us to the TEE */ + res = TEEC_InitializeContext(NULL, &ctx); + if (res != TEEC_SUCCESS) + errx(1, "TEEC_InitializeContext failed with code 0x%x", res); + + /* + * Open a session to the "hello world" TA, the TA will print "hello + * world!" in the log when the session is created. + */ + res = TEEC_OpenSession(&ctx, &sess, &uuid, + TEEC_LOGIN_PUBLIC, NULL, NULL, &err_origin); + if (res != TEEC_SUCCESS) + errx(1, "TEEC_Opensession failed with code 0x%x origin 0x%x", + res, err_origin); + + /* + * Execute a function in the TA by invoking it, in this case + * we're incrementing a number. + * + * The value of command ID part and how the parameters are + * interpreted is part of the interface provided by the TA. + */ + + /* Clear the TEEC_Operation struct */ + memset(&op, 0, sizeof(op)); + + /* + * Prepare the argument. Pass a value in the first parameter, + * the remaining three parameters are unused. + */ + op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT, TEEC_NONE, + TEEC_NONE, TEEC_NONE); + op.params[0].value.a = 42; + + printf("Invoking TA to increment %d\n", op.params[0].value.a); + res = TEEC_InvokeCommand(&sess, 1, &op, + &err_origin); + if (res != TEEC_SUCCESS) + errx(1, "TEEC_InvokeCommand failed with code 0x%x origin 0x%x", + res, err_origin); + printf("TA incremented value to %d\n", op.params[0].value.a); + + /* + * We're done with the TA, close the session and + * destroy the context. + * + * The TA will print "Goodbye!" in the log when the + * session is closed. + */ + + TEEC_CloseSession(&sess); + + TEEC_FinalizeContext(&ctx); + + return 0; +} |