mirror of
https://github.com/armbian/linux-cix.git
synced 2026-01-06 12:30:45 -08:00
Fix IRQ flag handling naming
Fix the IRQ flag handling naming. In linux/irqflags.h under one configuration, it maps: local_irq_enable() -> raw_local_irq_enable() local_irq_disable() -> raw_local_irq_disable() local_irq_save() -> raw_local_irq_save() ... and under the other configuration, it maps: raw_local_irq_enable() -> local_irq_enable() raw_local_irq_disable() -> local_irq_disable() raw_local_irq_save() -> local_irq_save() ... This is quite confusing. There should be one set of names expected of the arch, and this should be wrapped to give another set of names that are expected by users of this facility. Change this to have the arch provide: flags = arch_local_save_flags() flags = arch_local_irq_save() arch_local_irq_restore(flags) arch_local_irq_disable() arch_local_irq_enable() arch_irqs_disabled_flags(flags) arch_irqs_disabled() arch_safe_halt() Then linux/irqflags.h wraps these to provide: raw_local_save_flags(flags) raw_local_irq_save(flags) raw_local_irq_restore(flags) raw_local_irq_disable() raw_local_irq_enable() raw_irqs_disabled_flags(flags) raw_irqs_disabled() raw_safe_halt() with type checking on the flags 'arguments', and then wraps those to provide: local_save_flags(flags) local_irq_save(flags) local_irq_restore(flags) local_irq_disable() local_irq_enable() irqs_disabled_flags(flags) irqs_disabled() safe_halt() with tracing included if enabled. The arch functions can now all be inline functions rather than some of them having to be macros. Signed-off-by: David Howells <dhowells@redhat.com> [X86, FRV, MN10300] Signed-off-by: Chris Metcalf <cmetcalf@tilera.com> [Tile] Signed-off-by: Michal Simek <monstr@monstr.eu> [Microblaze] Tested-by: Catalin Marinas <catalin.marinas@arm.com> [ARM] Acked-by: Thomas Gleixner <tglx@linutronix.de> Acked-by: Haavard Skinnemoen <haavard.skinnemoen@atmel.com> [AVR] Acked-by: Tony Luck <tony.luck@intel.com> [IA-64] Acked-by: Hirokazu Takata <takata@linux-m32r.org> [M32R] Acked-by: Greg Ungerer <gerg@uclinux.org> [M68K/M68KNOMMU] Acked-by: Ralf Baechle <ralf@linux-mips.org> [MIPS] Acked-by: Kyle McMartin <kyle@mcmartin.ca> [PA-RISC] Acked-by: Paul Mackerras <paulus@samba.org> [PowerPC] Acked-by: Martin Schwidefsky <schwidefsky@de.ibm.com> [S390] Acked-by: Chen Liqin <liqin.chen@sunplusct.com> [Score] Acked-by: Matt Fleming <matt@console-pimps.org> [SH] Acked-by: David S. Miller <davem@davemloft.net> [Sparc] Acked-by: Chris Zankel <chris@zankel.net> [Xtensa] Reviewed-by: Richard Henderson <rth@twiddle.net> [Alpha] Reviewed-by: Yoshinori Sato <ysato@users.sourceforge.jp> [H8300] Cc: starvik@axis.com [CRIS] Cc: jesper.nilsson@axis.com [CRIS] Cc: linux-cris-kernel@axis.com
This commit is contained in:
67
arch/alpha/include/asm/irqflags.h
Normal file
67
arch/alpha/include/asm/irqflags.h
Normal file
@@ -0,0 +1,67 @@
|
||||
#ifndef __ALPHA_IRQFLAGS_H
|
||||
#define __ALPHA_IRQFLAGS_H
|
||||
|
||||
#include <asm/system.h>
|
||||
|
||||
#define IPL_MIN 0
|
||||
#define IPL_SW0 1
|
||||
#define IPL_SW1 2
|
||||
#define IPL_DEV0 3
|
||||
#define IPL_DEV1 4
|
||||
#define IPL_TIMER 5
|
||||
#define IPL_PERF 6
|
||||
#define IPL_POWERFAIL 6
|
||||
#define IPL_MCHECK 7
|
||||
#define IPL_MAX 7
|
||||
|
||||
#ifdef CONFIG_ALPHA_BROKEN_IRQ_MASK
|
||||
#undef IPL_MIN
|
||||
#define IPL_MIN __min_ipl
|
||||
extern int __min_ipl;
|
||||
#endif
|
||||
|
||||
#define getipl() (rdps() & 7)
|
||||
#define setipl(ipl) ((void) swpipl(ipl))
|
||||
|
||||
static inline unsigned long arch_local_save_flags(void)
|
||||
{
|
||||
return rdps();
|
||||
}
|
||||
|
||||
static inline void arch_local_irq_disable(void)
|
||||
{
|
||||
setipl(IPL_MAX);
|
||||
barrier();
|
||||
}
|
||||
|
||||
static inline unsigned long arch_local_irq_save(void)
|
||||
{
|
||||
unsigned long flags = swpipl(IPL_MAX);
|
||||
barrier();
|
||||
return flags;
|
||||
}
|
||||
|
||||
static inline void arch_local_irq_enable(void)
|
||||
{
|
||||
barrier();
|
||||
setipl(IPL_MIN);
|
||||
}
|
||||
|
||||
static inline void arch_local_irq_restore(unsigned long flags)
|
||||
{
|
||||
barrier();
|
||||
setipl(flags);
|
||||
barrier();
|
||||
}
|
||||
|
||||
static inline bool arch_irqs_disabled_flags(unsigned long flags)
|
||||
{
|
||||
return flags == IPL_MAX;
|
||||
}
|
||||
|
||||
static inline bool arch_irqs_disabled(void)
|
||||
{
|
||||
return arch_irqs_disabled_flags(getipl());
|
||||
}
|
||||
|
||||
#endif /* __ALPHA_IRQFLAGS_H */
|
||||
@@ -259,34 +259,6 @@ __CALL_PAL_RW2(wrperfmon, unsigned long, unsigned long, unsigned long);
|
||||
__CALL_PAL_W1(wrusp, unsigned long);
|
||||
__CALL_PAL_W1(wrvptptr, unsigned long);
|
||||
|
||||
#define IPL_MIN 0
|
||||
#define IPL_SW0 1
|
||||
#define IPL_SW1 2
|
||||
#define IPL_DEV0 3
|
||||
#define IPL_DEV1 4
|
||||
#define IPL_TIMER 5
|
||||
#define IPL_PERF 6
|
||||
#define IPL_POWERFAIL 6
|
||||
#define IPL_MCHECK 7
|
||||
#define IPL_MAX 7
|
||||
|
||||
#ifdef CONFIG_ALPHA_BROKEN_IRQ_MASK
|
||||
#undef IPL_MIN
|
||||
#define IPL_MIN __min_ipl
|
||||
extern int __min_ipl;
|
||||
#endif
|
||||
|
||||
#define getipl() (rdps() & 7)
|
||||
#define setipl(ipl) ((void) swpipl(ipl))
|
||||
|
||||
#define local_irq_disable() do { setipl(IPL_MAX); barrier(); } while(0)
|
||||
#define local_irq_enable() do { barrier(); setipl(IPL_MIN); } while(0)
|
||||
#define local_save_flags(flags) ((flags) = rdps())
|
||||
#define local_irq_save(flags) do { (flags) = swpipl(IPL_MAX); barrier(); } while(0)
|
||||
#define local_irq_restore(flags) do { barrier(); setipl(flags); barrier(); } while(0)
|
||||
|
||||
#define irqs_disabled() (getipl() == IPL_MAX)
|
||||
|
||||
/*
|
||||
* TB routines..
|
||||
*/
|
||||
|
||||
@@ -10,66 +10,85 @@
|
||||
*/
|
||||
#if __LINUX_ARM_ARCH__ >= 6
|
||||
|
||||
#define raw_local_irq_save(x) \
|
||||
({ \
|
||||
__asm__ __volatile__( \
|
||||
"mrs %0, cpsr @ local_irq_save\n" \
|
||||
"cpsid i" \
|
||||
: "=r" (x) : : "memory", "cc"); \
|
||||
})
|
||||
static inline unsigned long arch_local_irq_save(void)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
asm volatile(
|
||||
" mrs %0, cpsr @ arch_local_irq_save\n"
|
||||
" cpsid i"
|
||||
: "=r" (flags) : : "memory", "cc");
|
||||
return flags;
|
||||
}
|
||||
|
||||
static inline void arch_local_irq_enable(void)
|
||||
{
|
||||
asm volatile(
|
||||
" cpsie i @ arch_local_irq_enable"
|
||||
:
|
||||
:
|
||||
: "memory", "cc");
|
||||
}
|
||||
|
||||
static inline void arch_local_irq_disable(void)
|
||||
{
|
||||
asm volatile(
|
||||
" cpsid i @ arch_local_irq_disable"
|
||||
:
|
||||
:
|
||||
: "memory", "cc");
|
||||
}
|
||||
|
||||
#define raw_local_irq_enable() __asm__("cpsie i @ __sti" : : : "memory", "cc")
|
||||
#define raw_local_irq_disable() __asm__("cpsid i @ __cli" : : : "memory", "cc")
|
||||
#define local_fiq_enable() __asm__("cpsie f @ __stf" : : : "memory", "cc")
|
||||
#define local_fiq_disable() __asm__("cpsid f @ __clf" : : : "memory", "cc")
|
||||
|
||||
#else
|
||||
|
||||
/*
|
||||
* Save the current interrupt enable state & disable IRQs
|
||||
*/
|
||||
#define raw_local_irq_save(x) \
|
||||
({ \
|
||||
unsigned long temp; \
|
||||
(void) (&temp == &x); \
|
||||
__asm__ __volatile__( \
|
||||
"mrs %0, cpsr @ local_irq_save\n" \
|
||||
" orr %1, %0, #128\n" \
|
||||
" msr cpsr_c, %1" \
|
||||
: "=r" (x), "=r" (temp) \
|
||||
: \
|
||||
: "memory", "cc"); \
|
||||
})
|
||||
|
||||
static inline unsigned long arch_local_irq_save(void)
|
||||
{
|
||||
unsigned long flags, temp;
|
||||
|
||||
asm volatile(
|
||||
" mrs %0, cpsr @ arch_local_irq_save\n"
|
||||
" orr %1, %0, #128\n"
|
||||
" msr cpsr_c, %1"
|
||||
: "=r" (flags), "=r" (temp)
|
||||
:
|
||||
: "memory", "cc");
|
||||
return flags;
|
||||
}
|
||||
|
||||
/*
|
||||
* Enable IRQs
|
||||
*/
|
||||
#define raw_local_irq_enable() \
|
||||
({ \
|
||||
unsigned long temp; \
|
||||
__asm__ __volatile__( \
|
||||
"mrs %0, cpsr @ local_irq_enable\n" \
|
||||
" bic %0, %0, #128\n" \
|
||||
" msr cpsr_c, %0" \
|
||||
: "=r" (temp) \
|
||||
: \
|
||||
: "memory", "cc"); \
|
||||
})
|
||||
static inline void arch_local_irq_enable(void)
|
||||
{
|
||||
unsigned long temp;
|
||||
asm volatile(
|
||||
" mrs %0, cpsr @ arch_local_irq_enable\n"
|
||||
" bic %0, %0, #128\n"
|
||||
" msr cpsr_c, %0"
|
||||
: "=r" (temp)
|
||||
:
|
||||
: "memory", "cc");
|
||||
}
|
||||
|
||||
/*
|
||||
* Disable IRQs
|
||||
*/
|
||||
#define raw_local_irq_disable() \
|
||||
({ \
|
||||
unsigned long temp; \
|
||||
__asm__ __volatile__( \
|
||||
"mrs %0, cpsr @ local_irq_disable\n" \
|
||||
" orr %0, %0, #128\n" \
|
||||
" msr cpsr_c, %0" \
|
||||
: "=r" (temp) \
|
||||
: \
|
||||
: "memory", "cc"); \
|
||||
})
|
||||
static inline void arch_local_irq_disable(void)
|
||||
{
|
||||
unsigned long temp;
|
||||
asm volatile(
|
||||
" mrs %0, cpsr @ arch_local_irq_disable\n"
|
||||
" orr %0, %0, #128\n"
|
||||
" msr cpsr_c, %0"
|
||||
: "=r" (temp)
|
||||
:
|
||||
: "memory", "cc");
|
||||
}
|
||||
|
||||
/*
|
||||
* Enable FIQs
|
||||
@@ -106,27 +125,31 @@
|
||||
/*
|
||||
* Save the current interrupt enable state.
|
||||
*/
|
||||
#define raw_local_save_flags(x) \
|
||||
({ \
|
||||
__asm__ __volatile__( \
|
||||
"mrs %0, cpsr @ local_save_flags" \
|
||||
: "=r" (x) : : "memory", "cc"); \
|
||||
})
|
||||
static inline unsigned long arch_local_save_flags(void)
|
||||
{
|
||||
unsigned long flags;
|
||||
asm volatile(
|
||||
" mrs %0, cpsr @ local_save_flags"
|
||||
: "=r" (flags) : : "memory", "cc");
|
||||
return flags;
|
||||
}
|
||||
|
||||
/*
|
||||
* restore saved IRQ & FIQ state
|
||||
*/
|
||||
#define raw_local_irq_restore(x) \
|
||||
__asm__ __volatile__( \
|
||||
"msr cpsr_c, %0 @ local_irq_restore\n" \
|
||||
: \
|
||||
: "r" (x) \
|
||||
: "memory", "cc")
|
||||
static inline void arch_local_irq_restore(unsigned long flags)
|
||||
{
|
||||
asm volatile(
|
||||
" msr cpsr_c, %0 @ local_irq_restore"
|
||||
:
|
||||
: "r" (flags)
|
||||
: "memory", "cc");
|
||||
}
|
||||
|
||||
#define raw_irqs_disabled_flags(flags) \
|
||||
({ \
|
||||
(int)((flags) & PSR_I_BIT); \
|
||||
})
|
||||
static inline int arch_irqs_disabled_flags(unsigned long flags)
|
||||
{
|
||||
return flags & PSR_I_BIT;
|
||||
}
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@@ -8,16 +8,14 @@
|
||||
#ifndef __ASM_AVR32_IRQFLAGS_H
|
||||
#define __ASM_AVR32_IRQFLAGS_H
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <asm/sysreg.h>
|
||||
|
||||
static inline unsigned long __raw_local_save_flags(void)
|
||||
static inline unsigned long arch_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.
|
||||
@@ -25,44 +23,39 @@ static inline unsigned long __raw_local_save_flags(void)
|
||||
* 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)
|
||||
static inline void arch_local_irq_restore(unsigned long flags)
|
||||
{
|
||||
sysreg_write(SR, flags);
|
||||
asm volatile("" : : : "memory", "cc");
|
||||
}
|
||||
|
||||
static inline void raw_local_irq_disable(void)
|
||||
static inline void arch_local_irq_disable(void)
|
||||
{
|
||||
asm volatile("ssrf %0" : : "n"(SYSREG_GM_OFFSET) : "memory");
|
||||
}
|
||||
|
||||
static inline void raw_local_irq_enable(void)
|
||||
static inline void arch_local_irq_enable(void)
|
||||
{
|
||||
asm volatile("csrf %0" : : "n"(SYSREG_GM_OFFSET) : "memory");
|
||||
}
|
||||
|
||||
static inline int raw_irqs_disabled_flags(unsigned long flags)
|
||||
static inline bool arch_irqs_disabled_flags(unsigned long flags)
|
||||
{
|
||||
return (flags & SYSREG_BIT(GM)) != 0;
|
||||
}
|
||||
|
||||
static inline int raw_irqs_disabled(void)
|
||||
static inline bool arch_irqs_disabled(void)
|
||||
{
|
||||
unsigned long flags = __raw_local_save_flags();
|
||||
|
||||
return raw_irqs_disabled_flags(flags);
|
||||
return arch_irqs_disabled_flags(arch_local_save_flags());
|
||||
}
|
||||
|
||||
static inline unsigned long __raw_local_irq_save(void)
|
||||
static inline unsigned long arch_local_irq_save(void)
|
||||
{
|
||||
unsigned long flags = __raw_local_save_flags();
|
||||
unsigned long flags = arch_local_save_flags();
|
||||
|
||||
raw_local_irq_disable();
|
||||
arch_local_irq_disable();
|
||||
|
||||
return flags;
|
||||
}
|
||||
|
||||
#define raw_local_irq_save(flags) \
|
||||
do { (flags) = __raw_local_irq_save(); } while (0)
|
||||
|
||||
#endif /* __ASM_AVR32_IRQFLAGS_H */
|
||||
|
||||
@@ -218,16 +218,4 @@ static inline void hard_local_irq_restore(unsigned long flags)
|
||||
|
||||
|
||||
#endif /* !CONFIG_IPIPE */
|
||||
|
||||
/*
|
||||
* Raw interface to linux/irqflags.h.
|
||||
*/
|
||||
#define raw_local_save_flags(flags) do { (flags) = arch_local_save_flags(); } while (0)
|
||||
#define raw_local_irq_save(flags) do { (flags) = arch_local_irq_save(); } while (0)
|
||||
#define raw_local_irq_restore(flags) arch_local_irq_restore(flags)
|
||||
#define raw_local_irq_enable() arch_local_irq_enable()
|
||||
#define raw_local_irq_disable() arch_local_irq_disable()
|
||||
#define raw_irqs_disabled_flags(flags) arch_irqs_disabled_flags(flags)
|
||||
#define raw_irqs_disabled() arch_irqs_disabled()
|
||||
|
||||
#endif
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
#include <linux/kallsyms.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/irq.h>
|
||||
#include <asm/dma.h>
|
||||
#include <asm/trace.h>
|
||||
#include <asm/fixed_code.h>
|
||||
|
||||
45
arch/cris/include/arch-v10/arch/irqflags.h
Normal file
45
arch/cris/include/arch-v10/arch/irqflags.h
Normal file
@@ -0,0 +1,45 @@
|
||||
#ifndef __ASM_CRIS_ARCH_IRQFLAGS_H
|
||||
#define __ASM_CRIS_ARCH_IRQFLAGS_H
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
static inline unsigned long arch_local_save_flags(void)
|
||||
{
|
||||
unsigned long flags;
|
||||
asm volatile("move $ccr,%0" : "=rm" (flags) : : "memory");
|
||||
return flags;
|
||||
}
|
||||
|
||||
static inline void arch_local_irq_disable(void)
|
||||
{
|
||||
asm volatile("di" : : : "memory");
|
||||
}
|
||||
|
||||
static inline void arch_local_irq_enable(void)
|
||||
{
|
||||
asm volatile("ei" : : : "memory");
|
||||
}
|
||||
|
||||
static inline unsigned long arch_local_irq_save(void)
|
||||
{
|
||||
unsigned long flags = arch_local_save_flags();
|
||||
arch_local_irq_disable();
|
||||
return flags;
|
||||
}
|
||||
|
||||
static inline void arch_local_irq_restore(unsigned long flags)
|
||||
{
|
||||
asm volatile("move %0,$ccr" : : "rm" (flags) : "memory");
|
||||
}
|
||||
|
||||
static inline bool arch_irqs_disabled_flags(unsigned long flags)
|
||||
{
|
||||
return !(flags & (1 << 5));
|
||||
}
|
||||
|
||||
static inline bool arch_irqs_disabled(void)
|
||||
{
|
||||
return arch_irqs_disabled_flags(arch_local_save_flags());
|
||||
}
|
||||
|
||||
#endif /* __ASM_CRIS_ARCH_IRQFLAGS_H */
|
||||
@@ -44,20 +44,4 @@ static inline unsigned long _get_base(char * addr)
|
||||
struct __xchg_dummy { unsigned long a[100]; };
|
||||
#define __xg(x) ((struct __xchg_dummy *)(x))
|
||||
|
||||
/* interrupt control.. */
|
||||
#define local_save_flags(x) __asm__ __volatile__ ("move $ccr,%0" : "=rm" (x) : : "memory");
|
||||
#define local_irq_restore(x) __asm__ __volatile__ ("move %0,$ccr" : : "rm" (x) : "memory");
|
||||
#define local_irq_disable() __asm__ __volatile__ ( "di" : : :"memory");
|
||||
#define local_irq_enable() __asm__ __volatile__ ( "ei" : : :"memory");
|
||||
|
||||
#define irqs_disabled() \
|
||||
({ \
|
||||
unsigned long flags; \
|
||||
local_save_flags(flags); \
|
||||
!(flags & (1<<5)); \
|
||||
})
|
||||
|
||||
/* For spinlocks etc */
|
||||
#define local_irq_save(x) __asm__ __volatile__ ("move $ccr,%0\n\tdi" : "=rm" (x) : : "memory");
|
||||
|
||||
#endif
|
||||
|
||||
46
arch/cris/include/arch-v32/arch/irqflags.h
Normal file
46
arch/cris/include/arch-v32/arch/irqflags.h
Normal file
@@ -0,0 +1,46 @@
|
||||
#ifndef __ASM_CRIS_ARCH_IRQFLAGS_H
|
||||
#define __ASM_CRIS_ARCH_IRQFLAGS_H
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <arch/ptrace.h>
|
||||
|
||||
static inline unsigned long arch_local_save_flags(void)
|
||||
{
|
||||
unsigned long flags;
|
||||
asm volatile("move $ccs,%0" : "=rm" (flags) : : "memory");
|
||||
return flags;
|
||||
}
|
||||
|
||||
static inline void arch_local_irq_disable(void)
|
||||
{
|
||||
asm volatile("di" : : : "memory");
|
||||
}
|
||||
|
||||
static inline void arch_local_irq_enable(void)
|
||||
{
|
||||
asm volatile("ei" : : : "memory");
|
||||
}
|
||||
|
||||
static inline unsigned long arch_local_irq_save(void)
|
||||
{
|
||||
unsigned long flags = arch_local_save_flags();
|
||||
arch_local_irq_disable();
|
||||
return flags;
|
||||
}
|
||||
|
||||
static inline void arch_local_irq_restore(unsigned long flags)
|
||||
{
|
||||
asm volatile("move %0,$ccs" : : "rm" (flags) : "memory");
|
||||
}
|
||||
|
||||
static inline bool arch_irqs_disabled_flags(unsigned long flags)
|
||||
{
|
||||
return !(flags & (1 << I_CCS_BITNR));
|
||||
}
|
||||
|
||||
static inline bool arch_irqs_disabled(void)
|
||||
{
|
||||
return arch_irqs_disabled_flags(arch_local_save_flags());
|
||||
}
|
||||
|
||||
#endif /* __ASM_CRIS_ARCH_IRQFLAGS_H */
|
||||
@@ -44,26 +44,4 @@ static inline unsigned long rdsp(void)
|
||||
struct __xchg_dummy { unsigned long a[100]; };
|
||||
#define __xg(x) ((struct __xchg_dummy *)(x))
|
||||
|
||||
/* Used for interrupt control. */
|
||||
#define local_save_flags(x) \
|
||||
__asm__ __volatile__ ("move $ccs, %0" : "=rm" (x) : : "memory");
|
||||
|
||||
#define local_irq_restore(x) \
|
||||
__asm__ __volatile__ ("move %0, $ccs" : : "rm" (x) : "memory");
|
||||
|
||||
#define local_irq_disable() __asm__ __volatile__ ("di" : : : "memory");
|
||||
#define local_irq_enable() __asm__ __volatile__ ("ei" : : : "memory");
|
||||
|
||||
#define irqs_disabled() \
|
||||
({ \
|
||||
unsigned long flags; \
|
||||
\
|
||||
local_save_flags(flags);\
|
||||
!(flags & (1 << I_CCS_BITNR)); \
|
||||
})
|
||||
|
||||
/* Used for spinlocks, etc. */
|
||||
#define local_irq_save(x) \
|
||||
__asm__ __volatile__ ("move $ccs, %0\n\tdi" : "=rm" (x) : : "memory");
|
||||
|
||||
#endif /* _ASM_CRIS_ARCH_SYSTEM_H */
|
||||
|
||||
1
arch/cris/include/asm/irqflags.h
Normal file
1
arch/cris/include/asm/irqflags.h
Normal file
@@ -0,0 +1 @@
|
||||
#include <arch/irqflags.h>
|
||||
@@ -1,6 +1,7 @@
|
||||
#ifndef __ASM_CRIS_SYSTEM_H
|
||||
#define __ASM_CRIS_SYSTEM_H
|
||||
|
||||
#include <linux/irqflags.h>
|
||||
#include <arch/system.h>
|
||||
|
||||
/* the switch_to macro calls resume, an asm function in entry.S which does the actual
|
||||
|
||||
158
arch/frv/include/asm/irqflags.h
Normal file
158
arch/frv/include/asm/irqflags.h
Normal file
@@ -0,0 +1,158 @@
|
||||
/* FR-V interrupt handling
|
||||
*
|
||||
* Copyright (C) 2010 Red Hat, Inc. All Rights Reserved.
|
||||
* Written by David Howells (dhowells@redhat.com)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public Licence
|
||||
* as published by the Free Software Foundation; either version
|
||||
* 2 of the Licence, or (at your option) any later version.
|
||||
*/
|
||||
|
||||
#ifndef _ASM_IRQFLAGS_H
|
||||
#define _ASM_IRQFLAGS_H
|
||||
|
||||
/*
|
||||
* interrupt flag manipulation
|
||||
* - use virtual interrupt management since touching the PSR is slow
|
||||
* - ICC2.Z: T if interrupts virtually disabled
|
||||
* - ICC2.C: F if interrupts really disabled
|
||||
* - if Z==1 upon interrupt:
|
||||
* - C is set to 0
|
||||
* - interrupts are really disabled
|
||||
* - entry.S returns immediately
|
||||
* - uses TIHI (TRAP if Z==0 && C==0) #2 to really reenable interrupts
|
||||
* - if taken, the trap:
|
||||
* - sets ICC2.C
|
||||
* - enables interrupts
|
||||
*/
|
||||
static inline void arch_local_irq_disable(void)
|
||||
{
|
||||
/* set Z flag, but don't change the C flag */
|
||||
asm volatile(" andcc gr0,gr0,gr0,icc2 \n"
|
||||
:
|
||||
:
|
||||
: "memory", "icc2"
|
||||
);
|
||||
}
|
||||
|
||||
static inline void arch_local_irq_enable(void)
|
||||
{
|
||||
/* clear Z flag and then test the C flag */
|
||||
asm volatile(" oricc gr0,#1,gr0,icc2 \n"
|
||||
" tihi icc2,gr0,#2 \n"
|
||||
:
|
||||
:
|
||||
: "memory", "icc2"
|
||||
);
|
||||
}
|
||||
|
||||
static inline unsigned long arch_local_save_flags(void)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
asm volatile("movsg ccr,%0"
|
||||
: "=r"(flags)
|
||||
:
|
||||
: "memory");
|
||||
|
||||
/* shift ICC2.Z to bit 0 */
|
||||
flags >>= 26;
|
||||
|
||||
/* make flags 1 if interrupts disabled, 0 otherwise */
|
||||
return flags & 1UL;
|
||||
|
||||
}
|
||||
|
||||
static inline unsigned long arch_local_irq_save(void)
|
||||
{
|
||||
unsigned long flags = arch_local_save_flags();
|
||||
arch_local_irq_disable();
|
||||
return flags;
|
||||
}
|
||||
|
||||
static inline void arch_local_irq_restore(unsigned long flags)
|
||||
{
|
||||
/* load the Z flag by turning 1 if disabled into 0 if disabled
|
||||
* and thus setting the Z flag but not the C flag */
|
||||
asm volatile(" xoricc %0,#1,gr0,icc2 \n"
|
||||
/* then trap if Z=0 and C=0 */
|
||||
" tihi icc2,gr0,#2 \n"
|
||||
:
|
||||
: "r"(flags)
|
||||
: "memory", "icc2"
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
static inline bool arch_irqs_disabled_flags(unsigned long flags)
|
||||
{
|
||||
return flags;
|
||||
}
|
||||
|
||||
static inline bool arch_irqs_disabled(void)
|
||||
{
|
||||
return arch_irqs_disabled_flags(arch_local_save_flags());
|
||||
}
|
||||
|
||||
/*
|
||||
* real interrupt flag manipulation
|
||||
*/
|
||||
#define __arch_local_irq_disable() \
|
||||
do { \
|
||||
unsigned long psr; \
|
||||
asm volatile(" movsg psr,%0 \n" \
|
||||
" andi %0,%2,%0 \n" \
|
||||
" ori %0,%1,%0 \n" \
|
||||
" movgs %0,psr \n" \
|
||||
: "=r"(psr) \
|
||||
: "i" (PSR_PIL_14), "i" (~PSR_PIL) \
|
||||
: "memory"); \
|
||||
} while (0)
|
||||
|
||||
#define __arch_local_irq_enable() \
|
||||
do { \
|
||||
unsigned long psr; \
|
||||
asm volatile(" movsg psr,%0 \n" \
|
||||
" andi %0,%1,%0 \n" \
|
||||
" movgs %0,psr \n" \
|
||||
: "=r"(psr) \
|
||||
: "i" (~PSR_PIL) \
|
||||
: "memory"); \
|
||||
} while (0)
|
||||
|
||||
#define __arch_local_save_flags(flags) \
|
||||
do { \
|
||||
typecheck(unsigned long, flags); \
|
||||
asm("movsg psr,%0" \
|
||||
: "=r"(flags) \
|
||||
: \
|
||||
: "memory"); \
|
||||
} while (0)
|
||||
|
||||
#define __arch_local_irq_save(flags) \
|
||||
do { \
|
||||
unsigned long npsr; \
|
||||
typecheck(unsigned long, flags); \
|
||||
asm volatile(" movsg psr,%0 \n" \
|
||||
" andi %0,%3,%1 \n" \
|
||||
" ori %1,%2,%1 \n" \
|
||||
" movgs %1,psr \n" \
|
||||
: "=r"(flags), "=r"(npsr) \
|
||||
: "i" (PSR_PIL_14), "i" (~PSR_PIL) \
|
||||
: "memory"); \
|
||||
} while (0)
|
||||
|
||||
#define __arch_local_irq_restore(flags) \
|
||||
do { \
|
||||
typecheck(unsigned long, flags); \
|
||||
asm volatile(" movgs %0,psr \n" \
|
||||
: \
|
||||
: "r" (flags) \
|
||||
: "memory"); \
|
||||
} while (0)
|
||||
|
||||
#define __arch_irqs_disabled() \
|
||||
((__get_PSR() & PSR_PIL) >= PSR_PIL_14)
|
||||
|
||||
#endif /* _ASM_IRQFLAGS_H */
|
||||
@@ -36,142 +36,6 @@ do { \
|
||||
mb(); \
|
||||
} while(0)
|
||||
|
||||
/*
|
||||
* interrupt flag manipulation
|
||||
* - use virtual interrupt management since touching the PSR is slow
|
||||
* - ICC2.Z: T if interrupts virtually disabled
|
||||
* - ICC2.C: F if interrupts really disabled
|
||||
* - if Z==1 upon interrupt:
|
||||
* - C is set to 0
|
||||
* - interrupts are really disabled
|
||||
* - entry.S returns immediately
|
||||
* - uses TIHI (TRAP if Z==0 && C==0) #2 to really reenable interrupts
|
||||
* - if taken, the trap:
|
||||
* - sets ICC2.C
|
||||
* - enables interrupts
|
||||
*/
|
||||
#define local_irq_disable() \
|
||||
do { \
|
||||
/* set Z flag, but don't change the C flag */ \
|
||||
asm volatile(" andcc gr0,gr0,gr0,icc2 \n" \
|
||||
: \
|
||||
: \
|
||||
: "memory", "icc2" \
|
||||
); \
|
||||
} while(0)
|
||||
|
||||
#define local_irq_enable() \
|
||||
do { \
|
||||
/* clear Z flag and then test the C flag */ \
|
||||
asm volatile(" oricc gr0,#1,gr0,icc2 \n" \
|
||||
" tihi icc2,gr0,#2 \n" \
|
||||
: \
|
||||
: \
|
||||
: "memory", "icc2" \
|
||||
); \
|
||||
} while(0)
|
||||
|
||||
#define local_save_flags(flags) \
|
||||
do { \
|
||||
typecheck(unsigned long, flags); \
|
||||
asm volatile("movsg ccr,%0" \
|
||||
: "=r"(flags) \
|
||||
: \
|
||||
: "memory"); \
|
||||
\
|
||||
/* shift ICC2.Z to bit 0 */ \
|
||||
flags >>= 26; \
|
||||
\
|
||||
/* make flags 1 if interrupts disabled, 0 otherwise */ \
|
||||
flags &= 1UL; \
|
||||
} while(0)
|
||||
|
||||
#define irqs_disabled() \
|
||||
({unsigned long flags; local_save_flags(flags); !!flags; })
|
||||
|
||||
#define local_irq_save(flags) \
|
||||
do { \
|
||||
typecheck(unsigned long, flags); \
|
||||
local_save_flags(flags); \
|
||||
local_irq_disable(); \
|
||||
} while(0)
|
||||
|
||||
#define local_irq_restore(flags) \
|
||||
do { \
|
||||
typecheck(unsigned long, flags); \
|
||||
\
|
||||
/* load the Z flag by turning 1 if disabled into 0 if disabled \
|
||||
* and thus setting the Z flag but not the C flag */ \
|
||||
asm volatile(" xoricc %0,#1,gr0,icc2 \n" \
|
||||
/* then test Z=0 and C=0 */ \
|
||||
" tihi icc2,gr0,#2 \n" \
|
||||
: \
|
||||
: "r"(flags) \
|
||||
: "memory", "icc2" \
|
||||
); \
|
||||
\
|
||||
} while(0)
|
||||
|
||||
/*
|
||||
* real interrupt flag manipulation
|
||||
*/
|
||||
#define __local_irq_disable() \
|
||||
do { \
|
||||
unsigned long psr; \
|
||||
asm volatile(" movsg psr,%0 \n" \
|
||||
" andi %0,%2,%0 \n" \
|
||||
" ori %0,%1,%0 \n" \
|
||||
" movgs %0,psr \n" \
|
||||
: "=r"(psr) \
|
||||
: "i" (PSR_PIL_14), "i" (~PSR_PIL) \
|
||||
: "memory"); \
|
||||
} while(0)
|
||||
|
||||
#define __local_irq_enable() \
|
||||
do { \
|
||||
unsigned long psr; \
|
||||
asm volatile(" movsg psr,%0 \n" \
|
||||
" andi %0,%1,%0 \n" \
|
||||
" movgs %0,psr \n" \
|
||||
: "=r"(psr) \
|
||||
: "i" (~PSR_PIL) \
|
||||
: "memory"); \
|
||||
} while(0)
|
||||
|
||||
#define __local_save_flags(flags) \
|
||||
do { \
|
||||
typecheck(unsigned long, flags); \
|
||||
asm("movsg psr,%0" \
|
||||
: "=r"(flags) \
|
||||
: \
|
||||
: "memory"); \
|
||||
} while(0)
|
||||
|
||||
#define __local_irq_save(flags) \
|
||||
do { \
|
||||
unsigned long npsr; \
|
||||
typecheck(unsigned long, flags); \
|
||||
asm volatile(" movsg psr,%0 \n" \
|
||||
" andi %0,%3,%1 \n" \
|
||||
" ori %1,%2,%1 \n" \
|
||||
" movgs %1,psr \n" \
|
||||
: "=r"(flags), "=r"(npsr) \
|
||||
: "i" (PSR_PIL_14), "i" (~PSR_PIL) \
|
||||
: "memory"); \
|
||||
} while(0)
|
||||
|
||||
#define __local_irq_restore(flags) \
|
||||
do { \
|
||||
typecheck(unsigned long, flags); \
|
||||
asm volatile(" movgs %0,psr \n" \
|
||||
: \
|
||||
: "r" (flags) \
|
||||
: "memory"); \
|
||||
} while(0)
|
||||
|
||||
#define __irqs_disabled() \
|
||||
((__get_PSR() & PSR_PIL) >= PSR_PIL_14)
|
||||
|
||||
/*
|
||||
* Force strict CPU ordering.
|
||||
*/
|
||||
|
||||
43
arch/h8300/include/asm/irqflags.h
Normal file
43
arch/h8300/include/asm/irqflags.h
Normal file
@@ -0,0 +1,43 @@
|
||||
#ifndef _H8300_IRQFLAGS_H
|
||||
#define _H8300_IRQFLAGS_H
|
||||
|
||||
static inline unsigned long arch_local_save_flags(void)
|
||||
{
|
||||
unsigned long flags;
|
||||
asm volatile ("stc ccr,%w0" : "=r" (flags));
|
||||
return flags;
|
||||
}
|
||||
|
||||
static inline void arch_local_irq_disable(void)
|
||||
{
|
||||
asm volatile ("orc #0x80,ccr" : : : "memory");
|
||||
}
|
||||
|
||||
static inline void arch_local_irq_enable(void)
|
||||
{
|
||||
asm volatile ("andc #0x7f,ccr" : : : "memory");
|
||||
}
|
||||
|
||||
static inline unsigned long arch_local_irq_save(void)
|
||||
{
|
||||
unsigned long flags = arch_local_save_flags();
|
||||
arch_local_irq_disable();
|
||||
return flags;
|
||||
}
|
||||
|
||||
static inline void arch_local_irq_restore(unsigned long flags)
|
||||
{
|
||||
asm volatile ("ldc %w0,ccr" : : "r" (flags) : "memory");
|
||||
}
|
||||
|
||||
static inline bool arch_irqs_disabled_flags(unsigned long flags)
|
||||
{
|
||||
return (flags & 0x80) == 0x80;
|
||||
}
|
||||
|
||||
static inline bool arch_irqs_disabled(void)
|
||||
{
|
||||
return arch_irqs_disabled_flags(arch_local_save_flags());
|
||||
}
|
||||
|
||||
#endif /* _H8300_IRQFLAGS_H */
|
||||
@@ -2,6 +2,7 @@
|
||||
#define _H8300_SYSTEM_H
|
||||
|
||||
#include <linux/linkage.h>
|
||||
#include <linux/irqflags.h>
|
||||
|
||||
struct pt_regs;
|
||||
|
||||
@@ -51,31 +52,8 @@ asmlinkage void resume(void);
|
||||
(last) = _last; \
|
||||
}
|
||||
|
||||
#define __sti() asm volatile ("andc #0x7f,ccr")
|
||||
#define __cli() asm volatile ("orc #0x80,ccr")
|
||||
|
||||
#define __save_flags(x) \
|
||||
asm volatile ("stc ccr,%w0":"=r" (x))
|
||||
|
||||
#define __restore_flags(x) \
|
||||
asm volatile ("ldc %w0,ccr": :"r" (x))
|
||||
|
||||
#define irqs_disabled() \
|
||||
({ \
|
||||
unsigned char flags; \
|
||||
__save_flags(flags); \
|
||||
((flags & 0x80) == 0x80); \
|
||||
})
|
||||
|
||||
#define iret() __asm__ __volatile__ ("rte": : :"memory", "sp", "cc")
|
||||
|
||||
/* For spinlocks etc */
|
||||
#define local_irq_disable() __cli()
|
||||
#define local_irq_enable() __sti()
|
||||
#define local_irq_save(x) ({ __save_flags(x); local_irq_disable(); })
|
||||
#define local_irq_restore(x) __restore_flags(x)
|
||||
#define local_save_flags(x) __save_flags(x)
|
||||
|
||||
/*
|
||||
* Force strict CPU ordering.
|
||||
* Not really required on H8...
|
||||
|
||||
94
arch/ia64/include/asm/irqflags.h
Normal file
94
arch/ia64/include/asm/irqflags.h
Normal file
@@ -0,0 +1,94 @@
|
||||
/*
|
||||
* IRQ flags defines.
|
||||
*
|
||||
* Copyright (C) 1998-2003 Hewlett-Packard Co
|
||||
* David Mosberger-Tang <davidm@hpl.hp.com>
|
||||
* Copyright (C) 1999 Asit Mallick <asit.k.mallick@intel.com>
|
||||
* Copyright (C) 1999 Don Dugger <don.dugger@intel.com>
|
||||
*/
|
||||
|
||||
#ifndef _ASM_IA64_IRQFLAGS_H
|
||||
#define _ASM_IA64_IRQFLAGS_H
|
||||
|
||||
#ifdef CONFIG_IA64_DEBUG_IRQ
|
||||
extern unsigned long last_cli_ip;
|
||||
static inline void arch_maybe_save_ip(unsigned long flags)
|
||||
{
|
||||
if (flags & IA64_PSR_I)
|
||||
last_cli_ip = ia64_getreg(_IA64_REG_IP);
|
||||
}
|
||||
#else
|
||||
#define arch_maybe_save_ip(flags) do {} while (0)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* - clearing psr.i is implicitly serialized (visible by next insn)
|
||||
* - setting psr.i requires data serialization
|
||||
* - we need a stop-bit before reading PSR because we sometimes
|
||||
* write a floating-point register right before reading the PSR
|
||||
* and that writes to PSR.mfl
|
||||
*/
|
||||
|
||||
static inline unsigned long arch_local_save_flags(void)
|
||||
{
|
||||
ia64_stop();
|
||||
#ifdef CONFIG_PARAVIRT
|
||||
return ia64_get_psr_i();
|
||||
#else
|
||||
return ia64_getreg(_IA64_REG_PSR);
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline unsigned long arch_local_irq_save(void)
|
||||
{
|
||||
unsigned long flags = arch_local_save_flags();
|
||||
|
||||
ia64_stop();
|
||||
ia64_rsm(IA64_PSR_I);
|
||||
arch_maybe_save_ip(flags);
|
||||
return flags;
|
||||
}
|
||||
|
||||
static inline void arch_local_irq_disable(void)
|
||||
{
|
||||
#ifdef CONFIG_IA64_DEBUG_IRQ
|
||||
arch_local_irq_save();
|
||||
#else
|
||||
ia64_stop();
|
||||
ia64_rsm(IA64_PSR_I);
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline void arch_local_irq_enable(void)
|
||||
{
|
||||
ia64_stop();
|
||||
ia64_ssm(IA64_PSR_I);
|
||||
ia64_srlz_d();
|
||||
}
|
||||
|
||||
static inline void arch_local_irq_restore(unsigned long flags)
|
||||
{
|
||||
#ifdef CONFIG_IA64_DEBUG_IRQ
|
||||
unsigned long old_psr = arch_local_save_flags();
|
||||
#endif
|
||||
ia64_intrin_local_irq_restore(flags & IA64_PSR_I);
|
||||
arch_maybe_save_ip(old_psr & ~flags);
|
||||
}
|
||||
|
||||
static inline bool arch_irqs_disabled_flags(unsigned long flags)
|
||||
{
|
||||
return (flags & IA64_PSR_I) == 0;
|
||||
}
|
||||
|
||||
static inline bool arch_irqs_disabled(void)
|
||||
{
|
||||
return arch_irqs_disabled_flags(arch_local_save_flags());
|
||||
}
|
||||
|
||||
static inline void arch_safe_halt(void)
|
||||
{
|
||||
ia64_pal_halt_light(); /* PAL_HALT_LIGHT */
|
||||
}
|
||||
|
||||
|
||||
#endif /* _ASM_IA64_IRQFLAGS_H */
|
||||
@@ -107,87 +107,11 @@ extern struct ia64_boot_param {
|
||||
*/
|
||||
#define set_mb(var, value) do { (var) = (value); mb(); } while (0)
|
||||
|
||||
#define safe_halt() ia64_pal_halt_light() /* PAL_HALT_LIGHT */
|
||||
|
||||
/*
|
||||
* The group barrier in front of the rsm & ssm are necessary to ensure
|
||||
* that none of the previous instructions in the same group are
|
||||
* affected by the rsm/ssm.
|
||||
*/
|
||||
/* For spinlocks etc */
|
||||
|
||||
/*
|
||||
* - clearing psr.i is implicitly serialized (visible by next insn)
|
||||
* - setting psr.i requires data serialization
|
||||
* - we need a stop-bit before reading PSR because we sometimes
|
||||
* write a floating-point register right before reading the PSR
|
||||
* and that writes to PSR.mfl
|
||||
*/
|
||||
#ifdef CONFIG_PARAVIRT
|
||||
#define __local_save_flags() ia64_get_psr_i()
|
||||
#else
|
||||
#define __local_save_flags() ia64_getreg(_IA64_REG_PSR)
|
||||
#endif
|
||||
|
||||
#define __local_irq_save(x) \
|
||||
do { \
|
||||
ia64_stop(); \
|
||||
(x) = __local_save_flags(); \
|
||||
ia64_stop(); \
|
||||
ia64_rsm(IA64_PSR_I); \
|
||||
} while (0)
|
||||
|
||||
#define __local_irq_disable() \
|
||||
do { \
|
||||
ia64_stop(); \
|
||||
ia64_rsm(IA64_PSR_I); \
|
||||
} while (0)
|
||||
|
||||
#define __local_irq_restore(x) ia64_intrin_local_irq_restore((x) & IA64_PSR_I)
|
||||
|
||||
#ifdef CONFIG_IA64_DEBUG_IRQ
|
||||
|
||||
extern unsigned long last_cli_ip;
|
||||
|
||||
# define __save_ip() last_cli_ip = ia64_getreg(_IA64_REG_IP)
|
||||
|
||||
# define local_irq_save(x) \
|
||||
do { \
|
||||
unsigned long __psr; \
|
||||
\
|
||||
__local_irq_save(__psr); \
|
||||
if (__psr & IA64_PSR_I) \
|
||||
__save_ip(); \
|
||||
(x) = __psr; \
|
||||
} while (0)
|
||||
|
||||
# define local_irq_disable() do { unsigned long __x; local_irq_save(__x); } while (0)
|
||||
|
||||
# define local_irq_restore(x) \
|
||||
do { \
|
||||
unsigned long __old_psr, __psr = (x); \
|
||||
\
|
||||
local_save_flags(__old_psr); \
|
||||
__local_irq_restore(__psr); \
|
||||
if ((__old_psr & IA64_PSR_I) && !(__psr & IA64_PSR_I)) \
|
||||
__save_ip(); \
|
||||
} while (0)
|
||||
|
||||
#else /* !CONFIG_IA64_DEBUG_IRQ */
|
||||
# define local_irq_save(x) __local_irq_save(x)
|
||||
# define local_irq_disable() __local_irq_disable()
|
||||
# define local_irq_restore(x) __local_irq_restore(x)
|
||||
#endif /* !CONFIG_IA64_DEBUG_IRQ */
|
||||
|
||||
#define local_irq_enable() ({ ia64_stop(); ia64_ssm(IA64_PSR_I); ia64_srlz_d(); })
|
||||
#define local_save_flags(flags) ({ ia64_stop(); (flags) = __local_save_flags(); })
|
||||
|
||||
#define irqs_disabled() \
|
||||
({ \
|
||||
unsigned long __ia64_id_flags; \
|
||||
local_save_flags(__ia64_id_flags); \
|
||||
(__ia64_id_flags & IA64_PSR_I) == 0; \
|
||||
})
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
|
||||
104
arch/m32r/include/asm/irqflags.h
Normal file
104
arch/m32r/include/asm/irqflags.h
Normal file
@@ -0,0 +1,104 @@
|
||||
/*
|
||||
* This file is subject to the terms and conditions of the GNU General Public
|
||||
* License. See the file "COPYING" in the main directory of this archive
|
||||
* for more details.
|
||||
*
|
||||
* Copyright (C) 2001 Hiroyuki Kondo, Hirokazu Takata, and Hitoshi Yamamoto
|
||||
* Copyright (C) 2004, 2006 Hirokazu Takata <takata at linux-m32r.org>
|
||||
*/
|
||||
|
||||
#ifndef _ASM_M32R_IRQFLAGS_H
|
||||
#define _ASM_M32R_IRQFLAGS_H
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
static inline unsigned long arch_local_save_flags(void)
|
||||
{
|
||||
unsigned long flags;
|
||||
asm volatile("mvfc %0,psw" : "=r"(flags));
|
||||
return flags;
|
||||
}
|
||||
|
||||
static inline void arch_local_irq_disable(void)
|
||||
{
|
||||
#if !defined(CONFIG_CHIP_M32102) && !defined(CONFIG_CHIP_M32104)
|
||||
asm volatile (
|
||||
"clrpsw #0x40 -> nop"
|
||||
: : : "memory");
|
||||
#else
|
||||
unsigned long tmpreg0, tmpreg1;
|
||||
asm volatile (
|
||||
"ld24 %0, #0 ; Use 32-bit insn. \n\t"
|
||||
"mvfc %1, psw ; No interrupt can be accepted here. \n\t"
|
||||
"mvtc %0, psw \n\t"
|
||||
"and3 %0, %1, #0xffbf \n\t"
|
||||
"mvtc %0, psw \n\t"
|
||||
: "=&r" (tmpreg0), "=&r" (tmpreg1)
|
||||
:
|
||||
: "cbit", "memory");
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline void arch_local_irq_enable(void)
|
||||
{
|
||||
#if !defined(CONFIG_CHIP_M32102) && !defined(CONFIG_CHIP_M32104)
|
||||
asm volatile (
|
||||
"setpsw #0x40 -> nop"
|
||||
: : : "memory");
|
||||
#else
|
||||
unsigned long tmpreg;
|
||||
asm volatile (
|
||||
"mvfc %0, psw; \n\t"
|
||||
"or3 %0, %0, #0x0040; \n\t"
|
||||
"mvtc %0, psw; \n\t"
|
||||
: "=&r" (tmpreg)
|
||||
:
|
||||
: "cbit", "memory");
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline unsigned long arch_local_irq_save(void)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
#if !(defined(CONFIG_CHIP_M32102) || defined(CONFIG_CHIP_M32104))
|
||||
asm volatile (
|
||||
"mvfc %0, psw; \n\t"
|
||||
"clrpsw #0x40 -> nop; \n\t"
|
||||
: "=r" (flags)
|
||||
:
|
||||
: "memory");
|
||||
#else
|
||||
unsigned long tmpreg;
|
||||
asm volatile (
|
||||
"ld24 %1, #0 \n\t"
|
||||
"mvfc %0, psw \n\t"
|
||||
"mvtc %1, psw \n\t"
|
||||
"and3 %1, %0, #0xffbf \n\t"
|
||||
"mvtc %1, psw \n\t"
|
||||
: "=r" (flags), "=&r" (tmpreg)
|
||||
:
|
||||
: "cbit", "memory");
|
||||
#endif
|
||||
return flags;
|
||||
}
|
||||
|
||||
static inline void arch_local_irq_restore(unsigned long flags)
|
||||
{
|
||||
asm volatile("mvtc %0,psw"
|
||||
:
|
||||
: "r" (flags)
|
||||
: "cbit", "memory");
|
||||
}
|
||||
|
||||
static inline bool arch_irqs_disabled_flags(unsigned long flags)
|
||||
{
|
||||
return !(flags & 0x40);
|
||||
}
|
||||
|
||||
static inline bool arch_irqs_disabled(void)
|
||||
{
|
||||
return arch_irqs_disabled_flags(arch_local_save_flags());
|
||||
}
|
||||
|
||||
#endif /* _ASM_M32R_IRQFLAGS_H */
|
||||
@@ -11,6 +11,7 @@
|
||||
*/
|
||||
|
||||
#include <linux/compiler.h>
|
||||
#include <linux/irqflags.h>
|
||||
#include <asm/assembler.h>
|
||||
|
||||
#ifdef __KERNEL__
|
||||
@@ -54,71 +55,6 @@
|
||||
); \
|
||||
} while(0)
|
||||
|
||||
/* Interrupt Control */
|
||||
#if !defined(CONFIG_CHIP_M32102) && !defined(CONFIG_CHIP_M32104)
|
||||
#define local_irq_enable() \
|
||||
__asm__ __volatile__ ("setpsw #0x40 -> nop": : :"memory")
|
||||
#define local_irq_disable() \
|
||||
__asm__ __volatile__ ("clrpsw #0x40 -> nop": : :"memory")
|
||||
#else /* CONFIG_CHIP_M32102 || CONFIG_CHIP_M32104 */
|
||||
static inline void local_irq_enable(void)
|
||||
{
|
||||
unsigned long tmpreg;
|
||||
__asm__ __volatile__(
|
||||
"mvfc %0, psw; \n\t"
|
||||
"or3 %0, %0, #0x0040; \n\t"
|
||||
"mvtc %0, psw; \n\t"
|
||||
: "=&r" (tmpreg) : : "cbit", "memory");
|
||||
}
|
||||
|
||||
static inline void local_irq_disable(void)
|
||||
{
|
||||
unsigned long tmpreg0, tmpreg1;
|
||||
__asm__ __volatile__(
|
||||
"ld24 %0, #0 ; Use 32-bit insn. \n\t"
|
||||
"mvfc %1, psw ; No interrupt can be accepted here. \n\t"
|
||||
"mvtc %0, psw \n\t"
|
||||
"and3 %0, %1, #0xffbf \n\t"
|
||||
"mvtc %0, psw \n\t"
|
||||
: "=&r" (tmpreg0), "=&r" (tmpreg1) : : "cbit", "memory");
|
||||
}
|
||||
#endif /* CONFIG_CHIP_M32102 || CONFIG_CHIP_M32104 */
|
||||
|
||||
#define local_save_flags(x) \
|
||||
__asm__ __volatile__("mvfc %0,psw" : "=r"(x) : /* no input */)
|
||||
|
||||
#define local_irq_restore(x) \
|
||||
__asm__ __volatile__("mvtc %0,psw" : /* no outputs */ \
|
||||
: "r" (x) : "cbit", "memory")
|
||||
|
||||
#if !(defined(CONFIG_CHIP_M32102) || defined(CONFIG_CHIP_M32104))
|
||||
#define local_irq_save(x) \
|
||||
__asm__ __volatile__( \
|
||||
"mvfc %0, psw; \n\t" \
|
||||
"clrpsw #0x40 -> nop; \n\t" \
|
||||
: "=r" (x) : /* no input */ : "memory")
|
||||
#else /* CONFIG_CHIP_M32102 || CONFIG_CHIP_M32104 */
|
||||
#define local_irq_save(x) \
|
||||
({ \
|
||||
unsigned long tmpreg; \
|
||||
__asm__ __volatile__( \
|
||||
"ld24 %1, #0 \n\t" \
|
||||
"mvfc %0, psw \n\t" \
|
||||
"mvtc %1, psw \n\t" \
|
||||
"and3 %1, %0, #0xffbf \n\t" \
|
||||
"mvtc %1, psw \n\t" \
|
||||
: "=r" (x), "=&r" (tmpreg) \
|
||||
: : "cbit", "memory"); \
|
||||
})
|
||||
#endif /* CONFIG_CHIP_M32102 || CONFIG_CHIP_M32104 */
|
||||
|
||||
#define irqs_disabled() \
|
||||
({ \
|
||||
unsigned long flags; \
|
||||
local_save_flags(flags); \
|
||||
!(flags & 0x40); \
|
||||
})
|
||||
|
||||
#define nop() __asm__ __volatile__ ("nop" : : )
|
||||
|
||||
#define xchg(ptr, x) \
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user