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?

> 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