1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- /*
- * Copyright IBM Corp. 1999, 2009
- *
- * Author(s): Martin Schwidefsky <schwidefsky@de.ibm.com>
- */
- #ifndef __ASM_CTL_REG_H
- #define __ASM_CTL_REG_H
- #ifdef __s390x__
- #define __ctl_load(array, low, high) ({ \
- typedef struct { char _[sizeof(array)]; } addrtype; \
- asm volatile( \
- " lctlg %1,%2,%0\n" \
- : : "Q" (*(addrtype *)(&array)), \
- "i" (low), "i" (high)); \
- })
- #define __ctl_store(array, low, high) ({ \
- typedef struct { char _[sizeof(array)]; } addrtype; \
- asm volatile( \
- " stctg %1,%2,%0\n" \
- : "=Q" (*(addrtype *)(&array)) \
- : "i" (low), "i" (high)); \
- })
- #else /* __s390x__ */
- #define __ctl_load(array, low, high) ({ \
- typedef struct { char _[sizeof(array)]; } addrtype; \
- asm volatile( \
- " lctl %1,%2,%0\n" \
- : : "Q" (*(addrtype *)(&array)), \
- "i" (low), "i" (high)); \
- })
- #define __ctl_store(array, low, high) ({ \
- typedef struct { char _[sizeof(array)]; } addrtype; \
- asm volatile( \
- " stctl %1,%2,%0\n" \
- : "=Q" (*(addrtype *)(&array)) \
- : "i" (low), "i" (high)); \
- })
- #endif /* __s390x__ */
- #define __ctl_set_bit(cr, bit) ({ \
- unsigned long __dummy; \
- __ctl_store(__dummy, cr, cr); \
- __dummy |= 1UL << (bit); \
- __ctl_load(__dummy, cr, cr); \
- })
- #define __ctl_clear_bit(cr, bit) ({ \
- unsigned long __dummy; \
- __ctl_store(__dummy, cr, cr); \
- __dummy &= ~(1UL << (bit)); \
- __ctl_load(__dummy, cr, cr); \
- })
- #ifdef CONFIG_SMP
- extern void smp_ctl_set_bit(int cr, int bit);
- extern void smp_ctl_clear_bit(int cr, int bit);
- #define ctl_set_bit(cr, bit) smp_ctl_set_bit(cr, bit)
- #define ctl_clear_bit(cr, bit) smp_ctl_clear_bit(cr, bit)
- #else
- #define ctl_set_bit(cr, bit) __ctl_set_bit(cr, bit)
- #define ctl_clear_bit(cr, bit) __ctl_clear_bit(cr, bit)
- #endif /* CONFIG_SMP */
- #endif /* __ASM_CTL_REG_H */
|