%patch Index: xen-3.4.1-testing/xen/include/asm-x86/hvm/domain.h =================================================================== --- xen-3.4.1-testing.orig/xen/include/asm-x86/hvm/domain.h +++ xen-3.4.1-testing/xen/include/asm-x86/hvm/domain.h @@ -89,6 +89,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.4.1-testing/xen/arch/x86/hvm/Makefile =================================================================== --- xen-3.4.1-testing.orig/xen/arch/x86/hvm/Makefile +++ xen-3.4.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.4.1-testing/xen/arch/x86/hvm/hvm.c =================================================================== --- xen-3.4.1-testing.orig/xen/arch/x86/hvm/hvm.c +++ xen-3.4.1-testing/xen/arch/x86/hvm/hvm.c @@ -46,6 +46,7 @@ #include #include #include +#include #include #include #include @@ -377,6 +378,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); @@ -680,8 +682,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; @@ -732,6 +740,7 @@ int hvm_vcpu_initialise(struct vcpu *v) hvm_funcs.vcpu_destroy(v); fail2: vlapic_destroy(v); + hyperx_intercept_vcpu_destroy(v); fail1: return rc; } @@ -739,6 +748,7 @@ int hvm_vcpu_initialise(struct vcpu *v) void hvm_vcpu_destroy(struct vcpu *v) { tasklet_kill(&v->arch.hvm_vcpu.assert_evtchn_irq_tasklet); + hyperx_intercept_vcpu_destroy(v); hvm_vcpu_cacheattr_destroy(v); vlapic_destroy(v); hvm_funcs.vcpu_destroy(v); @@ -1690,7 +1700,7 @@ void hvm_cpuid(unsigned int input, unsig return; if ( cpuid_hypervisor_leaves(input, eax, ebx, ecx, edx) ) - return; + goto hvm_cpuid_done; domain_cpuid(v->domain, input, *ecx, eax, ebx, ecx, edx); @@ -1702,6 +1712,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) @@ -1801,6 +1813,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); } @@ -1889,6 +1903,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); } @@ -2056,6 +2072,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); @@ -2572,6 +2592,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.4.1-testing/xen/include/public/arch-x86/hvm/save.h =================================================================== --- xen-3.4.1-testing.orig/xen/include/public/arch-x86/hvm/save.h +++ xen-3.4.1-testing/xen/include/public/arch-x86/hvm/save.h @@ -432,9 +432,26 @@ 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-3.4.1-testing/xen/arch/x86/hvm/vlapic.c =================================================================== --- xen-3.4.1-testing.orig/xen/arch/x86/hvm/vlapic.c +++ xen-3.4.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.4.1-testing/xen/include/public/hvm/params.h =================================================================== --- xen-3.4.1-testing.orig/xen/include/public/hvm/params.h +++ xen-3.4.1-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__ */