On Mon, May 27 2019, Mike Larkin wrote:

On Mon, May 27, 2019 at 03:53:11AM -0700, Renato Aguiar wrote:
Hi,

The following patch makes Linux guests use kvm-clock by setting KVM's CPUID
signature on VMM:


By saying the hypervisor is KVM to all guests, does this cause the guests
to make other assumptions we don't want?

I'm not sure. Linux seems to be fine with it, but it may cause issues with other OSs.

I'll try implementing it on the Linux side instead.


Index: sys/arch/amd64/amd64/vmm.c
===================================================================
RCS file: /cvs/src/sys/arch/amd64/amd64/vmm.c,v
retrieving revision 1.245
diff -u -p -r1.245 vmm.c
--- sys/arch/amd64/amd64/vmm.c 17 May 2019 19:07:15 -0000 1.245
+++ sys/arch/amd64/amd64/vmm.c  27 May 2019 09:44:07 -0000
@@ -238,6 +238,7 @@ extern uint64_t tsc_frequency;
extern int tsc_is_invariant;

const char *vmm_hv_signature = VMM_HV_SIGNATURE;
+const char *kvm_hv_signature = KVM_HV_SIGNATURE;

const struct kmem_pa_mode vmm_kp_contig = {
        .kp_constraint = &no_constraint,
@@ -6433,7 +6434,14 @@ vmm_handle_cpuid(struct vcpu *vcpu)
                *rcx = *((uint32_t *)&vmm_hv_signature[4]);
                *rdx = *((uint32_t *)&vmm_hv_signature[8]);
                break;
+       case 0x40000100:        /* KVM CPUID signature */
+               *rax = 0;
+               *rbx = *((uint32_t *)&kvm_hv_signature[0]);
+               *rcx = *((uint32_t *)&kvm_hv_signature[4]);
+               *rdx = *((uint32_t *)&kvm_hv_signature[8]);
+               break;
        case 0x40000001:        /* KVM hypervisor features */
+       case 0x40000101:
                *rax = (1 << KVM_FEATURE_CLOCKSOURCE2) |
                    (1 << KVM_FEATURE_CLOCKSOURCE_STABLE_BIT);
                *rbx = 0;
Index: sys/arch/amd64/include/vmmvar.h
===================================================================
RCS file: /cvs/src/sys/arch/amd64/include/vmmvar.h,v
retrieving revision 1.66
diff -u -p -r1.66 vmmvar.h
--- sys/arch/amd64/include/vmmvar.h 17 May 2019 19:07:16 -0000 1.66
+++ sys/arch/amd64/include/vmmvar.h     27 May 2019 09:44:07 -0000
@@ -22,6 +22,7 @@
#define _MACHINE_VMMVAR_H_

#define VMM_HV_SIGNATURE        "OpenBSDVMM58"
+#define KVM_HV_SIGNATURE       "KVMKVMKVM\0\0\0"

#define VMM_MAX_MEM_RANGES      16
#define VMM_MAX_DISKS_PER_VM    4
Index: sys/arch/i386/include/vmmvar.h
===================================================================
RCS file: /cvs/src/sys/arch/i386/include/vmmvar.h,v
retrieving revision 1.19
diff -u -p -r1.19 vmmvar.h
--- sys/arch/i386/include/vmmvar.h 18 Jan 2019 01:34:50 -0000 1.19
+++ sys/arch/i386/include/vmmvar.h      27 May 2019 09:44:07 -0000
@@ -15,3 +15,4 @@
 */

#define VMM_HV_SIGNATURE        "OpenBSDVMM58"
+#define KVM_HV_SIGNATURE       "KVMKVMKVM\0\0\0"
Index: sys/dev/pv/pvbus.c
===================================================================
RCS file: /cvs/src/sys/dev/pv/pvbus.c,v
retrieving revision 1.19
diff -u -p -r1.19 pvbus.c
--- sys/dev/pv/pvbus.c 13 May 2019 15:40:34 -0000 1.19
+++ sys/dev/pv/pvbus.c  27 May 2019 09:44:08 -0000
@@ -85,7 +85,7 @@ struct pvbus_type {
        void            (*init)(struct pvbus_hv *);
        void            (*print)(struct pvbus_hv *);
} pvbus_types[PVBUS_MAX] = {
-       { "KVMKVMKVM\0\0\0",  "KVM",        pvbus_kvm },
+       { KVM_HV_SIGNATURE,     "KVM",        pvbus_kvm },
{ "Microsoft Hv", "Hyper-V", pvbus_hyperv, pvbus_hyperv_print },
        { "VMwareVMware",     "VMware" },
{ "XenVMMXenVMM", "Xen", pvbus_xen, pvbus_xen_print },


--
Renato Aguiar



--
Renato Aguiar

Reply via email to