Skip to main content

rust_utee/api/
tee_api_time.rs

1use crate::api::tee_api_panic::TEE_Panic;
2use crate::syscalls::syscall_table::{_utee_get_time, _utee_set_ta_time, _utee_wait};
3use crate::tee_api_defines::{
4    TEE_ERROR_CANCEL, TEE_ERROR_OUT_OF_MEMORY, TEE_ERROR_OVERFLOW, TEE_ERROR_STORAGE_NO_SPACE,
5    TEE_ERROR_TIME_NEEDS_RESET, TEE_ERROR_TIME_NOT_SET, TEE_SUCCESS,
6};
7use crate::tee_api_types::{TEE_Result, TEE_Time};
8use crate::utee_types::utee_time_category;
9
10#[unsafe(no_mangle)]
11pub extern "C" fn TEE_GetSystemTime(time: *mut TEE_Time) {
12    let res = unsafe { _utee_get_time(utee_time_category::UTEE_TIME_CAT_SYSTEM as u64, time) };
13
14    // 检查结果是否为 TEE_SUCCESS (0)
15    if res != TEE_SUCCESS as usize {
16        TEE_Panic(res as TEE_Result);
17    }
18}
19
20#[unsafe(no_mangle)]
21pub extern "C" fn TEE_GetTAPersistentTime(time: *mut TEE_Time) -> TEE_Result {
22    let res =
23        unsafe { _utee_get_time(utee_time_category::UTEE_TIME_CAT_TA_PERSISTENT as u64, time) };
24
25    // 如果结果不是成功且不是溢出错误,则将时间设置为0
26    if res != TEE_ERROR_OVERFLOW as usize {
27        unsafe {
28            (*time).seconds = 0;
29            (*time).millis = 0;
30        }
31    }
32
33    // 检查是否需要panic
34    if res != TEE_SUCCESS as usize
35        && res != TEE_ERROR_TIME_NOT_SET as usize
36        && res != TEE_ERROR_TIME_NEEDS_RESET as usize
37        && res != TEE_ERROR_OVERFLOW as usize
38        && res != TEE_ERROR_OUT_OF_MEMORY as usize
39    {
40        TEE_Panic(res as TEE_Result);
41    }
42
43    res as TEE_Result
44}
45
46#[unsafe(no_mangle)]
47pub extern "C" fn TEE_GetREETime(time: *mut TEE_Time) {
48    let res = unsafe { _utee_get_time(utee_time_category::UTEE_TIME_CAT_REE as u64, time) };
49
50    if res != TEE_SUCCESS as usize {
51        TEE_Panic(res as TEE_Result);
52    }
53}
54
55#[unsafe(no_mangle)]
56pub extern "C" fn TEE_Wait(timeout: u32) -> TEE_Result {
57    let res = unsafe { _utee_wait(timeout as u64) };
58
59    if res != TEE_SUCCESS as usize && res != TEE_ERROR_CANCEL as usize {
60        TEE_Panic(res as TEE_Result);
61    }
62
63    res as TEE_Result
64}
65
66#[unsafe(no_mangle)]
67pub extern "C" fn TEE_SetTAPersistentTime(time: *const TEE_Time) -> TEE_Result {
68    let res = unsafe { _utee_set_ta_time(time) };
69
70    if res != TEE_SUCCESS as usize
71        && res != TEE_ERROR_OUT_OF_MEMORY as usize
72        && res != TEE_ERROR_STORAGE_NO_SPACE as usize
73    {
74        TEE_Panic(res as TEE_Result);
75    }
76
77    res as TEE_Result
78}