历史上的今天
今天是:2024年11月26日(星期二)
2021年11月26日 | ARMv8-中断处理接口
2021-11-26 来源:eefocus
不考虑EL2和EL3,IRQ处理分两种情况:用户态发生的中断和内核态发生的中断,相应的中断处理接口分别为:
el1_irq
el0_irq
以内核态el1发生的irq为例:
358 .align 6
359 el1_irq:
360 kernel_entry 1 //压栈,保存上下文;
361 enable_dbg
362 #ifdef CONFIG_TRACE_IRQFLAGS
363 bl trace_hardirqs_off
364 #endif
365
366 irq_handler /*调用中断处理默认函数*/
367
368 #ifdef CONFIG_PREEMPT
369 get_thread_info tsk
370 ldr w24, [tsk, #TI_PREEMPT] // get preempt count
371 cbnz w24, 1f // preempt count != 0
372 ldr x0, [tsk, #TI_FLAGS] // get flags
373 tbz x0, #TIF_NEED_RESCHED, 1f // needs rescheduling?
374 bl el1_preempt
375 1:
376 #endif
377 #ifdef CONFIG_TRACE_IRQFLAGS
378 bl trace_hardirqs_on
379 #endif
380 kernel_exit 1
381 ENDPROC(el1_irq)
irq_handler也是一个伪指令宏操作:
187 /*
188 * Interrupt handling.
189 */
190 .macro irq_handler
191 adrp x1, handle_arch_irq //把handle_arch_irq地址放到x1, handle_arch_irq是一个指针;
192 ldr x1, [x1, #:lo12:handle_arch_irq]//取出指针所指向的值;
193 mov x0, sp
194 blr x1 //跳转到handle_arch_irq
195 .endm
handle_arch_irq 在arch/arm64/kernel/irq.c设置:
45 void __init set_handle_irq(void (*handle_irq)(struct pt_regs *))
46 {
47 if (handle_arch_irq)
48 return;
49
50 handle_arch_irq = handle_irq;
51 }
根据不同的中断控制器会设置不同的处理接口,通过在驱动控制器设置,代码在drivers/irqchip/,以irq-gic.c(通用中断控制器)为例,设置set_handle_irq(gic_handle_irq):
437 static void __exception_irq_entry gic_handle_irq(struct pt_regs *regs)
438 {
439 u32 irqstat, irqnr;
440 struct gic_chip_data *gic = &gic_data[0];
441 void __iomem *cpu_base = gic_data_cpu_base(gic);
442
443 do {
444 irqstat = readl_relaxed_no_log(cpu_base + GIC_CPU_INTACK);
445 irqnr = irqstat & GICC_IAR_INT_ID_MASK;
446
447 if (likely(irqnr > 15 && irqnr < 1021)) {
448 uncached_logk(LOGK_IRQ, (void *)(uintptr_t)irqnr);
449 handle_domain_irq(gic->domain, irqnr, regs);//根据中断号调用相应的中断处理函数;
450 continue;
451 }
452 if (irqnr < 16) {
453 writel_relaxed_no_log(irqstat, cpu_base + GIC_CPU_EOI);
454 uncached_logk(LOGK_IRQ, (void *)(uintptr_t)irqnr);
455 #ifdef CONFIG_SMP
456 handle_IPI(irqnr, regs);
457 #endif
458 continue;
459 }
460 break;
461 } while (1);
462 }
上一篇:ARMv8-异常处理
下一篇:ARM基础学习-寄存器
史海拾趣
|
联想LJ2500打印机由于驱动程序的问题,在WINXP系统下打印Protel原理图时,图中的字符都是反向的,即镜像打印,真是一大缺陷,不知道联想是怎么搞的。就是将原理图复制到WORD文档中打印也是一样的。 我找到了一个解决方法 ...… 查看全部问答> |
|
我是西南大学的学生,本科,现在刚刚大三,9月2号刚刚参加完全国大学生电子大赛,最后却是意想不到的那种失败。 我本身是学计算机的,计算机科学与技术专业,这个专业软、硬全学,但偏向软件,而我偏偏对硬件感兴趣, ...… 查看全部问答> |
|
我在控制面板扫描蓝牙设备能扫描到,可以当WINCESLEEP起来后,再在控制面板扫描时,就扫描不到了,并弹出对话框“BLUETOOTH HARDWARE ERROR 10050。。。。。。”有哪位兄弟遇到过这样的情况呀,是哪一块把连接断开了吗?请多多赐教呀!… 查看全部问答> |
|
Mk7A11p,兼容em78p153,sn2501,性价比优 研发兼销售工程师:李泳生 13760155692 075581580452 QQ:252859106(技术交流) Mk7A11p,兼容em78p153,sn2501,性价比优,同比优惠15%, 广泛应用于电动车防盗器,闪灯控制,闪字棒,闪字风扇,i温度显示等。月 ...… 查看全部问答> |
|
MSP430FG439集成的的三个运放,datasheet上引脚的标注不怎么看得明白,有相关的中文资料吗,实在是被弄晕了!这些运放能设置各自的放大倍数吗,有没有例子啊!救命!!… 查看全部问答> |
|
团购的事情忙完了,参加团购的网友不能让板子闲着,要玩起来,所以想征询下大家的意见,想从何玩起?想怎么玩?玩成什么样?有具体计划的网友请跟帖回复,过几天我把我的计划给大家分享一下!~前一段时间不用多说,肯定要按照计划来熟悉学习板子, ...… 查看全部问答> |




