所谓的fast call 就是ATF通过smc 陷入到optee中后,获取一些参数,例如UID、MUTEX等
从ATF陷入到OPTEE的入口为:
core/arm/kernel/thread_optee_smc_a64.S
/*
* Vector table supplied to ARM Trusted Firmware (ARM-TF) at
* initialization.
*
* Note that ARM-TF depends on the layout of this vector table, any change
* in layout has to be synced with ARM-TF.
*/
FUNC thread_vector_table , : , .identity_map
b vector_std_smc_entry
b vector_fast_smc_entry
b vector_cpu_on_entry
b vector_cpu_off_entry
b vector_cpu_resume_entry
b vector_cpu_suspend_entry
b vector_fiq_entry
b vector_system_off_entry
b vector_system_reset_entry
END_FUNC thread_vector_table
我们重点看看vector_fast_smc_entry
LOCAL_FUNC vector_fast_smc_entry , : , .identity_map
readjust_pc
sub sp, sp, #THREAD_SMC_ARGS_SIZE
store_xregs sp, THREAD_SMC_ARGS_X0, 0, 7
mov x0, sp
bl thread_handle_fast_smc
#保存thread_handle_fast_smc 中得到值,并把这些只保存到sp中,并调整sp
load_xregs sp, THREAD_SMC_ARGS_X0, 1, 8
add sp, sp, #THREAD_SMC_ARGS_SIZE
ldr x0, =TEESMC_OPTEED_RETURN_CALL_DONE
#返回到ATF中
smc #0
b . /* SMC should not return */
END_FUNC vector_fast_smc_entry
void thread_handle_fast_smc(struct thread_smc_args *args)
{
tee_entry_fast(args);
}
void __weak tee_entry_fast(struct thread_smc_args *args)
{
__tee_entry_fast(args);
}
void __tee_entry_fast(struct thread_smc_args *args)
{
switch (args->a0) {
#可以看到根据参数a0 来执行不同的操作
/* Generic functions */
case OPTEE_SMC_CALLS_COUNT:
tee_entry_get_api_call_count(args);
break;
case OPTEE_SMC_CALLS_UID:
tee_entry_get_api_uuid(args);
}
这里我们看看OPTEE_SMC_CALLS_UID
void __weak tee_entry_get_api_uuid(struct thread_smc_args *args)
{
args->a0 = OPTEE_MSG_UID_0;
args->a1 = OPTEE_MSG_UID_1;
args->a2 = OPTEE_MSG_UID_2;
args->a3 = OPTEE_MSG_UID_3;
}
这里直接修改aregs的值后,这些值保存到sp中,返回给ATF