]>
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 | ||
12325f09 HC |
12 | #define __ctl_load(array, low, high) { \ |
13 | typedef struct { char _[sizeof(array)]; } addrtype; \ | |
14 | \ | |
15 | BUILD_BUG_ON(sizeof(addrtype) != (high - low + 1) * sizeof(long));\ | |
16 | asm volatile( \ | |
5a79859a | 17 | " lctlg %1,%2,%0\n" \ |
12325f09 HC |
18 | : : "Q" (*(addrtype *)(&array)), "i" (low), "i" (high));\ |
19 | } | |
20 | ||
21 | #define __ctl_store(array, low, high) { \ | |
22 | typedef struct { char _[sizeof(array)]; } addrtype; \ | |
23 | \ | |
24 | BUILD_BUG_ON(sizeof(addrtype) != (high - low + 1) * sizeof(long));\ | |
25 | asm volatile( \ | |
5a79859a | 26 | " stctg %1,%2,%0\n" \ |
12325f09 HC |
27 | : "=Q" (*(addrtype *)(&array)) \ |
28 | : "i" (low), "i" (high)); \ | |
29 | } | |
30 | ||
31 | static inline void __ctl_set_bit(unsigned int cr, unsigned int bit) | |
32 | { | |
33 | unsigned long reg; | |
34 | ||
35 | __ctl_store(reg, cr, cr); | |
36 | reg |= 1UL << bit; | |
37 | __ctl_load(reg, cr, cr); | |
38 | } | |
39 | ||
40 | static inline void __ctl_clear_bit(unsigned int cr, unsigned int bit) | |
41 | { | |
42 | unsigned long reg; | |
43 | ||
44 | __ctl_store(reg, cr, cr); | |
45 | reg &= ~(1UL << bit); | |
46 | __ctl_load(reg, cr, cr); | |
47 | } | |
48 | ||
49 | void smp_ctl_set_bit(int cr, int bit); | |
50 | void smp_ctl_clear_bit(int cr, int bit); | |
a0616cde | 51 | |
5f4e87a2 HC |
52 | union ctlreg0 { |
53 | unsigned long val; | |
54 | struct { | |
5f4e87a2 | 55 | unsigned long : 32; |
5f4e87a2 HC |
56 | unsigned long : 3; |
57 | unsigned long lap : 1; /* Low-address-protection control */ | |
58 | unsigned long : 4; | |
59 | unsigned long edat : 1; /* Enhanced-DAT-enablement control */ | |
cad49cfc HC |
60 | unsigned long : 4; |
61 | unsigned long afp : 1; /* AFP-register control */ | |
62 | unsigned long vx : 1; /* Vector enablement control */ | |
63 | unsigned long : 17; | |
5f4e87a2 HC |
64 | }; |
65 | }; | |
66 | ||
a0616cde | 67 | #ifdef CONFIG_SMP |
12325f09 HC |
68 | # define ctl_set_bit(cr, bit) smp_ctl_set_bit(cr, bit) |
69 | # define ctl_clear_bit(cr, bit) smp_ctl_clear_bit(cr, bit) | |
a0616cde | 70 | #else |
12325f09 HC |
71 | # define ctl_set_bit(cr, bit) __ctl_set_bit(cr, bit) |
72 | # define ctl_clear_bit(cr, bit) __ctl_clear_bit(cr, bit) | |
73 | #endif | |
a0616cde DH |
74 | |
75 | #endif /* __ASM_CTL_REG_H */ |