i.MX8MP平台开发分享(gicv3篇)-- set_handle_irq及中断路由过程分析

news2024/9/21 16:19:02

专栏目录:专栏目录传送门

平台内核
i.MX8MP5.15.71

文章目录

    • set_handle_irq
    • hard中断入口

set_handle_irq(gic_handle_irq);

set_handle_irq

这个函数的功能很简单,将gic_handle_irq设置为中断处理函数。在发生中断异常后,内核就会切入到这个中断处理函数中.

void (*handle_arch_irq)(struct pt_regs *) __ro_after_init = default_handle_irq;

int __init set_handle_irq(void (*handle_irq)(struct pt_regs *))
{
	if (handle_arch_irq != default_handle_irq)
		return -EBUSY;

	handle_arch_irq = handle_irq;
	pr_info("Root IRQ handler: %ps\n", handle_irq);
	return 0;
}

hard中断入口

EL0和EL1会分别用到这里的handle_arch_irq函数。下面会各针对EL1和EL0进行分析。

static void noinstr __el0_irq_handler_common(struct pt_regs *regs)
{
	el0_interrupt(regs, handle_arch_irq);
}

asmlinkage void noinstr el1h_64_irq_handler(struct pt_regs *regs)
{
	el1_interrupt(regs, handle_arch_irq);
}

中断代码路由过程如下图所示。

image-20230411200758261

arm64所有的异常向量存储在一下所示的vectors中。

SYM_CODE_START(vectors)
	kernel_ventry	1, t, 64, sync		// Synchronous EL1t
	kernel_ventry	1, t, 64, irq		// IRQ EL1t
	kernel_ventry	1, t, 64, fiq		// FIQ EL1h
	kernel_ventry	1, t, 64, error		// Error EL1t

	kernel_ventry	1, h, 64, sync		// Synchronous EL1h
	kernel_ventry	1, h, 64, irq		// IRQ EL1h
	kernel_ventry	1, h, 64, fiq		// FIQ EL1h
	kernel_ventry	1, h, 64, error		// Error EL1h

	kernel_ventry	0, t, 64, sync		// Synchronous 64-bit EL0
	kernel_ventry	0, t, 64, irq		// IRQ 64-bit EL0
	kernel_ventry	0, t, 64, fiq		// FIQ 64-bit EL0
	kernel_ventry	0, t, 64, error		// Error 64-bit EL0

	kernel_ventry	0, t, 32, sync		// Synchronous 32-bit EL0
	kernel_ventry	0, t, 32, irq		// IRQ 32-bit EL0
	kernel_ventry	0, t, 32, fiq		// FIQ 32-bit EL0
	kernel_ventry	0, t, 32, error		// Error 32-bit EL0
SYM_CODE_END(vectors)

如何设置这个异常向量vectors?在__primary_switched函数中使用msr指令将vectors异常向量表的地址设置到vbar_el1寄存器中。

adr_l x8, vectors
msr vbar_el1, x8

如何正确看待每一个异常向量?这里涉及的代码比较复杂,以kernel_ventry 1, h, 64, irq这个异常向量为例,kernel_ventry通过 el\el\ht\()_\regsize\()_\label展开为了el1h_64_irq这个函数,然后跳转到这个函数。

这个el1h_64_irq函数是如何定义的?使用SYM_CODE_START_LOCAL(el\el\ht\()_\regsize\()_\label)定义每种异常函数。在这个函数中,会跳转到具体的el\el\ht\()_\regsize\()_\label\()_handler

针对每一个异常向量,使用entry_handler将其信息展开,一开始就定义了上面的el\el\ht\()_\regsize\()_\label函数。通过el\el\ht\()_\regsize\()_\label\()_handler展开为内核C代码中各自的handler,例如这里就是el1h_64_irq_handler,也就是arch/arm64/kernel/entry-common.c里的el1h_64_irq_handler

在el1h_64_irq函数一开始使用kernel_entry存储和清除EL0/1中的通用寄存器。通过 kernel_exit来退出异常,恢复刚才保存的通用寄存器,执行 ERET 来恢复 PC 和 PSTATE。如果是el0,则使用ret_to_user返回用户态,el1是ret_to_kernel返回内核态。

