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