This commit is contained in:
parent
1b5538862e
commit
1e7aaafcb1
468
15185-vtpr.patch
Normal file
468
15185-vtpr.patch
Normal file
@ -0,0 +1,468 @@
|
||||
|
||||
# HG changeset patch
|
||||
# User kfraser@localhost.localdomain
|
||||
# Date 1180540108 -3600
|
||||
# Node ID 1f8fb764f843552eb4d20e9cb7b67fd8738006d7
|
||||
# Parent 1f1d1b43951eb14eff8c71884b7421da2484af3c
|
||||
Add VMX memory-mapped Local APIC access optimization.
|
||||
|
||||
Some operating systems access the local APIC TPR very frequently, and
|
||||
we handle that using software-based local APIC virtualization in Xen
|
||||
today. Such virtualization incurs a number of VM exits from the
|
||||
memory-access instructions against the APIC page in the guest.
|
||||
|
||||
The attached patch enables the TPR shadow feature that provides APIC
|
||||
TPR virtualization in hardware. Our tests indicate it can
|
||||
significantly boost the performance of such guests including 32-bit
|
||||
Windows XP/2003.
|
||||
|
||||
Moreover, with the patch, local APIC accesses other than TPR in guests
|
||||
are intercepted directly as APIC_ACCESS VM exits rather than
|
||||
PAGE_FAULT VM exits; this can lower the emulation cost of such
|
||||
accesses.
|
||||
|
||||
Signed-off-by: Dexuan Cui <dexuan.cui@intel.com>
|
||||
|
||||
Index: xen-3.1-testing/xen/arch/x86/hvm/hvm.c
|
||||
===================================================================
|
||||
--- xen-3.1-testing.orig/xen/arch/x86/hvm/hvm.c
|
||||
+++ xen-3.1-testing/xen/arch/x86/hvm/hvm.c
|
||||
@@ -226,6 +226,7 @@ int hvm_domain_initialise(struct domain
|
||||
|
||||
spin_lock_init(&d->arch.hvm_domain.pbuf_lock);
|
||||
spin_lock_init(&d->arch.hvm_domain.irq_lock);
|
||||
+ spin_lock_init(&d->arch.hvm_domain.vapic_access_lock);
|
||||
|
||||
rc = paging_enable(d, PG_refcounts|PG_translate|PG_external);
|
||||
if ( rc != 0 )
|
||||
Index: xen-3.1-testing/xen/arch/x86/hvm/vlapic.c
|
||||
===================================================================
|
||||
--- xen-3.1-testing.orig/xen/arch/x86/hvm/vlapic.c
|
||||
+++ xen-3.1-testing/xen/arch/x86/hvm/vlapic.c
|
||||
@@ -79,8 +79,6 @@ static unsigned int vlapic_lvt_mask[VLAP
|
||||
#define vlapic_lvtt_period(vlapic) \
|
||||
(vlapic_get_reg(vlapic, APIC_LVTT) & APIC_LVT_TIMER_PERIODIC)
|
||||
|
||||
-#define vlapic_base_address(vlapic) \
|
||||
- (vlapic->hw.apic_base_msr & MSR_IA32_APICBASE_BASE)
|
||||
|
||||
/*
|
||||
* Generic APIC bitmap vector update & search routines.
|
||||
Index: xen-3.1-testing/xen/arch/x86/hvm/vmx/intr.c
|
||||
===================================================================
|
||||
--- xen-3.1-testing.orig/xen/arch/x86/hvm/vmx/intr.c
|
||||
+++ xen-3.1-testing/xen/arch/x86/hvm/vmx/intr.c
|
||||
@@ -67,7 +67,6 @@ static inline int is_interruptibility_st
|
||||
return __vmread(GUEST_INTERRUPTIBILITY_INFO);
|
||||
}
|
||||
|
||||
-#ifdef __x86_64__
|
||||
static void update_tpr_threshold(struct vlapic *vlapic)
|
||||
{
|
||||
int max_irr, tpr;
|
||||
@@ -75,6 +74,11 @@ static void update_tpr_threshold(struct
|
||||
if ( !cpu_has_vmx_tpr_shadow )
|
||||
return;
|
||||
|
||||
+#ifdef __i386__
|
||||
+ if ( !vlapic->mmap_vtpr_enabled )
|
||||
+ return;
|
||||
+#endif
|
||||
+
|
||||
if ( !vlapic_enabled(vlapic) ||
|
||||
((max_irr = vlapic_find_highest_irr(vlapic)) == -1) )
|
||||
{
|
||||
@@ -85,9 +89,6 @@ static void update_tpr_threshold(struct
|
||||
tpr = vlapic_get_reg(vlapic, APIC_TASKPRI) & 0xF0;
|
||||
__vmwrite(TPR_THRESHOLD, (max_irr > tpr) ? (tpr >> 4) : (max_irr >> 4));
|
||||
}
|
||||
-#else
|
||||
-#define update_tpr_threshold(v) ((void)0)
|
||||
-#endif
|
||||
|
||||
asmlinkage void vmx_intr_assist(void)
|
||||
{
|
||||
Index: xen-3.1-testing/xen/arch/x86/hvm/vmx/vmcs.c
|
||||
===================================================================
|
||||
--- xen-3.1-testing.orig/xen/arch/x86/hvm/vmx/vmcs.c
|
||||
+++ xen-3.1-testing/xen/arch/x86/hvm/vmx/vmcs.c
|
||||
@@ -40,6 +40,7 @@
|
||||
/* Dynamic (run-time adjusted) execution control flags. */
|
||||
u32 vmx_pin_based_exec_control __read_mostly;
|
||||
u32 vmx_cpu_based_exec_control __read_mostly;
|
||||
+u32 vmx_secondary_exec_control __read_mostly;
|
||||
u32 vmx_vmexit_control __read_mostly;
|
||||
u32 vmx_vmentry_control __read_mostly;
|
||||
|
||||
@@ -60,11 +61,15 @@ static u32 adjust_vmx_controls(u32 ctl_m
|
||||
return ctl;
|
||||
}
|
||||
|
||||
+#define vmx_has_secondary_exec_ctls \
|
||||
+ (_vmx_cpu_based_exec_control & ACTIVATE_SECONDARY_CONTROLS)
|
||||
+
|
||||
void vmx_init_vmcs_config(void)
|
||||
{
|
||||
u32 vmx_msr_low, vmx_msr_high, min, opt;
|
||||
u32 _vmx_pin_based_exec_control;
|
||||
u32 _vmx_cpu_based_exec_control;
|
||||
+ u32 _vmx_secondary_exec_control = 0;
|
||||
u32 _vmx_vmexit_control;
|
||||
u32 _vmx_vmentry_control;
|
||||
|
||||
@@ -80,9 +85,8 @@ void vmx_init_vmcs_config(void)
|
||||
CPU_BASED_ACTIVATE_IO_BITMAP |
|
||||
CPU_BASED_USE_TSC_OFFSETING);
|
||||
opt = CPU_BASED_ACTIVATE_MSR_BITMAP;
|
||||
-#ifdef __x86_64__
|
||||
opt |= CPU_BASED_TPR_SHADOW;
|
||||
-#endif
|
||||
+ opt |= ACTIVATE_SECONDARY_CONTROLS;
|
||||
_vmx_cpu_based_exec_control = adjust_vmx_controls(
|
||||
min, opt, MSR_IA32_VMX_PROCBASED_CTLS_MSR);
|
||||
#ifdef __x86_64__
|
||||
@@ -92,8 +96,19 @@ void vmx_init_vmcs_config(void)
|
||||
_vmx_cpu_based_exec_control = adjust_vmx_controls(
|
||||
min, opt, MSR_IA32_VMX_PROCBASED_CTLS_MSR);
|
||||
}
|
||||
+#elif defined(__i386__)
|
||||
+ if ( !vmx_has_secondary_exec_ctls )
|
||||
+ _vmx_cpu_based_exec_control &= ~CPU_BASED_TPR_SHADOW;
|
||||
#endif
|
||||
|
||||
+ if ( vmx_has_secondary_exec_ctls )
|
||||
+ {
|
||||
+ min = 0;
|
||||
+ opt = SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES;
|
||||
+ _vmx_secondary_exec_control = adjust_vmx_controls(
|
||||
+ min, opt, MSR_IA32_VMX_PROCBASED_CTLS2);
|
||||
+ }
|
||||
+
|
||||
min = VM_EXIT_ACK_INTR_ON_EXIT;
|
||||
opt = 0;
|
||||
#ifdef __x86_64__
|
||||
@@ -113,6 +128,8 @@ void vmx_init_vmcs_config(void)
|
||||
vmcs_revision_id = vmx_msr_low;
|
||||
vmx_pin_based_exec_control = _vmx_pin_based_exec_control;
|
||||
vmx_cpu_based_exec_control = _vmx_cpu_based_exec_control;
|
||||
+ if ( vmx_has_secondary_exec_ctls )
|
||||
+ vmx_secondary_exec_control = _vmx_secondary_exec_control;
|
||||
vmx_vmexit_control = _vmx_vmexit_control;
|
||||
vmx_vmentry_control = _vmx_vmentry_control;
|
||||
}
|
||||
@@ -121,6 +138,8 @@ void vmx_init_vmcs_config(void)
|
||||
BUG_ON(vmcs_revision_id != vmx_msr_low);
|
||||
BUG_ON(vmx_pin_based_exec_control != _vmx_pin_based_exec_control);
|
||||
BUG_ON(vmx_cpu_based_exec_control != _vmx_cpu_based_exec_control);
|
||||
+ if ( vmx_has_secondary_exec_ctls )
|
||||
+ BUG_ON(vmx_secondary_exec_control != _vmx_secondary_exec_control);
|
||||
BUG_ON(vmx_vmexit_control != _vmx_vmexit_control);
|
||||
BUG_ON(vmx_vmentry_control != _vmx_vmentry_control);
|
||||
}
|
||||
@@ -296,6 +315,8 @@ static void construct_vmcs(struct vcpu *
|
||||
__vmwrite(VM_ENTRY_CONTROLS, vmx_vmentry_control);
|
||||
__vmwrite(CPU_BASED_VM_EXEC_CONTROL, vmx_cpu_based_exec_control);
|
||||
v->arch.hvm_vcpu.u.vmx.exec_control = vmx_cpu_based_exec_control;
|
||||
+ if ( vmx_cpu_based_exec_control & ACTIVATE_SECONDARY_CONTROLS )
|
||||
+ __vmwrite(SECONDARY_VM_EXEC_CONTROL, vmx_secondary_exec_control);
|
||||
|
||||
if ( cpu_has_vmx_msr_bitmap )
|
||||
__vmwrite(MSR_BITMAP, virt_to_maddr(vmx_msr_bitmap));
|
||||
@@ -422,7 +443,7 @@ static void construct_vmcs(struct vcpu *
|
||||
__vmwrite(CR4_READ_SHADOW, v->arch.hvm_vmx.cpu_shadow_cr4);
|
||||
|
||||
#ifdef __x86_64__
|
||||
- /* VLAPIC TPR optimisation. */
|
||||
+ /* CR8 based VLAPIC TPR optimization. */
|
||||
if ( cpu_has_vmx_tpr_shadow )
|
||||
{
|
||||
__vmwrite(VIRTUAL_APIC_PAGE_ADDR,
|
||||
@@ -431,6 +452,16 @@ static void construct_vmcs(struct vcpu *
|
||||
}
|
||||
#endif
|
||||
|
||||
+ /* Memory-mapped based VLAPIC TPR optimization. */
|
||||
+ if ( cpu_has_vmx_mmap_vtpr_optimization )
|
||||
+ {
|
||||
+ __vmwrite(VIRTUAL_APIC_PAGE_ADDR,
|
||||
+ page_to_maddr(vcpu_vlapic(v)->regs_page));
|
||||
+ __vmwrite(TPR_THRESHOLD, 0);
|
||||
+
|
||||
+ vcpu_vlapic(v)->mmap_vtpr_enabled = 1;
|
||||
+ }
|
||||
+
|
||||
__vmwrite(GUEST_LDTR_SELECTOR, 0);
|
||||
__vmwrite(GUEST_LDTR_BASE, 0);
|
||||
__vmwrite(GUEST_LDTR_LIMIT, 0);
|
||||
@@ -501,6 +532,18 @@ void vmx_do_resume(struct vcpu *v)
|
||||
vmx_set_host_env(v);
|
||||
}
|
||||
|
||||
+ if ( !v->arch.hvm_vmx.launched && vcpu_vlapic(v)->mmap_vtpr_enabled )
|
||||
+ {
|
||||
+ struct page_info *pg = change_guest_physmap_for_vtpr(v->domain, 1);
|
||||
+
|
||||
+ if ( pg == NULL )
|
||||
+ {
|
||||
+ gdprintk(XENLOG_ERR, "change_guest_physmap_for_vtpr failed!\n");
|
||||
+ domain_crash_synchronous();
|
||||
+ }
|
||||
+ __vmwrite(APIC_ACCESS_ADDR, page_to_maddr(pg));
|
||||
+ }
|
||||
+
|
||||
debug_state = v->domain->debugger_attached;
|
||||
if ( unlikely(v->arch.hvm_vcpu.debug_state_latch != debug_state) )
|
||||
{
|
||||
Index: xen-3.1-testing/xen/arch/x86/hvm/vmx/vmx.c
|
||||
===================================================================
|
||||
--- xen-3.1-testing.orig/xen/arch/x86/hvm/vmx/vmx.c
|
||||
+++ xen-3.1-testing/xen/arch/x86/hvm/vmx/vmx.c
|
||||
@@ -2416,6 +2416,114 @@ done:
|
||||
return 1;
|
||||
}
|
||||
|
||||
+struct page_info * change_guest_physmap_for_vtpr(struct domain *d,
|
||||
+ int enable_vtpr)
|
||||
+{
|
||||
+ struct page_info *pg;
|
||||
+ unsigned long pfn, mfn;
|
||||
+
|
||||
+ spin_lock(&d->arch.hvm_domain.vapic_access_lock);
|
||||
+
|
||||
+ pg = d->arch.hvm_domain.apic_access_page;
|
||||
+ pfn = paddr_to_pfn(APIC_DEFAULT_PHYS_BASE);
|
||||
+
|
||||
+ if ( enable_vtpr )
|
||||
+ {
|
||||
+ if ( d->arch.hvm_domain.physmap_changed_for_vlapic_access )
|
||||
+ goto out;
|
||||
+
|
||||
+ if ( pg == NULL )
|
||||
+ pg = alloc_domheap_page(d);
|
||||
+ if ( pg == NULL )
|
||||
+ {
|
||||
+ gdprintk(XENLOG_ERR, "alloc_domheap_pages() failed!\n");
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ mfn = page_to_mfn(pg);
|
||||
+ d->arch.hvm_domain.apic_access_page = pg;
|
||||
+
|
||||
+ guest_physmap_add_page(d, pfn, mfn);
|
||||
+
|
||||
+ d->arch.hvm_domain.physmap_changed_for_vlapic_access = 1;
|
||||
+
|
||||
+ goto out;
|
||||
+ }
|
||||
+ else
|
||||
+ {
|
||||
+ if ( d->arch.hvm_domain.physmap_changed_for_vlapic_access )
|
||||
+ {
|
||||
+ mfn = page_to_mfn(pg);
|
||||
+ guest_physmap_remove_page(d, pfn, mfn);
|
||||
+ flush_tlb_mask(d->domain_dirty_cpumask);
|
||||
+
|
||||
+ d->arch.hvm_domain.physmap_changed_for_vlapic_access = 0;
|
||||
+ }
|
||||
+ pg = NULL;
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+out:
|
||||
+ spin_unlock(&d->arch.hvm_domain.vapic_access_lock);
|
||||
+ return pg;
|
||||
+}
|
||||
+
|
||||
+static void check_vlapic_msr_for_vtpr(struct vcpu *v)
|
||||
+{
|
||||
+ struct vlapic *vlapic = vcpu_vlapic(v);
|
||||
+ int mmap_vtpr_enabled = vcpu_vlapic(v)->mmap_vtpr_enabled;
|
||||
+ uint32_t tmp;
|
||||
+
|
||||
+
|
||||
+ if ( vlapic_hw_disabled(vlapic) && mmap_vtpr_enabled )
|
||||
+ {
|
||||
+ vcpu_vlapic(v)->mmap_vtpr_enabled = 0;
|
||||
+
|
||||
+#ifdef __i386__
|
||||
+ v->arch.hvm_vcpu.u.vmx.exec_control &= ~CPU_BASED_TPR_SHADOW;
|
||||
+ __vmwrite(CPU_BASED_VM_EXEC_CONTROL,
|
||||
+ v->arch.hvm_vcpu.u.vmx.exec_control);
|
||||
+#elif defined(__x86_64__)
|
||||
+ if ( !cpu_has_vmx_tpr_shadow )
|
||||
+ {
|
||||
+ v->arch.hvm_vcpu.u.vmx.exec_control &= ~CPU_BASED_TPR_SHADOW;
|
||||
+ __vmwrite(CPU_BASED_VM_EXEC_CONTROL,
|
||||
+ v->arch.hvm_vcpu.u.vmx.exec_control);
|
||||
+ }
|
||||
+#endif
|
||||
+ tmp = __vmread(SECONDARY_VM_EXEC_CONTROL);
|
||||
+ tmp &= ~SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES;
|
||||
+ __vmwrite(SECONDARY_VM_EXEC_CONTROL, tmp);
|
||||
+
|
||||
+ change_guest_physmap_for_vtpr(v->domain, 0);
|
||||
+ }
|
||||
+ else if ( !vlapic_hw_disabled(vlapic) && !mmap_vtpr_enabled &&
|
||||
+ cpu_has_vmx_mmap_vtpr_optimization )
|
||||
+ {
|
||||
+ vcpu_vlapic(v)->mmap_vtpr_enabled = 1;
|
||||
+
|
||||
+ v->arch.hvm_vcpu.u.vmx.exec_control |=
|
||||
+ ( ACTIVATE_SECONDARY_CONTROLS | CPU_BASED_TPR_SHADOW );
|
||||
+ __vmwrite(CPU_BASED_VM_EXEC_CONTROL,
|
||||
+ v->arch.hvm_vcpu.u.vmx.exec_control);
|
||||
+ tmp = __vmread(SECONDARY_VM_EXEC_CONTROL);
|
||||
+ tmp |= SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES;
|
||||
+ __vmwrite(SECONDARY_VM_EXEC_CONTROL, tmp);
|
||||
+
|
||||
+ change_guest_physmap_for_vtpr(v->domain, 1);
|
||||
+ }
|
||||
+
|
||||
+ if ( vcpu_vlapic(v)->mmap_vtpr_enabled &&
|
||||
+ !vlapic_hw_disabled(vlapic) &&
|
||||
+ (vlapic_base_address(vlapic) != APIC_DEFAULT_PHYS_BASE) )
|
||||
+ {
|
||||
+ gdprintk(XENLOG_ERR,
|
||||
+ "Local APIC base address is set to 0x%016"PRIx64"!\n",
|
||||
+ vlapic_base_address(vlapic));
|
||||
+ domain_crash_synchronous();
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
static inline int vmx_do_msr_write(struct cpu_user_regs *regs)
|
||||
{
|
||||
u32 ecx = regs->ecx;
|
||||
@@ -2444,6 +2552,7 @@ static inline int vmx_do_msr_write(struc
|
||||
break;
|
||||
case MSR_IA32_APICBASE:
|
||||
vlapic_msr_set(vcpu_vlapic(v), msr_content);
|
||||
+ check_vlapic_msr_for_vtpr(v);
|
||||
break;
|
||||
default:
|
||||
if ( !long_mode_do_msr_write(regs) )
|
||||
@@ -2756,6 +2865,15 @@ asmlinkage void vmx_vmexit_handler(struc
|
||||
|
||||
case EXIT_REASON_TPR_BELOW_THRESHOLD:
|
||||
break;
|
||||
+ case EXIT_REASON_APIC_ACCESS:
|
||||
+ {
|
||||
+ unsigned long offset;
|
||||
+
|
||||
+ exit_qualification = __vmread(EXIT_QUALIFICATION);
|
||||
+ offset = exit_qualification & 0x0fffUL;
|
||||
+ handle_mmio(APIC_DEFAULT_PHYS_BASE | offset);
|
||||
+ break;
|
||||
+ }
|
||||
|
||||
default:
|
||||
exit_and_crash:
|
||||
Index: xen-3.1-testing/xen/include/asm-x86/hvm/domain.h
|
||||
===================================================================
|
||||
--- xen-3.1-testing.orig/xen/include/asm-x86/hvm/domain.h
|
||||
+++ xen-3.1-testing/xen/include/asm-x86/hvm/domain.h
|
||||
@@ -41,6 +41,11 @@ struct hvm_domain {
|
||||
s64 tsc_frequency;
|
||||
struct pl_time pl_time;
|
||||
|
||||
+ /* For memory-mapped vLAPIC/vTPR access optimization */
|
||||
+ spinlock_t vapic_access_lock;
|
||||
+ int physmap_changed_for_vlapic_access : 1;
|
||||
+ struct page_info *apic_access_page;
|
||||
+
|
||||
struct hvm_io_handler io_handler;
|
||||
|
||||
/* Lock protects access to irq, vpic and vioapic. */
|
||||
Index: xen-3.1-testing/xen/include/asm-x86/hvm/vlapic.h
|
||||
===================================================================
|
||||
--- xen-3.1-testing.orig/xen/include/asm-x86/hvm/vlapic.h
|
||||
+++ xen-3.1-testing/xen/include/asm-x86/hvm/vlapic.h
|
||||
@@ -49,12 +49,17 @@
|
||||
#define vlapic_disabled(vlapic) ((vlapic)->hw.disabled)
|
||||
#define vlapic_enabled(vlapic) (!vlapic_disabled(vlapic))
|
||||
|
||||
+#define vlapic_base_address(vlapic) \
|
||||
+ (vlapic->hw.apic_base_msr & MSR_IA32_APICBASE_BASE)
|
||||
+
|
||||
struct vlapic {
|
||||
struct hvm_hw_lapic hw;
|
||||
struct hvm_hw_lapic_regs *regs;
|
||||
struct periodic_time pt;
|
||||
s_time_t timer_last_update;
|
||||
struct page_info *regs_page;
|
||||
+
|
||||
+ int mmap_vtpr_enabled : 1;
|
||||
};
|
||||
|
||||
static inline uint32_t vlapic_get_reg(struct vlapic *vlapic, uint32_t reg)
|
||||
Index: xen-3.1-testing/xen/include/asm-x86/hvm/vmx/vmcs.h
|
||||
===================================================================
|
||||
--- xen-3.1-testing.orig/xen/include/asm-x86/hvm/vmx/vmcs.h
|
||||
+++ xen-3.1-testing/xen/include/asm-x86/hvm/vmx/vmcs.h
|
||||
@@ -104,6 +104,7 @@ void vmx_vmcs_exit(struct vcpu *v);
|
||||
#define CPU_BASED_ACTIVATE_MSR_BITMAP 0x10000000
|
||||
#define CPU_BASED_MONITOR_EXITING 0x20000000
|
||||
#define CPU_BASED_PAUSE_EXITING 0x40000000
|
||||
+#define ACTIVATE_SECONDARY_CONTROLS 0x80000000
|
||||
extern u32 vmx_cpu_based_exec_control;
|
||||
|
||||
#define PIN_BASED_EXT_INTR_MASK 0x00000001
|
||||
@@ -119,8 +120,16 @@ extern u32 vmx_vmexit_control;
|
||||
#define VM_ENTRY_DEACT_DUAL_MONITOR 0x00000800
|
||||
extern u32 vmx_vmentry_control;
|
||||
|
||||
+#define SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES 0x00000001
|
||||
+extern u32 vmx_secondary_exec_control;
|
||||
+
|
||||
+#define cpu_has_vmx_virtualize_apic_accesses \
|
||||
+ (vmx_secondary_exec_control & SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES)
|
||||
#define cpu_has_vmx_tpr_shadow \
|
||||
(vmx_cpu_based_exec_control & CPU_BASED_TPR_SHADOW)
|
||||
+#define cpu_has_vmx_mmap_vtpr_optimization \
|
||||
+ (cpu_has_vmx_virtualize_apic_accesses && cpu_has_vmx_tpr_shadow)
|
||||
+
|
||||
#define cpu_has_vmx_msr_bitmap \
|
||||
(vmx_cpu_based_exec_control & CPU_BASED_ACTIVATE_MSR_BITMAP)
|
||||
extern char *vmx_msr_bitmap;
|
||||
@@ -158,6 +167,8 @@ enum vmcs_field {
|
||||
TSC_OFFSET_HIGH = 0x00002011,
|
||||
VIRTUAL_APIC_PAGE_ADDR = 0x00002012,
|
||||
VIRTUAL_APIC_PAGE_ADDR_HIGH = 0x00002013,
|
||||
+ APIC_ACCESS_ADDR = 0x00002014,
|
||||
+ APIC_ACCESS_ADDR_HIGH = 0x00002015,
|
||||
VMCS_LINK_POINTER = 0x00002800,
|
||||
VMCS_LINK_POINTER_HIGH = 0x00002801,
|
||||
GUEST_IA32_DEBUGCTL = 0x00002802,
|
||||
Index: xen-3.1-testing/xen/include/asm-x86/hvm/vmx/vmx.h
|
||||
===================================================================
|
||||
--- xen-3.1-testing.orig/xen/include/asm-x86/hvm/vmx/vmx.h
|
||||
+++ xen-3.1-testing/xen/include/asm-x86/hvm/vmx/vmx.h
|
||||
@@ -33,6 +33,9 @@ void vmx_intr_assist(void);
|
||||
void vmx_do_resume(struct vcpu *);
|
||||
void set_guest_time(struct vcpu *v, u64 gtime);
|
||||
|
||||
+extern struct page_info *change_guest_physmap_for_vtpr(struct domain *d,
|
||||
+ int enable_vtpr);
|
||||
+
|
||||
/*
|
||||
* Exit Reasons
|
||||
*/
|
||||
@@ -81,6 +84,7 @@ void set_guest_time(struct vcpu *v, u64
|
||||
#define EXIT_REASON_MACHINE_CHECK 41
|
||||
|
||||
#define EXIT_REASON_TPR_BELOW_THRESHOLD 43
|
||||
+#define EXIT_REASON_APIC_ACCESS 44
|
||||
|
||||
/*
|
||||
* Interruption-information format
|
||||
Index: xen-3.1-testing/xen/include/asm-x86/msr.h
|
||||
===================================================================
|
||||
--- xen-3.1-testing.orig/xen/include/asm-x86/msr.h
|
||||
+++ xen-3.1-testing/xen/include/asm-x86/msr.h
|
||||
@@ -116,6 +116,7 @@ static inline void wrmsrl(unsigned int m
|
||||
#define MSR_IA32_VMX_CR0_FIXED1 0x487
|
||||
#define MSR_IA32_VMX_CR4_FIXED0 0x488
|
||||
#define MSR_IA32_VMX_CR4_FIXED1 0x489
|
||||
+#define MSR_IA32_VMX_PROCBASED_CTLS2 0x48b
|
||||
#define IA32_FEATURE_CONTROL_MSR 0x3a
|
||||
#define IA32_FEATURE_CONTROL_MSR_LOCK 0x1
|
||||
#define IA32_FEATURE_CONTROL_MSR_ENABLE_VMXON 0x4
|
11
hvm_vnc.diff
Normal file
11
hvm_vnc.diff
Normal file
@ -0,0 +1,11 @@
|
||||
diff -ru a/tools/python/xen/xend/XendConfig.py b/tools/python/xen/xend/XendConfig.py
|
||||
--- a/tools/python/xen/xend/XendConfig.py 2007-09-07 11:31:20.000000000 -0600
|
||||
+++ b/tools/python/xen/xend/XendConfig.py 2007-09-07 14:07:50.000000000 -0600
|
||||
@@ -726,6 +726,7 @@
|
||||
|
||||
if not has_rfb:
|
||||
dev_config = ['vfb']
|
||||
+ dev_config.append(['type', 'vnc'])
|
||||
# copy VNC related params from platform config to vfb dev conf
|
||||
for key in ['vncpasswd', 'vncunused', 'vncdisplay',
|
||||
'vnclisten']:
|
172
network-multinet
172
network-multinet
@ -1,22 +1,22 @@
|
||||
#!/bin/sh
|
||||
#============================================================================
|
||||
# network-multi_net
|
||||
# network-multinet
|
||||
#
|
||||
# Version = 1.1.2
|
||||
# Date = 2007-07-11
|
||||
# Version = 1.3.1
|
||||
# Date = 2007-08-29
|
||||
#
|
||||
# Maintainer(s) = Ron Terry - ron (at) pronetworkconsulting (dot) com
|
||||
#
|
||||
# The latest version can be found at:
|
||||
#
|
||||
# http://pronetworkconsulting.com/linux/scripts/network-multi_net.html
|
||||
# http://pronetworkconsulting.com/linux/scripts/network-multinet.html
|
||||
#
|
||||
# Description:
|
||||
#
|
||||
# Replacement for the xen network-bridge, network-nat and network-route
|
||||
# scripts. This script allows for the creation of multiple bridges.
|
||||
#
|
||||
# This script can create 3 types of bridges:
|
||||
# This script can create 4 types of bridges:
|
||||
#
|
||||
# traditional bridges: -Bridges that contain both a physical network
|
||||
# device (ethX) and a virtual network device (vethX)
|
||||
@ -55,6 +55,13 @@
|
||||
# -These can be used to allow VMs in DomUs to
|
||||
# communicate only with other DomUs and not Dom0.
|
||||
#
|
||||
# nohost bridges: -Bridges that contain a physical network device
|
||||
# but not a virtual network device from Dom0.
|
||||
# -These can be used to allow virtual machines to
|
||||
# communicate with the outside world but not with
|
||||
# Dom0. (Usefull if you want to isolate traffic
|
||||
# away from Dom0)
|
||||
#
|
||||
# This script accepts the (start|stop|restart|status) parameters.
|
||||
#
|
||||
# This script depends on an unmodified version of the network-bridge script
|
||||
@ -96,21 +103,26 @@
|
||||
# is configured as a NAT network and the second host bridge (on veth3)
|
||||
# is configured as a hostonly network.
|
||||
#
|
||||
# Edit the NOHOST_BRIDGE_LIST variable to define which bridges you would
|
||||
# like to be connected to the outside world but not Dom0. These are
|
||||
# usefull if you want to allow VMs to access the outside world but you
|
||||
# want to isolate traffic away from Dom0.
|
||||
#
|
||||
# Edit the EMPTY_BRIDGE_LIST variable to define which empty bridges to
|
||||
# create. This list should contain the numbers of the bridges to
|
||||
# create (4 5 6 7)
|
||||
#
|
||||
# To enable this script edit the network-script field in the
|
||||
# /etc/xen/xen-config.sxp file.
|
||||
# /etc/xen/xend-config.sxp file.
|
||||
#
|
||||
# Example: (network-script network-multi_net)
|
||||
# Example: (network-script network-multinet)
|
||||
#
|
||||
# Depends on: /etc/xen/scripts/xen-network-common.sh
|
||||
# /etc/xen/scripts/network-bridge
|
||||
#
|
||||
# Config file: /etc/sysconfig/xend
|
||||
# Config file: /etc/sysconfig/xendconfig
|
||||
#
|
||||
# Usage: network-multi_net (start|stop|restart|status)
|
||||
# Usage: network-multinet (start|stop|restart|status)
|
||||
#
|
||||
# Vars:
|
||||
#
|
||||
@ -123,11 +135,20 @@
|
||||
# LOCAL_BRIDGE_LIST -Space delimited list of virtual network devices to
|
||||
# create local bridges on using the following format:
|
||||
#
|
||||
# <virtual network device>,<mac address>,<IP address/CIDR NetMask>,<nat|hostonly|routed>
|
||||
# <virtual network device>,<mac address>,<IP address/CIDR NetMask>,<nat|hostonly|routed>,<dhcp-on|dhcp-off>
|
||||
#
|
||||
# Example with 2 virtual devices:
|
||||
#
|
||||
# "veth2,00:16:3E:01:00:02,172.22.0.1/16,nat veth3,00:16:3E:01:00:03,172.23.0.1/16,hostonly"
|
||||
# "veth2,00:16:3E:01:00:02,172.22.0.1/16,nat,dhcp-on veth3,00:16:3E:01:00:03,172.23.0.1/16,hostonly,dhcp-off"
|
||||
#
|
||||
# NOHOST_BRIDGE_LIST -Space delimited list of bridge numbers/NICs to create
|
||||
# "no-host" bridges on.
|
||||
#
|
||||
# <bridge number>,<physical network device>
|
||||
#
|
||||
# Example with 2 devices:
|
||||
#
|
||||
# "4,eth1 5.eth2"
|
||||
#
|
||||
# EMPTY_BRIDGE_LIST -Space delimited list of bridge numbers to create as
|
||||
# empty bridges.
|
||||
@ -148,8 +169,10 @@
|
||||
. /etc/sysconfig/xend
|
||||
|
||||
SCRIPT_PATH="/etc/xen/scripts"
|
||||
CONF_FILE_PATH="/etc/xen/conf"
|
||||
NETWORK_SAVE_PATH="/var/lib/xend/network_save"
|
||||
IPTABLES_SAVE_FILE="$NETWORK_SAVE_PATH/iptables-save"
|
||||
XEN_DHCP_SCRIPT="$SCRIPT_PATH/xen-dhcpd"
|
||||
|
||||
#### Script Functions #####################################################
|
||||
|
||||
@ -171,12 +194,17 @@ get_option() {
|
||||
esac
|
||||
}
|
||||
|
||||
make_save_dir() {
|
||||
make_config_dirs() {
|
||||
# Create temporary storage directory if needed.
|
||||
if ! [ -d "$NETWORK_SAVE_PATH" ]
|
||||
then
|
||||
mkdir $NETWORK_SAVE_PATH
|
||||
fi
|
||||
|
||||
if ! [ -d $CONF_FILE_PATH ]
|
||||
then
|
||||
mkdir $CONF_FILE_PATH
|
||||
fi
|
||||
}
|
||||
|
||||
manage_routing() {
|
||||
@ -385,6 +413,7 @@ setup_host_interface() {
|
||||
|
||||
# bring it back up
|
||||
ip link set $DEV up
|
||||
ip link set $DEV arp on
|
||||
;;
|
||||
stop)
|
||||
# take the interface down
|
||||
@ -580,6 +609,89 @@ create_local_bridges() {
|
||||
done
|
||||
}
|
||||
|
||||
create_nohost_bridges() {
|
||||
# Creates bridges attached to an external interface but no devices in Dom0.
|
||||
#
|
||||
# This function reads the start,stop,status parameter from the $CMD_OPT
|
||||
# variable and responds respectively.
|
||||
|
||||
echo ""
|
||||
echo "============================================================"
|
||||
for BRIDGE in $NOHOST_BRIDGE_LIST
|
||||
do
|
||||
|
||||
local DEV=`echo $BRIDGE|cut -d "," -f 1`
|
||||
local PDEV=p$DEV
|
||||
local MAC=`ip link show ${i} | grep 'link\/ether' | sed -e 's/.*ether \(..:..:..:..:..:..\).*/\1/'`
|
||||
local BRIDGE_NUM=`echo $BRIDGE|cut -d "," -f 2`
|
||||
local BR_NAME=$BRIDGE_NAME$BRIDGE_NUM
|
||||
|
||||
case $CMD_OPT in
|
||||
start)
|
||||
if ! brctl show | grep -qw "^$BR_NAME"
|
||||
then
|
||||
echo ""
|
||||
echo "============================================================"
|
||||
echo "Configuring Virtual No-Host Bridge: $BR_NAME"
|
||||
echo ""
|
||||
echo " using- Virtual Device: $DEV"
|
||||
|
||||
# create the bridge
|
||||
create_bridge $BR_NAME
|
||||
|
||||
# back up the interface's info (MAC, etc)
|
||||
echo $MAC > $NETWORK_SAVE_PATH/$DEV-info
|
||||
|
||||
# configure the interface as a bridge port
|
||||
setup_bridge_port $DEV
|
||||
|
||||
# rename the physical interface
|
||||
ip link set $DEV name $PDEV
|
||||
|
||||
# add the interface to the bridge
|
||||
add_to_bridge $BR_NAME $PDEV
|
||||
fi
|
||||
;;
|
||||
stop)
|
||||
if brctl show | grep -qw "^$BR_NAME"
|
||||
then
|
||||
echo "============================================================"
|
||||
echo "Removing Virtual No-Host Bridge: $BR_NAME"
|
||||
echo ""
|
||||
|
||||
# bring the bridge down
|
||||
ip link set $BR_NAME down
|
||||
|
||||
# remove the interface from the bridge
|
||||
brctl delif $BR_NAME $PDEV
|
||||
|
||||
# remove the bridge
|
||||
brctl delbr $BR_NAME
|
||||
|
||||
# bring the interface down
|
||||
ip link set down $PDEV
|
||||
|
||||
# reset the interface back to normal
|
||||
ip link set $PDEV arp on
|
||||
ip link set $PDEV multicast on
|
||||
|
||||
# reset the interface back to its original name and MAC
|
||||
ip link set $PDEV name $DEV
|
||||
ip link set $DEV addr `cat $NETWORK_SAVE_PATH/$DEV-info`
|
||||
rm -f `cat $NETWORK_SAVE_PATH/$DEV-info`
|
||||
|
||||
# bring the interface back up
|
||||
ifup $DEV
|
||||
fi
|
||||
;;
|
||||
status)
|
||||
brctl show $BR_NAME | grep -w "^$BR_NAME"
|
||||
;;
|
||||
esac
|
||||
done
|
||||
echo "============================================================"
|
||||
}
|
||||
|
||||
create_empty_bridges() {
|
||||
# Creates bridges attached to no devices in Dom0.
|
||||
#
|
||||
@ -625,12 +737,13 @@ start_xend_network() {
|
||||
echo "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%"
|
||||
echo " Starting the xend network environment"
|
||||
echo "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%"
|
||||
make_save_dir
|
||||
make_config_dirs
|
||||
manage_susefirewall2 || manage_iptables
|
||||
create_traditional_bridges
|
||||
manage_routing
|
||||
create_local_bridges
|
||||
create_empty_bridges
|
||||
create_nohost_bridges
|
||||
}
|
||||
|
||||
stop_xend_network() {
|
||||
@ -641,6 +754,7 @@ stop_xend_network() {
|
||||
create_traditional_bridges
|
||||
create_local_bridges
|
||||
create_empty_bridges
|
||||
create_nohost_bridges
|
||||
manage_routing
|
||||
manage_susefirewall2 || manage_iptables
|
||||
}
|
||||
@ -649,28 +763,58 @@ show_xend_network_status() {
|
||||
create_traditional_bridges
|
||||
create_local_bridges
|
||||
create_empty_bridges
|
||||
create_nohost_bridges
|
||||
}
|
||||
|
||||
#### Maid Code Body #######################################################
|
||||
#### Main Code Body #######################################################
|
||||
|
||||
get_option "$1"
|
||||
|
||||
case $CMD_OPT in
|
||||
start)
|
||||
# Start the Xen network
|
||||
start_xend_network
|
||||
|
||||
# Start the DHCP server if it exists
|
||||
if [ -e $XEN_DHCP_SCRIPT ]
|
||||
then
|
||||
$XEN_DHCP_SCRIPT start
|
||||
fi
|
||||
;;
|
||||
stop)
|
||||
# Stop the DHCP server if it exists
|
||||
if [ -e $XEN_DHCP_SCRIPT ]
|
||||
then
|
||||
$XEN_DHCP_SCRIPT stop
|
||||
fi
|
||||
|
||||
# Stop the Xen network
|
||||
stop_xend_network
|
||||
;;
|
||||
restart)
|
||||
# Stop the DHCP server if it exists
|
||||
if [ -e $XEN_DHCP_SCRIPT ]
|
||||
then
|
||||
$XEN_DHCP_SCRIPT stop
|
||||
fi
|
||||
|
||||
# Stop the Xen network
|
||||
CMD_OPT="stop"
|
||||
stop_xend_network
|
||||
|
||||
# Start the Xen network
|
||||
CMD_OPT="start"
|
||||
start_xend_network
|
||||
|
||||
# Start the DHCP server if it exists
|
||||
if [ -e $XEN_DHCP_SCRIPT ]
|
||||
then
|
||||
$XEN_DHCP_SCRIPT start
|
||||
fi
|
||||
;;
|
||||
status)
|
||||
show_xend_network_status
|
||||
$XEN_DHCP_SCRIPT status
|
||||
;;
|
||||
esac
|
||||
|
||||
|
85
svm-cr8-performance.diff
Normal file
85
svm-cr8-performance.diff
Normal file
@ -0,0 +1,85 @@
|
||||
[SVM] Greatly reduce total number of CR8 intercepts
|
||||
|
||||
This patch reduces the number of CR8 intercept to a fraction of the
|
||||
number of CR8 intercepts without. First, CR8 read intercepts are
|
||||
completely disabled since the SVM vTPR is kept kept in sync with the HVM
|
||||
vLAPIC. Second, CR8 write intercepts are enabled and disabled based
|
||||
upon certain conditions. Most of the time, CR8 write intercepts are
|
||||
disabled. They are enabled only when there is a pending interrupt that
|
||||
can't be delivered because of either the current ISR or TPR (aka PPR)
|
||||
because this is the only time the TPR matters.
|
||||
|
||||
With this patch, the number of CR8 intercepts dropped from around
|
||||
10,000,000 to around 6,000 during boot of Windows 2003 Server 64-bit
|
||||
(this is a rough estimate).
|
||||
|
||||
Signed-off-by: Travis Betak <travis.betak@amd.com>
|
||||
|
||||
Index: xen-3.1-testing/xen/arch/x86/hvm/svm/intr.c
|
||||
===================================================================
|
||||
--- xen-3.1-testing.orig/xen/arch/x86/hvm/svm/intr.c
|
||||
+++ xen-3.1-testing/xen/arch/x86/hvm/svm/intr.c
|
||||
@@ -63,9 +63,20 @@ static inline int svm_inject_extint(stru
|
||||
asmlinkage void svm_intr_assist(void)
|
||||
{
|
||||
struct vcpu *v = current;
|
||||
+ struct vlapic *vlapic = vcpu_vlapic(v);
|
||||
struct vmcb_struct *vmcb = v->arch.hvm_svm.vmcb;
|
||||
int intr_type = APIC_DM_EXTINT;
|
||||
int intr_vector = -1;
|
||||
+ vintr_t *intr = &vmcb->vintr;
|
||||
+
|
||||
+ /*
|
||||
+ * Before doing anything else, we need to sync up the VLAPIC's TPR with
|
||||
+ * SVM's vTPR if CR8 writes are currently disabled. It's OK if the
|
||||
+ * guest doesn't touch the CR8 (e.g. 32-bit Windows) because we update
|
||||
+ * the vTPR on MMIO writes to the TPR
|
||||
+ */
|
||||
+ if ( !(vmcb->cr_intercepts & CR_INTERCEPT_CR8_WRITE) )
|
||||
+ vlapic_set_reg(vlapic, APIC_TASKPRI, (intr->fields.tpr & 0x0F) << 4);
|
||||
|
||||
/*
|
||||
* Previous Interrupt delivery caused this intercept?
|
||||
@@ -98,7 +109,22 @@ asmlinkage void svm_intr_assist(void)
|
||||
pt_update_irq(v);
|
||||
hvm_set_callback_irq_level();
|
||||
if ( !cpu_has_pending_irq(v) )
|
||||
+ {
|
||||
+ /*
|
||||
+ * Before we return, let's check if there is a pending interrupt
|
||||
+ * that just happens to be blocked (either ISR or TPR aka PPR).
|
||||
+ * Enable CR8 write intercepts in case the guest unmasks the
|
||||
+ * pending interrupt.
|
||||
+ */
|
||||
+ if ( vlapic_enabled(vlapic)
|
||||
+ && (vlapic_find_highest_irr(vlapic) != -1) )
|
||||
+ vmcb->cr_intercepts |= CR_INTERCEPT_CR8_WRITE;
|
||||
+
|
||||
return;
|
||||
+ }
|
||||
+
|
||||
+ /* It should be fairly safe to disable CR8 write intercepts here */
|
||||
+ vmcb->cr_intercepts &= ~CR_INTERCEPT_CR8_WRITE;
|
||||
|
||||
/*
|
||||
* If the guest can't take an interrupt right now, create a 'fake'
|
||||
Index: xen-3.1-testing/xen/arch/x86/hvm/svm/vmcb.c
|
||||
===================================================================
|
||||
--- xen-3.1-testing.orig/xen/arch/x86/hvm/svm/vmcb.c
|
||||
+++ xen-3.1-testing/xen/arch/x86/hvm/svm/vmcb.c
|
||||
@@ -130,8 +130,13 @@ static int construct_vmcb(struct vcpu *v
|
||||
/* Intercept all debug-register writes. */
|
||||
vmcb->dr_intercepts = DR_INTERCEPT_ALL_WRITES;
|
||||
|
||||
- /* Intercept all control-register accesses, except to CR2. */
|
||||
- vmcb->cr_intercepts = ~(CR_INTERCEPT_CR2_READ | CR_INTERCEPT_CR2_WRITE);
|
||||
+ /*
|
||||
+ * Intercept all control-register accesses except for CR2 reads/writes
|
||||
+ * and CR8 reads (and actually CR8 writes, but that's a special case
|
||||
+ * that's handled in svm/intr.c).
|
||||
+ */
|
||||
+ vmcb->cr_intercepts = ~(CR_INTERCEPT_CR2_READ | CR_INTERCEPT_CR2_WRITE
|
||||
+ | CR_INTERCEPT_CR8_READ);
|
||||
|
||||
/* I/O and MSR permission bitmaps. */
|
||||
arch_svm->msrpm = alloc_xenheap_pages(get_order_from_bytes(MSRPM_SIZE));
|
15
xen.changes
15
xen.changes
@ -1,3 +1,18 @@
|
||||
-------------------------------------------------------------------
|
||||
Fri Sep 7 14:17:11 MDT 2007 - jfehlig@novell.com
|
||||
|
||||
- #297125: Expose 'type vnc' in vfb device sexp for HVM guests.
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Thu Sep 6 14:42:19 MDT 2007 - ccoffing@novell.com
|
||||
|
||||
- #302106: Update network-multinet
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Wed Sep 5 09:12:31 MDT 2007 - carnold@novell.com
|
||||
|
||||
- #307458: AMD-V CR8 intercept reduction for HVM windows 64b guests
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Wed Aug 29 16:20:48 MDT 2007 - ccoffing@novell.com
|
||||
|
||||
|
94
xen.spec
94
xen.spec
@ -34,7 +34,7 @@ BuildRequires: glibc-32bit glibc-devel-32bit
|
||||
BuildRequires: kernel-source kernel-syms module-init-tools xorg-x11
|
||||
%endif
|
||||
Version: 3.1.0_15042
|
||||
Release: 38
|
||||
Release: 41
|
||||
License: GPL v2 only
|
||||
Group: System/Kernel
|
||||
Autoreqprov: on
|
||||
@ -69,46 +69,47 @@ Patch8: 15157_xend_device_destroy.patch
|
||||
Patch9: 15168-check-dup-domians.patch
|
||||
Patch10: 15173-32on64-runstate.patch
|
||||
Patch11: 15183-32on64-multicall.patch
|
||||
Patch12: 15189-pmtimer.patch
|
||||
Patch13: 15190-clocksource-opt.patch
|
||||
Patch14: 15217-hvm-save-restore.patch
|
||||
Patch15: 15228-hvm-usb-windows-crash.patch
|
||||
Patch16: 15230-hvm-usb-windows-crash.patch
|
||||
Patch17: 15234-hvm-usb-windows-crash.patch
|
||||
Patch18: 15250_xend_device_destroy.patch
|
||||
Patch19: 15257-hvm-save-restore.patch
|
||||
Patch20: 15273_libxenapi.patch
|
||||
Patch21: 15274_xenapi.patch
|
||||
Patch22: 15275_xenapi.patch
|
||||
Patch23: 15277-hvm-intel2amd-windows-migrate.patch
|
||||
Patch24: 15381-log-svm-npt.patch
|
||||
Patch25: 15383-hvm-usb-windows-crash.patch
|
||||
Patch26: 15389-32on64-memop-error-path.patch
|
||||
Patch27: 15390-32on64-setup-error-path.patch
|
||||
Patch28: 15391-32on64-setup-pgtable.patch
|
||||
Patch29: 15410-domain-restore.patch
|
||||
Patch30: 15416-x86_64-failsafe.patch
|
||||
Patch31: 15418-hvm-usb-windows-crash.patch
|
||||
Patch32: 15433-pae-ptwr-check.patch
|
||||
Patch33: 15444-vmxassist-p2r.patch
|
||||
Patch34: 15469-hvm-save-restore.patch
|
||||
Patch35: 15477_dev_attach.patch
|
||||
Patch36: 15480-man-xm.patch
|
||||
Patch37: 15528-hvm-sles9-install.patch
|
||||
Patch38: 15587-domid-reset.patch
|
||||
Patch39: 15595-rtl8139-data-corruption.patch
|
||||
Patch40: 15596-rtl8139-crc-fix.patch
|
||||
Patch41: 15609-save-mem-values.patch
|
||||
Patch42: 15642_uuid_unique.patch
|
||||
Patch43: 15645-hvm-save-restore.patch
|
||||
Patch44: 15649_xenapi.patch
|
||||
Patch45: 15650_xenapi.patch
|
||||
Patch46: 15651_xenapi.patch
|
||||
Patch47: 15689_dev_destroy_cleanup.patch
|
||||
Patch48: 15691-hvm-save-restore.patch
|
||||
Patch49: 15693-32on64-gnttab-err.patch
|
||||
Patch50: 15716_dev_detach.patch
|
||||
Patch51: fix_15716.patch
|
||||
Patch12: 15185-vtpr.patch
|
||||
Patch13: 15189-pmtimer.patch
|
||||
Patch14: 15190-clocksource-opt.patch
|
||||
Patch15: 15217-hvm-save-restore.patch
|
||||
Patch16: 15228-hvm-usb-windows-crash.patch
|
||||
Patch17: 15230-hvm-usb-windows-crash.patch
|
||||
Patch18: 15234-hvm-usb-windows-crash.patch
|
||||
Patch19: 15250_xend_device_destroy.patch
|
||||
Patch20: 15257-hvm-save-restore.patch
|
||||
Patch21: 15273_libxenapi.patch
|
||||
Patch22: 15274_xenapi.patch
|
||||
Patch23: 15275_xenapi.patch
|
||||
Patch24: 15277-hvm-intel2amd-windows-migrate.patch
|
||||
Patch25: 15381-log-svm-npt.patch
|
||||
Patch26: 15383-hvm-usb-windows-crash.patch
|
||||
Patch27: 15389-32on64-memop-error-path.patch
|
||||
Patch28: 15390-32on64-setup-error-path.patch
|
||||
Patch29: 15391-32on64-setup-pgtable.patch
|
||||
Patch30: 15410-domain-restore.patch
|
||||
Patch31: 15416-x86_64-failsafe.patch
|
||||
Patch32: 15418-hvm-usb-windows-crash.patch
|
||||
Patch33: 15433-pae-ptwr-check.patch
|
||||
Patch34: 15444-vmxassist-p2r.patch
|
||||
Patch35: 15469-hvm-save-restore.patch
|
||||
Patch36: 15477_dev_attach.patch
|
||||
Patch37: 15480-man-xm.patch
|
||||
Patch38: 15528-hvm-sles9-install.patch
|
||||
Patch39: 15587-domid-reset.patch
|
||||
Patch40: 15595-rtl8139-data-corruption.patch
|
||||
Patch41: 15596-rtl8139-crc-fix.patch
|
||||
Patch42: 15609-save-mem-values.patch
|
||||
Patch43: 15642_uuid_unique.patch
|
||||
Patch44: 15645-hvm-save-restore.patch
|
||||
Patch45: 15649_xenapi.patch
|
||||
Patch46: 15650_xenapi.patch
|
||||
Patch47: 15651_xenapi.patch
|
||||
Patch48: 15689_dev_destroy_cleanup.patch
|
||||
Patch49: 15691-hvm-save-restore.patch
|
||||
Patch50: 15693-32on64-gnttab-err.patch
|
||||
Patch51: 15716_dev_detach.patch
|
||||
Patch52: fix_15716.patch
|
||||
# Our patches
|
||||
Patch100: xen-config.diff
|
||||
Patch101: xend-config.diff
|
||||
@ -155,6 +156,8 @@ Patch152: bridge-hostonly.diff
|
||||
Patch153: bridge-vlan.diff
|
||||
Patch154: pci-passthru-reboot-fix.patch
|
||||
Patch155: keymap_nl-be.patch
|
||||
Patch156: svm-cr8-performance.diff
|
||||
Patch157: hvm_vnc.diff
|
||||
# Patches from Jan
|
||||
Patch200: inval-sh-ldt.patch
|
||||
Patch201: 32on64-cpuid.patch
|
||||
@ -610,6 +613,7 @@ Authors:
|
||||
%patch49 -p1
|
||||
%patch50 -p1
|
||||
%patch51 -p1
|
||||
%patch52 -p1
|
||||
%patch100 -p1
|
||||
%patch101 -p1
|
||||
%patch102 -p1
|
||||
@ -655,6 +659,8 @@ Authors:
|
||||
%patch153 -p1
|
||||
%patch154 -p1
|
||||
%patch155 -p1
|
||||
%patch156 -p1
|
||||
%patch157 -p1
|
||||
%patch200 -p1
|
||||
%patch201 -p1
|
||||
%patch202 -p1
|
||||
@ -997,6 +1003,12 @@ rm -f $RPM_BUILD_ROOT/%pysite/*.egg-info
|
||||
/sbin/ldconfig
|
||||
|
||||
%changelog
|
||||
* Fri Sep 07 2007 - jfehlig@novell.com
|
||||
- #297125: Expose 'type vnc' in vfb device sexp for HVM guests.
|
||||
* Thu Sep 06 2007 - ccoffing@novell.com
|
||||
- #302106: Update network-multinet
|
||||
* Wed Sep 05 2007 - carnold@novell.com
|
||||
- #307458: AMD-V CR8 intercept reduction for HVM windows 64b guests
|
||||
* Wed Aug 29 2007 - ccoffing@novell.com
|
||||
- Update block-iscsi to match changes to open-iscsi.
|
||||
* Mon Aug 27 2007 - carnold@novell.com
|
||||
|
Loading…
Reference in New Issue
Block a user