Commit | Line | Data |
---|---|---|
a0616cde DH |
1 | /* |
2 | * Copyright IBM Corp. 1999, 2009 | |
3 | * | |
4 | * Author(s): Martin Schwidefsky <schwidefsky@de.ibm.com> | |
5 | */ | |
6 | ||
7 | #ifndef __ASM_CTL_REG_H | |
8 | #define __ASM_CTL_REG_H | |
9 | ||
acf6a004 MH |
10 | #include <linux/bug.h> |
11 | ||
f4815ac6 | 12 | #ifdef CONFIG_64BIT |
12325f09 HC |
13 | # define __CTL_LOAD "lctlg" |
14 | # define __CTL_STORE "stctg" | |
15 | #else | |
16 | # define __CTL_LOAD "lctl" | |
17 | # define __CTL_STORE "stctl" | |
18 | #endif | |
19 | ||
20 | #define __ctl_load(array, low, high) { \ | |
21 | typedef struct { char _[sizeof(array)]; } addrtype; \ | |
22 | \ | |
23 | BUILD_BUG_ON(sizeof(addrtype) != (high - low + 1) * sizeof(long));\ | |
24 | asm volatile( \ | |
25 | __CTL_LOAD " %1,%2,%0\n" \ | |
26 | : : "Q" (*(addrtype *)(&array)), "i" (low), "i" (high));\ | |
27 | } | |
28 | ||
29 | #define __ctl_store(array, low, high) { \ | |
30 | typedef struct { char _[sizeof(array)]; } addrtype; \ | |
31 | \ | |
32 | BUILD_BUG_ON(sizeof(addrtype) != (high - low + 1) * sizeof(long));\ | |
33 | asm volatile( \ | |
34 | __CTL_STORE " %1,%2,%0\n" \ | |
35 | : "=Q" (*(addrtype *)(&array)) \ | |
36 | : "i" (low), "i" (high)); \ | |
37 | } | |
38 | ||
39 | static inline void __ctl_set_bit(unsigned int cr, unsigned int bit) | |
40 | { | |
41 | unsigned long reg; | |
42 | ||
43 | __ctl_store(reg, cr, cr); | |
44 | reg |= 1UL << bit; | |
45 | __ctl_load(reg, cr, cr); | |
46 | } | |
47 | ||
48 | static inline void __ctl_clear_bit(unsigned int cr, unsigned int bit) | |
49 | { | |
50 | unsigned long reg; | |
51 | ||
52 | __ctl_store(reg, cr, cr); | |
53 | reg &= ~(1UL << bit); | |
54 | __ctl_load(reg, cr, cr); | |
55 | } | |
56 | ||
57 | void smp_ctl_set_bit(int cr, int bit); | |
58 | void smp_ctl_clear_bit(int cr, int bit); | |
a0616cde DH |
59 | |
60 | #ifdef CONFIG_SMP | |
12325f09 HC |
61 | # define ctl_set_bit(cr, bit) smp_ctl_set_bit(cr, bit) |
62 | # define ctl_clear_bit(cr, bit) smp_ctl_clear_bit(cr, bit) | |
a0616cde | 63 | #else |
12325f09 HC |
64 | # define ctl_set_bit(cr, bit) __ctl_set_bit(cr, bit) |
65 | # define ctl_clear_bit(cr, bit) __ctl_clear_bit(cr, bit) | |
66 | #endif | |
a0616cde DH |
67 | |
68 | #endif /* __ASM_CTL_REG_H */ |