fastcall

所谓的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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值