aboutsummaryrefslogtreecommitdiff
path: root/aarch64/el0_s/tztest_sec.c
blob: a7ee3b7aa563560b7c885c898d9a4d91973b8d92 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include "el0_common.h"

void el0_sec_loop()
{
    svc_op_desc_t desc;
    op_test_t *test = (op_test_t *)&desc;
    uint32_t op = SVC_OP_YIELD;

    DEBUG_MSG("Starting loop - desc = %p  test = %p\n", &desc, test);

    while (op != SVC_OP_EXIT) {
        switch (op) {
        case SVC_OP_MAP:
            DEBUG_MSG("Handling a SVC_OP_MAP - desc = %p\n", &desc);
            op = SVC_OP_MAP;
            break;
        case SVC_OP_YIELD:
            DEBUG_MSG("Handling a SVC_OP_YIELD - desc = %p\n", &desc);
            break;
        case SVC_OP_TEST:
            DEBUG_MSG("Handling a SVC_OP_TEST - desc =  %p\n", &desc);
            if (test->val != test->orig >> test->count) {
                test->fail++;
            }
            test->val >>= 1;
            test->count++;
            break;
        case 0:
            op = SVC_OP_YIELD;
            break;
        default:
            DEBUG_MSG("Unrecognized SVC opcode %d.  Exiting ...\n", op);
            op = SVC_OP_EXIT;
            break;
        }

        DEBUG_MSG("Calling svc(%d, %p)\n", op, &desc);
        op = __svc(op, &desc);
        DEBUG_MSG("Returned from svc - op = %d &desc = %p\n", op, &desc);
    }

    __svc(SVC_OP_EXIT, NULL);
}

int main()
{
    svc_op_desc_t desc;

    printf("Starting secure-side EL0  ...\n");

    /* Fetch the system-wide control structure */
    __svc(SVC_OP_GET_SYSCNTL, &desc);
    syscntl = (sys_control_t *)desc.get.data;

    /* If we didn't get a valid control structure then something has already
     * gone drastically wrong.
     */
    if (!syscntl) {
        printf("Failed to acquire system control structure\n");
        __svc(SVC_OP_EXIT, NULL);
    }

    el0_sec_loop();

    return 0;
}