in optee-utee-build/src/code_generator.rs [116:190]
fn write_properties(&mut self, conf: &TaConfig) -> Result<(), Error> {
let mut ext_property_codes =
Vec::<proc_macro2::TokenStream>::with_capacity(conf.ext_properties.len());
for (index, prop) in conf.ext_properties.iter().enumerate() {
let var_name = format!("EXT_PROP_VALUE_{}", index + 1);
let rust_type_name_codes = property_value_rust_type_declaration_codes(&prop.value);
let value_codes = property_value_data_codes(&prop.value)?;
let var_name_codes = format_ident!("{}", var_name);
self.code.extend(quote! {
const #var_name_codes: #rust_type_name_codes = #value_codes;
});
let prop_name_codes = string_to_binary_codes(&prop.name);
let utee_type_name_codes = property_value_utee_type_codes(&prop.value);
let utee_value_conv_codes = property_value_as_utee_value_codes(&var_name, &prop.value);
ext_property_codes.push(quote! {
optee_utee_sys::user_ta_property {
name: #prop_name_codes.as_ptr(),
prop_type: #utee_type_name_codes,
value: #utee_value_conv_codes,
}
});
}
const ORIGIN_PROPERTY_LEN: usize = 7;
let property_len = ORIGIN_PROPERTY_LEN + conf.ext_properties.len();
let no_mangle_attribute = self.edition.no_mangle_attribute_codes();
self.code.extend(quote! {
static FLAG_BOOL: bool = (TA_FLAGS & optee_utee_sys::TA_FLAG_SINGLE_INSTANCE) != 0;
static FLAG_MULTI: bool = (TA_FLAGS & optee_utee_sys::TA_FLAG_MULTI_SESSION) != 0;
static FLAG_INSTANCE: bool = (TA_FLAGS & optee_utee_sys::TA_FLAG_INSTANCE_KEEP_ALIVE) != 0;
#no_mangle_attribute
pub static ta_num_props: usize = #property_len;
#no_mangle_attribute
pub static ta_props: [optee_utee_sys::user_ta_property; #property_len] = [
optee_utee_sys::user_ta_property {
name: optee_utee_sys::TA_PROP_STR_SINGLE_INSTANCE,
prop_type: optee_utee_sys::user_ta_prop_type::USER_TA_PROP_TYPE_BOOL,
value: &FLAG_BOOL as *const bool as *mut _,
},
optee_utee_sys::user_ta_property {
name: optee_utee_sys::TA_PROP_STR_MULTI_SESSION,
prop_type: optee_utee_sys::user_ta_prop_type::USER_TA_PROP_TYPE_BOOL,
value: &FLAG_MULTI as *const bool as *mut _,
},
optee_utee_sys::user_ta_property {
name: optee_utee_sys::TA_PROP_STR_KEEP_ALIVE,
prop_type: optee_utee_sys::user_ta_prop_type::USER_TA_PROP_TYPE_BOOL,
value: &FLAG_INSTANCE as *const bool as *mut _,
},
optee_utee_sys::user_ta_property {
name: optee_utee_sys::TA_PROP_STR_DATA_SIZE,
prop_type: optee_utee_sys::user_ta_prop_type::USER_TA_PROP_TYPE_U32,
value: &TA_DATA_SIZE as *const u32 as *mut _,
},
optee_utee_sys::user_ta_property {
name: optee_utee_sys::TA_PROP_STR_STACK_SIZE,
prop_type: optee_utee_sys::user_ta_prop_type::USER_TA_PROP_TYPE_U32,
value: &TA_STACK_SIZE as *const u32 as *mut _,
},
optee_utee_sys::user_ta_property {
name: optee_utee_sys::TA_PROP_STR_VERSION,
prop_type: optee_utee_sys::user_ta_prop_type::USER_TA_PROP_TYPE_STRING,
value: TA_VERSION as *const [u8] as *mut _,
},
optee_utee_sys::user_ta_property {
name: optee_utee_sys::TA_PROP_STR_DESCRIPTION,
prop_type: optee_utee_sys::user_ta_prop_type::USER_TA_PROP_TYPE_STRING,
value: TA_DESCRIPTION as *const [u8] as *mut _,
},
#(#ext_property_codes),*
];
});
Ok(())
}