| 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 | |
| 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 | |
| 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 | |
| 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 | |
| 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 */ |