0001
0002 #ifndef _GUARDED_STORAGE_H
0003 #define _GUARDED_STORAGE_H
0004
0005 #include <linux/types.h>
0006
0007 struct gs_cb {
0008 __u64 reserved;
0009 __u64 gsd;
0010 __u64 gssm;
0011 __u64 gs_epl_a;
0012 };
0013
0014 struct gs_epl {
0015 __u8 pad1;
0016 union {
0017 __u8 gs_eam;
0018 struct {
0019 __u8 : 6;
0020 __u8 e : 1;
0021 __u8 b : 1;
0022 };
0023 };
0024 union {
0025 __u8 gs_eci;
0026 struct {
0027 __u8 tx : 1;
0028 __u8 cx : 1;
0029 __u8 : 5;
0030 __u8 in : 1;
0031 };
0032 };
0033 union {
0034 __u8 gs_eai;
0035 struct {
0036 __u8 : 1;
0037 __u8 t : 1;
0038 __u8 as : 2;
0039 __u8 ar : 4;
0040 };
0041 };
0042 __u32 pad2;
0043 __u64 gs_eha;
0044 __u64 gs_eia;
0045 __u64 gs_eoa;
0046 __u64 gs_eir;
0047 __u64 gs_era;
0048 };
0049
0050 #define GS_ENABLE 0
0051 #define GS_DISABLE 1
0052 #define GS_SET_BC_CB 2
0053 #define GS_CLEAR_BC_CB 3
0054 #define GS_BROADCAST 4
0055
0056 static inline void load_gs_cb(struct gs_cb *gs_cb)
0057 {
0058 asm volatile(".insn rxy,0xe3000000004d,0,%0" : : "Q" (*gs_cb));
0059 }
0060
0061 static inline void store_gs_cb(struct gs_cb *gs_cb)
0062 {
0063 asm volatile(".insn rxy,0xe30000000049,0,%0" : : "Q" (*gs_cb));
0064 }
0065
0066 static inline void save_gs_cb(struct gs_cb *gs_cb)
0067 {
0068 if (gs_cb)
0069 store_gs_cb(gs_cb);
0070 }
0071
0072 static inline void restore_gs_cb(struct gs_cb *gs_cb)
0073 {
0074 if (gs_cb)
0075 load_gs_cb(gs_cb);
0076 }
0077
0078 #endif