.macro entry_handler el:req, ht:req, regsize:req, label:req
SYM_CODE_START_LOCAL(el\el\ht\()_\regsize\()_\label)
	kernel_entry \el, \regsize
	mov	x0, sp
	bl	el\el\ht\()_\regsize\()_\label\()_handler
	.if \el == 0
	b	ret_to_user
	.else
	b	ret_to_kernel
	.endif
SYM_CODE_END(el\el\ht\()_\regsize\()_\label)
	.endm
	
	entry_handler	1, t, 64, sync
	entry_handler	1, t, 64, irq
	entry_handler	1, t, 64, fiq
	entry_handler	1, t, 64, error

	entry_handler	1, h, 64, sync
	entry_handler	1, h, 64, irq
	entry_handler	1, h, 64, fiq
	entry_handler	1, h, 64, error

	entry_handler	0, t, 64, sync
	entry_handler	0, t, 64, irq
	entry_handler	0, t, 64, fiq
	entry_handler	0, t, 64, error

	entry_handler	0, t, 32, sync
	entry_handler	0, t, 32, irq
	entry_handler	0, t, 32, fiq
	entry_handler	0, t, 32, error

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/440773.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

060201面积-定积分在几何学上的应用-定积分的应用

文章目录 1 平面图形的面积1.1 直角坐标情形1.2 极坐标情形1.2.1 极坐标的定义1.1.2 曲边扇形的面积 结语 1 平面图形的面积 1.1 直角坐标情形 ①平面图形由 y f ( x ) , y 0 , x a , y b yf(x),y0,xa,yb yf(x),y0,xa,yb围成图像的面积,如下图1.1-1所示&#…

防洪决策指挥系统(Axure高保真原型)

使用Axure制作的rp高保真原型防洪决策指挥系统可用于行业参考、实际业务需求开发、学习交流使用,本原型需求可以作为开发使用,业务需求均为作者本人行业经验。本系统包括水系展示系统、城区调度决策系统、实时监测预警和防洪调度四大功能模块的界面。 原…

MICCAI 2023 FLARE国际竞赛:打造腹部泛癌CT分割Foundation Models

竞赛官网 CodaLab - Competitionhttps://codalab.lisn.upsaclay.fr/competitions/12239 背景介绍 腹部器官是相当常见的患癌部位,例如结直肠癌和胰腺癌,分别位列癌症死亡率排名的第二位和第三位。Computed tomography (CT) 成像可以为医生提供重要的诊…

前端错误合集

Uncaught Reference Error: xx is not defined 未捕获的引用错误:未定义xx 原因 1.关键字写错了 解决办法 1.修改成正确的关键字 NAN 计算错误 原因 计算时数据类型不同 解决办法 使用数据类型相同的数据进行计算 Uncaught SyntaxError: Invalid left-h…

计算广告(十四)

营销是一个涉及产品、服务或品牌从概念到消费者的全过程的商业活动。它包括分析市场需求、识别潜在消费者、制定和实施策略以满足他们的需求、创造价值和实现销售。营销的目标是在满足客户需求的同时,实现企业的利润和业务增长。 营销涉及以下几个关键环节&#xf…

vim编辑器的使用介绍

文章目录 vim编辑器的使用介绍vim的缓存、恢复与打开时的警告信息vim的额外功能可视化区块多文件编辑多窗口功能vim的关键词补全功能vim环境设置与记录:~/.vimrc、~/.viminfovim的环境设置参数 vim常用的命令示意图 其他vim使用注意事项中文编码的问题DOS与Linux的换…

【PyTorch】课堂测试一:线性回归的求解

作者🕵️‍♂️:让机器理解语言か 专栏🎇:PyTorch 描述🎨:PyTorch 是一个基于 Torch 的 Python 开源机器学习库。 寄语💓:🐾没有白走的路,每一步都算数&#…

如何在自定义数据集上训练YOLOv8的各个模型

YOLOv8效果图(可以应用到图片和视频): 四个模式命令 yolo taskdetect modepredict modelmodel/yolov8n.pt sourceinput/test.mp4 showTrueyolo tasksegment modepredict modelmodel/yolov8x-seg.pt sourceinput/zidane.jpg showTrueyolo tas…

JavaSE-part2

