Index: xen-4.0.0-testing/xen/include/asm-x86/hvm/domain.h =================================================================== --- xen-4.0.0-testing.orig/xen/include/asm-x86/hvm/domain.h +++ xen-4.0.0-testing/xen/include/asm-x86/hvm/domain.h @@ -98,6 +98,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-4.0.0-testing/xen/arch/x86/hvm/Makefile =================================================================== --- xen-4.0.0-testing.orig/xen/arch/x86/hvm/Makefile +++ xen-4.0.0-testing/xen/arch/x86/hvm/Makefile @@ -1,5 +1,6 @@ subdir-y += svm subdir-y += vmx +subdir-$(x86_64) += hyperv obj-y += asid.o obj-y += emulate.o Index: xen-4.0.0-testing/xen/arch/x86/hvm/hvm.c =================================================================== --- xen-4.0.0-testing.orig/xen/arch/x86/hvm/hvm.c +++ xen-4.0.0-testing/xen/arch/x86/hvm/hvm.c @@ -48,6 +48,7 @@ #include #include #include +#include #include #include #include @@ -461,6 +462,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); @@ -782,8 +784,14 @@ int hvm_vcpu_initialise(struct vcpu *v) v->arch.hvm_vcpu.xfeature_mask = XSTATE_FP_SSE; } + 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; @@ -834,12 +842,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); tasklet_kill(&v->arch.hvm_vcpu.assert_evtchn_irq_tasklet); hvm_vcpu_cacheattr_destroy(v); vlapic_destroy(v); @@ -1897,7 +1907,7 @@ void hvm_cpuid(unsigned int input, unsig return; if ( cpuid_hypervisor_leaves(input, count, eax, ebx, ecx, edx) ) - return; + goto hvm_cpuid_done; domain_cpuid(v->domain, input, *ecx, eax, ebx, ecx, edx); @@ -1964,6 +1974,8 @@ void hvm_cpuid(unsigned int input, unsig *edx &= ~bitmaskof(X86_FEATURE_RDTSCP); break; } +hvm_cpuid_done: + hyperx_intercept_do_cpuid(input, eax, ebx, ecx, edx); } void hvm_rdtsc_intercept(struct cpu_user_regs *regs) @@ -2064,6 +2076,8 @@ int hvm_msr_read_intercept(struct cpu_us break; /* ret == 0, This is not an MCE MSR, see other MSRs */ else if (!ret) + if (hyperx_intercept_do_msr_read(ecx, regs)) + return X86EMUL_OKAY; return hvm_funcs.msr_read_intercept(regs); } @@ -2162,6 +2176,8 @@ int hvm_msr_write_intercept(struct cpu_u else if ( ret ) break; else if (!ret) + if (hyperx_intercept_do_msr_write(ecx, regs)) + return X86EMUL_OKAY; return hvm_funcs.msr_write_intercept(regs); } @@ -2354,6 +2370,10 @@ int hvm_do_hypercall(struct cpu_user_reg case 0: break; } + if (hyperx_intercept_do_hypercall(regs)) + { + return HVM_HCALL_completed; + } if ( (eax & 0x80000000) && is_viridian_domain(curr->domain) ) return viridian_hypercall(regs); @@ -2888,6 +2908,18 @@ long do_hvm_op(unsigned long op, XEN_GUE rc = -EINVAL; break; + case HVM_PARAM_EXTEND_HYPERVISOR: +#ifdef __x86_64__ + if (a.value != 1) + rc = -EINVAL; + else if (hyperv_initialize(d)) + rc = -ENOMEM; + else + break; +#else + rc = -EINVAL; +#endif + goto param_fail; } if ( rc == 0 ) Index: xen-4.0.0-testing/xen/include/public/arch-x86/hvm/save.h =================================================================== --- xen-4.0.0-testing.orig/xen/include/public/arch-x86/hvm/save.h +++ xen-4.0.0-testing/xen/include/public/arch-x86/hvm/save.h @@ -431,9 +431,24 @@ struct hvm_viridian_context { DECLARE_HVM_SAVE_TYPE(VIRIDIAN, 15, struct hvm_viridian_context); +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, 16, struct hvm_hyperv_dom); + +struct hvm_hyperv_cpu { + uint64_t control_msr; + uint64_t version_msr; + uint64_t pad[27]; //KYS: sles10 sp2 compatibility +}; +DECLARE_HVM_SAVE_TYPE(HYPERV_CPU, 17, struct hvm_hyperv_cpu); + /* * Largest type-code in use */ -#define HVM_SAVE_CODE_MAX 15 +#define HVM_SAVE_CODE_MAX 17 #endif /* __XEN_PUBLIC_HVM_SAVE_X86_H__ */ Index: xen-4.0.0-testing/xen/arch/x86/hvm/vlapic.c =================================================================== --- xen-4.0.0-testing.orig/xen/arch/x86/hvm/vlapic.c +++ xen-4.0.0-testing/xen/arch/x86/hvm/vlapic.c @@ -34,6 +34,7 @@ #include #include #include +#include #include #include #include @@ -291,6 +292,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-4.0.0-testing/xen/include/public/hvm/params.h =================================================================== --- xen-4.0.0-testing.orig/xen/include/public/hvm/params.h +++ xen-4.0.0-testing/xen/include/public/hvm/params.h @@ -106,6 +106,8 @@ /* Boolean: Enable aligning all periodic vpts to reduce interrupts */ #define HVM_PARAM_VPT_ALIGN 16 -#define HVM_NR_PARAMS 17 +#define HVM_PARAM_EXTEND_HYPERVISOR 17 + +#define HVM_NR_PARAMS 18 #endif /* __XEN_PUBLIC_HVM_PARAMS_H__ */