Skip to main content

rust_utee/api/
tee_api_generic.rs

1use 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}