Hi,

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

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

Reply via email to