21
21
#include "psmouse.h"
22
22
#include "vmmouse.h"
23
23
24
- #define VMMOUSE_PROTO_MAGIC 0x564D5868U
25
-
26
24
/*
27
25
* Main commands supported by the vmmouse hypervisor port.
28
26
*/
29
- #define VMMOUSE_PROTO_CMD_GETVERSION 10
30
- #define VMMOUSE_PROTO_CMD_ABSPOINTER_DATA 39
31
- #define VMMOUSE_PROTO_CMD_ABSPOINTER_STATUS 40
32
- #define VMMOUSE_PROTO_CMD_ABSPOINTER_COMMAND 41
33
- #define VMMOUSE_PROTO_CMD_ABSPOINTER_RESTRICT 86
27
+ #define VMWARE_CMD_ABSPOINTER_DATA 39
28
+ #define VMWARE_CMD_ABSPOINTER_STATUS 40
29
+ #define VMWARE_CMD_ABSPOINTER_COMMAND 41
30
+ #define VMWARE_CMD_ABSPOINTER_RESTRICT 86
34
31
35
32
/*
36
- * Subcommands for VMMOUSE_PROTO_CMD_ABSPOINTER_COMMAND
33
+ * Subcommands for VMWARE_CMD_ABSPOINTER_COMMAND
37
34
*/
38
35
#define VMMOUSE_CMD_ENABLE 0x45414552U
39
36
#define VMMOUSE_CMD_DISABLE 0x000000f5U
@@ -76,28 +73,6 @@ struct vmmouse_data {
76
73
char dev_name [128 ];
77
74
};
78
75
79
- /*
80
- * Hypervisor-specific bi-directional communication channel
81
- * implementing the vmmouse protocol. Should never execute on
82
- * bare metal hardware.
83
- */
84
- #define VMMOUSE_CMD (cmd , in1 , out1 , out2 , out3 , out4 ) \
85
- ({ \
86
- unsigned long __dummy1, __dummy2; \
87
- __asm__ __volatile__ (VMWARE_HYPERCALL : \
88
- "=a"(out1), \
89
- "=b"(out2), \
90
- "=c"(out3), \
91
- "=d"(out4), \
92
- "=S"(__dummy1), \
93
- "=D"(__dummy2) : \
94
- "a"(VMMOUSE_PROTO_MAGIC), \
95
- "b"(in1), \
96
- "c"(VMMOUSE_PROTO_CMD_##cmd), \
97
- "d"(0) : \
98
- "memory"); \
99
- })
100
-
101
76
/**
102
77
* vmmouse_report_button - report button state on the correct input device
103
78
*
@@ -145,14 +120,12 @@ static psmouse_ret_t vmmouse_report_events(struct psmouse *psmouse)
145
120
struct input_dev * abs_dev = priv -> abs_dev ;
146
121
struct input_dev * pref_dev ;
147
122
u32 status , x , y , z ;
148
- u32 dummy1 , dummy2 , dummy3 ;
149
123
unsigned int queue_length ;
150
124
unsigned int count = 255 ;
151
125
152
126
while (count -- ) {
153
127
/* See if we have motion data. */
154
- VMMOUSE_CMD (ABSPOINTER_STATUS , 0 ,
155
- status , dummy1 , dummy2 , dummy3 );
128
+ status = vmware_hypercall1 (VMWARE_CMD_ABSPOINTER_STATUS , 0 );
156
129
if ((status & VMMOUSE_ERROR ) == VMMOUSE_ERROR ) {
157
130
psmouse_err (psmouse , "failed to fetch status data\n" );
158
131
/*
@@ -172,7 +145,8 @@ static psmouse_ret_t vmmouse_report_events(struct psmouse *psmouse)
172
145
}
173
146
174
147
/* Now get it */
175
- VMMOUSE_CMD (ABSPOINTER_DATA , 4 , status , x , y , z );
148
+ status = vmware_hypercall4 (VMWARE_CMD_ABSPOINTER_DATA , 4 ,
149
+ & x , & y , & z );
176
150
177
151
/*
178
152
* And report what we've got. Prefer to report button
@@ -247,14 +221,10 @@ static psmouse_ret_t vmmouse_process_byte(struct psmouse *psmouse)
247
221
static void vmmouse_disable (struct psmouse * psmouse )
248
222
{
249
223
u32 status ;
250
- u32 dummy1 , dummy2 , dummy3 , dummy4 ;
251
-
252
- VMMOUSE_CMD (ABSPOINTER_COMMAND , VMMOUSE_CMD_DISABLE ,
253
- dummy1 , dummy2 , dummy3 , dummy4 );
254
224
255
- VMMOUSE_CMD (ABSPOINTER_STATUS , 0 ,
256
- status , dummy1 , dummy2 , dummy3 );
225
+ vmware_hypercall1 (VMWARE_CMD_ABSPOINTER_COMMAND , VMMOUSE_CMD_DISABLE );
257
226
227
+ status = vmware_hypercall1 (VMWARE_CMD_ABSPOINTER_STATUS , 0 );
258
228
if ((status & VMMOUSE_ERROR ) != VMMOUSE_ERROR )
259
229
psmouse_warn (psmouse , "failed to disable vmmouse device\n" );
260
230
}
@@ -271,26 +241,24 @@ static void vmmouse_disable(struct psmouse *psmouse)
271
241
static int vmmouse_enable (struct psmouse * psmouse )
272
242
{
273
243
u32 status , version ;
274
- u32 dummy1 , dummy2 , dummy3 , dummy4 ;
275
244
276
245
/*
277
246
* Try enabling the device. If successful, we should be able to
278
247
* read valid version ID back from it.
279
248
*/
280
- VMMOUSE_CMD (ABSPOINTER_COMMAND , VMMOUSE_CMD_ENABLE ,
281
- dummy1 , dummy2 , dummy3 , dummy4 );
249
+ vmware_hypercall1 (VMWARE_CMD_ABSPOINTER_COMMAND , VMMOUSE_CMD_ENABLE );
282
250
283
251
/*
284
252
* See if version ID can be retrieved.
285
253
*/
286
- VMMOUSE_CMD ( ABSPOINTER_STATUS , 0 , status , dummy1 , dummy2 , dummy3 );
254
+ status = vmware_hypercall1 ( VMWARE_CMD_ABSPOINTER_STATUS , 0 );
287
255
if ((status & 0x0000ffff ) == 0 ) {
288
256
psmouse_dbg (psmouse , "empty flags - assuming no device\n" );
289
257
return - ENXIO ;
290
258
}
291
259
292
- VMMOUSE_CMD ( ABSPOINTER_DATA , 1 /* single item */ ,
293
- version , dummy1 , dummy2 , dummy3 );
260
+ version = vmware_hypercall1 ( VMWARE_CMD_ABSPOINTER_DATA ,
261
+ 1 /* single item */ );
294
262
if (version != VMMOUSE_VERSION_ID ) {
295
263
psmouse_dbg (psmouse , "Unexpected version value: %u vs %u\n" ,
296
264
(unsigned ) version , VMMOUSE_VERSION_ID );
@@ -301,11 +269,11 @@ static int vmmouse_enable(struct psmouse *psmouse)
301
269
/*
302
270
* Restrict ioport access, if possible.
303
271
*/
304
- VMMOUSE_CMD ( ABSPOINTER_RESTRICT , VMMOUSE_RESTRICT_CPL0 ,
305
- dummy1 , dummy2 , dummy3 , dummy4 );
272
+ vmware_hypercall1 ( VMWARE_CMD_ABSPOINTER_RESTRICT ,
273
+ VMMOUSE_RESTRICT_CPL0 );
306
274
307
- VMMOUSE_CMD ( ABSPOINTER_COMMAND , VMMOUSE_CMD_REQUEST_ABSOLUTE ,
308
- dummy1 , dummy2 , dummy3 , dummy4 );
275
+ vmware_hypercall1 ( VMWARE_CMD_ABSPOINTER_COMMAND ,
276
+ VMMOUSE_CMD_REQUEST_ABSOLUTE );
309
277
310
278
return 0 ;
311
279
}
@@ -342,7 +310,7 @@ static bool vmmouse_check_hypervisor(void)
342
310
*/
343
311
int vmmouse_detect (struct psmouse * psmouse , bool set_properties )
344
312
{
345
- u32 response , version , dummy1 , dummy2 ;
313
+ u32 response , version , type ;
346
314
347
315
if (!vmmouse_check_hypervisor ()) {
348
316
psmouse_dbg (psmouse ,
@@ -351,9 +319,9 @@ int vmmouse_detect(struct psmouse *psmouse, bool set_properties)
351
319
}
352
320
353
321
/* Check if the device is present */
354
- response = ~VMMOUSE_PROTO_MAGIC ;
355
- VMMOUSE_CMD ( GETVERSION , 0 , version , response , dummy1 , dummy2 );
356
- if (response != VMMOUSE_PROTO_MAGIC || version == 0xffffffffU )
322
+ response = ~VMWARE_HYPERVISOR_MAGIC ;
323
+ version = vmware_hypercall3 ( VMWARE_CMD_GETVERSION , 0 , & response , & type );
324
+ if (response != VMWARE_HYPERVISOR_MAGIC || version == 0xffffffffU )
357
325
return - ENXIO ;
358
326
359
327
if (set_properties ) {
0 commit comments