Olaf Hering
b9d38dfc8d
- remove xen.migrate.tools_notify_restore_to_hangup_during_migration_--abort_if_busy.patch It changed migration protocol and upstream wants a different solution - bnc#802221 - fix xenpaging readd xenpaging.qemu.flush-cache.patch - Upstream patches from Jan 26891-x86-S3-Fix-cpu-pool-scheduling-after-suspend-resume.patch 26930-x86-EFI-fix-runtime-call-status-for-compat-mode-Dom0.patch - Additional fix for bnc#816159 CVE-2013-1918-xsa45-followup.patch - bnc#817068 - Xen guest with >1 sr-iov vf won't start xen-managed-pci-device.patch - Update to Xen 4.2.2 c/s 26064 The following recent security patches are included in the tarball CVE-2013-0151-xsa34.patch (bnc#797285) CVE-2012-6075-xsa41.patch (bnc#797523) CVE-2013-1917-xsa44.patch (bnc#813673) CVE-2013-1919-xsa46.patch (bnc#813675) - Upstream patch from Jan 26902-x86-EFI-pass-boot-services-variable-info-to-runtime-code.patch - bnc#816159 - VUL-0: xen: CVE-2013-1918: XSA-45: Several long latency operations are not preemptible CVE-2013-1918-xsa45-1-vcpu-destroy-pagetables-preemptible.patch OBS-URL: https://build.opensuse.org/package/show/Virtualization/xen?expand=0&rev=237
129 lines
5.6 KiB
Diff
129 lines
5.6 KiB
Diff
References: FATE#313605
|
|
|
|
# HG changeset patch
|
|
# User Jiongxi Li <jiongxi.li@intel.com>
|
|
# Date 1347912362 -3600
|
|
# Node ID c2578dd96b8318e108fff0f340411135dedaa47d
|
|
# Parent 713b8849b11afa05f1dde157a3f5086fa3aaad08
|
|
xen: add virtual x2apic support for apicv
|
|
|
|
basically to benefit from apicv, we need clear MSR bitmap for
|
|
corresponding x2apic MSRs:
|
|
0x800 - 0x8ff: no read intercept for apicv register virtualization
|
|
TPR,EOI,SELF-IPI: no write intercept for virtual interrupt
|
|
delivery
|
|
|
|
Signed-off-by: Jiongxi Li <jiongxi.li@intel.com>
|
|
Committed-by: Keir Fraser <keir@xen.org>
|
|
|
|
Index: xen-4.2.2-testing/xen/arch/x86/hvm/vmx/vmcs.c
|
|
===================================================================
|
|
--- xen-4.2.2-testing.orig/xen/arch/x86/hvm/vmx/vmcs.c
|
|
+++ xen-4.2.2-testing/xen/arch/x86/hvm/vmx/vmcs.c
|
|
@@ -658,7 +658,7 @@ static void vmx_set_host_env(struct vcpu
|
|
(unsigned long)&get_cpu_info()->guest_cpu_user_regs.error_code);
|
|
}
|
|
|
|
-void vmx_disable_intercept_for_msr(struct vcpu *v, u32 msr)
|
|
+void vmx_disable_intercept_for_msr(struct vcpu *v, u32 msr, int type)
|
|
{
|
|
unsigned long *msr_bitmap = v->arch.hvm_vmx.msr_bitmap;
|
|
|
|
@@ -673,14 +673,18 @@ void vmx_disable_intercept_for_msr(struc
|
|
*/
|
|
if ( msr <= 0x1fff )
|
|
{
|
|
- __clear_bit(msr, msr_bitmap + 0x000/BYTES_PER_LONG); /* read-low */
|
|
- __clear_bit(msr, msr_bitmap + 0x800/BYTES_PER_LONG); /* write-low */
|
|
+ if (type & MSR_TYPE_R)
|
|
+ __clear_bit(msr, msr_bitmap + 0x000/BYTES_PER_LONG); /* read-low */
|
|
+ if (type & MSR_TYPE_W)
|
|
+ __clear_bit(msr, msr_bitmap + 0x800/BYTES_PER_LONG); /* write-low */
|
|
}
|
|
else if ( (msr >= 0xc0000000) && (msr <= 0xc0001fff) )
|
|
{
|
|
msr &= 0x1fff;
|
|
- __clear_bit(msr, msr_bitmap + 0x400/BYTES_PER_LONG); /* read-high */
|
|
- __clear_bit(msr, msr_bitmap + 0xc00/BYTES_PER_LONG); /* write-high */
|
|
+ if (type & MSR_TYPE_R)
|
|
+ __clear_bit(msr, msr_bitmap + 0x400/BYTES_PER_LONG); /* read-high */
|
|
+ if (type & MSR_TYPE_W)
|
|
+ __clear_bit(msr, msr_bitmap + 0xc00/BYTES_PER_LONG); /* write-high */
|
|
}
|
|
}
|
|
|
|
@@ -776,13 +780,25 @@ static int construct_vmcs(struct vcpu *v
|
|
v->arch.hvm_vmx.msr_bitmap = msr_bitmap;
|
|
__vmwrite(MSR_BITMAP, virt_to_maddr(msr_bitmap));
|
|
|
|
- vmx_disable_intercept_for_msr(v, MSR_FS_BASE);
|
|
- vmx_disable_intercept_for_msr(v, MSR_GS_BASE);
|
|
- vmx_disable_intercept_for_msr(v, MSR_IA32_SYSENTER_CS);
|
|
- vmx_disable_intercept_for_msr(v, MSR_IA32_SYSENTER_ESP);
|
|
- vmx_disable_intercept_for_msr(v, MSR_IA32_SYSENTER_EIP);
|
|
+ vmx_disable_intercept_for_msr(v, MSR_FS_BASE, MSR_TYPE_R | MSR_TYPE_W);
|
|
+ vmx_disable_intercept_for_msr(v, MSR_GS_BASE, MSR_TYPE_R | MSR_TYPE_W);
|
|
+ vmx_disable_intercept_for_msr(v, MSR_IA32_SYSENTER_CS, MSR_TYPE_R | MSR_TYPE_W);
|
|
+ vmx_disable_intercept_for_msr(v, MSR_IA32_SYSENTER_ESP, MSR_TYPE_R | MSR_TYPE_W);
|
|
+ vmx_disable_intercept_for_msr(v, MSR_IA32_SYSENTER_EIP, MSR_TYPE_R | MSR_TYPE_W);
|
|
if ( cpu_has_vmx_pat && paging_mode_hap(d) )
|
|
- vmx_disable_intercept_for_msr(v, MSR_IA32_CR_PAT);
|
|
+ vmx_disable_intercept_for_msr(v, MSR_IA32_CR_PAT, MSR_TYPE_R | MSR_TYPE_W);
|
|
+ if ( cpu_has_vmx_apic_reg_virt )
|
|
+ {
|
|
+ int msr;
|
|
+ for (msr = MSR_IA32_APICBASE_MSR; msr <= MSR_IA32_APICBASE_MSR + 0xff; msr++)
|
|
+ vmx_disable_intercept_for_msr(v, msr, MSR_TYPE_R);
|
|
+ }
|
|
+ if ( cpu_has_vmx_virtual_intr_delivery )
|
|
+ {
|
|
+ vmx_disable_intercept_for_msr(v, MSR_IA32_APICTPR_MSR, MSR_TYPE_W);
|
|
+ vmx_disable_intercept_for_msr(v, MSR_IA32_APICEOI_MSR, MSR_TYPE_W);
|
|
+ vmx_disable_intercept_for_msr(v, MSR_IA32_APICSELF_MSR, MSR_TYPE_W);
|
|
+ }
|
|
}
|
|
|
|
/* I/O access bitmap. */
|
|
Index: xen-4.2.2-testing/xen/arch/x86/hvm/vmx/vmx.c
|
|
===================================================================
|
|
--- xen-4.2.2-testing.orig/xen/arch/x86/hvm/vmx/vmx.c
|
|
+++ xen-4.2.2-testing/xen/arch/x86/hvm/vmx/vmx.c
|
|
@@ -2041,7 +2041,7 @@ static int vmx_msr_write_intercept(unsig
|
|
for ( ; (rc == 0) && lbr->count; lbr++ )
|
|
for ( i = 0; (rc == 0) && (i < lbr->count); i++ )
|
|
if ( (rc = vmx_add_guest_msr(lbr->base + i)) == 0 )
|
|
- vmx_disable_intercept_for_msr(v, lbr->base + i);
|
|
+ vmx_disable_intercept_for_msr(v, lbr->base + i, MSR_TYPE_R | MSR_TYPE_W);
|
|
}
|
|
|
|
if ( (rc < 0) ||
|
|
Index: xen-4.2.2-testing/xen/include/asm-x86/hvm/vmx/vmcs.h
|
|
===================================================================
|
|
--- xen-4.2.2-testing.orig/xen/include/asm-x86/hvm/vmx/vmcs.h
|
|
+++ xen-4.2.2-testing/xen/include/asm-x86/hvm/vmx/vmcs.h
|
|
@@ -407,7 +407,9 @@ enum vmcs_field {
|
|
|
|
#define VMCS_VPID_WIDTH 16
|
|
|
|
-void vmx_disable_intercept_for_msr(struct vcpu *v, u32 msr);
|
|
+#define MSR_TYPE_R 1
|
|
+#define MSR_TYPE_W 2
|
|
+void vmx_disable_intercept_for_msr(struct vcpu *v, u32 msr, int type);
|
|
int vmx_read_guest_msr(u32 msr, u64 *val);
|
|
int vmx_write_guest_msr(u32 msr, u64 val);
|
|
int vmx_add_guest_msr(u32 msr);
|
|
Index: xen-4.2.2-testing/xen/include/asm-x86/msr-index.h
|
|
===================================================================
|
|
--- xen-4.2.2-testing.orig/xen/include/asm-x86/msr-index.h
|
|
+++ xen-4.2.2-testing/xen/include/asm-x86/msr-index.h
|
|
@@ -293,6 +293,9 @@
|
|
#define MSR_IA32_APICBASE_ENABLE (1<<11)
|
|
#define MSR_IA32_APICBASE_BASE (0xfffff<<12)
|
|
#define MSR_IA32_APICBASE_MSR 0x800
|
|
+#define MSR_IA32_APICTPR_MSR 0x808
|
|
+#define MSR_IA32_APICEOI_MSR 0x80b
|
|
+#define MSR_IA32_APICSELF_MSR 0x83f
|
|
|
|
#define MSR_IA32_UCODE_WRITE 0x00000079
|
|
#define MSR_IA32_UCODE_REV 0x0000008b
|