optee中的fiq的执行

在optee的初始化时会调用 thread_init_per_cpu
void thread_init_per_cpu(void)
 {
     size_t pos = get_core_pos();
     struct thread_core_local *l = thread_get_core_local();
 
     init_sec_mon(pos);
 
     set_tmp_stack(l, GET_STACK(stack_tmp[pos]) - STACK_TMP_OFFS);
     set_abt_stack(l, GET_STACK(stack_abt[pos]));
 
     thread_init_vbar();
 }
在thread_init_per_cpu 中最重要的是调用thread_init_vbar来保存中断向量表

 FUNC thread_init_vbar , :
     adr x0, thread_vect_table
     msr vbar_el1, x0
     ret
 END_FUNC thread_init_vbar

可以看到在thread_init_vbar 中是将thread_vect_table 保存到vbar_el1 中,这里的thread_vect_table 就是中断想量表,这样当产生irq中断是就会从thread_vect_table 中开始执行,一般optee中处理frq和在rich os中处理irq中断
 LOCAL_FUNC thread_vect_table , :
 UNWIND( .fnstart)
 UNWIND( .cantunwind)
     b   .           /* Reset            */
     b   thread_und_handler  /* Undefined instruction    */
     b   thread_svc_handler  /* System call          */
     b   thread_pabort_handler   /* Prefetch abort       */
     b   thread_dabort_handler   /* Data abort           */
     b   .           /* Reserved         */
     b   thread_irq_handler  /* IRQ              */
     b   thread_fiq_handler  /* FIQ              */
 UNWIND( .fnend)
 END_FUNC thread_vect_table
irq的话这里当然调用thread_irq_handler
 LOCAL_FUNC thread_irq_handler , :
 UNWIND( .fnstart)
 UNWIND( .cantunwind)
 #if defined(CFG_ARM_GICV3)
     native_intr_handler irq
 #else
     foreign_intr_handler    irq
 #endif
 UNWIND( .fnend)
 END_FUNC thread_irq_handler
我们没有定义CFG_ARM_GICV3,因此这里走foreign_intr_handler
.macro foreign_intr_handler mode:req
  * Mark current thread as suspended
      */
     mov w0, #THREAD_FLAGS_EXIT_ON_FOREIGN_INTR
     mrs x1, spsr_el1
     mrs x2, elr_el1
     bl  thread_state_suspend
     mov w4, w0      /* Supply thread index */

     orr w1, w1, #THREAD_CLF_IRQ
    ldr w0, =TEESMC_OPTEED_RETURN_CALL_DONE
     ldr w1, =OPTEE_SMC_RETURN_RPC_FOREIGN_INTR
     mov w2, #0
     mov w3, #0
     /* w4 is already filled in above */
     smc #0
     b   .   /* SMC should not return */
 .endm
这个函数很长,总的思想是将当前thread suspend,然后通过smc #0 进入到el3,也就是monitor。在monitor中会回调到sm_vect_table
 LOCAL_FUNC sm_vect_table , :
 UNWIND( .fnstart)
 UNWIND( .cantunwind)
     b   .       /* Reset            */
     b   .       /* Undefined instruction    */
     b   sm_smc_entry    /* Secure monitor call      */
     b   .       /* Prefetch abort       */
     b   .       /* Data abort           */
     b   .       /* Reserved         */
     b   .       /* IRQ              */
     b   sm_fiq_entry    /* FIQ              */
 UNWIND( .fnend)
 END_FUNC sm_vect_table

