]> Git Repo - linux.git/blob - arch/s390/include/asm/ctlreg.h
Linux 6.14-rc3
[linux.git] / arch / s390 / include / asm / ctlreg.h
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * Copyright IBM Corp. 1999, 2009
4  *
5  * Author(s): Martin Schwidefsky <[email protected]>
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
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
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
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
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
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
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
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 */
This page took 0.04539 seconds and 4 git commands to generate.