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