
Change consists creation of ADCI thread at SMCInvoke driver initialization Change consists creation of ADCI thread at SMCInvoke driver initialization Following scenario have been tested for this change (1) ADCI thread creation and QTEE invocation during driver initialization (2) Backward Compatibility - IF ADCI feature is not supported (OBJECT_ERROR_INVALID) then exit the ADCI thread gracefully after cleaning up all the resources (3) Leak Test: All the resources held by ADCI thread should be released if ADCI feature is not supported by QTEE (i) adci task_struct state and exit state: state = TASK_RUNNING , exit_state = 0 (While ADCI thread execution) state = TASK_DEAD , exit_state = EXIT_DEAD (During ADCI thread termination) (ii) adci task_struct = NULL (fetched based on adci thread_id) which make sure task_struct has been deallocated (4) SMCInvoke related Test: All the internal(suuported),memobj and cbo testing has been performed. Change-Id: I2916ce260fae293b88fbc8b9d24baccdee1ea89f Signed-off-by: Pawan Rai <quic_pawarai@quicinc.com>
134 lines
3.1 KiB
C
134 lines
3.1 KiB
C
/* SPDX-License-Identifier: GPL-2.0-only WITH Linux-syscall-note */
|
|
/*
|
|
*
|
|
* Copyright (c) 2021 The Linux Foundation. All rights reserved.
|
|
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
|
*/
|
|
|
|
#define IClientEnv_OP_open 0
|
|
#define IClientEnv_OP_registerLegacy 1
|
|
#define IClientEnv_OP_register 2
|
|
#define IClientEnv_OP_registerWithWhitelist 3
|
|
#define IClientEnv_OP_notifyDomainChange 4
|
|
#define IClientEnv_OP_registerWithCredentials 5
|
|
#define IClientEnv_OP_accept 6
|
|
#define IClientEnv_OP_adciShutdown 7
|
|
|
|
#include "smcinvoke_object.h"
|
|
|
|
static inline int32_t
|
|
IClientEnv_release(struct Object self)
|
|
{
|
|
return Object_invoke(self, Object_OP_release, 0, 0);
|
|
}
|
|
|
|
static inline int32_t
|
|
IClientEnv_retain(struct Object self)
|
|
{
|
|
return Object_invoke(self, Object_OP_retain, 0, 0);
|
|
}
|
|
|
|
static inline int32_t
|
|
IClientEnv_open(struct Object self, uint32_t uid_val, struct Object *obj_ptr)
|
|
{
|
|
union ObjectArg a[2];
|
|
int32_t result;
|
|
|
|
a[0].b = (struct ObjectBuf) { &uid_val, sizeof(uint32_t) };
|
|
|
|
result = Object_invoke(self, IClientEnv_OP_open, a, ObjectCounts_pack(1, 0, 0, 1));
|
|
|
|
*obj_ptr = a[1].o;
|
|
|
|
return result;
|
|
}
|
|
|
|
static inline int32_t
|
|
IClientEnv_registerLegacy(struct Object self, const void *credentials_ptr, size_t credentials_len,
|
|
struct Object *clientEnv_ptr)
|
|
{
|
|
union ObjectArg a[2];
|
|
int32_t result;
|
|
|
|
a[0].bi = (struct ObjectBufIn) { credentials_ptr, credentials_len * 1 };
|
|
|
|
result = Object_invoke(self, IClientEnv_OP_registerLegacy, a,
|
|
ObjectCounts_pack(1, 0, 0, 1));
|
|
|
|
*clientEnv_ptr = a[1].o;
|
|
|
|
return result;
|
|
}
|
|
|
|
static inline int32_t
|
|
IClientEnv_register(struct Object self, struct Object credentials_val,
|
|
struct Object *clientEnv_ptr)
|
|
{
|
|
union ObjectArg a[2];
|
|
int32_t result;
|
|
|
|
a[0].o = credentials_val;
|
|
|
|
result = Object_invoke(self, IClientEnv_OP_register, a,
|
|
ObjectCounts_pack(0, 0, 1, 1));
|
|
|
|
*clientEnv_ptr = a[1].o;
|
|
|
|
return result;
|
|
}
|
|
|
|
static inline int32_t
|
|
IClientEnv_registerWithWhitelist(struct Object self,
|
|
struct Object credentials_val, const uint32_t *uids_ptr,
|
|
size_t uids_len, struct Object *clientEnv_ptr)
|
|
{
|
|
union ObjectArg a[3];
|
|
int32_t result;
|
|
|
|
a[1].o = credentials_val;
|
|
a[0].bi = (struct ObjectBufIn) { uids_ptr, uids_len *
|
|
sizeof(uint32_t) };
|
|
|
|
result = Object_invoke(self, IClientEnv_OP_registerWithWhitelist, a,
|
|
ObjectCounts_pack(1, 0, 1, 1));
|
|
|
|
*clientEnv_ptr = a[2].o;
|
|
|
|
return result;
|
|
}
|
|
|
|
static inline int32_t
|
|
IClientEnv_notifyDomainChange(struct Object self)
|
|
{
|
|
return Object_invoke(self, IClientEnv_OP_notifyDomainChange, 0, 0);
|
|
}
|
|
|
|
static inline int32_t
|
|
IClientEnv_registerWithCredentials(struct Object self, struct Object
|
|
credentials_val, struct Object *clientEnv_ptr)
|
|
{
|
|
union ObjectArg a[2]={{{0,0}}};
|
|
int32_t result;
|
|
|
|
a[0].o = credentials_val;
|
|
|
|
result = Object_invoke(self, IClientEnv_OP_registerWithCredentials, a,
|
|
ObjectCounts_pack(0, 0, 1, 1));
|
|
|
|
*clientEnv_ptr = a[1].o;
|
|
|
|
return result;
|
|
}
|
|
|
|
static inline int32_t
|
|
IClientEnv_accept(struct Object self)
|
|
{
|
|
return Object_invoke(self, IClientEnv_OP_accept, 0, 0);
|
|
}
|
|
|
|
static inline int32_t
|
|
IClientEnv_adciShutdown(struct Object self)
|
|
{
|
|
return Object_invoke(self, IClientEnv_OP_adciShutdown, 0, 0);
|
|
}
|