Linux Kernel中local_irq_enable()和local_irq_disable()的实现
生活随笔
收集整理的這篇文章主要介紹了
Linux Kernel中local_irq_enable()和local_irq_disable()的实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
快速鏈接:
.
👉👉👉 個人博客筆記導讀目錄(全部) 👈👈👈
說明:
在默認情況下,本文講述的都是ARMV8-aarch64架構,linux kernel 5.14
local_irq_enable()和local_irq_disable()的實現,其實就是操作的DAIF寄存器(PSTATE), 命令分別是
- msr daifclr, #3 //enable
- msr daifset, #3 //disable
(1)、 local_irq_disable()
(linux/include/linux/irqflags.h)#define local_irq_disable() do { raw_local_irq_disable(); } while (0)#define raw_local_irq_disable() arch_local_irq_disable()(linux/arch/arm64/include/asm/irqflags.h) static inline void arch_local_irq_disable(void) {if (system_has_prio_mask_debugging()) {u32 pmr = read_sysreg_s(SYS_ICC_PMR_EL1);WARN_ON_ONCE(pmr != GIC_PRIO_IRQON && pmr != GIC_PRIO_IRQOFF);}asm volatile(ALTERNATIVE("msr daifset, #3 // arch_local_irq_disable",__msr_s(SYS_ICC_PMR_EL1, "%0"),ARM64_HAS_IRQ_PRIO_MASKING):: "r" ((unsigned long) GIC_PRIO_IRQOFF): "memory"); }(2)、 local_irq_enable()
(linux/include/linux/irqflags.h)#define local_irq_disable() do { raw_local_irq_disable(); } while (0)#define raw_local_irq_enable() arch_local_irq_enable()(linux/arch/arm64/include/asm/irqflags.h) static inline void arch_local_irq_enable(void) {if (system_has_prio_mask_debugging()) {u32 pmr = read_sysreg_s(SYS_ICC_PMR_EL1);WARN_ON_ONCE(pmr != GIC_PRIO_IRQON && pmr != GIC_PRIO_IRQOFF);}asm volatile(ALTERNATIVE("msr daifclr, #3 // arch_local_irq_enable",__msr_s(SYS_ICC_PMR_EL1, "%0"),ARM64_HAS_IRQ_PRIO_MASKING):: "r" ((unsigned long) GIC_PRIO_IRQON): "memory");pmr_sync(); }總結
以上是生活随笔為你收集整理的Linux Kernel中local_irq_enable()和local_irq_disable()的实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 02-Linux Kernel(armv
- 下一篇: 思考:Linux Kernel的中断处理