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
67
68
69
70
71
72
73
|
static int sbi_ecall_penglai_handler(unsigned long extid, unsigned long funcid,
unsigned long *args, unsigned long *out_val,
struct sbi_trap_info *out_trap)
{
uintptr_t arg0 = args[10], arg1 = args[11], arg2 = args[12], arg3 = args[13], arg4 = args[14], retval;
csr_write(CSR_MEPC, args[32] + 4);
switch (funcid) {
case SBI_SET_PTE:
retval = sm_set_pte(arg0, (uintptr_t*)arg1, arg2, arg3);
break;
case SBI_SM_INIT:
retval = sm_sm_init(arg0, arg1, arg2, arg3, arg4);
break;
case SBI_SM_PT_AREA_SEPARATION:
retval = sm_pt_area_separation(arg0, arg1);
break;
case SBI_SM_MAP_PTE:
retval = sm_map_pte((uintptr_t *)arg0, (uintptr_t *)arg1);
break;
case SBI_MEMORY_EXTEND:
retval = sm_mm_extend(arg0, arg1);
break;
case SBI_CREATE_ENCLAVE:
retval = sm_create_enclave(arg0);
break;
case SBI_RUN_ENCLAVE:
retval = sm_run_enclave(args, arg0, arg1);
break;
case SBI_STOP_ENCLAVE:
retval = sm_stop_enclave(args, arg0);
break;
case SBI_RESUME_ENCLAVE:
retval = sm_resume_enclave(args, arg0, arg1);
break;
case SBI_DESTROY_ENCLAVE:
retval = sm_destroy_enclave(args, arg0);
break;
case SBI_ATTEST_ENCLAVE:
retval = sm_attest_enclave(arg0, arg1, arg2);
break;
case SBI_CREATE_SERVER_ENCLAVE:
retval = sm_create_server_enclave(arg0);
break;
case SBI_CREATE_SHADOW_ENCLAVE:
retval = sm_create_shadow_enclave(arg0);
break;
case SBI_RUN_SHADOW_ENCLAVE:
retval = sm_run_shadow_enclave(args, arg0, arg1);
break;
case SBI_ATTEST_SHADOW_ENCLAVE:
retval = sm_attest_shadow_enclave(arg0, arg1, arg2);
break;
case SBI_DESTROY_SHADOW_ENCLAVE:
retval = sm_destroy_shadow_enclave(args, arg0);
break;
case SBI_DESTROY_SERVER_ENCLAVE:
retval = sm_destroy_server_enclave(args, arg0);
break;
case SBI_SCHRODINGER_INIT:
retval = sm_schrodinger_init(arg0, arg1);
break;
case 84:
retval = sm_print(arg0, arg1);
break;
default:
retval = SBI_ENOTSUPP;
}
args[32] = csr_read(CSR_MEPC);
args[33] = csr_read(CSR_MSTATUS);
*out_val = retval;
return retval;
}
|