Commit caf4110f authored by Vitaly Kuznetsov's avatar Vitaly Kuznetsov Committed by Paolo Bonzini
Browse files

KVM: selftests: Move the function doing Hyper-V hypercall to a common header



All Hyper-V specific tests issuing hypercalls need this.

Reviewed-by: default avatarMaxim Levitsky <mlevitsk@redhat.com>
Reviewed-by: default avatarSean Christopherson <seanjc@google.com>
Signed-off-by: default avatarVitaly Kuznetsov <vkuznets@redhat.com>
Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
Message-Id: <20221101145426.251680-33-vkuznets@redhat.com>
Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
parent c05a0a71
Loading
Loading
Loading
Loading
+19 −0
Original line number Diff line number Diff line
@@ -185,6 +185,25 @@
/* hypercall options */
#define HV_HYPERCALL_FAST_BIT		BIT(16)

static inline uint8_t hyperv_hypercall(u64 control, vm_vaddr_t input_address,
				       vm_vaddr_t output_address,
				       uint64_t *hv_status)
{
	uint64_t error_code;
	uint8_t vector;

	/* Note both the hypercall and the "asm safe" clobber r9-r11. */
	asm volatile("mov %[output_address], %%r8\n\t"
		     KVM_ASM_SAFE("vmcall")
		     : "=a" (*hv_status),
		       "+c" (control), "+d" (input_address),
		       KVM_ASM_SAFE_OUTPUTS(vector, error_code)
		     : [output_address] "r"(output_address),
		       "a" (-EFAULT)
		     : "cc", "memory", "r8", KVM_ASM_SAFE_CLOBBERS);
	return vector;
}

/* Proper HV_X64_MSR_GUEST_OS_ID value */
#define HYPERV_LINUX_OS_ID ((u64)0x8100 << 48)

+1 −19
Original line number Diff line number Diff line
@@ -13,24 +13,6 @@
#include "processor.h"
#include "hyperv.h"

static inline uint8_t hypercall(u64 control, vm_vaddr_t input_address,
				vm_vaddr_t output_address, uint64_t *hv_status)
{
	uint64_t error_code;
	uint8_t vector;

	/* Note both the hypercall and the "asm safe" clobber r9-r11. */
	asm volatile("mov %[output_address], %%r8\n\t"
		     KVM_ASM_SAFE("vmcall")
		     : "=a" (*hv_status),
		       "+c" (control), "+d" (input_address),
		       KVM_ASM_SAFE_OUTPUTS(vector, error_code)
		     : [output_address] "r"(output_address),
		       "a" (-EFAULT)
		     : "cc", "memory", "r8", KVM_ASM_SAFE_CLOBBERS);
	return vector;
}

struct msr_data {
	uint32_t idx;
	bool available;
@@ -80,7 +62,7 @@ static void guest_hcall(vm_vaddr_t pgs_gpa, struct hcall_data *hcall)
		input = output = 0;
	}

	vector = hypercall(hcall->control, input, output, &res);
	vector = hyperv_hypercall(hcall->control, input, output, &res);
	if (hcall->ud_expected) {
		GUEST_ASSERT_2(vector == UD_VECTOR, hcall->control, vector);
	} else {