Since we should always call the matching arch_local_irq_restore to a
arch_local_irq_save before any bret or eret instruction, the should work.

On 08/02/2011 01:10 AM, Michael Walle wrote:
> Save and restore whole IE register instead of just the lower bit.
> ---
>  arch/lm32/include/asm/irqflags.h |   39 ++++++++++++++-----------------------
>  1 files changed, 15 insertions(+), 24 deletions(-)
> 
> diff --git a/arch/lm32/include/asm/irqflags.h 
> b/arch/lm32/include/asm/irqflags.h
> index ff7688f..22157a6 100644
> --- a/arch/lm32/include/asm/irqflags.h
> +++ b/arch/lm32/include/asm/irqflags.h
> @@ -3,38 +3,36 @@
>  
>  static inline void arch_local_irq_disable(void)
>  {
> -     unsigned int ie;
> +     unsigned long ie;
>       asm volatile (
> -             "rcsr %0, IE\n" \
> -             "andi %0, %0, 0xfffe\n" \
> -             "wcsr IE, %0\n" \
> -             : "=r"(ie) \
> +             "rcsr %0, IE\n"
> +             "andi %0, %0, 0xfffe\n"
> +             "wcsr IE, %0\n"
> +             : "=r"(ie)
>       );
>  }
>  
>  static inline unsigned long arch_local_save_flags(void)
>  {
> -     unsigned long ie;
> -     asm volatile ("rcsr %0, IE\n" : "=r" (ie));
> -     return ie;
> +     unsigned long flags;
> +     asm volatile ("rcsr %0, IE\n" : "=r" (flags));
> +     return flags;
>  }
>  
>  static inline unsigned long arch_local_irq_save(void)
>  {
> -     unsigned int old_ie, new_ie;
> +     unsigned long flags;
>       asm volatile (
> -             "rcsr %1, IE\n" \
> -             "andi %0, %1, 0xfffe\n" \
> -             "wcsr IE, %0\n" \
> -             "andi %1, %1, 1\n" \
> -             : "=r"(new_ie), "=r"(old_ie) \
> +             "rcsr %0, IE\n"
> +             "wcsr IE, r0\n"
> +             : "=r"(flags)
>       );
> -     return old_ie;
> +     return flags;
>  }
>  
>  static inline void arch_local_irq_enable(void)
>  {
> -     unsigned int ie;
> +     unsigned long ie;
>       asm volatile (
>               "rcsr %0, IE\n"
>               "ori %0, %0, 1\n"
> @@ -44,14 +42,7 @@ static inline void arch_local_irq_enable(void)
>  
>  static inline void arch_local_irq_restore(unsigned long flags)
>  {
> -     unsigned int ie;
> -     asm volatile ( \
> -             "andi %1, %1, 0x0001\n" \
> -             "rcsr %0, IE\n" \
> -             "andi %0, %0, 0xfffe\n" \
> -             "or %0, %0, %1\n" \
> -             "wcsr IE, %0\n": \
> -              "=&r" (ie): "r" (flags) );
> +     asm volatile ("wcsr IE, %0\n" : : "r"(flags));
>  }
>  
>  static inline int arch_irqs_disabled_flags(unsigned long flags)

_______________________________________________
http://lists.milkymist.org/listinfo.cgi/devel-milkymist.org
IRC: #milkymist@Freenode
Twitter: www.twitter.com/milkymistvj
Ideas? http://milkymist.uservoice.com

Reply via email to