From 3e00189de00fbca49c2ac3ffd68ee43a03716dcd Mon Sep 17 00:00:00 2001 From: Masamichi Takagi Date: Tue, 9 Mar 2021 12:14:55 +0900 Subject: [PATCH] kprintf: fix checking if interrupt is disabled Change-Id: I2ee1a1e2438ae761c4136593953ede2738bc6f74 --- arch/arm64/kernel/cpu.c | 14 ++++++++++++-- arch/x86_64/kernel/cpu.c | 9 +++++++++ kernel/debug.c | 6 +++--- lib/include/ihk/cpu.h | 2 -- 4 files changed, 24 insertions(+), 7 deletions(-) diff --git a/arch/arm64/kernel/cpu.c b/arch/arm64/kernel/cpu.c index fb7664c2..b407e28c 100644 --- a/arch/arm64/kernel/cpu.c +++ b/arch/arm64/kernel/cpu.c @@ -912,7 +912,6 @@ unsigned long cpu_enable_interrupt_save(void) return flags; } -#ifdef ENABLE_FUGAKU_HACKS int cpu_interrupt_disabled(void) { unsigned long flags; @@ -925,7 +924,6 @@ int cpu_interrupt_disabled(void) : "memory"); return (flags == masked); } -#endif #else /* defined(CONFIG_HAS_NMI) */ @@ -989,6 +987,18 @@ unsigned long cpu_enable_interrupt_save(void) : "memory"); return flags; } + +int cpu_interrupt_disabled(void) +{ + unsigned long flags; + + asm volatile( + "mrs %0, daif // arch_local_irq_save\n" + : "=r" (flags) + : + : "memory"); + return !!(flags & 0x2); +} #endif /* defined(CONFIG_HAS_NMI) */ /* we not have "pause" instruction, instead "yield" instruction */ diff --git a/arch/x86_64/kernel/cpu.c b/arch/x86_64/kernel/cpu.c index fbd0b826..5591a2e3 100644 --- a/arch/x86_64/kernel/cpu.c +++ b/arch/x86_64/kernel/cpu.c @@ -1273,6 +1273,15 @@ unsigned long cpu_enable_interrupt_save(void) return flags; } +int cpu_interrupt_disabled(void) +{ + unsigned long flags; + + asm volatile("pushf; pop %0" : "=r"(flags) : : "memory", "cc"); + + return !(flags & 0x200); +} + /*@ @ behavior valid_vector: @ assumes 32 <= vector <= 255; diff --git a/kernel/debug.c b/kernel/debug.c index 93a16368..54835a1e 100644 --- a/kernel/debug.c +++ b/kernel/debug.c @@ -87,7 +87,7 @@ void kputs(char *buf) debug_spin_unlock_irqrestore(&kmsg_buf->lock, flags_inner); kprintf_unlock(flags_outer); - if (irqflags_can_interrupt(flags_outer) && + if (!cpu_interrupt_disabled() && DEBUG_KMSG_USED > IHK_KMSG_HIGH_WATER_MARK) { eventfd(IHK_OS_EVENTFD_TYPE_KMSG); ihk_mc_delay_us(IHK_KMSG_NOTIFY_DELAY); @@ -128,7 +128,7 @@ int __kprintf(const char *format, ...) } debug_spin_unlock_irqrestore(&kmsg_buf->lock, flags_inner); - if (irqflags_can_interrupt(flags_inner) && + if (!cpu_interrupt_disabled() && DEBUG_KMSG_USED > IHK_KMSG_HIGH_WATER_MARK) { eventfd(IHK_OS_EVENTFD_TYPE_KMSG); ihk_mc_delay_us(IHK_KMSG_NOTIFY_DELAY); @@ -171,7 +171,7 @@ int kprintf(const char *format, ...) debug_spin_unlock_irqrestore(&kmsg_buf->lock, flags_inner); kprintf_unlock(flags_outer); - if (irqflags_can_interrupt(flags_outer) && + if (!cpu_interrupt_disabled() && DEBUG_KMSG_USED > IHK_KMSG_HIGH_WATER_MARK) { eventfd(IHK_OS_EVENTFD_TYPE_KMSG); ihk_mc_delay_us(IHK_KMSG_NOTIFY_DELAY); diff --git a/lib/include/ihk/cpu.h b/lib/include/ihk/cpu.h index b141a45c..a283e094 100644 --- a/lib/include/ihk/cpu.h +++ b/lib/include/ihk/cpu.h @@ -23,9 +23,7 @@ extern int num_processors; void cpu_enable_interrupt(void); void cpu_disable_interrupt(void); -#ifdef ENABLE_FUGAKU_HACKS int cpu_interrupt_disabled(void); -#endif void cpu_halt(void); #ifdef ENABLE_FUGAKU_HACKS void cpu_halt_panic(void);