rust_utee/api/
tee_api_generic.rs1use crate::{
2 tee_api_defines::{
3 TEE_NUM_PARAMS, TEE_PARAM_TYPE_GET, TEE_PARAM_TYPE_MEMREF_INOUT,
4 TEE_PARAM_TYPE_MEMREF_INPUT, TEE_PARAM_TYPE_MEMREF_OUTPUT, TEE_PARAM_TYPE_VALUE_INOUT,
5 TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_VALUE_OUTPUT,
6 },
7 tee_api_types::{Memref, TEE_Param},
8 utee_types::utee_params,
9};
10
11pub(crate) fn copy_param(
12 up: &mut utee_params,
13 paramTypes: u32,
14 params: *mut [TEE_Param; TEE_NUM_PARAMS as usize],
15) {
16 up.types = paramTypes as u64;
17 let params = unsafe { &mut *params };
18 for i in 0..TEE_NUM_PARAMS as usize {
19 let (a, b) = match TEE_PARAM_TYPE_GET(paramTypes, i as u32) {
20 TEE_PARAM_TYPE_VALUE_INPUT | TEE_PARAM_TYPE_VALUE_INOUT => unsafe {
21 (params[i].value.a as u64, params[i].value.b as u64)
22 },
23 TEE_PARAM_TYPE_MEMREF_OUTPUT
24 | TEE_PARAM_TYPE_MEMREF_INOUT
25 | TEE_PARAM_TYPE_MEMREF_INPUT => unsafe {
26 let memref = params[i].memref;
27 let buffer_ptr = memref.buffer as u64;
28 (buffer_ptr, memref.size as u64)
29 },
30 _ => (0, 0),
31 };
32
33 up.vals[i * 2] = a;
34 up.vals[i * 2 + 1] = b;
35 }
36}
37
38pub(crate) fn update_out_param(
39 params: *mut [TEE_Param; TEE_NUM_PARAMS as usize],
40 up: &utee_params,
41) {
42 let params = unsafe { &mut *params };
43 for i in 0..TEE_NUM_PARAMS as usize {
44 let a = up.vals[i * 2];
45 let b = up.vals[i * 2 + 1];
46 match TEE_PARAM_TYPE_GET(up.types as u32, i as u32) {
47 TEE_PARAM_TYPE_VALUE_OUTPUT | TEE_PARAM_TYPE_VALUE_INOUT => {
48 params[i].value.a = a as u32;
49 params[i].value.b = b as u32;
50 }
51 TEE_PARAM_TYPE_MEMREF_OUTPUT | TEE_PARAM_TYPE_MEMREF_INOUT => {
52 params[i].memref = Memref {
53 buffer: a as _,
54 size: b as usize,
55 }
56 }
57 _ => {}
58 };
59 }
60}