1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3 * Copyright IBM Corp. 1999, 2009
4 *
5 * Author(s): Martin Schwidefsky <schwidefsky@de.ibm.com>
6 */
7
8 #ifndef __ASM_S390_CTLREG_H
9 #define __ASM_S390_CTLREG_H
10
11 #include <linux/bits.h>
12
13 #define CR0_TRANSACTIONAL_EXECUTION_BIT (63 - 8)
14 #define CR0_CLOCK_COMPARATOR_SIGN_BIT (63 - 10)
15 #define CR0_CRYPTOGRAPHY_COUNTER_BIT (63 - 13)
16 #define CR0_PAI_EXTENSION_BIT (63 - 14)
17 #define CR0_CPUMF_EXTRACTION_AUTH_BIT (63 - 15)
18 #define CR0_WARNING_TRACK_BIT (63 - 30)
19 #define CR0_LOW_ADDRESS_PROTECTION_BIT (63 - 35)
20 #define CR0_FETCH_PROTECTION_OVERRIDE_BIT (63 - 38)
21 #define CR0_STORAGE_PROTECTION_OVERRIDE_BIT (63 - 39)
22 #define CR0_EDAT_BIT (63 - 40)
23 #define CR0_INSTRUCTION_EXEC_PROTECTION_BIT (63 - 43)
24 #define CR0_VECTOR_BIT (63 - 46)
25 #define CR0_MALFUNCTION_ALERT_SUBMASK_BIT (63 - 48)
26 #define CR0_EMERGENCY_SIGNAL_SUBMASK_BIT (63 - 49)
27 #define CR0_EXTERNAL_CALL_SUBMASK_BIT (63 - 50)
28 #define CR0_CLOCK_COMPARATOR_SUBMASK_BIT (63 - 52)
29 #define CR0_CPU_TIMER_SUBMASK_BIT (63 - 53)
30 #define CR0_SERVICE_SIGNAL_SUBMASK_BIT (63 - 54)
31 #define CR0_UNUSED_56_BIT (63 - 56)
32 #define CR0_INTERRUPT_KEY_SUBMASK_BIT (63 - 57)
33 #define CR0_MEASUREMENT_ALERT_SUBMASK_BIT (63 - 58)
34 #define CR0_ETR_SUBMASK_BIT (63 - 59)
35 #define CR0_IUCV_BIT (63 - 62)
36
37 #define CR0_TRANSACTIONAL_EXECUTION BIT(CR0_TRANSACTIONAL_EXECUTION_BIT)
38 #define CR0_CLOCK_COMPARATOR_SIGN BIT(CR0_CLOCK_COMPARATOR_SIGN_BIT)
39 #define CR0_CRYPTOGRAPHY_COUNTER BIT(CR0_CRYPTOGRAPHY_COUNTER_BIT)
40 #define CR0_PAI_EXTENSION BIT(CR0_PAI_EXTENSION_BIT)
41 #define CR0_CPUMF_EXTRACTION_AUTH BIT(CR0_CPUMF_EXTRACTION_AUTH_BIT)
42 #define CR0_WARNING_TRACK BIT(CR0_WARNING_TRACK_BIT)
43 #define CR0_LOW_ADDRESS_PROTECTION BIT(CR0_LOW_ADDRESS_PROTECTION_BIT)
44 #define CR0_FETCH_PROTECTION_OVERRIDE BIT(CR0_FETCH_PROTECTION_OVERRIDE_BIT)
45 #define CR0_STORAGE_PROTECTION_OVERRIDE BIT(CR0_STORAGE_PROTECTION_OVERRIDE_BIT)
46 #define CR0_EDAT BIT(CR0_EDAT_BIT)
47 #define CR0_INSTRUCTION_EXEC_PROTECTION BIT(CR0_INSTRUCTION_EXEC_PROTECTION_BIT)
48 #define CR0_VECTOR BIT(CR0_VECTOR_BIT)
49 #define CR0_MALFUNCTION_ALERT_SUBMASK BIT(CR0_MALFUNCTION_ALERT_SUBMASK_BIT)
50 #define CR0_EMERGENCY_SIGNAL_SUBMASK BIT(CR0_EMERGENCY_SIGNAL_SUBMASK_BIT)
51 #define CR0_EXTERNAL_CALL_SUBMASK BIT(CR0_EXTERNAL_CALL_SUBMASK_BIT)
52 #define CR0_CLOCK_COMPARATOR_SUBMASK BIT(CR0_CLOCK_COMPARATOR_SUBMASK_BIT)
53 #define CR0_CPU_TIMER_SUBMASK BIT(CR0_CPU_TIMER_SUBMASK_BIT)
54 #define CR0_SERVICE_SIGNAL_SUBMASK BIT(CR0_SERVICE_SIGNAL_SUBMASK_BIT)
55 #define CR0_UNUSED_56 BIT(CR0_UNUSED_56_BIT)
56 #define CR0_INTERRUPT_KEY_SUBMASK BIT(CR0_INTERRUPT_KEY_SUBMASK_BIT)
57 #define CR0_MEASUREMENT_ALERT_SUBMASK BIT(CR0_MEASUREMENT_ALERT_SUBMASK_BIT)
58 #define CR0_ETR_SUBMASK BIT(CR0_ETR_SUBMASK_BIT)
59 #define CR0_IUCV BIT(CR0_IUCV_BIT)
60
61 #define CR2_MIO_ADDRESSING_BIT (63 - 58)
62 #define CR2_GUARDED_STORAGE_BIT (63 - 59)
63
64 #define CR2_MIO_ADDRESSING BIT(CR2_MIO_ADDRESSING_BIT)
65 #define CR2_GUARDED_STORAGE BIT(CR2_GUARDED_STORAGE_BIT)
66
67 #define CR14_UNUSED_32_BIT (63 - 32)
68 #define CR14_UNUSED_33_BIT (63 - 33)
69 #define CR14_CHANNEL_REPORT_SUBMASK_BIT (63 - 35)
70 #define CR14_RECOVERY_SUBMASK_BIT (63 - 36)
71 #define CR14_DEGRADATION_SUBMASK_BIT (63 - 37)
72 #define CR14_EXTERNAL_DAMAGE_SUBMASK_BIT (63 - 38)
73 #define CR14_WARNING_SUBMASK_BIT (63 - 39)
74
75 #define CR14_UNUSED_32 BIT(CR14_UNUSED_32_BIT)
76 #define CR14_UNUSED_33 BIT(CR14_UNUSED_33_BIT)
77 #define CR14_CHANNEL_REPORT_SUBMASK BIT(CR14_CHANNEL_REPORT_SUBMASK_BIT)
78 #define CR14_RECOVERY_SUBMASK BIT(CR14_RECOVERY_SUBMASK_BIT)
79 #define CR14_DEGRADATION_SUBMASK BIT(CR14_DEGRADATION_SUBMASK_BIT)
80 #define CR14_EXTERNAL_DAMAGE_SUBMASK BIT(CR14_EXTERNAL_DAMAGE_SUBMASK_BIT)
81 #define CR14_WARNING_SUBMASK BIT(CR14_WARNING_SUBMASK_BIT)
82
83 #ifndef __ASSEMBLY__
84
85 #include <linux/bug.h>
86
87 struct ctlreg {
88 unsigned long val;
89 };
90
91 #define __local_ctl_load(low, high, array) do { \
92 struct addrtype { \
93 char _[sizeof(array)]; \
94 }; \
95 int _high = high; \
96 int _low = low; \
97 int _esize; \
98 \
99 _esize = (_high - _low + 1) * sizeof(struct ctlreg); \
100 BUILD_BUG_ON(sizeof(struct addrtype) != _esize); \
101 typecheck(struct ctlreg, array[0]); \
102 asm volatile( \
103 " lctlg %[_low],%[_high],%[_arr]\n" \
104 : \
105 : [_arr] "Q" (*(struct addrtype *)(&array)), \
106 [_low] "i" (low), [_high] "i" (high) \
107 : "memory"); \
108 } while (0)
109
110 #define __local_ctl_store(low, high, array) do { \
111 struct addrtype { \
112 char _[sizeof(array)]; \
113 }; \
114 int _high = high; \
115 int _low = low; \
116 int _esize; \
117 \
118 _esize = (_high - _low + 1) * sizeof(struct ctlreg); \
119 BUILD_BUG_ON(sizeof(struct addrtype) != _esize); \
120 typecheck(struct ctlreg, array[0]); \
121 asm volatile( \
122 " stctg %[_low],%[_high],%[_arr]\n" \
123 : [_arr] "=Q" (*(struct addrtype *)(&array)) \
124 : [_low] "i" (low), [_high] "i" (high)); \
125 } while (0)
126
local_ctl_load(unsigned int cr,struct ctlreg * reg)127 static __always_inline void local_ctl_load(unsigned int cr, struct ctlreg *reg)
128 {
129 asm volatile(
130 " lctlg %[cr],%[cr],%[reg]\n"
131 :
132 : [reg] "Q" (*reg), [cr] "i" (cr)
133 : "memory");
134 }
135
local_ctl_store(unsigned int cr,struct ctlreg * reg)136 static __always_inline void local_ctl_store(unsigned int cr, struct ctlreg *reg)
137 {
138 asm volatile(
139 " stctg %[cr],%[cr],%[reg]\n"
140 : [reg] "=Q" (*reg)
141 : [cr] "i" (cr));
142 }
143
local_ctl_set_bit(unsigned int cr,unsigned int bit)144 static __always_inline struct ctlreg local_ctl_set_bit(unsigned int cr, unsigned int bit)
145 {
146 struct ctlreg new, old;
147
148 local_ctl_store(cr, &old);
149 new = old;
150 new.val |= 1UL << bit;
151 local_ctl_load(cr, &new);
152 return old;
153 }
154
local_ctl_clear_bit(unsigned int cr,unsigned int bit)155 static __always_inline struct ctlreg local_ctl_clear_bit(unsigned int cr, unsigned int bit)
156 {
157 struct ctlreg new, old;
158
159 local_ctl_store(cr, &old);
160 new = old;
161 new.val &= ~(1UL << bit);
162 local_ctl_load(cr, &new);
163 return old;
164 }
165
166 struct lowcore;
167
168 void system_ctlreg_lock(void);
169 void system_ctlreg_unlock(void);
170 void system_ctlreg_init_save_area(struct lowcore *lc);
171 void system_ctlreg_modify(unsigned int cr, unsigned long data, int request);
172
173 enum {
174 CTLREG_SET_BIT,
175 CTLREG_CLEAR_BIT,
176 CTLREG_LOAD,
177 };
178
system_ctl_set_bit(unsigned int cr,unsigned int bit)179 static inline void system_ctl_set_bit(unsigned int cr, unsigned int bit)
180 {
181 system_ctlreg_modify(cr, bit, CTLREG_SET_BIT);
182 }
183
system_ctl_clear_bit(unsigned int cr,unsigned int bit)184 static inline void system_ctl_clear_bit(unsigned int cr, unsigned int bit)
185 {
186 system_ctlreg_modify(cr, bit, CTLREG_CLEAR_BIT);
187 }
188
system_ctl_load(unsigned int cr,struct ctlreg * reg)189 static inline void system_ctl_load(unsigned int cr, struct ctlreg *reg)
190 {
191 system_ctlreg_modify(cr, reg->val, CTLREG_LOAD);
192 }
193
194 union ctlreg0 {
195 unsigned long val;
196 struct ctlreg reg;
197 struct {
198 unsigned long : 8;
199 unsigned long tcx : 1; /* Transactional-Execution control */
200 unsigned long pifo : 1; /* Transactional-Execution Program-
201 Interruption-Filtering Override */
202 unsigned long : 3;
203 unsigned long ccc : 1; /* Cryptography counter control */
204 unsigned long pec : 1; /* PAI extension control */
205 unsigned long : 15;
206 unsigned long wti : 1; /* Warning-track */
207 unsigned long : 4;
208 unsigned long lap : 1; /* Low-address-protection control */
209 unsigned long : 4;
210 unsigned long edat : 1; /* Enhanced-DAT-enablement control */
211 unsigned long : 2;
212 unsigned long iep : 1; /* Instruction-Execution-Protection */
213 unsigned long : 1;
214 unsigned long afp : 1; /* AFP-register control */
215 unsigned long vx : 1; /* Vector enablement control */
216 unsigned long : 7;
217 unsigned long sssm : 1; /* Service signal subclass mask */
218 unsigned long : 9;
219 };
220 };
221
222 union ctlreg2 {
223 unsigned long val;
224 struct ctlreg reg;
225 struct {
226 unsigned long : 33;
227 unsigned long ducto : 25;
228 unsigned long : 1;
229 unsigned long gse : 1;
230 unsigned long : 1;
231 unsigned long tds : 1;
232 unsigned long tdc : 2;
233 };
234 };
235
236 union ctlreg5 {
237 unsigned long val;
238 struct ctlreg reg;
239 struct {
240 unsigned long : 33;
241 unsigned long pasteo: 25;
242 unsigned long : 6;
243 };
244 };
245
246 union ctlreg15 {
247 unsigned long val;
248 struct ctlreg reg;
249 struct {
250 unsigned long lsea : 61;
251 unsigned long : 3;
252 };
253 };
254
255 #endif /* __ASSEMBLY__ */
256 #endif /* __ASM_S390_CTLREG_H */
257