xref: /linux/arch/s390/include/uapi/asm/guarded_storage.h (revision 916cda1aa1b412d7cf2991c3af7479544942d121)
1*916cda1aSMartin Schwidefsky #ifndef _GUARDED_STORAGE_H
2*916cda1aSMartin Schwidefsky #define _GUARDED_STORAGE_H
3*916cda1aSMartin Schwidefsky 
4*916cda1aSMartin Schwidefsky #include <linux/types.h>
5*916cda1aSMartin Schwidefsky 
6*916cda1aSMartin Schwidefsky struct gs_cb {
7*916cda1aSMartin Schwidefsky 	__u64 reserved;
8*916cda1aSMartin Schwidefsky 	__u64 gsd;
9*916cda1aSMartin Schwidefsky 	__u64 gssm;
10*916cda1aSMartin Schwidefsky 	__u64 gs_epl_a;
11*916cda1aSMartin Schwidefsky };
12*916cda1aSMartin Schwidefsky 
13*916cda1aSMartin Schwidefsky struct gs_epl {
14*916cda1aSMartin Schwidefsky 	__u8 pad1;
15*916cda1aSMartin Schwidefsky 	union {
16*916cda1aSMartin Schwidefsky 		__u8 gs_eam;
17*916cda1aSMartin Schwidefsky 		struct {
18*916cda1aSMartin Schwidefsky 			__u8	: 6;
19*916cda1aSMartin Schwidefsky 			__u8 e	: 1;
20*916cda1aSMartin Schwidefsky 			__u8 b	: 1;
21*916cda1aSMartin Schwidefsky 		};
22*916cda1aSMartin Schwidefsky 	};
23*916cda1aSMartin Schwidefsky 	union {
24*916cda1aSMartin Schwidefsky 		__u8 gs_eci;
25*916cda1aSMartin Schwidefsky 		struct {
26*916cda1aSMartin Schwidefsky 			__u8 tx	: 1;
27*916cda1aSMartin Schwidefsky 			__u8 cx	: 1;
28*916cda1aSMartin Schwidefsky 			__u8	: 5;
29*916cda1aSMartin Schwidefsky 			__u8 in	: 1;
30*916cda1aSMartin Schwidefsky 		};
31*916cda1aSMartin Schwidefsky 	};
32*916cda1aSMartin Schwidefsky 	union {
33*916cda1aSMartin Schwidefsky 		__u8 gs_eai;
34*916cda1aSMartin Schwidefsky 		struct {
35*916cda1aSMartin Schwidefsky 			__u8	: 1;
36*916cda1aSMartin Schwidefsky 			__u8 t	: 1;
37*916cda1aSMartin Schwidefsky 			__u8 as	: 2;
38*916cda1aSMartin Schwidefsky 			__u8 ar	: 4;
39*916cda1aSMartin Schwidefsky 		};
40*916cda1aSMartin Schwidefsky 	};
41*916cda1aSMartin Schwidefsky 	__u32 pad2;
42*916cda1aSMartin Schwidefsky 	__u64 gs_eha;
43*916cda1aSMartin Schwidefsky 	__u64 gs_eia;
44*916cda1aSMartin Schwidefsky 	__u64 gs_eoa;
45*916cda1aSMartin Schwidefsky 	__u64 gs_eir;
46*916cda1aSMartin Schwidefsky 	__u64 gs_era;
47*916cda1aSMartin Schwidefsky };
48*916cda1aSMartin Schwidefsky 
49*916cda1aSMartin Schwidefsky #define GS_ENABLE	0
50*916cda1aSMartin Schwidefsky #define	GS_DISABLE	1
51*916cda1aSMartin Schwidefsky #define GS_SET_BC_CB	2
52*916cda1aSMartin Schwidefsky #define GS_CLEAR_BC_CB	3
53*916cda1aSMartin Schwidefsky #define GS_BROADCAST	4
54*916cda1aSMartin Schwidefsky 
55*916cda1aSMartin Schwidefsky static inline void load_gs_cb(struct gs_cb *gs_cb)
56*916cda1aSMartin Schwidefsky {
57*916cda1aSMartin Schwidefsky 	asm volatile(".insn rxy,0xe3000000004d,0,%0" : : "Q" (*gs_cb));
58*916cda1aSMartin Schwidefsky }
59*916cda1aSMartin Schwidefsky 
60*916cda1aSMartin Schwidefsky static inline void store_gs_cb(struct gs_cb *gs_cb)
61*916cda1aSMartin Schwidefsky {
62*916cda1aSMartin Schwidefsky 	asm volatile(".insn rxy,0xe30000000049,0,%0" : : "Q" (*gs_cb));
63*916cda1aSMartin Schwidefsky }
64*916cda1aSMartin Schwidefsky 
65*916cda1aSMartin Schwidefsky static inline void save_gs_cb(struct gs_cb *gs_cb)
66*916cda1aSMartin Schwidefsky {
67*916cda1aSMartin Schwidefsky 	if (gs_cb)
68*916cda1aSMartin Schwidefsky 		store_gs_cb(gs_cb);
69*916cda1aSMartin Schwidefsky }
70*916cda1aSMartin Schwidefsky 
71*916cda1aSMartin Schwidefsky static inline void restore_gs_cb(struct gs_cb *gs_cb)
72*916cda1aSMartin Schwidefsky {
73*916cda1aSMartin Schwidefsky 	if (gs_cb)
74*916cda1aSMartin Schwidefsky 		load_gs_cb(gs_cb);
75*916cda1aSMartin Schwidefsky }
76*916cda1aSMartin Schwidefsky 
77*916cda1aSMartin Schwidefsky #endif /* _GUARDED_STORAGE_H */
78