为什么更新ARM gic ICC_PMR寄存器后需要DSB SY?

问题描述 投票:0回答:1

在 Linux 内核中,如果 ICC_CTLR_EL1.PMHE == 0b1,则更新 SYS_ICC_PMR_EL1 后会跟随着 DSB SY。

./arch/arm64/include/asm/irqflags.h:
45              write_sysreg_s(GIC_PRIO_IRQON, SYS_ICC_PMR_EL1);
   0xffff80008069ff90 <+156>:   mov     x0, #0xe0                       // #224
   0xffff80008069ff94 <+160>:   msr     s3_0_c4_c6_0, x0

46              pmr_sync();
   0xffff80008069ff98 <+164>:   dsb     sy

commit msg 中的解释是:

当优先级掩码提示启用(PMHE)== 0b1时,GIC可以使用PMR 值来确定是否向 PE 发送 IRQ 信号,并因此 更改 PMR 值后,可能需要 DSB SY 以确保 在有限时间内向 CPU 发送中断信号。

但是DSB是一个内存屏障,为什么这里需要更新寄存器呢?因为它不是内存操作。

arm64 memory-barriers
1个回答
1
投票

DSB
不仅仅是一个记忆障碍。 ARMv8 将其用作“同步一切”锤子。架构参考手册说:

此外,在程序顺序中,在 DSB指令可以改变系统的任何状态或执行任何部分 其功能直至 DSB 完成,但以下情况除外:

  • 存在 从内存中提取并解码。
  • 读取通用、SIMD 和浮点、SVE 向量或谓词、特殊用途或 直接或间接读取的系统寄存器不会导致 副作用。
  • 如果未实现 FEAT_ETS,则具有任何虚拟 已翻译的负载和商店地址。

还有许多其他系统类型指令,其文本诸如“保证在 DSB 后完成”。例如,DSB 等待所有正在进行的缓存维护指令完成。

© www.soinside.com 2019 - 2024. All rights reserved.