ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-06-22 14:01:46  阅读:447  来源: 互联网

标签:optee 1020 1023 中断 INTR tee gicv3 linux interrupt


 

文章目录

        • 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的中断
......

 

标签:optee,1020,1023,中断,INTR,tee,gicv3,linux,interrupt
来源: https://blog.51cto.com/u_15278218/2936810

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有