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;
}
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;
}
阅读全文
0 0
- fast_smc调用的流程
- plproxy的调用流程
- ioctl的调用流程
- MFT的调用流程
- binder的调用流程
- RPC调用的流程
- opencore Init的调用流程
- StagefrightPlayer的OpenMax调用流程
- 云盘的调用流程
- iOS 函数调用的流程
- JNI的制作和调用流程
- read()系统调用的流程(转个贴)
- SDK接口调用的主要流程
- SDK接口调用的主要流程
- Windows中系统调用的流程
- Windows中系统调用的流程
- MFC中模态对话框的调用流程小解
- Android HAL的被调用流程
- Cocos2dx 版本下载方法
- codecademy python lesson1
- sqoop1.99.7搭建和使用
- ajax无刷新分页实现 带实例呦
- LeetCode-63. Unique Paths II
- fast_smc调用的流程
- sklearn.preprocessing中 LabelEncoder 和 OneHotEncoder区别
- ExecutorService 的理解与使用
- MapReduce介绍
- Android系统休眠对程序的影响以及处理
- mysql的监控工具mysqlreport安装和说明
- 哈夫曼树的创建
- 35、36、37
- 面试中常遇到的Set、Map、LinkedList各自区别