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