ARMv8 中斷處理介面

2021-08-01 04:41:54 字數 1863 閱讀 8070

不考慮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

365366 irq_handler /*呼叫中斷處理預設函式*/

367368

#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

3751:

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

根據不同的中斷控制器會設定不同的處理介面,通過在驅動控制器設定,**在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

452if (irqnr < 16)

460break;

461 } while (1);

462 }

DA9034中斷處理

clear the irq pdata ack irq schedule work pdata work return irq handled static void micco worker struct work struct work if val micco eb otgcp iover r...

Linux驅動開發 8 中斷分層機制 軟中斷

1 概念 軟中斷是模擬硬體中斷的概念,實現巨集觀上的非同步執行效果。其實tasklet 也是基於軟中斷實現的。2 軟中斷和硬中斷的區別 a 硬中斷是外部裝置對cpu 的中斷,軟中斷時程式對核心的中斷 b 訊號是由核心 或者其他程序 對某個程序的軟中斷 3 結構表示 struct softirq ac...

linux2 6 32中斷處理流程

1 當發生中斷時,pc指標通過異常向量表跳轉到中斷入口函式asm do irq asm do irq是中斷的c語言總入口函式,它在 arch arm kernel irq.c中定義,宣告如下 asmlinkage void exception asm do irq unsigned int irq,...