On Fri, Aug 23, 2019 at 10:13:14AM +0200, Thomas HellstrÃm (VMware) wrote:It should be correct. The flags VMWARE_HYPERVISOR_HB and VMWARE_HYPERVISOR_OUT are only valid for the vmcall / vmmcall versions.
+/*Hmm, that looks fishy:
+ * The high bandwidth out call. The low word of edx is presumed to have the
+ * HB and OUT bits set.
+#define VMWARE_HYPERCALL_HB_OUT \
+ ALTERNATIVE_2("movw $" VMWARE_HYPERVISOR_PORT_HB ", %%dx; rep outsb", \
This call in vmw_port_hb_out(), for example, gets converted to the asm
below (I've left in the asm touching only rDX).
# drivers/gpu/drm/vmwgfx/vmwgfx_msg.c:160: VMW_PORT_HB_OUT(
movzwl 0(%rbp), %edx # channel_20(D)->channel_id, channel_20(D)->channel_id
sall $16, %edx #, tmp172
orl $3, %edx #, tmp173
this is adding channel_id and flags:
VMWARE_HYPERVISOR_HB | (channel->channel_id << 16) |
the $3 being (VMWARE_HYPERVISOR_HB | VMWARE_HYPERVISOR_OUT).
movslq %edx, %rdx # tmp173, tmp174
Here it is sign-extending it.
# 160 "drivers/gpu/drm/vmwgfx/vmwgfx_msg.c" 1
push %rbp;mov %r8, %rbp;# ALT: oldinstr2 # bp
movw $0x5659, %dx; rep outsb
And now here you're overwriting the low word of %edx. And now it
and the low word doesn't contain the 3, i.e., (VMWARE_HYPERVISOR_HB |
VMWARE_HYPERVISOR_OUT) anymore. And that's before you do the hypercall
so I'm guessing that cannot be right.