From: Haavard Skinnemoen Move the irq-flags manipulation to asm/irqflags.h, add the required raw_ prefix and define TRACE_IRQFLAGS_SUPPORT. Signed-off-by: Haavard Skinnemoen Signed-off-by: Andrew Morton --- arch/avr32/Kconfig.debug | 4 + include/asm-avr32/irqflags.h | 68 +++++++++++++++++++++++++++++++++ include/asm-avr32/system.h | 32 --------------- 3 files changed, 73 insertions(+), 31 deletions(-) diff -puN arch/avr32/Kconfig.debug~avr32-add-support-for-irq-flags-state-tracing arch/avr32/Kconfig.debug --- a/arch/avr32/Kconfig.debug~avr32-add-support-for-irq-flags-state-tracing +++ a/arch/avr32/Kconfig.debug @@ -1,5 +1,9 @@ menu "Kernel hacking" +config TRACE_IRQFLAGS_SUPPORT + bool + default y + source "lib/Kconfig.debug" config KPROBES diff -puN /dev/null include/asm-avr32/irqflags.h --- /dev/null +++ a/include/asm-avr32/irqflags.h @@ -0,0 +1,68 @@ +/* + * Copyright (C) 2004-2006 Atmel Corporation + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#ifndef __ASM_AVR32_IRQFLAGS_H +#define __ASM_AVR32_IRQFLAGS_H + +#include + +static inline unsigned long __raw_local_save_flags(void) +{ + return sysreg_read(SR); +} + +#define raw_local_save_flags(x) \ + do { (x) = __raw_local_save_flags(); } while (0) + +/* + * This will restore ALL status register flags, not only the interrupt + * mask flag. + * + * The empty asm statement informs the compiler of this fact while + * also serving as a barrier. + */ +static inline void raw_local_irq_restore(unsigned long flags) +{ + sysreg_write(SR, flags); + asm volatile("" : : : "memory", "cc"); +} + +static inline void raw_local_irq_disable(void) +{ + asm volatile("ssrf %0" : : "n"(SYSREG_GM_OFFSET) : "memory"); +} + +static inline void raw_local_irq_enable(void) +{ + asm volatile("csrf %0" : : "n"(SYSREG_GM_OFFSET) : "memory"); +} + +static inline int raw_irqs_disabled_flags(unsigned long flags) +{ + return (flags & SYSREG_BIT(GM)) != 0; +} + +static inline int raw_irqs_disabled(void) +{ + unsigned long flags = __raw_local_save_flags(); + + return raw_irqs_disabled_flags(flags); +} + +static inline unsigned long __raw_local_irq_save(void) +{ + unsigned long flags = __raw_local_save_flags(); + + raw_local_irq_disable(); + + return flags; +} + +#define raw_local_irq_save(flags) \ + do { (flags) = __raw_local_irq_save(); } while (0) + +#endif /* __ASM_AVR32_IRQFLAGS_H */ diff -puN include/asm-avr32/system.h~avr32-add-support-for-irq-flags-state-tracing include/asm-avr32/system.h --- a/include/asm-avr32/system.h~avr32-add-support-for-irq-flags-state-tracing +++ a/include/asm-avr32/system.h @@ -69,37 +69,7 @@ extern struct task_struct *__switch_to(s # define smp_read_barrier_depends() do { } while(0) #endif -/* Interrupt Control */ - -#define local_irq_enable() \ - asm volatile("csrf %0" : : "n"(SR_GM_BIT) : "memory") -#define local_irq_disable() \ - asm volatile ("ssrf %0" : : "n"(SR_GM_BIT) : "memory") -#define local_save_flags(x) ((x) = sysreg_read(SR)) -#define irqs_disabled() \ - ({ \ - unsigned long flags; \ - local_save_flags(flags); \ - ((flags & SR_GM) != 0); \ - }) - -/* - * This will restore ALL status register flags, not only the interrupt - * mask flag. - * - * The empty asm statement informs the compiler of this fact (it also - * serves as a barrier). - */ -#define local_irq_restore(x) \ - do { \ - sysreg_write(SR, (x)); \ - asm volatile("" : : : "memory", "cc"); \ - } while(0) -#define local_irq_save(flags) \ - do { \ - local_save_flags(flags); \ - local_irq_disable(); \ - } while(0) +#include extern void __xchg_called_with_bad_pointer(void); _