调用sm_smc_entry
LOCAL_FUNC sm_smc_entry , :
UNWIND(    .fnstart)
UNWIND(    .cantunwind)
    srsdb    sp!, #CPSR_MODE_MON
    push    {r0-r7}

    clrex        /* Clear the exclusive monitor */

    /* Find out if we're doing an secure or non-secure entry */
    read_scr r1
    tst    r1, #SCR_NS
    bne    .smc_from_nsec

    /*
     * As we're coming from secure world (NS bit cleared) the stack
     * pointer points to sm_ctx.sec.r0 at this stage. After the
     * instruction below the stack pointer points to sm_ctx.
     */
    sub    sp, sp, #(SM_CTX_SEC + SM_SEC_CTX_R0)

    /* Save secure context */
    add    r0, sp, #SM_CTX_SEC
    bl    sm_save_modes_regs

    /*
     * On FIQ exit we're restoring the non-secure context unchanged, on
     * all other exits we're shifting r1-r4 from secure context into
     * r0-r3 in non-secure context.
     */
    add    r8, sp, #(SM_CTX_SEC + SM_SEC_CTX_R0)
    ldm    r8, {r0-r4}
    mov_imm    r9, TEESMC_OPTEED_RETURN_FIQ_DONE
    cmp    r0, r9
    addne    r8, sp, #(SM_CTX_NSEC + SM_NSEC_CTX_R0)
    stmne    r8, {r1-r4}
//恢复不安全的环境,这里就是normal world中kernel的设定
    /* Restore non-secure context */
    add    r0, sp, #SM_CTX_NSEC
    bl    sm_restore_modes_regs
//返回到non-secure world
.sm_ret_to_nsec:
    /*
     * Return to non-secure world
     */

    add     r0, sp, #(SM_CTX_NSEC + SM_NSEC_CTX_R8)
    ldm    r0, {r8-r12}

    /* Update SCR */
    read_scr r0
    orr    r0, r0, #(SCR_NS | SCR_FIQ) /* Set NS and FIQ bit in SCR */
    write_scr r0

    add    sp, sp, #(SM_CTX_NSEC + SM_NSEC_CTX_R0)
    b    .sm_exit //这里真正跳到non-secure world执行
//执行完成后跳到secure world继续执行,所以总的来说在secure world中产生fiq后会保存当前参数跳到normal world执行,执行完成后返回secure wordl继续执行。
.smc_from_nsec:
    /*
     * As we're coming from non-secure world (NS bit set) the stack
     * pointer points to sm_ctx.nsec.r0 at this stage. After the
     * instruction below the stack pointer points to sm_ctx.
     */
    sub    sp, sp, #(SM_CTX_NSEC + SM_NSEC_CTX_R0)

    bic    r1, r1, #(SCR_NS | SCR_FIQ) /* Clear NS and FIQ bit in SCR */
    write_scr r1

    add    r0, sp, #(SM_CTX_NSEC + SM_NSEC_CTX_R8)
    stm    r0, {r8-r12}

    mov    r0, sp
    bl    sm_from_nsec
    cmp    r0, #0
    beq    .sm_ret_to_nsec

    /*
     * Continue into secure world
     */
    add    sp, sp, #(SM_CTX_SEC + SM_SEC_CTX_R0)

.sm_exit:
    pop    {r0-r7}
    rfefd    sp!
UNWIND(    .fnend)
END_FUNC sm_smc_entry

