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
7struct gs_cb {
8	__u64 reserved;
9	__u64 gsd;
10	__u64 gssm;
11	__u64 gs_epl_a;
12};
13
14struct 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
56static inline void load_gs_cb(struct gs_cb *gs_cb)
57{
58	asm volatile(".insn rxy,0xe3000000004d,0,%0" : : "Q" (*gs_cb));
59}
60
61static inline void store_gs_cb(struct gs_cb *gs_cb)
62{
63	asm volatile(".insn rxy,0xe30000000049,0,%0" : : "Q" (*gs_cb));
64}
65
66static inline void save_gs_cb(struct gs_cb *gs_cb)
67{
68	if (gs_cb)
69		store_gs_cb(gs_cb);
70}
71
72static 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