fast_smc调用的流程

来源:互联网 发布:c语言 strtok s 编辑:程序博客网 时间:2024/06/14 00:14
当在secure monitor下发生中断是,cpu切换到secure worid,执行vector table
optee/optee_os-master/core/arch/arm/kernel/thread_a64.S
 FUNC thread_vector_table , :
     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 , :
     sub sp, sp, #THREAD_SMC_ARGS_SIZE
     store_xregs sp, THREAD_SMC_ARGS_X0, 0, 7
     mov x0, sp
     bl  thread_handle_fast_smc
     load_xregs sp, THREAD_SMC_ARGS_X0, 1, 8
     add sp, sp, #THREAD_SMC_ARGS_SIZE
     ldr x0, =TEESMC_OPTEED_RETURN_CALL_DONE
     smc #0
     b   .   /* SMC should not return */
 END_FUNC vector_fast_smc_entry
在vector_fast_smc_entry 中调用thread_handle_fast_smc
void thread_handle_fast_smc(struct thread_smc_args *args)
{
    thread_check_canaries();
    thread_fast_smc_handler_ptr(args);
    /* Fast handlers must not unmask any exceptions */
    assert(thread_get_exceptions() == THREAD_EXCP_ALL);
}

这里直接调用thread_fast_smc_handler_ptr
而thread_fast_smc_handler_ptr 是在init_handlers 中赋值的
static void init_handlers(const struct thread_handlers *handlers)
{
    thread_std_smc_handler_ptr = handlers->std_smc;
    thread_fast_smc_handler_ptr = handlers->fast_smc;
    thread_nintr_handler_ptr = handlers->nintr;
    thread_cpu_on_handler_ptr = handlers->cpu_on;
    thread_cpu_off_handler_ptr = handlers->cpu_off;
    thread_cpu_suspend_handler_ptr = handlers->cpu_suspend;
    thread_cpu_resume_handler_ptr = handlers->cpu_resume;
    thread_system_off_handler_ptr = handlers->system_off;
    thread_system_reset_handler_ptr = handlers->system_reset;
}

这里的handlers就是个个厂家自己实现的,以D02 为例
static const struct thread_handlers handlers = {
    .std_smc = tee_entry_std,
    .fast_smc = tee_entry_fast,
    .nintr = main_fiq,
    .cpu_on = cpu_on_handler,
    .cpu_off = pm_do_nothing,
    .cpu_suspend = pm_do_nothing,
    .cpu_resume = pm_do_nothing,
    .system_off = pm_do_nothing,
    .system_reset = pm_do_nothing,
};

static struct hi16xx_uart_data console_data __early_bss;

register_phys_mem(MEM_AREA_IO_NSEC, CONSOLE_UART_BASE, HI16XX_UART_REG_SIZE);

const struct thread_handlers *generic_boot_get_handlers(void)
{
    return &handlers;
}
最终调用tee_entry_fast
void tee_entry_fast(struct thread_smc_args *args)
{
    switch (args->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);
        break;
}

原创粉丝点击