--- zzzz-none-000/linux-4.4.271/arch/arm/include/asm/irqflags.h 2021-06-03 06:22:09.000000000 +0000 +++ hawkeye-5590-750/linux-4.4.271/arch/arm/include/asm/irqflags.h 2023-04-19 10:22:27.000000000 +0000 @@ -20,21 +20,55 @@ #if __LINUX_ARM_ARCH__ >= 6 +#if IS_ENABLED(CONFIG_ENABLE_IRQ_PROFILING_HOOKS) +#include +#define _local_RET_IP_ ((unsigned long)__builtin_return_address(0)) +#endif + +/* + * Save the current interrupt enable state. + */ +#define arch_local_save_flags arch_local_save_flags +static inline unsigned long arch_local_save_flags(void) +{ + unsigned long flags; + asm volatile( + " mrs %0, " IRQMASK_REG_NAME_R " @ local_save_flags" + : "=r" (flags) : : "memory", "cc"); + return flags; +} + #define arch_local_irq_save arch_local_irq_save static inline unsigned long arch_local_irq_save(void) { - unsigned long flags; + unsigned long flags, pc_addr __maybe_unused; asm volatile( + " mov %1, pc\n" " mrs %0, " IRQMASK_REG_NAME_R " @ arch_local_irq_save\n" " cpsid i" - : "=r" (flags) : : "memory", "cc"); + : "=r" (flags), "=r" (pc_addr) + : + : "memory", "cc"); +#if IS_ENABLED(CONFIG_ENABLE_IRQ_PROFILING_HOOKS) + avm_simple_profiling_irq_disabled(pc_addr, _local_RET_IP_, + flags & PSR_I_BIT, /* old-status */ + PSR_I_BIT /* new-status */); +#endif return flags; } #define arch_local_irq_enable arch_local_irq_enable static inline void arch_local_irq_enable(void) { +#if IS_ENABLED(CONFIG_ENABLE_IRQ_PROFILING_HOOKS) + unsigned long flags = arch_local_save_flags(); + + avm_simple_profiling_irq_disabled((unsigned long)&&here, _local_RET_IP_, + flags & PSR_I_BIT, /* old-status */ + 0 /* new-status */); +here: +#endif asm volatile( " cpsie i @ arch_local_irq_enable" : @@ -45,6 +79,10 @@ #define arch_local_irq_disable arch_local_irq_disable static inline void arch_local_irq_disable(void) { +#if IS_ENABLED(CONFIG_ENABLE_IRQ_PROFILING_HOOKS) + arch_local_irq_save(); + return; +#endif asm volatile( " cpsid i @ arch_local_irq_disable" : @@ -121,9 +159,9 @@ ({ \ unsigned long temp; \ __asm__ __volatile__( \ - "mrs %0, cpsr @ stf\n" \ -" bic %0, %0, #64\n" \ -" msr cpsr_c, %0" \ + " mrs %0, cpsr @ stf\n" \ + " bic %0, %0, #64\n" \ + " msr cpsr_c, %0" \ : "=r" (temp) \ : \ : "memory", "cc"); \ @@ -136,9 +174,9 @@ ({ \ unsigned long temp; \ __asm__ __volatile__( \ - "mrs %0, cpsr @ clf\n" \ -" orr %0, %0, #64\n" \ -" msr cpsr_c, %0" \ + " mrs %0, cpsr @ clf\n" \ + " orr %0, %0, #64\n" \ + " msr cpsr_c, %0" \ : "=r" (temp) \ : \ : "memory", "cc"); \ @@ -149,24 +187,17 @@ #endif /* - * Save the current interrupt enable state. - */ -#define arch_local_save_flags arch_local_save_flags -static inline unsigned long arch_local_save_flags(void) -{ - unsigned long flags; - asm volatile( - " mrs %0, " IRQMASK_REG_NAME_R " @ local_save_flags" - : "=r" (flags) : : "memory", "cc"); - return flags; -} - -/* - * restore saved IRQ & FIQ state + * restore saved IRQ state */ #define arch_local_irq_restore arch_local_irq_restore static inline void arch_local_irq_restore(unsigned long flags) { +#if IS_ENABLED(CONFIG_ENABLE_IRQ_PROFILING_HOOKS) + avm_simple_profiling_irq_disabled((unsigned long)&&here, _local_RET_IP_, + PSR_I_BIT, /* old-status */ + (flags & PSR_I_BIT) /* new-status */); +here: +#endif asm volatile( " msr " IRQMASK_REG_NAME_W ", %0 @ local_irq_restore" :