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 7struct gs_cb { 8 __u64 reserved; 9 __u64 gsd; 10 __u64 gssm; 11 __u64 gs_epl_a; 12}; 13 14struct 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 56static inline void load_gs_cb(struct gs_cb *gs_cb) 57{ 58 asm volatile(".insn rxy,0xe3000000004d,0,%0" : : "Q" (*gs_cb)); 59} 60 61static inline void store_gs_cb(struct gs_cb *gs_cb) 62{ 63 asm volatile(".insn rxy,0xe30000000049,0,%0" : : "Q" (*gs_cb)); 64} 65 66static inline void save_gs_cb(struct gs_cb *gs_cb) 67{ 68 if (gs_cb) 69 store_gs_cb(gs_cb); 70} 71 72static 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