%patch Index: xen-3.3.1-testing/xen/include/asm-x86/hvm/domain.h =================================================================== --- xen-3.3.1-testing.orig/xen/include/asm-x86/hvm/domain.h +++ xen-3.3.1-testing/xen/include/asm-x86/hvm/domain.h @@ -82,6 +82,7 @@ struct hvm_domain { struct vmx_domain vmx; struct svm_domain svm; }; + void *hyperv_handle; /* will be NULL on creation*/ }; #endif /* __ASM_X86_HVM_DOMAIN_H__ */ Index: xen-3.3.1-testing/xen/arch/x86/hvm/Makefile =================================================================== --- xen-3.3.1-testing.orig/xen/arch/x86/hvm/Makefile +++ xen-3.3.1-testing/xen/arch/x86/hvm/Makefile @@ -1,5 +1,6 @@ subdir-y += svm subdir-y += vmx +subdir-y += hyperv obj-y += emulate.o obj-y += hvm.o Index: xen-3.3.1-testing/xen/arch/x86/hvm/hvm.c =================================================================== --- xen-3.3.1-testing.orig/xen/arch/x86/hvm/hvm.c +++ xen-3.3.1-testing/xen/arch/x86/hvm/hvm.c @@ -44,6 +44,7 @@ #include #include #include +#include #include #include #include @@ -361,6 +362,7 @@ void hvm_domain_relinquish_resources(str void hvm_domain_destroy(struct domain *d) { + hyperx_intercept_domain_destroy(d); hvm_funcs.domain_destroy(d); rtc_deinit(d); stdvga_deinit(d); @@ -645,8 +647,14 @@ int hvm_vcpu_initialise(struct vcpu *v) { int rc; + if ((rc = hyperx_intercept_vcpu_initialize(v)) != 0) + goto fail1; + if ( (rc = vlapic_init(v)) != 0 ) + { + hyperx_intercept_vcpu_destroy(v); goto fail1; + } if ( (rc = hvm_funcs.vcpu_initialise(v)) != 0 ) goto fail2; @@ -693,12 +701,14 @@ int hvm_vcpu_initialise(struct vcpu *v) hvm_funcs.vcpu_destroy(v); fail2: vlapic_destroy(v); + hyperx_intercept_vcpu_destroy(v); fail1: return rc; } void hvm_vcpu_destroy(struct vcpu *v) { + hyperx_intercept_vcpu_destroy(v); hvm_vcpu_cacheattr_destroy(v); vlapic_destroy(v); hvm_funcs.vcpu_destroy(v); @@ -1647,7 +1657,7 @@ void hvm_cpuid(unsigned int input, unsig struct vcpu *v = current; if ( cpuid_hypervisor_leaves(input, eax, ebx, ecx, edx) ) - return; + goto hvm_cpuid_done; domain_cpuid(v->domain, input, *ecx, eax, ebx, ecx, edx); @@ -1659,6 +1669,8 @@ void hvm_cpuid(unsigned int input, unsig if ( vlapic_hw_disabled(vcpu_vlapic(v)) ) __clear_bit(X86_FEATURE_APIC & 31, edx); } +hvm_cpuid_done: + hyperx_intercept_do_cpuid(input, eax, ebx, ecx, edx); } void hvm_rdtsc_intercept(struct cpu_user_regs *regs) @@ -1749,6 +1761,8 @@ int hvm_msr_read_intercept(struct cpu_us break; default: + if (hyperx_intercept_do_msr_read(ecx, regs)) + return X86EMUL_OKAY; return hvm_funcs.msr_read_intercept(regs); } @@ -1837,6 +1851,8 @@ int hvm_msr_write_intercept(struct cpu_u break; default: + if (hyperx_intercept_do_msr_write(ecx, regs)) + return X86EMUL_OKAY; return hvm_funcs.msr_write_intercept(regs); } @@ -1963,6 +1979,10 @@ int hvm_do_hypercall(struct cpu_user_reg case 0: break; } + if (hyperx_intercept_do_hypercall(regs)) + { + return HVM_HCALL_completed; + } if ( (eax >= NR_hypercalls) || !hvm_hypercall32_table[eax] ) { @@ -2464,6 +2484,15 @@ long do_hvm_op(unsigned long op, XEN_GUE rc = -EINVAL; break; + case HVM_PARAM_EXTEND_HYPERVISOR: + if ((a.value == 1) && hyperv_initialize(d)) + { + if (a.value != 1) + rc = -EINVAL; + else + rc = -ENOMEM; + goto param_fail; + } } if ( rc == 0 ) Index: xen-3.3.1-testing/xen/include/public/arch-x86/hvm/save.h =================================================================== --- xen-3.3.1-testing.orig/xen/include/public/arch-x86/hvm/save.h +++ xen-3.3.1-testing/xen/include/public/arch-x86/hvm/save.h @@ -38,7 +38,7 @@ struct hvm_save_header { uint32_t version; /* File format version */ uint64_t changeset; /* Version of Xen that saved this file */ uint32_t cpuid; /* CPUID[0x01][%eax] on the saving machine */ - uint32_t pad0; + uint32_t pad0; }; DECLARE_HVM_SAVE_TYPE(HEADER, 1, struct hvm_save_header); @@ -421,9 +421,22 @@ struct hvm_hw_mtrr { DECLARE_HVM_SAVE_TYPE(MTRR, 14, struct hvm_hw_mtrr); +struct hvm_hyperv_dom { + uint64_t guestid_msr; + uint64_t hypercall_msr; + uint32_t long_mode; + uint32_t ext_id; +}; +DECLARE_HVM_SAVE_TYPE(HYPERV_DOM, 15, struct hvm_hyperv_dom); + +struct hvm_hyperv_cpu { + uint64_t control_msr; + uint64_t version_msr; +}; +DECLARE_HVM_SAVE_TYPE(HYPERV_CPU, 16, struct hvm_hyperv_cpu); /* * Largest type-code in use */ -#define HVM_SAVE_CODE_MAX 14 +#define HVM_SAVE_CODE_MAX 16 #endif /* __XEN_PUBLIC_HVM_SAVE_X86_H__ */ Index: xen-3.3.1-testing/xen/arch/x86/hvm/vlapic.c =================================================================== --- xen-3.3.1-testing.orig/xen/arch/x86/hvm/vlapic.c +++ xen-3.3.1-testing/xen/arch/x86/hvm/vlapic.c @@ -34,6 +34,7 @@ #include #include #include +#include #include #include #include @@ -307,6 +308,7 @@ static int vlapic_accept_sipi(struct vcp hvm_vcpu_reset_state(v, trampoline_vector << 8, 0); vcpu_unpause(v); + hyperx_intercept_vcpu_up(v); return X86EMUL_OKAY; } Index: xen-3.3.1-testing/xen/include/public/hvm/params.h =================================================================== --- xen-3.3.1-testing.orig/xen/include/public/hvm/params.h +++ xen-3.3.1-testing/xen/include/public/hvm/params.h @@ -93,6 +93,8 @@ /* ACPI S state: currently support S0 and S3 on x86. */ #define HVM_PARAM_ACPI_S_STATE 14 -#define HVM_NR_PARAMS 15 +#define HVM_PARAM_EXTEND_HYPERVISOR 15 + +#define HVM_NR_PARAMS 16 #endif /* __XEN_PUBLIC_HVM_PARAMS_H__ */