文章目录 Day07 IO流1.IO流1.1背景介绍1.2File类1.2.1常用方法 1.3IO流原理1.4IO流的分类1.4.1InputStream 字节输入流1.4.1.1FileInputStream1.4.1.2FileOutPutStream1.4.1.3练习 1.4.2Reader and Writer1.4.2.1FileReader1.4.2.2FileWriter 1.4.3节点流和处理流1.4.3.1处理流…

MSNet网络结构与代码搭建深入解读

模型结构 1、首先,将多光谱遥感图像的波段分为可见光和不可见光两组,然后进行分组同步特征提取; 代码 先看总体结构,主代码 __init__定义了声明MSNet模型有哪些类,MSNet的forward方法规定数据如何在层之间流动。 1、首先是获得图片的输入尺寸input_size = (rgbnnd.size(…

Python数据结构与算法-动态规划(钢条切割问题)

一、动态规划(DP)介绍 1、从斐波那契数列看动态规划 (1)问题 斐波那契数列递推式: 练习:使用递归和非递归的方法来求解斐波那契数列的第n项 (2)递归方法的代码实现 import time # 递…

Spark----RDD(弹性分布式数据集)

RDD 文章目录 RDDRDD是什么?为什么需要RDD?RDD的五大属性WordCount中的RDD的五大属性如何创建RDD?RDD的操作两种基本算子/操作/方法/API分区操作重分区操作聚合操作四个有key函数的区别 关联操作排序操作 RDD的缓存/持久化cache和persistchec…

Java学习-MySQL-DQL数据查询-联表查询JOIN

Java学习-MySQL-DQL数据查询-联表查询JOIN 1.分析需求,查找那些字段 2.分析查询的字段来自哪些表 3.确定使用哪种连接查询 4.确定交叉点 5.确定判断条件 操作描述inner join返回左右表的交集left join返回左表,即使右表没有right join返回右表&#xf…

iptables深度总结--基础篇

iptables 五表五链 链:INPUT OUTPUT FORWARD PREROUTING POSTROUTING 表:filter、nat、mangle、raw、security 数据报文刚进网卡,还没有到路由表的时候,先进行了prerouting,进入到路由表,通过目标地址判…

FFMPEG 关于smaple_fmts的理解及ffplay播放PCM

问题 当我将一个aac的音频文件解码为原始的PCM数据后,使用ffplay播放测试是否成功时,需要提供给ffplay 采样率,通道数,PCM的格式类型 3个参数,否则无法播放! 所以使用ffprobe 查看原来的aac文件信息&…

Python手写板 画图板 签名工具

程序示例精选 Python手写板 画图板 签名工具 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<Python手写板 画图板 签名工具>>编写代码&#xff0c;代码整洁&#xff0c;规则&am…

别再回答面试官,toFixed采用的是四舍五入啦!

四舍五入大家都知道&#xff0c;但你知道银行家舍入法么&#xff1f;你知道JS里的toFixed实现用的是哪种吗&#xff1f; 前两天我写了篇《0.1 0.2 不等于 0.3&#xff1f;原来是因为这个》&#xff0c;大概就是说&#xff0c;0.1 0.2不等于0.3是因为浮点数精度问题。 结果在…

LinkedList 的特点及优缺点

现在来讲 LinkedList LinkedList 是链表集合&#xff0c;基于链表去存储数据&#xff0c;每一个数据视作一个节点 private static class Node<E> {// 存放的数据E item;// 下一个节点Node<E> next;// 上一个节点Node<E> prev;Node(Node<E> prev, E ele…

【unity实战】2D横版实现人物移动跳跃2——用对象池设计制作冲锋残影的效果(包含源码)

基于上一篇人物移动二段跳进一步优化完善 先看看最终效果 什么是对象池? 在Unity中,对象池是一种重复使用游戏对象的技术。使用对象池的好处是可以减少游戏对象的创建和销毁,从而提高游戏的性能。如果不使用对象池,每次需要创建游戏对象时,都需要调用Unity的Instantiate函…

国内几大技术网站,你最爱和哪个玩耍?

所谓“物以类聚&#xff0c;人以群分” 所谓“士为知己者死&#xff0c;女为悦己者容” 所谓“世上的乌鸦都一般黑&#xff0c;鸽子却各有各的白” CSDN&#xff0c;掘金&#xff0c;博客园等&#xff0c;说起来都是“技术”社区&#xff0c;每个却都有着不同的姿色和用处。至于…