2006-07-03 11:24:46 +04:00
/*
* include / asm - s390 / irqflags . h
*
* Copyright ( C ) IBM Corp . 2006
* Author ( s ) : Heiko Carstens < heiko . carstens @ de . ibm . com >
*/
# ifndef __ASM_IRQFLAGS_H
# define __ASM_IRQFLAGS_H
# ifdef __KERNEL__
2006-09-28 18:56:43 +04:00
# if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 2)
/* store then or system mask. */
# define __raw_local_irq_stosm(__or) \
( { \
unsigned long __mask ; \
asm volatile ( \
" stosm %0,%1 " \
: " =Q " ( __mask ) : " i " ( __or ) : " memory " ) ; \
__mask ; \
} )
/* store then and system mask. */
# define __raw_local_irq_stnsm(__and) \
( { \
unsigned long __mask ; \
asm volatile ( \
" stnsm %0,%1 " \
: " =Q " ( __mask ) : " i " ( __and ) : " memory " ) ; \
__mask ; \
} )
/* set system mask. */
# define __raw_local_irq_ssm(__mask) \
( { \
asm volatile ( " ssm %0 " : : " Q " ( __mask ) : " memory " ) ; \
} )
# else /* __GNUC__ */
/* store then or system mask. */
# define __raw_local_irq_stosm(__or) \
( { \
unsigned long __mask ; \
asm volatile ( \
" stosm 0(%1),%2 " \
: " =m " ( __mask ) \
: " a " ( & __mask ) , " i " ( __or ) : " memory " ) ; \
__mask ; \
} )
/* store then and system mask. */
# define __raw_local_irq_stnsm(__and) \
( { \
unsigned long __mask ; \
asm volatile ( \
" stnsm 0(%1),%2 " \
: " =m " ( __mask ) \
: " a " ( & __mask ) , " i " ( __and ) : " memory " ) ; \
__mask ; \
} )
/* set system mask. */
# define __raw_local_irq_ssm(__mask) \
( { \
asm volatile ( \
" ssm 0(%0) " \
: : " a " ( & __mask ) , " m " ( __mask ) : " memory " ) ; \
} )
# endif /* __GNUC__ */
2006-07-03 11:24:46 +04:00
/* interrupt control.. */
2006-09-28 18:56:43 +04:00
static inline unsigned long raw_local_irq_enable ( void )
{
return __raw_local_irq_stosm ( 0x03 ) ;
}
2006-07-12 18:39:47 +04:00
2006-09-28 18:56:43 +04:00
static inline unsigned long raw_local_irq_disable ( void )
{
return __raw_local_irq_stnsm ( 0xfc ) ;
}
# define raw_local_save_flags(x) \
do { \
typecheck ( unsigned long , x ) ; \
( x ) = __raw_local_irq_stosm ( 0x00 ) ; \
2006-07-12 18:39:47 +04:00
} while ( 0 )
2006-07-03 11:24:46 +04:00
2006-09-28 18:56:43 +04:00
static inline void raw_local_irq_restore ( unsigned long flags )
{
__raw_local_irq_ssm ( flags ) ;
}
2006-07-03 11:24:46 +04:00
static inline int raw_irqs_disabled_flags ( unsigned long flags )
{
2006-09-28 18:56:43 +04:00
return ! ( flags & ( 3UL < < ( BITS_PER_LONG - 8 ) ) ) ;
2006-07-03 11:24:46 +04:00
}
/* For spinlocks etc */
# define raw_local_irq_save(x) ((x) = raw_local_irq_disable())
# endif /* __KERNEL__ */
# endif /* __ASM_IRQFLAGS_H */