[gic]-gicv3的1020-1023号的中断的使用

 

文章目录

        • 1、linux/optee双系统irq fiq的处理流程
        • 2、针对第(4)点“当cpu运行在linux,来了一个tee中断”我们做一个代码解剖

 


 

1、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函数中,cpu读取icc_hppir0_el1寄存器(1020表示secure中断,1021表示no-secure中断),由于是tee中断,所以读到是数值是1020,然调用opteed_sel1_interrupt_handler切入到tee,在tee中该中断又被标记为IRQ,tee中处理这个中断;

2、针对第(4)点“当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的中断
......

 

上一篇:1020 逆序排列


下一篇:如何在Mac*问 USB 驱动器?