Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
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 /* _GUARDED_STORAGE_H */