11bb92983SJerome Forissier /* SPDX-License-Identifier: BSD-2-Clause */ 2b0104773SPascal Brand /* 3e86f1266SJens Wiklander * Copyright (c) 2015, Linaro Limited 4b0104773SPascal Brand * Copyright (c) 2014, STMicroelectronics International N.V. 5b0104773SPascal Brand */ 6b0104773SPascal Brand #ifndef UTEE_SYSCALLS_H 7b0104773SPascal Brand #define UTEE_SYSCALLS_H 8b0104773SPascal Brand 9cebdec51SJens Wiklander #include <compiler.h> 10b0104773SPascal Brand #include <stddef.h> 11b0104773SPascal Brand #include <stdint.h> 12b0104773SPascal Brand 13b0104773SPascal Brand #include <utee_types.h> 14b0104773SPascal Brand #include <tee_api_types.h> 154de4bebcSJens Wiklander #include <trace.h> 16b0104773SPascal Brand 17e86f1266SJens Wiklander /* 189102ce21SJens Wiklander * Arguments must use the native register width, unless it's a signed 199102ce21SJens Wiklander * argument then it must be a 32-bit value instead to avoid problems with 209102ce21SJens Wiklander * sign extension. To keep it simple, only use pointers, int32_t, unsigned 219102ce21SJens Wiklander * long and size_t. Pointers may only point structures or types based on 229102ce21SJens Wiklander * fixed width integer types. Only exception are buffers with opaque data. 23e86f1266SJens Wiklander * 24e86f1266SJens Wiklander * Return values should not use a fixed width larger than 32 bits, unsigned 25e86f1266SJens Wiklander * long and pointers are OK though. 26e86f1266SJens Wiklander * 27e86f1266SJens Wiklander * Members in structs on the other hand should only use fixed width integer 28e86f1266SJens Wiklander * types; uint32_t, uint64_t etc. To keep it simple, use uint64_t for all 29e86f1266SJens Wiklander * length fields. 30e86f1266SJens Wiklander */ 31e86f1266SJens Wiklander 32*2c028fdeSJerome Forissier void _utee_return(unsigned long ret) __noreturn; 33b0104773SPascal Brand 34*2c028fdeSJerome Forissier void _utee_log(const void *buf, size_t len); 35b0104773SPascal Brand 360e1c6e8eSJerome Forissier /* This is not __noreturn because AArch32 stack unwinding fails otherwise */ 37*2c028fdeSJerome Forissier void _utee_panic(unsigned long code); 38b0104773SPascal Brand 3964a5011eSPascal Brand /* prop_set is TEE_PROPSET_xxx*/ 40*2c028fdeSJerome Forissier TEE_Result _utee_get_property(unsigned long prop_set, unsigned long index, 41*2c028fdeSJerome Forissier void *name, uint32_t *name_len, void *buf, 42*2c028fdeSJerome Forissier uint32_t *blen, uint32_t *prop_type); 43*2c028fdeSJerome Forissier 44*2c028fdeSJerome Forissier TEE_Result _utee_get_property_name_to_index(unsigned long prop_set, 458f07fe6fSJerome Forissier const void *name, 4664a5011eSPascal Brand unsigned long name_len, 4764a5011eSPascal Brand uint32_t *index); 4864a5011eSPascal Brand 49*2c028fdeSJerome Forissier /* sess has type TEE_TASessionHandle */ 50*2c028fdeSJerome Forissier TEE_Result _utee_open_ta_session(const TEE_UUID *dest, 51*2c028fdeSJerome Forissier unsigned long cancel_req_to, 52*2c028fdeSJerome Forissier struct utee_params *params, uint32_t *sess, 53*2c028fdeSJerome Forissier uint32_t *ret_orig); 54b0104773SPascal Brand 55e86f1266SJens Wiklander /* sess has type TEE_TASessionHandle */ 56*2c028fdeSJerome Forissier TEE_Result _utee_close_ta_session(unsigned long sess); 57b0104773SPascal Brand 58e86f1266SJens Wiklander /* sess has type TEE_TASessionHandle */ 59*2c028fdeSJerome Forissier TEE_Result _utee_invoke_ta_command(unsigned long sess, 60*2c028fdeSJerome Forissier unsigned long cancel_req_to, 61*2c028fdeSJerome Forissier unsigned long cmd_id, 62*2c028fdeSJerome Forissier struct utee_params *params, 63*2c028fdeSJerome Forissier uint32_t *ret_orig); 64b0104773SPascal Brand 65*2c028fdeSJerome Forissier TEE_Result _utee_check_access_rights(uint32_t flags, const void *buf, 66b0104773SPascal Brand size_t len); 67b0104773SPascal Brand 68e86f1266SJens Wiklander /* cancel has type bool */ 69*2c028fdeSJerome Forissier TEE_Result _utee_get_cancellation_flag(uint32_t *cancel); 70b0104773SPascal Brand 71e86f1266SJens Wiklander /* old_mask has type bool */ 72*2c028fdeSJerome Forissier TEE_Result _utee_unmask_cancellation(uint32_t *old_mask); 73b0104773SPascal Brand 74e86f1266SJens Wiklander /* old_mask has type bool */ 75*2c028fdeSJerome Forissier TEE_Result _utee_mask_cancellation(uint32_t *old_mask); 76b0104773SPascal Brand 77*2c028fdeSJerome Forissier TEE_Result _utee_wait(unsigned long timeout); 78b0104773SPascal Brand 79*2c028fdeSJerome Forissier /* cat has type enum _utee_time_category */ 80*2c028fdeSJerome Forissier TEE_Result _utee_get_time(unsigned long cat, TEE_Time *time); 81b0104773SPascal Brand 82*2c028fdeSJerome Forissier TEE_Result _utee_set_ta_time(const TEE_Time *time); 83b0104773SPascal Brand 84*2c028fdeSJerome Forissier TEE_Result _utee_cryp_state_alloc(unsigned long algo, unsigned long op_mode, 85e86f1266SJens Wiklander unsigned long key1, unsigned long key2, 86b0104773SPascal Brand uint32_t *state); 87*2c028fdeSJerome Forissier TEE_Result _utee_cryp_state_copy(unsigned long dst, unsigned long src); 88*2c028fdeSJerome Forissier TEE_Result _utee_cryp_state_free(unsigned long state); 89b0104773SPascal Brand 90b0104773SPascal Brand /* iv and iv_len are ignored for some algorithms */ 91*2c028fdeSJerome Forissier TEE_Result _utee_hash_init(unsigned long state, const void *iv, size_t iv_len); 92*2c028fdeSJerome Forissier TEE_Result _utee_hash_update(unsigned long state, const void *chunk, 93b0104773SPascal Brand size_t chunk_size); 94*2c028fdeSJerome Forissier TEE_Result _utee_hash_final(unsigned long state, const void *chunk, 95e86f1266SJens Wiklander size_t chunk_size, void *hash, uint64_t *hash_len); 96b0104773SPascal Brand 97*2c028fdeSJerome Forissier TEE_Result _utee_cipher_init(unsigned long state, const void *iv, 98*2c028fdeSJerome Forissier size_t iv_len); 99*2c028fdeSJerome Forissier TEE_Result _utee_cipher_update(unsigned long state, const void *src, 100e86f1266SJens Wiklander size_t src_len, void *dest, uint64_t *dest_len); 101*2c028fdeSJerome Forissier TEE_Result _utee_cipher_final(unsigned long state, const void *src, 102e86f1266SJens Wiklander size_t src_len, void *dest, uint64_t *dest_len); 103b0104773SPascal Brand 104b0104773SPascal Brand /* Generic Object Functions */ 105*2c028fdeSJerome Forissier TEE_Result _utee_cryp_obj_get_info(unsigned long obj, TEE_ObjectInfo *info); 106*2c028fdeSJerome Forissier TEE_Result _utee_cryp_obj_restrict_usage(unsigned long obj, 107*2c028fdeSJerome Forissier unsigned long usage); 108*2c028fdeSJerome Forissier TEE_Result _utee_cryp_obj_get_attr(unsigned long obj, unsigned long attr_id, 109e86f1266SJens Wiklander void *buffer, uint64_t *size); 110b0104773SPascal Brand 111b0104773SPascal Brand /* Transient Object Functions */ 112e86f1266SJens Wiklander /* type has type TEE_ObjectType */ 113*2c028fdeSJerome Forissier TEE_Result _utee_cryp_obj_alloc(unsigned long type, unsigned long max_size, 114b0104773SPascal Brand uint32_t *obj); 115*2c028fdeSJerome Forissier TEE_Result _utee_cryp_obj_close(unsigned long obj); 116*2c028fdeSJerome Forissier TEE_Result _utee_cryp_obj_reset(unsigned long obj); 117*2c028fdeSJerome Forissier TEE_Result _utee_cryp_obj_populate(unsigned long obj, 118*2c028fdeSJerome Forissier struct utee_attribute *attrs, 119*2c028fdeSJerome Forissier unsigned long attr_count); 120*2c028fdeSJerome Forissier TEE_Result _utee_cryp_obj_copy(unsigned long dst_obj, unsigned long src_obj); 121b0104773SPascal Brand 122*2c028fdeSJerome Forissier TEE_Result _utee_cryp_obj_generate_key(unsigned long obj, 123*2c028fdeSJerome Forissier unsigned long key_size, 124e86f1266SJens Wiklander const struct utee_attribute *params, 125e86f1266SJens Wiklander unsigned long param_count); 126b0104773SPascal Brand 127*2c028fdeSJerome Forissier TEE_Result _utee_cryp_derive_key(unsigned long state, 128e86f1266SJens Wiklander const struct utee_attribute *params, 129*2c028fdeSJerome Forissier unsigned long param_count, 130*2c028fdeSJerome Forissier unsigned long derived_key); 131b0104773SPascal Brand 132*2c028fdeSJerome Forissier TEE_Result _utee_cryp_random_number_generate(void *buf, size_t blen); 133b0104773SPascal Brand 134*2c028fdeSJerome Forissier TEE_Result _utee_authenc_init(unsigned long state, const void *nonce, 135b0104773SPascal Brand size_t nonce_len, size_t tag_len, size_t aad_len, 136b0104773SPascal Brand size_t payload_len); 137*2c028fdeSJerome Forissier TEE_Result _utee_authenc_update_aad(unsigned long state, const void *aad_data, 138b0104773SPascal Brand size_t aad_data_len); 139*2c028fdeSJerome Forissier TEE_Result _utee_authenc_update_payload(unsigned long state, 140*2c028fdeSJerome Forissier const void *src_data, size_t src_len, 141*2c028fdeSJerome Forissier void *dest_data, uint64_t *dest_len); 142*2c028fdeSJerome Forissier TEE_Result _utee_authenc_enc_final(unsigned long state, const void *src_data, 143*2c028fdeSJerome Forissier size_t src_len, void *dest_data, 144*2c028fdeSJerome Forissier uint64_t *dest_len, void *tag, 145*2c028fdeSJerome Forissier uint64_t *tag_len); 146*2c028fdeSJerome Forissier TEE_Result _utee_authenc_dec_final(unsigned long state, const void *src_data, 147*2c028fdeSJerome Forissier size_t src_len, void *dest_data, 148*2c028fdeSJerome Forissier uint64_t *dest_len, const void *tag, 149*2c028fdeSJerome Forissier size_t tag_len); 150b0104773SPascal Brand 151*2c028fdeSJerome Forissier TEE_Result _utee_asymm_operate(unsigned long state, 152e86f1266SJens Wiklander const struct utee_attribute *params, 153e86f1266SJens Wiklander unsigned long num_params, const void *src_data, 154*2c028fdeSJerome Forissier size_t src_len, void *dest_data, 155*2c028fdeSJerome Forissier uint64_t *dest_len); 156b0104773SPascal Brand 157*2c028fdeSJerome Forissier TEE_Result _utee_asymm_verify(unsigned long state, 158e86f1266SJens Wiklander const struct utee_attribute *params, 159e86f1266SJens Wiklander unsigned long num_params, const void *data, 160e86f1266SJens Wiklander size_t data_len, const void *sig, size_t sig_len); 161b0104773SPascal Brand 162b0104773SPascal Brand /* Persistant Object Functions */ 163e86f1266SJens Wiklander /* obj is of type TEE_ObjectHandle */ 164*2c028fdeSJerome Forissier TEE_Result _utee_storage_obj_open(unsigned long storage_id, 165*2c028fdeSJerome Forissier const void *object_id, size_t object_id_len, 166*2c028fdeSJerome Forissier unsigned long flags, uint32_t *obj); 167b0104773SPascal Brand 168e86f1266SJens Wiklander /* 169e86f1266SJens Wiklander * attr is of type TEE_ObjectHandle 170e86f1266SJens Wiklander * obj is of type TEE_ObjectHandle 171e86f1266SJens Wiklander */ 172*2c028fdeSJerome Forissier TEE_Result _utee_storage_obj_create(unsigned long storage_id, 1738f07fe6fSJerome Forissier const void *object_id, 174e86f1266SJens Wiklander size_t object_id_len, unsigned long flags, 175e86f1266SJens Wiklander unsigned long attr, const void *data, 176e86f1266SJens Wiklander size_t len, uint32_t *obj); 177b0104773SPascal Brand 178e86f1266SJens Wiklander /* obj is of type TEE_ObjectHandle */ 179*2c028fdeSJerome Forissier TEE_Result _utee_storage_obj_del(unsigned long obj); 180b0104773SPascal Brand 181e86f1266SJens Wiklander /* obj is of type TEE_ObjectHandle */ 182*2c028fdeSJerome Forissier TEE_Result _utee_storage_obj_rename(unsigned long obj, const void *new_obj_id, 183b0104773SPascal Brand size_t new_obj_id_len); 184b0104773SPascal Brand 185b0104773SPascal Brand /* Persistent Object Enumeration Functions */ 186e86f1266SJens Wiklander /* obj_enum is of type TEE_ObjectEnumHandle */ 187*2c028fdeSJerome Forissier TEE_Result _utee_storage_alloc_enum(uint32_t *obj_enum); 188b0104773SPascal Brand 189b0104773SPascal Brand 190e86f1266SJens Wiklander /* obj_enum is of type TEE_ObjectEnumHandle */ 191*2c028fdeSJerome Forissier TEE_Result _utee_storage_free_enum(unsigned long obj_enum); 192b0104773SPascal Brand 193e86f1266SJens Wiklander /* obj_enum is of type TEE_ObjectEnumHandle */ 194*2c028fdeSJerome Forissier TEE_Result _utee_storage_reset_enum(unsigned long obj_enum); 195b0104773SPascal Brand 196e86f1266SJens Wiklander /* obj_enum is of type TEE_ObjectEnumHandle */ 197*2c028fdeSJerome Forissier TEE_Result _utee_storage_start_enum(unsigned long obj_enum, 198e86f1266SJens Wiklander unsigned long storage_id); 199e86f1266SJens Wiklander 200e86f1266SJens Wiklander /* obj_enum is of type TEE_ObjectEnumHandle */ 201*2c028fdeSJerome Forissier TEE_Result _utee_storage_next_enum(unsigned long obj_enum, TEE_ObjectInfo *info, 202e86f1266SJens Wiklander void *obj_id, uint64_t *len); 203b0104773SPascal Brand 204b0104773SPascal Brand /* Data Stream Access Functions */ 205e86f1266SJens Wiklander /* obj is of type TEE_ObjectHandle */ 206*2c028fdeSJerome Forissier TEE_Result _utee_storage_obj_read(unsigned long obj, void *data, size_t len, 207e86f1266SJens Wiklander uint64_t *count); 208b0104773SPascal Brand 209e86f1266SJens Wiklander /* obj is of type TEE_ObjectHandle */ 210*2c028fdeSJerome Forissier TEE_Result _utee_storage_obj_write(unsigned long obj, const void *data, 211b0104773SPascal Brand size_t len); 212b0104773SPascal Brand 213e86f1266SJens Wiklander /* obj is of type TEE_ObjectHandle */ 214*2c028fdeSJerome Forissier TEE_Result _utee_storage_obj_trunc(unsigned long obj, size_t len); 215b0104773SPascal Brand 216e86f1266SJens Wiklander /* obj is of type TEE_ObjectHandle */ 217e86f1266SJens Wiklander /* whence is of type TEE_Whence */ 218*2c028fdeSJerome Forissier TEE_Result _utee_storage_obj_seek(unsigned long obj, int32_t offset, 219e86f1266SJens Wiklander unsigned long whence); 220b0104773SPascal Brand 221e86f1266SJens Wiklander /* seServiceHandle is of type TEE_SEServiceHandle */ 222*2c028fdeSJerome Forissier TEE_Result _utee_se_service_open(uint32_t *seServiceHandle); 223197d17e7SSY Chiu 224e86f1266SJens Wiklander /* seServiceHandle is of type TEE_SEServiceHandle */ 225*2c028fdeSJerome Forissier TEE_Result _utee_se_service_close(unsigned long seServiceHandle); 226197d17e7SSY Chiu 227e86f1266SJens Wiklander /* 228e86f1266SJens Wiklander * seServiceHandle is of type TEE_SEServiceHandle 229e86f1266SJens Wiklander * r is of type TEE_SEReaderHandle 230e86f1266SJens Wiklander */ 231*2c028fdeSJerome Forissier TEE_Result _utee_se_service_get_readers(unsigned long seServiceHandle, 232e86f1266SJens Wiklander uint32_t *r, uint64_t *len); 233197d17e7SSY Chiu 234e86f1266SJens Wiklander /* 235e86f1266SJens Wiklander * r is of type TEE_SEReaderHandle 236e86f1266SJens Wiklander * p is defined with defines UTEE_SE_READER_* 237e86f1266SJens Wiklander */ 238*2c028fdeSJerome Forissier TEE_Result _utee_se_reader_get_prop(unsigned long r, uint32_t *p); 239197d17e7SSY Chiu 240e86f1266SJens Wiklander /* r is of type TEE_SEReaderHandle */ 241*2c028fdeSJerome Forissier TEE_Result _utee_se_reader_get_name(unsigned long r, char *name, 242*2c028fdeSJerome Forissier uint64_t *name_len); 243197d17e7SSY Chiu 244e86f1266SJens Wiklander /* 245e86f1266SJens Wiklander * r is of type TEE_SEReaderHandle 246e86f1266SJens Wiklander * s if of type TEE_SESessionHandle 247e86f1266SJens Wiklander */ 248*2c028fdeSJerome Forissier TEE_Result _utee_se_reader_open_session(unsigned long r, uint32_t *s); 249197d17e7SSY Chiu 250e86f1266SJens Wiklander /* r is of type TEE_SEReaderHandle */ 251*2c028fdeSJerome Forissier TEE_Result _utee_se_reader_close_sessions(unsigned long r); 252197d17e7SSY Chiu 253e86f1266SJens Wiklander /* s is of type TEE_SESessionHandle */ 254*2c028fdeSJerome Forissier TEE_Result _utee_se_session_is_closed(unsigned long s); 255197d17e7SSY Chiu 256e86f1266SJens Wiklander /* s is of type TEE_SESessionHandle */ 257*2c028fdeSJerome Forissier TEE_Result _utee_se_session_get_atr(unsigned long s, void *atr, 258e86f1266SJens Wiklander uint64_t *atr_len); 259197d17e7SSY Chiu 260e86f1266SJens Wiklander /* 261e86f1266SJens Wiklander * s is of type TEE_SESessionHandle 262e86f1266SJens Wiklander * c is of type TEE_SEChannelHandle 263e86f1266SJens Wiklander */ 264*2c028fdeSJerome Forissier TEE_Result _utee_se_session_open_channel(unsigned long s, 265*2c028fdeSJerome Forissier unsigned long is_logical, 266*2c028fdeSJerome Forissier const void *aid_buffer, 267e86f1266SJens Wiklander size_t aid_buffer_len, uint32_t *c); 268197d17e7SSY Chiu 269e86f1266SJens Wiklander /* s is of type TEE_SESessionHandle */ 270*2c028fdeSJerome Forissier TEE_Result _utee_se_session_close(unsigned long s); 271197d17e7SSY Chiu 272e86f1266SJens Wiklander /* c is of type TEE_SEChannelHandle */ 273*2c028fdeSJerome Forissier TEE_Result _utee_se_channel_select_next(unsigned long c); 274197d17e7SSY Chiu 275e86f1266SJens Wiklander /* c is of type TEE_SEChannelHandle */ 276*2c028fdeSJerome Forissier TEE_Result _utee_se_channel_get_select_resp(unsigned long c, void *resp, 277e86f1266SJens Wiklander uint64_t *resp_len); 278197d17e7SSY Chiu 279e86f1266SJens Wiklander /* c is of type TEE_SEChannelHandle */ 280*2c028fdeSJerome Forissier TEE_Result _utee_se_channel_transmit(unsigned long c, void *cmd, size_t cmd_len, 281*2c028fdeSJerome Forissier void *resp, uint64_t *resp_len); 282197d17e7SSY Chiu 283e86f1266SJens Wiklander /* c is of type TEE_SEChannelHandle */ 284*2c028fdeSJerome Forissier TEE_Result _utee_se_channel_close(unsigned long c); 285197d17e7SSY Chiu 286*2c028fdeSJerome Forissier /* op is of type enum _utee_cache_operation */ 287*2c028fdeSJerome Forissier TEE_Result _utee_cache_operation(void *va, size_t l, unsigned long op); 288fa530828SPascal Brand 289*2c028fdeSJerome Forissier TEE_Result _utee_gprof_send(void *buf, size_t size, uint32_t *id); 290883c4be3SJerome Forissier 291b0104773SPascal Brand #endif /* UTEE_SYSCALLS_H */ 292