所以结论就是fiq的处理函数是在non-secure中进行的,即使在secure world中收到fiq中断也会先保存secure world的环境后切到non-secure world执行
# 课程背景2021年ARM又推出了ARMv9架构,系统软件架构也在悄无声息地发生变化。在这种架构,强调的是隔离技术,包括资源的隔离、运行时隔离,特权操作系统的权限也变得越来越小…不管您是什么领域,ARM服务器、汽车电子、手机或者是其它设备终端,安全都是其的一个重要环节。我们常说的安全一般是只网络安全/业务安全/App安全,这些安全依赖的正是操作系统安全,操作系统安全所依赖的就是安全架构技术,在该安全架构,首当要学习的就是Trustzone/TEE技术。只有设备安全/操作系统安全/APP安全/网络安全/服务器安全整个一条链都安全了,那么你的业务才算得上的安全.不管您是做什么的,您做不做安全或虚拟化,掌握整个系统软件架构也是一件必要的事情。您只有掌握了安全架构,你才具有全局的视野,才能进行全局的软件设计,才称得上架构师。安全不仅仅是架构安全,安全还是一种生态,安全还产生一类标准。安全出现在产品声明周期的任何一个角落,它可能零碎地出现在硬件、零碎地出现在软件代码。如果你不了解安全,你可能无法进行优秀的产品设计,你甚至无法去正确的阅读代码。# 课程介绍(1) 讲解ARM最新硬件架构(ARM Core、ARM Architecture)、SOC架构(2) 讲解最新的Trustzone安全架构、TEE架构、Secureboot等(3) 讲解软件组件:TF-A(ATF)、optee_os、Linux Kernel、CA/TA应用程序等,及其交互模型、设计模型(4) 多系统交互代码导读、安全论证实践、CA/TA示例实践、安全业务设计实践(5) 我们学习的是全部硬件、全部系统,软硬结合,或者是大系统的软硬件融合# 课程收益1、安全不再神秘,能cover住全局2、熟悉ARM Architecture架构知识3、熟悉SOC架构知识4、熟悉主流的系统软件框架5、知道多系统之间是如何交互的,也能够进行系统级的设计6、深入了解当前的系统安全架构以及未来安全架构趋势7、熟悉基础的安全业务设计方法8、熟悉系统的启动流程、Secureboot等9、知道Linux Kernel在大系统的位置,以及与其它系统交互的方法10、熟悉各类标准和规范11、学习资料的获取方法 # 课程大纲《Trustzone/TEE/系统安全开发速成班》 --当前48节课/19小时说明: 本视频会持续更新,购买时请以课程目录为主。本EXCEL一个月更新一次。章节编号课程时常第一章基础和简介1课程介绍 8:332ARM和SOC的架构简介60:13第二章软硬件基础3armv8/armv9基础概念26:204ARMv8/ARMv9的Trustzone技术77:565ARMv7的Trustzone技术8:376安全架构及其未来趋势(FF-A/SPM/CCA)6:417ARMv9 CCA机密计算框架底层核心原理简介20:448ARMv9 RME安全扩展详解61:299ATF Quick Start0161:2710Optee Quick Start49:3411系统软件Quick Start21:0412Secureboot原理深度讲解60:2813Android AVB的介绍26:0914TZC400详解17:5615TZC400代码导读之ATF13:4416RPMB详解30:0617RPMB代码导读之optee14:0318efuse详解12:1919Anti-Rollback的介绍11:33第三章软件架构20TEE的组件介绍67:5921TEE的RPC反向调用31:1422TEE的调度模型21:3223各类标准和规范22:17第四章软件架构(高级)24多系统之间的管理模型(ABI/标准)10:3025多系统之间的调度12:2126多系统之间的断(不含虚拟化)61:4727多系统之间的断(虚拟化)6:5728再谈多系统之间的调度(多核多线程)10:3129其它(内存管理/PSCI...)10:12第五章安全应用开发基础30安全应用开发基础5:3731TEE环境:qemu_V8环境的使用4:2032TEE环境:编写一个CA和TA程序11:0433TEE环境:编写漂亮的文档4:1434TEE环境:搭建阅读代码神器opengrok3:2635TEE环境(必看):使用集成好的qemu_v8镜像程序20:2936[CA/TA开发]CA到TA的通信9:1837[CA/TA开发]CA到TA的传参27:1638[CA/TA开发]TEE的存储系统20:5739[CA/TA开发]TEE的密码学系统简介12:3740[CA/TA开发]TEE的密码学系统简介-数字摘要Hash等33:2141[CA/TA开发]TEE的密码学系统简介-对称密码学算法AES等12:2042[CA/TA开发]TEE的密码学系统简介-消息摘要算法HMAC等15:4843[CA/TA开发]TEE的密码学系统简介-非对称密码学算法RSA等7:33第六章安全业务设计高级44Gatekeeper的介绍29:3245keymaster/keymint/keystore/keystore213:2746生物认证(指纹/人脸)13:5747DRM的介绍21:3748TUI的介绍17:03总计时统计(分钟)1128:12 说明:本课程会持续更新…
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值