当在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;
}
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;
}