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