16f52b16cSGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ 2916cda1aSMartin Schwidefsky #ifndef _GUARDED_STORAGE_H 3916cda1aSMartin Schwidefsky #define _GUARDED_STORAGE_H 4916cda1aSMartin Schwidefsky 5916cda1aSMartin Schwidefsky #include <linux/types.h> 6916cda1aSMartin Schwidefsky 7916cda1aSMartin Schwidefsky struct gs_cb { 8916cda1aSMartin Schwidefsky __u64 reserved; 9916cda1aSMartin Schwidefsky __u64 gsd; 10916cda1aSMartin Schwidefsky __u64 gssm; 11916cda1aSMartin Schwidefsky __u64 gs_epl_a; 12916cda1aSMartin Schwidefsky }; 13916cda1aSMartin Schwidefsky 14916cda1aSMartin Schwidefsky struct gs_epl { 15916cda1aSMartin Schwidefsky __u8 pad1; 16916cda1aSMartin Schwidefsky union { 17916cda1aSMartin Schwidefsky __u8 gs_eam; 18916cda1aSMartin Schwidefsky struct { 19916cda1aSMartin Schwidefsky __u8 : 6; 20916cda1aSMartin Schwidefsky __u8 e : 1; 21916cda1aSMartin Schwidefsky __u8 b : 1; 22916cda1aSMartin Schwidefsky }; 23916cda1aSMartin Schwidefsky }; 24916cda1aSMartin Schwidefsky union { 25916cda1aSMartin Schwidefsky __u8 gs_eci; 26916cda1aSMartin Schwidefsky struct { 27916cda1aSMartin Schwidefsky __u8 tx : 1; 28916cda1aSMartin Schwidefsky __u8 cx : 1; 29916cda1aSMartin Schwidefsky __u8 : 5; 30916cda1aSMartin Schwidefsky __u8 in : 1; 31916cda1aSMartin Schwidefsky }; 32916cda1aSMartin Schwidefsky }; 33916cda1aSMartin Schwidefsky union { 34916cda1aSMartin Schwidefsky __u8 gs_eai; 35916cda1aSMartin Schwidefsky struct { 36916cda1aSMartin Schwidefsky __u8 : 1; 37916cda1aSMartin Schwidefsky __u8 t : 1; 38916cda1aSMartin Schwidefsky __u8 as : 2; 39916cda1aSMartin Schwidefsky __u8 ar : 4; 40916cda1aSMartin Schwidefsky }; 41916cda1aSMartin Schwidefsky }; 42916cda1aSMartin Schwidefsky __u32 pad2; 43916cda1aSMartin Schwidefsky __u64 gs_eha; 44916cda1aSMartin Schwidefsky __u64 gs_eia; 45916cda1aSMartin Schwidefsky __u64 gs_eoa; 46916cda1aSMartin Schwidefsky __u64 gs_eir; 47916cda1aSMartin Schwidefsky __u64 gs_era; 48916cda1aSMartin Schwidefsky }; 49916cda1aSMartin Schwidefsky 50916cda1aSMartin Schwidefsky #define GS_ENABLE 0 51916cda1aSMartin Schwidefsky #define GS_DISABLE 1 52916cda1aSMartin Schwidefsky #define GS_SET_BC_CB 2 53916cda1aSMartin Schwidefsky #define GS_CLEAR_BC_CB 3 54916cda1aSMartin Schwidefsky #define GS_BROADCAST 4 55916cda1aSMartin Schwidefsky load_gs_cb(struct gs_cb * gs_cb)56916cda1aSMartin Schwidefskystatic inline void load_gs_cb(struct gs_cb *gs_cb) 57916cda1aSMartin Schwidefsky { 58916cda1aSMartin Schwidefsky asm volatile(".insn rxy,0xe3000000004d,0,%0" : : "Q" (*gs_cb)); 59916cda1aSMartin Schwidefsky } 60916cda1aSMartin Schwidefsky store_gs_cb(struct gs_cb * gs_cb)61916cda1aSMartin Schwidefskystatic inline void store_gs_cb(struct gs_cb *gs_cb) 62916cda1aSMartin Schwidefsky { 63916cda1aSMartin Schwidefsky asm volatile(".insn rxy,0xe30000000049,0,%0" : : "Q" (*gs_cb)); 64916cda1aSMartin Schwidefsky } 65916cda1aSMartin Schwidefsky save_gs_cb(struct gs_cb * gs_cb)66916cda1aSMartin Schwidefskystatic inline void save_gs_cb(struct gs_cb *gs_cb) 67916cda1aSMartin Schwidefsky { 68916cda1aSMartin Schwidefsky if (gs_cb) 69916cda1aSMartin Schwidefsky store_gs_cb(gs_cb); 70916cda1aSMartin Schwidefsky } 71916cda1aSMartin Schwidefsky restore_gs_cb(struct gs_cb * gs_cb)72916cda1aSMartin Schwidefskystatic inline void restore_gs_cb(struct gs_cb *gs_cb) 73916cda1aSMartin Schwidefsky { 74916cda1aSMartin Schwidefsky if (gs_cb) 75916cda1aSMartin Schwidefsky load_gs_cb(gs_cb); 76916cda1aSMartin Schwidefsky } 77916cda1aSMartin Schwidefsky 78916cda1aSMartin Schwidefsky #endif /* _GUARDED_STORAGE_H */ 79