Merge remote-tracking branches 'asoc/topic/ac97', 'asoc/topic/ac97-mfd', 'asoc/topic...
[sfrench/cifs-2.6.git] / arch / s390 / include / uapi / asm / guarded_storage.h
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
7 struct gs_cb {
8         __u64 reserved;
9         __u64 gsd;
10         __u64 gssm;
11         __u64 gs_epl_a;
12 };
13
14 struct 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
56 static inline void load_gs_cb(struct gs_cb *gs_cb)
57 {
58         asm volatile(".insn rxy,0xe3000000004d,0,%0" : : "Q" (*gs_cb));
59 }
60
61 static inline void store_gs_cb(struct gs_cb *gs_cb)
62 {
63         asm volatile(".insn rxy,0xe30000000049,0,%0" : : "Q" (*gs_cb));
64 }
65
66 static inline void save_gs_cb(struct gs_cb *gs_cb)
67 {
68         if (gs_cb)
69                 store_gs_cb(gs_cb);
70 }
71
72 static 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 */