1*53ee8cc1Swenshuai.xi //#include <nuttx/config.h>
2*53ee8cc1Swenshuai.xi #include <stdio.h>
3*53ee8cc1Swenshuai.xi //#include "MsTypes.h"
4*53ee8cc1Swenshuai.xi //#include "stdlib.h"
5*53ee8cc1Swenshuai.xi #include "utopia.h" // for utopia open/ioctl/close
6*53ee8cc1Swenshuai.xi #include "utopia_driver_id.h" // for module id
7*53ee8cc1Swenshuai.xi #include "MsOS.h" // for MsOS_ObtainMutex test
8*53ee8cc1Swenshuai.xi //#include "drvMMIO.h"
9*53ee8cc1Swenshuai.xi //#include <string.h>
10*53ee8cc1Swenshuai.xi //#include <unistd.h>
11*53ee8cc1Swenshuai.xi //#include "drvMIU.h"
12*53ee8cc1Swenshuai.xi
13*53ee8cc1Swenshuai.xi #include "drvSYS.h"
14*53ee8cc1Swenshuai.xi #include "drvSYS_priv.h"
15*53ee8cc1Swenshuai.xi
16*53ee8cc1Swenshuai.xi static const char optee_test[] = "opteearmtz00";
17*53ee8cc1Swenshuai.xi char *_device = (char *)optee_test;
18*53ee8cc1Swenshuai.xi
19*53ee8cc1Swenshuai.xi
20*53ee8cc1Swenshuai.xi TEEC_Context mstar_teec_ctx;
21*53ee8cc1Swenshuai.xi /* This UUID is generated with the ITU-T UUID generator at
22*53ee8cc1Swenshuai.xi http://www.itu.int/ITU-T/asn1/uuid.html
23*53ee8cc1Swenshuai.xi 7cac5480-a1fb-11e5-acb4-0002a5d5c51b */
24*53ee8cc1Swenshuai.xi #define MSTAR_INTERNAL_TEST_UUID {0x7cac5480, 0xa1fb, 0x11e5, \
25*53ee8cc1Swenshuai.xi {0xac, 0xb4, 0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b} }
26*53ee8cc1Swenshuai.xi #define SYS_TEEC_OPERATION_INITIALIZER { 0, 0, { { { 0 } } } }
27*53ee8cc1Swenshuai.xi #define CMD_TRACE 0
28*53ee8cc1Swenshuai.xi #define CMD_PARAMS 1
29*53ee8cc1Swenshuai.xi #define CMD_SELF_TESTS 2
30*53ee8cc1Swenshuai.xi #define CMD_PRINT 3
31*53ee8cc1Swenshuai.xi #define CMD_MULTIPLY_VALUE 4
32*53ee8cc1Swenshuai.xi #define CMD_MEMORY_WRITE 5
33*53ee8cc1Swenshuai.xi #define CMD_MEMORY_READ 6
34*53ee8cc1Swenshuai.xi
main(int argc,char * argv[])35*53ee8cc1Swenshuai.xi int main(int argc, char *argv[])
36*53ee8cc1Swenshuai.xi {
37*53ee8cc1Swenshuai.xi unsigned int ret, ret_orig= 0;
38*53ee8cc1Swenshuai.xi TEEC_Session session = { 0 };
39*53ee8cc1Swenshuai.xi TEEC_UUID uuid = MSTAR_INTERNAL_TEST_UUID;
40*53ee8cc1Swenshuai.xi TEEC_Operation op = SYS_TEEC_OPERATION_INITIALIZER;
41*53ee8cc1Swenshuai.xi int cmd = 0;
42*53ee8cc1Swenshuai.xi uint8_t buf[32];
43*53ee8cc1Swenshuai.xi
44*53ee8cc1Swenshuai.xi if (argc < 2) {
45*53ee8cc1Swenshuai.xi printf("./verify 0 or ./verify [0..5]\n");
46*53ee8cc1Swenshuai.xi goto end_test;
47*53ee8cc1Swenshuai.xi }
48*53ee8cc1Swenshuai.xi
49*53ee8cc1Swenshuai.xi cmd = atoi(argv[1]);
50*53ee8cc1Swenshuai.xi printf("cmd:%d\n",cmd);
51*53ee8cc1Swenshuai.xi
52*53ee8cc1Swenshuai.xi
53*53ee8cc1Swenshuai.xi switch (cmd)
54*53ee8cc1Swenshuai.xi {
55*53ee8cc1Swenshuai.xi case CMD_TRACE:
56*53ee8cc1Swenshuai.xi case CMD_PARAMS:
57*53ee8cc1Swenshuai.xi case CMD_SELF_TESTS:
58*53ee8cc1Swenshuai.xi case CMD_PRINT:
59*53ee8cc1Swenshuai.xi if (ret = MDrv_SYS_TEEC_InitializeContext(_device, &mstar_teec_ctx)) {
60*53ee8cc1Swenshuai.xi printf("%s %d: Init Context failed\n",__func__,__LINE__);
61*53ee8cc1Swenshuai.xi goto end_test;
62*53ee8cc1Swenshuai.xi }
63*53ee8cc1Swenshuai.xi
64*53ee8cc1Swenshuai.xi if (ret = MDrv_SYS_TEEC_Open(&mstar_teec_ctx, &session, &uuid, TEEC_LOGIN_PUBLIC, NULL, &op, &ret_orig)) {
65*53ee8cc1Swenshuai.xi printf("%s %d: TEEC Open session failed\n",__func__,__LINE__);
66*53ee8cc1Swenshuai.xi goto end_test;
67*53ee8cc1Swenshuai.xi }
68*53ee8cc1Swenshuai.xi if (ret = MDrv_SYS_TEEC_InvokeCmd(&session, cmd, &op, &ret_orig)) {
69*53ee8cc1Swenshuai.xi printf("%s %d: TEEC Invoke command failed\n",__func__,__LINE__);
70*53ee8cc1Swenshuai.xi goto end_test1;
71*53ee8cc1Swenshuai.xi }
72*53ee8cc1Swenshuai.xi break;
73*53ee8cc1Swenshuai.xi case CMD_MULTIPLY_VALUE:
74*53ee8cc1Swenshuai.xi if (argc < 4) {
75*53ee8cc1Swenshuai.xi printf("./verify 4 num1 num2\n");
76*53ee8cc1Swenshuai.xi printf("num1 is a numeric\n");
77*53ee8cc1Swenshuai.xi printf("num2 is a numeric\n");
78*53ee8cc1Swenshuai.xi goto end_test;
79*53ee8cc1Swenshuai.xi }
80*53ee8cc1Swenshuai.xi if (ret = MDrv_SYS_TEEC_InitializeContext(_device, &mstar_teec_ctx)) {
81*53ee8cc1Swenshuai.xi printf("%s %d: Init Context failed\n",__func__,__LINE__);
82*53ee8cc1Swenshuai.xi goto end_test;
83*53ee8cc1Swenshuai.xi }
84*53ee8cc1Swenshuai.xi
85*53ee8cc1Swenshuai.xi if (ret = MDrv_SYS_TEEC_Open(&mstar_teec_ctx, &session, &uuid, TEEC_LOGIN_PUBLIC, NULL, &op, &ret_orig)) {
86*53ee8cc1Swenshuai.xi printf("%s %d: TEEC Open session failed\n",__func__,__LINE__);
87*53ee8cc1Swenshuai.xi goto end_test;
88*53ee8cc1Swenshuai.xi }
89*53ee8cc1Swenshuai.xi
90*53ee8cc1Swenshuai.xi op.params[0].value.a = atoi(argv[2]);
91*53ee8cc1Swenshuai.xi op.params[0].value.b = atoi(argv[3]);
92*53ee8cc1Swenshuai.xi op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_VALUE_OUTPUT,
93*53ee8cc1Swenshuai.xi TEEC_NONE, TEEC_NONE);
94*53ee8cc1Swenshuai.xi
95*53ee8cc1Swenshuai.xi if (ret = MDrv_SYS_TEEC_InvokeCmd(&session, CMD_MULTIPLY_VALUE, &op, &ret_orig)) {
96*53ee8cc1Swenshuai.xi printf("%s %d: TEEC Invoke command failed\n",__func__,__LINE__);
97*53ee8cc1Swenshuai.xi goto end_test1;
98*53ee8cc1Swenshuai.xi }
99*53ee8cc1Swenshuai.xi printf("%d * %d = %d\n",op.params[0].value.a, op.params[0].value.b, op.params[1].value.a);
100*53ee8cc1Swenshuai.xi break;
101*53ee8cc1Swenshuai.xi case CMD_MEMORY_WRITE:
102*53ee8cc1Swenshuai.xi case CMD_MEMORY_READ:
103*53ee8cc1Swenshuai.xi {
104*53ee8cc1Swenshuai.xi static uint8_t test_input[3] = {0x5A, 0xA5, 0x5A};
105*53ee8cc1Swenshuai.xi static uint8_t test_out[3] = {0xBB, 0xCC, 0xDD};
106*53ee8cc1Swenshuai.xi printf("test_input:%x, %x, %x, test_out:%x, %x, %x\n",test_input[0], test_input[1], test_input[2], test_out[0], test_out[1], test_out[2]);
107*53ee8cc1Swenshuai.xi if (ret = MDrv_SYS_TEEC_InitializeContext(_device, &mstar_teec_ctx)) {
108*53ee8cc1Swenshuai.xi printf("%s %d: Init Context failed\n",__func__,__LINE__);
109*53ee8cc1Swenshuai.xi goto end_test;
110*53ee8cc1Swenshuai.xi }
111*53ee8cc1Swenshuai.xi
112*53ee8cc1Swenshuai.xi if (ret = MDrv_SYS_TEEC_Open(&mstar_teec_ctx, &session, &uuid, TEEC_LOGIN_PUBLIC, NULL, &op, &ret_orig)) {
113*53ee8cc1Swenshuai.xi printf("%s %d: TEEC Open session failed\n",__func__,__LINE__);
114*53ee8cc1Swenshuai.xi goto end_test;
115*53ee8cc1Swenshuai.xi }
116*53ee8cc1Swenshuai.xi op.params[0].tmpref.buffer = test_input;
117*53ee8cc1Swenshuai.xi op.params[0].tmpref.size = sizeof(test_input);
118*53ee8cc1Swenshuai.xi op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, TEEC_NONE,
119*53ee8cc1Swenshuai.xi TEEC_NONE, TEEC_NONE);
120*53ee8cc1Swenshuai.xi if (ret = MDrv_SYS_TEEC_InvokeCmd(&session, CMD_MEMORY_WRITE, &op, &ret_orig)) {
121*53ee8cc1Swenshuai.xi printf("%s %d: TEEC Invoke command failed\n",__func__,__LINE__);
122*53ee8cc1Swenshuai.xi goto end_test1;
123*53ee8cc1Swenshuai.xi }
124*53ee8cc1Swenshuai.xi
125*53ee8cc1Swenshuai.xi op.params[0].tmpref.buffer = test_out;
126*53ee8cc1Swenshuai.xi op.params[0].tmpref.size = sizeof(test_out);
127*53ee8cc1Swenshuai.xi op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT, TEEC_NONE,
128*53ee8cc1Swenshuai.xi TEEC_NONE, TEEC_NONE);
129*53ee8cc1Swenshuai.xi if (ret = MDrv_SYS_TEEC_InvokeCmd(&session, CMD_MEMORY_READ, &op, &ret_orig)) {
130*53ee8cc1Swenshuai.xi printf("%s %d: TEEC Invoke command failed\n",__func__,__LINE__);
131*53ee8cc1Swenshuai.xi goto end_test1;
132*53ee8cc1Swenshuai.xi }
133*53ee8cc1Swenshuai.xi printf("test_input:%x, %x, %x, test_out:%x, %x, %x\n",test_input[0], test_input[1], test_input[2], test_out[0], test_out[1], test_out[2]);
134*53ee8cc1Swenshuai.xi }
135*53ee8cc1Swenshuai.xi break;
136*53ee8cc1Swenshuai.xi }
137*53ee8cc1Swenshuai.xi
138*53ee8cc1Swenshuai.xi end_test1:
139*53ee8cc1Swenshuai.xi MDrv_SYS_TEEC_Close(&session);
140*53ee8cc1Swenshuai.xi end_test:
141*53ee8cc1Swenshuai.xi printf("%s %d:ret:%u\n",__func__,__LINE__,ret);
142*53ee8cc1Swenshuai.xi return 0;
143*53ee8cc1Swenshuai.xi }
144