static inline void gic_arch_restore_irqs(unsigned long flags)
{
if (gic_supports_nmi())
asm volatile ("msr daif, %0" : : "r" (flags >> 32)
: "memory");
}
当前flags的高32位恒为0,该函数并没有实现根据flags恢复中断状态,而是强制把daif都打开了。
Hi stkid, welcome to the openEuler Community.
I'm the Bot here serving you. You can find the instructions on how to interact with me at Here.
If you have any questions, please contact the SIG: Kernel, and any of the maintainers: @YangYingliang , @pi3orama , @成坚 (CHENG Jian) , @jiaoff , @zhengzengkai , @Qiuuuuu , @刘勇强 , @Xie XiuQi
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。
The gic_arch_restore_irqs() depends on commit e7e6a881f797 ("arm64:
irqflags: fix incomplete save & restore"). While it is reverted in commit
2e680920c2e7 ("Revert "arm64: irqflags: fix incomplete save & restore""),
and backported the upstreamed fix patches later:
680d0f96393c arm64: Lower priority mask for GIC_PRIO_IRQON
a6df44e97db2 arm64: irqflags: Introduce explicit debugging for IRQ priorities
a80102bd22af arm64: Fix incorrect irqflag restore for priority masking
8b1d3c9e913c arm64: Fix interrupt tracing in the presence of NMIs
So we should update the logic here:
Currently the upper 32 bits of 'flags' is always zero, change to use
'GIC_PRIO_PSR_I_SET' to indicate the interrupt enabling status.
登录 后才可以发表评论