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