File hv_xen_base.patch of Package xen

--- a/xen/include/asm-x86/hvm/domain.h
+++ b/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__ */
--- a/xen/arch/x86/hvm/Makefile
+++ b/xen/arch/x86/hvm/Makefile
@@ -1,5 +1,6 @@
 subdir-y += svm
 subdir-y += vmx
+subdir-$(x86_64) += hyperv
 
 obj-y += emulate.o
 obj-y += hvm.o
--- a/xen/arch/x86/hvm/hvm.c
+++ b/xen/arch/x86/hvm/hvm.c
@@ -44,6 +44,7 @@
 #include <asm/mc146818rtc.h>
 #include <asm/spinlock.h>
 #include <asm/hvm/hvm.h>
+#include <asm/hvm/hvm_extensions.h>
 #include <asm/hvm/vpt.h>
 #include <asm/hvm/support.h>
 #include <asm/hvm/cacheattr.h>
@@ -364,6 +365,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);
@@ -666,8 +668,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;
@@ -718,12 +726,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);
@@ -1696,7 +1706,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);
 
@@ -1714,6 +1724,8 @@ void hvm_cpuid(unsigned int input, unsig
         *edx = v->vcpu_id * 2;
         break;
     }
+hvm_cpuid_done:
+    hyperx_intercept_do_cpuid(input, eax, ebx, ecx, edx);
 }
 
 void hvm_rdtsc_intercept(struct cpu_user_regs *regs)
@@ -1813,6 +1825,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);
     }
 
@@ -1901,6 +1915,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);
     }
 
@@ -2068,6 +2084,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] )
     {
@@ -2572,6 +2592,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 )
--- a/xen/include/public/arch-x86/hvm/save.h
+++ b/xen/include/public/arch-x86/hvm/save.h
@@ -421,9 +421,23 @@ 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;
+    uint64_t pad[27]; //KYS: sles10 sp2 compatibility
+};
+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__ */
--- a/xen/arch/x86/hvm/vlapic.c
+++ b/xen/arch/x86/hvm/vlapic.c
@@ -34,6 +34,7 @@
 #include <asm/hvm/hvm.h>
 #include <asm/hvm/io.h>
 #include <asm/hvm/support.h>
+#include <asm/hvm/hvm_extensions.h>
 #include <asm/hvm/vmx/vmx.h>
 #include <public/hvm/ioreq.h>
 #include <public/hvm/params.h>
@@ -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;
 }
--- a/xen/include/public/hvm/params.h
+++ b/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__ */
openSUSE Build Service is sponsored by