Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/arch/s390/include/asm/ctlreg.h
26493 views
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 __ASSEMBLER__
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 /* __ASSEMBLER__ */
256
#endif /* __ASM_S390_CTLREG_H */
257
258