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