This source file includes following definitions.
- uv_call
- is_prot_virt_guest
- share
- uv_set_shared
- uv_remove_shared
- uv_set_shared
- uv_remove_shared
- uv_query_info
1
2
3
4
5
6
7
8
9
10
11 #ifndef _ASM_S390_UV_H
12 #define _ASM_S390_UV_H
13
14 #include <linux/types.h>
15 #include <linux/errno.h>
16 #include <linux/bug.h>
17 #include <asm/page.h>
18
19 #define UVC_RC_EXECUTED 0x0001
20 #define UVC_RC_INV_CMD 0x0002
21 #define UVC_RC_INV_STATE 0x0003
22 #define UVC_RC_INV_LEN 0x0005
23 #define UVC_RC_NO_RESUME 0x0007
24
25 #define UVC_CMD_QUI 0x0001
26 #define UVC_CMD_SET_SHARED_ACCESS 0x1000
27 #define UVC_CMD_REMOVE_SHARED_ACCESS 0x1001
28
29
30 enum uv_cmds_inst {
31 BIT_UVC_CMD_QUI = 0,
32 BIT_UVC_CMD_SET_SHARED_ACCESS = 8,
33 BIT_UVC_CMD_REMOVE_SHARED_ACCESS = 9,
34 };
35
36 struct uv_cb_header {
37 u16 len;
38 u16 cmd;
39 u16 rc;
40 u16 rrc;
41 } __packed __aligned(8);
42
43 struct uv_cb_qui {
44 struct uv_cb_header header;
45 u64 reserved08;
46 u64 inst_calls_list[4];
47 u64 reserved30[15];
48 } __packed __aligned(8);
49
50 struct uv_cb_share {
51 struct uv_cb_header header;
52 u64 reserved08[3];
53 u64 paddr;
54 u64 reserved28;
55 } __packed __aligned(8);
56
57 static inline int uv_call(unsigned long r1, unsigned long r2)
58 {
59 int cc;
60
61 asm volatile(
62 "0: .insn rrf,0xB9A40000,%[r1],%[r2],0,0\n"
63 " brc 3,0b\n"
64 " ipm %[cc]\n"
65 " srl %[cc],28\n"
66 : [cc] "=d" (cc)
67 : [r1] "a" (r1), [r2] "a" (r2)
68 : "memory", "cc");
69 return cc;
70 }
71
72 #ifdef CONFIG_PROTECTED_VIRTUALIZATION_GUEST
73 extern int prot_virt_guest;
74
75 static inline int is_prot_virt_guest(void)
76 {
77 return prot_virt_guest;
78 }
79
80 static inline int share(unsigned long addr, u16 cmd)
81 {
82 struct uv_cb_share uvcb = {
83 .header.cmd = cmd,
84 .header.len = sizeof(uvcb),
85 .paddr = addr
86 };
87
88 if (!is_prot_virt_guest())
89 return -ENOTSUPP;
90
91
92
93
94
95
96 BUG_ON(addr & ~PAGE_MASK);
97
98 if (!uv_call(0, (u64)&uvcb))
99 return 0;
100 return -EINVAL;
101 }
102
103
104
105
106
107
108
109 static inline int uv_set_shared(unsigned long addr)
110 {
111 return share(addr, UVC_CMD_SET_SHARED_ACCESS);
112 }
113
114
115
116
117
118
119 static inline int uv_remove_shared(unsigned long addr)
120 {
121 return share(addr, UVC_CMD_REMOVE_SHARED_ACCESS);
122 }
123
124 void uv_query_info(void);
125 #else
126 #define is_prot_virt_guest() 0
127 static inline int uv_set_shared(unsigned long addr) { return 0; }
128 static inline int uv_remove_shared(unsigned long addr) { return 0; }
129 static inline void uv_query_info(void) {}
130 #endif
131
132 #endif