baron · 3月24日 · 四川

Linux和optee双系统中1020-1023号的中断号的使用

快速连接

👉👉👉【精选】ARMv8/ARMv9架构入门到精通-目录 👈👈👈


 title=


1、1020-1023号的中断的介绍

在gic的文档中,理出了一些特殊的中断号,其中1020/1021和安全密切相关。

  • 1020 : for Trusted OS
  • 1021 : for rich OS
    在这里插入图片描述

2、linux/optee双系统irq/fiq的处理流程

环境:在linux/optee双系统环境下, linux系统的SCR.IRQ=0、SCR.FIQ=1, optee系统的SCR.IRQ=0、SCR.FIQ=0

我们回归下在gicv3架构下,在linux/optee双系统中IRQ FIQ中断的处理过程:
(1)、当cpu运行在tee,来了一个tee中断,该中断被标记为irq,tee处理这个中断;
(2)、当cpu运行在tee,来了一个linux中断,该中断被标记为fiq,tee调用smc切回到linux,在linux中该中断被标记为IRQ,linux中处理完该中断后,再切回tee;
(3)、当cpu运行在linux,来了一个linux中断,该中断被标记为irq,linux处理这个中断;
(4)、当cpu运行在linux,来了一个tee中断,该中断被标记为fiq,由于SCR.FIQ=1,该中断被target到了EL3,进入ATF的异步异常向量表,在ATF的fiq_aarch64函数中,<font color=blue size=4> cpu读取icc_hppir0_el1寄存器(1020表示secure中断,1021表示no-secure中断)</font>,由于是tee中断,所以读到是数值是1020,然调用opteed_sel1_interrupt_handler切入到tee,在tee中该中断又被标记为IRQ,tee中处理这个中断;

注意第4点,就是本文所要关注的,第四点无非就是想进行一个判断,以下三选一:

  • 这个中断是想给ATF处理的(如G0中断)
  • 这个中断是想给secure os处理的(如S-G1中断),icc_hppir0_el1读出的值应该是1020
  • 这个中断是想给rich os处理的(如NS-G1中断),icc_hppir0_el1读出的值应该是1021

然后ATF就会根据icc_hppir0_el1的值,走3个不同的分支。

3、1020中断号的的使用示例

以“当cpu运行在linux,来了一个tee中断”做一个代码解剖
(1)、在optee startup接受后,调用TEESMC_OPTEED_RETURN_ENTRY_DONE 回到ATF,再回到REE,我们看下在ATF干了什么事

case TEESMC_OPTEED_RETURN_ENTRY_DONE:
    /*
     * Stash the OPTEE entry points information. This is done
     * only once on the primary cpu
     */
    assert(optee_vectors == NULL);
    optee_vectors = (optee_vectors_t *) x1;

    if (optee_vectors) {
        set_optee_pstate(optee_ctx->state, OPTEE_PSTATE_ON);

        /*
         * OPTEE has been successfully initialized.
         * Register power management hooks with PSCI
         */
        psci_register_spd_pm_hook(&opteed_pm);

        /*
         * Register an interrupt handler for S-EL1 interrupts
         * when generated during code executing in the
         * non-secure state.
         */
        flags = 0;
        set_interrupt_rm_flag(flags, NON_SECURE);
        rc = register_interrupt_type_handler(INTR_TYPE_S_EL1,
                    opteed_sel1_interrupt_handler,
                    flags);
        if (rc)
            panic();
    }
  • 将optee传来的线程向量表,保存在了ATF的全局变量中;
  • 注册一个为optee服务的中断:register_interrupt_type_handler(INTR_TYPE_S_EL1,opteed_sel1_interrupt_handler, flags),其中flag=0表示该中断函数会切到TEE处理,flag=1表示切回linux中处理
#define INTR_TYPE_S_EL1            0
#define INTR_TYPE_EL3            1
#define INTR_TYPE_NS            2
#define MAX_INTR_TYPES            3
#define INTR_TYPE_INVAL            MAX_INTR_TYPES

(2)、在runtime_exceptions.S中的异常向量表中:fiq_aarch64

fiq_aarch64:
    handle_interrupt_exception fiq_aarch64
    check_vector_size fiq_aarch64

代码片段

    .macro    handle_interrupt_exception label
......
    bl    plat_ic_get_pending_interrupt_type
    cmp    x0, #INTR_TYPE_INVAL
    b.eq    interrupt_exit_\label  //读取icc_hppir0_el1,如果是1020返回INTR_TYPE_S_EL1,如果是1021则返回INTR_TYPE_NS,返回的type保存在了x0中
......
    bl    get_interrupt_type_handler //x0做为type参数传入,调用在opteed_main.c中注册的flag=0的中断
......

关注"Arm精选"公众号,备注进ARM交流讨论区。
图片1.png

推荐阅读
关注数
9466
内容数
212
以易懂、渐进、有序的方式,深入探讨ARMv8/ARMv9架构的核心概念。我们将从基础知识开始,逐步深入,覆盖最新的架构,不再纠缠于过时技术。本系列内容包含但不限于ARM基础、SOC芯片基础、Trustzone、gic、异常和中断、AMBA、Cache、MMU等内容,并将持续更新。
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息