| /* |
| * 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 */ |