diff --git a/23614-x86_64-EFI-boot.patch b/23614-x86_64-EFI-boot.patch index 642c261..c719d44 100644 --- a/23614-x86_64-EFI-boot.patch +++ b/23614-x86_64-EFI-boot.patch @@ -42,6 +42,23 @@ EFI_VENDOR. Signed-off-by: Jan Beulich +# HG changeset patch +# User Jan Beulich +# Date 1310127785 -3600 +# Node ID 88823213a4780ebced6d7adcb1ffd2dda6a339ca +# Parent d1a2861b9caa1a428a531c0d68b372df872d5b0d +x86-64/EFI: discard .comment.* sections + +The SuSE version of gcc produces a non-standard section named +.comment.SUSE.OPTs, but the PE32+ handling in binutils can't really +deal with any section to be placed at virtual address zero (and not +needing to be loaded). Even if binutils did, at least the UEFI +implementation in EDK 1.06 doesn't look at the section characteristics +at all, and hence would attempt to load such a section, and fail or +corrupt other data. + +Signed-off-by: Jan Beulich + --- a/xen/Makefile +++ b/xen/Makefile @@ -11,6 +11,8 @@ export XEN_DOMAIN ?= $(shell ([ -x /bin/ @@ -2294,7 +2311,7 @@ Signed-off-by: Jan Beulich PHDRS { text PT_LOAD ; -@@ -122,12 +141,29 @@ SECTIONS +@@ -122,12 +141,30 @@ SECTIONS } :text _end = . ; @@ -2320,6 +2337,7 @@ Signed-off-by: Jan Beulich *(.eh_frame) +#ifdef EFI + *(.comment) ++ *(.comment.*) +#endif } diff --git a/23615-x86_64-EFI-runtime.patch b/23615-x86_64-EFI-runtime.patch index 9e40c7d..428dd85 100644 --- a/23615-x86_64-EFI-runtime.patch +++ b/23615-x86_64-EFI-runtime.patch @@ -30,6 +30,20 @@ having established the normal page tables again afterwards). Signed-off-by: Jan Beulich +# HG changeset patch +# User Jan Beulich +# Date 1311081015 -3600 +# Node ID 7bc5825e471db5a3a989f47d21334ef63a6b5610 +# Parent 0ccb94d533d6feaece5d48eb1bbfb9ae1b6174c1 +x86-64/EFI: don't call EfiResetSystem() from machine_halt() + +c/s 23615:d19e77844267 was a little too eager in adding calls to EFI +runtime services: machine_halt() doesn't really want to power off the +machine, but that's what EfiResetSystem(EfiResetShutdown, ...) (called +through efi_halt_system()) does. + +Signed-off-by: Jan Beulich + --- a/xen/arch/x86/efi/boot.c +++ b/xen/arch/x86/efi/boot.c @@ -16,6 +16,7 @@ @@ -636,15 +650,7 @@ Signed-off-by: Jan Beulich #include #include #include -@@ -95,6 +96,7 @@ void machine_halt(void) - watchdog_disable(); - console_start_sync(); - local_irq_enable(); -+ efi_halt_system(); - smp_call_function(__machine_halt, NULL, 0); - __machine_halt(NULL); - } -@@ -337,6 +339,8 @@ void machine_restart(unsigned int delay_ +@@ -337,6 +338,8 @@ void machine_restart(unsigned int delay_ if ( tboot_in_measured_env() ) tboot_shutdown(TB_SHUTDOWN_REBOOT); diff --git a/23676-x86_64-image-map-bounds.patch b/23676-x86_64-image-map-bounds.patch new file mode 100644 index 0000000..a15a158 --- /dev/null +++ b/23676-x86_64-image-map-bounds.patch @@ -0,0 +1,59 @@ +# HG changeset patch +# User Jan Beulich +# Date 1310631973 -3600 +# Node ID 80c9db90bba96e443a22d268c06948fdef9c6a75 +# Parent 88823213a4780ebced6d7adcb1ffd2dda6a339ca +x86-64: properly handle alias mappings beyond _end + +Changeset 19632:b0966b6f5180 wasn't really complete: The Xen image +mapping doesn't end at _end, but a full 16Mb gets mapped during boot +(and never got unmapped so far), hence all of this space was subject +to alias mappings when it comes to cache attribute changes. Unmap all +full large pages between _end and the 16Mb boundary, and include all +other pages beyond _end when checking for aliases. + +Signed-off-by: Jan Beulich + +--- a/xen/arch/x86/mm.c ++++ b/xen/arch/x86/mm.c +@@ -776,7 +776,7 @@ static int update_xen_mappings(unsigned + int err = 0; + #ifdef __x86_64__ + bool_t alias = mfn >= PFN_DOWN(xen_phys_start) && +- mfn < PFN_UP(xen_phys_start + (unsigned long)_end - XEN_VIRT_START); ++ mfn < PFN_UP(xen_phys_start + xen_virt_end - XEN_VIRT_START); + unsigned long xen_va = + XEN_VIRT_START + ((mfn - PFN_DOWN(xen_phys_start)) << PAGE_SHIFT); + +--- a/xen/arch/x86/setup.c ++++ b/xen/arch/x86/setup.c +@@ -99,6 +99,8 @@ unsigned long __read_mostly xen_phys_sta + /* Limits of Xen heap, used to initialise the allocator. */ + unsigned long __initdata xenheap_initial_phys_start; + unsigned long __read_mostly xenheap_phys_end; ++#else ++unsigned long __read_mostly xen_virt_end; + #endif + + DEFINE_PER_CPU(struct tss_struct, init_tss); +@@ -1098,6 +1100,9 @@ void __init __start_xen(unsigned long mb + map_pages_to_xen((unsigned long)__va(kexec_crash_area.start), + kexec_crash_area.start >> PAGE_SHIFT, + PFN_UP(kexec_crash_area.size), PAGE_HYPERVISOR); ++ xen_virt_end = ((unsigned long)_end + (1UL << L2_PAGETABLE_SHIFT) - 1) & ++ ~((1UL << L2_PAGETABLE_SHIFT) - 1); ++ destroy_xen_mappings(xen_virt_end, XEN_VIRT_START + BOOTSTRAP_MAP_BASE); + #endif + + memguard_init(); +--- a/xen/include/asm-x86/x86_64/page.h ++++ b/xen/include/asm-x86/x86_64/page.h +@@ -34,6 +34,8 @@ + #include + #include + ++extern unsigned long xen_virt_end; ++ + extern unsigned long max_pdx; + extern unsigned long pfn_pdx_bottom_mask, ma_va_bottom_mask; + extern unsigned int pfn_pdx_hole_shift; diff --git a/23706-fix-20892.patch b/23706-fix-20892.patch new file mode 100644 index 0000000..1c9209b --- /dev/null +++ b/23706-fix-20892.patch @@ -0,0 +1,28 @@ +# HG changeset patch +# User Jan Beulich +# Date 1310804301 -3600 +# Node ID 3dd399873c9ef7762f4353f3259e502394f56a34 +# Parent 24e9ca968a2bc09d1aac927fcdbb7b769901d067 +x86: fix guest migration after c/s 20892:d311d1efc25e + +Guests would not manage to run successfully after being migrated to a +host having sufficiently much more memory than the host they were +originally started on. + +Subsequently the plan is to re-enable the changes behavior under the +control of a guest kernel announced feature flag. + +Signed-off-by: Jan Beulich +Acked-by: Ian Campbell + +--- a/xen/arch/x86/mm.c ++++ b/xen/arch/x86/mm.c +@@ -4791,7 +4791,7 @@ long arch_memory_op(int op, XEN_GUEST_HA + .max_mfn = MACH2PHYS_NR_ENTRIES - 1 + }; + +- if ( !mem_hotplug ) ++ if ( !mem_hotplug && current->domain == dom0 ) + mapping.max_mfn = max_page - 1; + if ( copy_to_guest(arg, &mapping, 1) ) + return -EFAULT; diff --git a/23723-x86-CMOS-lock.patch b/23723-x86-CMOS-lock.patch new file mode 100644 index 0000000..e7a915d --- /dev/null +++ b/23723-x86-CMOS-lock.patch @@ -0,0 +1,271 @@ +# HG changeset patch +# User Jan Beulich +# Date 1311081053 -3600 +# Node ID 18653a163b1e8e10b4353272bcb9e8302bfd2e19 +# Parent 7bc5825e471db5a3a989f47d21334ef63a6b5610 +x86: consistently serialize CMOS/RTC accesses on rtc_lock + +Since RTC/CMOS accesses aren't atomic, there are possible races +between code paths setting the index register and subsequently +reading/writing the data register. This is supposed to be dealt with +by acquiring rtc_lock, but two places up to now lacked respective +synchronization: Accesses to the EFI time functions and +smpboot_{setup,restore}_warm_reset_vector(). + +This in turn requires no longer directly passing through guest writes +to the index register, but instead using a machanism similar to that +for PCI config space method 1 accesses. + +Signed-off-by: Jan Beulich + +--- a/xen/arch/x86/efi/runtime.c ++++ b/xen/arch/x86/efi/runtime.c +@@ -3,6 +3,7 @@ + #include + #include + #include ++#include + + DEFINE_XEN_GUEST_HANDLE(CHAR16); + +@@ -80,9 +81,11 @@ unsigned long efi_get_time(void) + { + EFI_TIME time; + EFI_STATUS status; +- unsigned long cr3 = efi_rs_enter(); ++ unsigned long cr3 = efi_rs_enter(), flags; + ++ spin_lock_irqsave(&rtc_lock, flags); + status = efi_rs->GetTime(&time, NULL); ++ spin_unlock_irqrestore(&rtc_lock, flags); + efi_rs_leave(cr3); + + if ( EFI_ERROR(status) ) +@@ -223,7 +226,7 @@ static inline EFI_GUID *cast_guid(struct + + int efi_runtime_call(struct xenpf_efi_runtime_call *op) + { +- unsigned long cr3; ++ unsigned long cr3, flags; + EFI_STATUS status = EFI_NOT_STARTED; + int rc = 0; + +@@ -237,7 +240,9 @@ int efi_runtime_call(struct xenpf_efi_ru + return -EINVAL; + + cr3 = efi_rs_enter(); ++ spin_lock_irqsave(&rtc_lock, flags); + status = efi_rs->GetTime(cast_time(&op->u.get_time.time), &caps); ++ spin_unlock_irqrestore(&rtc_lock, flags); + efi_rs_leave(cr3); + + if ( !EFI_ERROR(status) ) +@@ -255,7 +260,9 @@ int efi_runtime_call(struct xenpf_efi_ru + return -EINVAL; + + cr3 = efi_rs_enter(); ++ spin_lock_irqsave(&rtc_lock, flags); + status = efi_rs->SetTime(cast_time(&op->u.set_time)); ++ spin_unlock_irqrestore(&rtc_lock, flags); + efi_rs_leave(cr3); + break; + +@@ -267,8 +274,10 @@ int efi_runtime_call(struct xenpf_efi_ru + return -EINVAL; + + cr3 = efi_rs_enter(); ++ spin_lock_irqsave(&rtc_lock, flags); + status = efi_rs->GetWakeupTime(&enabled, &pending, + cast_time(&op->u.get_wakeup_time)); ++ spin_unlock_irqrestore(&rtc_lock, flags); + efi_rs_leave(cr3); + + if ( !EFI_ERROR(status) ) +@@ -287,12 +296,14 @@ int efi_runtime_call(struct xenpf_efi_ru + return -EINVAL; + + cr3 = efi_rs_enter(); ++ spin_lock_irqsave(&rtc_lock, flags); + status = efi_rs->SetWakeupTime(!!(op->misc & + XEN_EFI_SET_WAKEUP_TIME_ENABLE), + (op->misc & + XEN_EFI_SET_WAKEUP_TIME_ENABLE_ONLY) ? + NULL : + cast_time(&op->u.set_wakeup_time)); ++ spin_unlock_irqrestore(&rtc_lock, flags); + efi_rs_leave(cr3); + + op->misc = 0; +--- a/xen/arch/x86/hpet.c ++++ b/xen/arch/x86/hpet.c +@@ -525,18 +525,10 @@ static void hpet_detach_channel(int cpu, + + #include + +-void (*pv_rtc_handler)(unsigned int port, uint8_t value); ++void (*__read_mostly pv_rtc_handler)(uint8_t index, uint8_t value); + +-static void handle_rtc_once(unsigned int port, uint8_t value) ++static void handle_rtc_once(uint8_t index, uint8_t value) + { +- static int index; +- +- if ( port == 0x70 ) +- { +- index = value; +- return; +- } +- + if ( index != RTC_REG_B ) + return; + +--- a/xen/arch/x86/traps.c ++++ b/xen/arch/x86/traps.c +@@ -67,6 +67,8 @@ + #include + #include + #include ++#include ++#include + #include + + /* +@@ -1620,6 +1622,10 @@ static int admin_io_okay( + if ( (port == 0xcf8) && (bytes == 4) ) + return 0; + ++ /* We also never permit direct access to the RTC/CMOS registers. */ ++ if ( ((port & ~1) == RTC_PORT(0)) ) ++ return 0; ++ + return ioports_access_permitted(v->domain, port, port + bytes - 1); + } + +@@ -1649,6 +1655,21 @@ static uint32_t guest_io_read( + { + sub_data = pv_pit_handler(port, 0, 0); + } ++ else if ( (port == RTC_PORT(0)) ) ++ { ++ sub_data = v->domain->arch.cmos_idx; ++ } ++ else if ( (port == RTC_PORT(1)) && ++ ioports_access_permitted(v->domain, RTC_PORT(0), ++ RTC_PORT(1)) ) ++ { ++ unsigned long flags; ++ ++ spin_lock_irqsave(&rtc_lock, flags); ++ outb(v->domain->arch.cmos_idx & 0x7f, RTC_PORT(0)); ++ sub_data = inb(RTC_PORT(1)); ++ spin_unlock_irqrestore(&rtc_lock, flags); ++ } + else if ( (port == 0xcf8) && (bytes == 4) ) + { + size = 4; +@@ -1674,8 +1695,6 @@ static uint32_t guest_io_read( + return data; + } + +-extern void (*pv_rtc_handler)(unsigned int port, uint8_t value); +- + static void guest_io_write( + unsigned int port, unsigned int bytes, uint32_t data, + struct vcpu *v, struct cpu_user_regs *regs) +@@ -1684,8 +1703,6 @@ static void guest_io_write( + { + switch ( bytes ) { + case 1: +- if ( ((port == 0x70) || (port == 0x71)) && pv_rtc_handler ) +- pv_rtc_handler(port, (uint8_t)data); + outb((uint8_t)data, port); + if ( pv_post_outb_hook ) + pv_post_outb_hook(port, (uint8_t)data); +@@ -1708,6 +1725,23 @@ static void guest_io_write( + { + pv_pit_handler(port, (uint8_t)data, 1); + } ++ else if ( (port == RTC_PORT(0)) ) ++ { ++ v->domain->arch.cmos_idx = data; ++ } ++ else if ( (port == RTC_PORT(1)) && ++ ioports_access_permitted(v->domain, RTC_PORT(0), ++ RTC_PORT(1)) ) ++ { ++ unsigned long flags; ++ ++ if ( pv_rtc_handler ) ++ pv_rtc_handler(v->domain->arch.cmos_idx & 0x7f, data); ++ spin_lock_irqsave(&rtc_lock, flags); ++ outb(v->domain->arch.cmos_idx & 0x7f, RTC_PORT(0)); ++ outb(data, RTC_PORT(1)); ++ spin_unlock_irqrestore(&rtc_lock, flags); ++ } + else if ( (port == 0xcf8) && (bytes == 4) ) + { + size = 4; +@@ -2073,10 +2107,6 @@ static int emulate_privileged_op(struct + goto fail; + if ( admin_io_okay(port, op_bytes, v, regs) ) + { +- if ( (op_bytes == 1) && +- ((port == 0x71) || (port == 0x70)) && +- pv_rtc_handler ) +- pv_rtc_handler(port, regs->eax); + io_emul(regs); + if ( (op_bytes == 1) && pv_post_outb_hook ) + pv_post_outb_hook(port, regs->eax); +--- a/xen/include/asm-x86/domain.h ++++ b/xen/include/asm-x86/domain.h +@@ -251,6 +251,7 @@ struct arch_domain + /* I/O-port admin-specified access capabilities. */ + struct rangeset *ioport_caps; + uint32_t pci_cf8; ++ uint8_t cmos_idx; + + struct list_head pdev_list; + struct hvm_domain hvm_domain; +--- a/xen/include/asm-x86/hpet.h ++++ b/xen/include/asm-x86/hpet.h +@@ -52,6 +52,7 @@ + #define HPET_TN_FSB_CAP 0x8000 + #define HPET_TN_ROUTE_SHIFT 9 + ++extern void (*pv_rtc_handler)(uint8_t reg, uint8_t value); + + #define hpet_read32(x) \ + (*(volatile u32 *)(fix_to_virt(FIX_HPET_BASE) + (x))) +--- a/xen/include/asm-x86/mach-default/smpboot_hooks.h ++++ b/xen/include/asm-x86/mach-default/smpboot_hooks.h +@@ -3,7 +3,11 @@ + + static inline void smpboot_setup_warm_reset_vector(unsigned long start_eip) + { ++ unsigned long flags; ++ ++ spin_lock_irqsave(&rtc_lock, flags); + CMOS_WRITE(0xa, 0xf); ++ spin_unlock_irqrestore(&rtc_lock, flags); + flush_tlb_local(); + Dprintk("1.\n"); + *((volatile unsigned short *) TRAMPOLINE_HIGH) = start_eip >> 4; +@@ -14,6 +18,8 @@ static inline void smpboot_setup_warm_re + + static inline void smpboot_restore_warm_reset_vector(void) + { ++ unsigned long flags; ++ + /* + * Install writable page 0 entry to set BIOS data area. + */ +@@ -23,7 +29,9 @@ static inline void smpboot_restore_warm_ + * Paranoid: Set warm reset code and vector here back + * to default values. + */ ++ spin_lock_irqsave(&rtc_lock, flags); + CMOS_WRITE(0, 0xf); ++ spin_unlock_irqrestore(&rtc_lock, flags); + + *((volatile int *) maddr_to_virt(0x467)) = 0; + } diff --git a/23724-x86-smpboot-x2apic.patch b/23724-x86-smpboot-x2apic.patch new file mode 100644 index 0000000..4ca49a7 --- /dev/null +++ b/23724-x86-smpboot-x2apic.patch @@ -0,0 +1,102 @@ +# HG changeset patch +# User Tim Deegan +# Date 1311081181 -3600 +# Node ID b3434f24b0827c5ef34e4b4a72893288e2ffbe40 +# Parent 18653a163b1e8e10b4353272bcb9e8302bfd2e19 +x86: Remove timeouts from INIT-SIPI-SIPI sequence when using x2apic. + +Some of the timeouts are pointless since they're waiting for the ICR +to ack the IPI delivery and that doesn't happen on x2apic. +The others should be benign (and are suggested in the SDM) but +removing them makes AP bringup much more reliable on some test boxes. + +Signed-off-by: Tim Deegan + +--- a/xen/arch/x86/smpboot.c ++++ b/xen/arch/x86/smpboot.c +@@ -448,29 +448,30 @@ static int wakeup_secondary_cpu(int phys + apic_icr_write(APIC_INT_LEVELTRIG | APIC_INT_ASSERT | APIC_DM_INIT, + phys_apicid); + +- Dprintk("Waiting for send to finish...\n"); +- timeout = 0; +- do { +- Dprintk("+"); +- udelay(100); +- if ( !x2apic_enabled ) ++ if ( !x2apic_enabled ) ++ { ++ Dprintk("Waiting for send to finish...\n"); ++ timeout = 0; ++ do { ++ Dprintk("+"); ++ udelay(100); + send_status = apic_read(APIC_ICR) & APIC_ICR_BUSY; +- } while ( send_status && (timeout++ < 1000) ); ++ } while ( send_status && (timeout++ < 1000) ); + +- mdelay(10); ++ mdelay(10); + +- Dprintk("Deasserting INIT.\n"); ++ Dprintk("Deasserting INIT.\n"); + +- apic_icr_write(APIC_INT_LEVELTRIG | APIC_DM_INIT, phys_apicid); ++ apic_icr_write(APIC_INT_LEVELTRIG | APIC_DM_INIT, phys_apicid); + +- Dprintk("Waiting for send to finish...\n"); +- timeout = 0; +- do { +- Dprintk("+"); +- udelay(100); +- if ( !x2apic_enabled ) ++ Dprintk("Waiting for send to finish...\n"); ++ timeout = 0; ++ do { ++ Dprintk("+"); ++ udelay(100); + send_status = apic_read(APIC_ICR) & APIC_ICR_BUSY; +- } while ( send_status && (timeout++ < 1000) ); ++ } while ( send_status && (timeout++ < 1000) ); ++ } + + /* + * Should we send STARTUP IPIs ? +@@ -499,22 +500,24 @@ static int wakeup_secondary_cpu(int phys + */ + apic_icr_write(APIC_DM_STARTUP | (start_eip >> 12), phys_apicid); + +- /* Give the other CPU some time to accept the IPI. */ +- udelay(300); ++ if ( !x2apic_enabled ) ++ { ++ /* Give the other CPU some time to accept the IPI. */ ++ udelay(300); + +- Dprintk("Startup point 1.\n"); ++ Dprintk("Startup point 1.\n"); + +- Dprintk("Waiting for send to finish...\n"); +- timeout = 0; +- do { +- Dprintk("+"); +- udelay(100); +- if ( !x2apic_enabled ) +- send_status = apic_read(APIC_ICR) & APIC_ICR_BUSY; +- } while ( send_status && (timeout++ < 1000) ); ++ Dprintk("Waiting for send to finish...\n"); ++ timeout = 0; ++ do { ++ Dprintk("+"); ++ udelay(100); ++ send_status = apic_read(APIC_ICR) & APIC_ICR_BUSY; ++ } while ( send_status && (timeout++ < 1000) ); + +- /* Give the other CPU some time to accept the IPI. */ +- udelay(200); ++ /* Give the other CPU some time to accept the IPI. */ ++ udelay(200); ++ } + + /* Due to the Pentium erratum 3AP. */ + if ( maxlvt > 3 ) diff --git a/23726-x86-intel-flexmigration.patch b/23726-x86-intel-flexmigration.patch new file mode 100644 index 0000000..f7cef73 --- /dev/null +++ b/23726-x86-intel-flexmigration.patch @@ -0,0 +1,128 @@ +# HG changeset patch +# User Jan Beulich +# Date 1311081291 -3600 +# Node ID fd97ca086df6808bffc6ecf3f79cebca64c60bc3 +# Parent 4dc6a9ba90d60fdf0cc0898fc9a8fe84ae9030fc +x86: update Intel CPUID masking code to latest spec + +..., which adds masking of the xsave feature leaf. + +Also add back (and fix to actually make it do what it was supposed to +do from the beginning) the printing of what specific masking couldn't +be done in case the user requested something the hardware doesn't +support. + +Signed-off-by: Jan Beulich + +# HG changeset patch +# User Jan Beulich +# Date 1311255291 -3600 +# Node ID 48f72b389b04cfa8d44924577a69ed59e48fbe77 +# Parent dd5eecf739d152fb16bd44897875ea878d4c9d59 +x86: add change missing in c/s 23726:fd97ca086df6 + +The early "do we need to do anything" check needs adjustment, too. +Thanks to Haitao Shan for pointing this out. + +Signed-off-by: Jan Beulich + +--- a/xen/arch/x86/cpu/common.c ++++ b/xen/arch/x86/cpu/common.c +@@ -27,10 +27,15 @@ boolean_param("noserialnumber", disable_ + + static bool_t __cpuinitdata use_xsave; + boolean_param("xsave", use_xsave); ++ + unsigned int __devinitdata opt_cpuid_mask_ecx = ~0u; + integer_param("cpuid_mask_ecx", opt_cpuid_mask_ecx); + unsigned int __devinitdata opt_cpuid_mask_edx = ~0u; + integer_param("cpuid_mask_edx", opt_cpuid_mask_edx); ++ ++unsigned int __devinitdata opt_cpuid_mask_xsave_eax = ~0u; ++integer_param("cpuid_mask_xsave_eax", opt_cpuid_mask_xsave_eax); ++ + unsigned int __devinitdata opt_cpuid_mask_ext_ecx = ~0u; + integer_param("cpuid_mask_ext_ecx", opt_cpuid_mask_ext_ecx); + unsigned int __devinitdata opt_cpuid_mask_ext_edx = ~0u; +--- a/xen/arch/x86/cpu/cpu.h ++++ b/xen/arch/x86/cpu/cpu.h +@@ -22,6 +22,7 @@ struct cpu_dev { + extern struct cpu_dev * cpu_devs [X86_VENDOR_NUM]; + + extern unsigned int opt_cpuid_mask_ecx, opt_cpuid_mask_edx; ++extern unsigned int opt_cpuid_mask_xsave_eax; + extern unsigned int opt_cpuid_mask_ext_ecx, opt_cpuid_mask_ext_edx; + + extern int get_model_name(struct cpuinfo_x86 *c); +--- a/xen/arch/x86/cpu/intel.c ++++ b/xen/arch/x86/cpu/intel.c +@@ -35,10 +35,12 @@ struct movsl_mask movsl_mask __read_most + */ + static void __devinit set_cpuidmask(const struct cpuinfo_x86 *c) + { ++ u32 eax, edx; + const char *extra = ""; + + if (!~(opt_cpuid_mask_ecx & opt_cpuid_mask_edx & +- opt_cpuid_mask_ext_ecx & opt_cpuid_mask_ext_edx)) ++ opt_cpuid_mask_ext_ecx & opt_cpuid_mask_ext_edx & ++ opt_cpuid_mask_xsave_eax)) + return; + + /* Only family 6 supports this feature */ +@@ -51,9 +53,12 @@ static void __devinit set_cpuidmask(cons + wrmsr(MSR_INTEL_CPUID_FEATURE_MASK, + opt_cpuid_mask_ecx, + opt_cpuid_mask_edx); +- if (!~(opt_cpuid_mask_ext_ecx & opt_cpuid_mask_ext_edx)) ++ if (~(opt_cpuid_mask_ext_ecx & opt_cpuid_mask_ext_edx)) ++ extra = "extended "; ++ else if (~opt_cpuid_mask_xsave_eax) ++ extra = "xsave "; ++ else + return; +- extra = "extended "; + break; + /* + * CPU supports this feature if the processor signature meets the following: +@@ -73,11 +78,25 @@ static void __devinit set_cpuidmask(cons + wrmsr(MSR_INTEL_CPUID80000001_FEATURE_MASK, + opt_cpuid_mask_ext_ecx, + opt_cpuid_mask_ext_edx); ++ if (!~opt_cpuid_mask_xsave_eax) ++ return; ++ extra = "xsave "; ++ break; ++ case 0x2a: ++ wrmsr(MSR_INTEL_CPUID1_FEATURE_MASK_V2, ++ opt_cpuid_mask_ecx, ++ opt_cpuid_mask_edx); ++ rdmsr(MSR_INTEL_CPUIDD_01_FEATURE_MASK, eax, edx); ++ wrmsr(MSR_INTEL_CPUIDD_01_FEATURE_MASK, ++ opt_cpuid_mask_xsave_eax, edx); ++ wrmsr(MSR_INTEL_CPUID80000001_FEATURE_MASK_V2, ++ opt_cpuid_mask_ext_ecx, ++ opt_cpuid_mask_ext_edx); + return; + } + +- printk(XENLOG_ERR "Cannot set CPU feature mask on CPU#%d\n", +- smp_processor_id()); ++ printk(XENLOG_ERR "Cannot set CPU %sfeature mask on CPU#%d\n", ++ extra, smp_processor_id()); + } + + void __devinit early_intel_workaround(struct cpuinfo_x86 *c) +--- a/xen/include/asm-x86/msr-index.h ++++ b/xen/include/asm-x86/msr-index.h +@@ -161,6 +161,10 @@ + #define MSR_INTEL_CPUID1_FEATURE_MASK 0x00000130 + #define MSR_INTEL_CPUID80000001_FEATURE_MASK 0x00000131 + ++#define MSR_INTEL_CPUID1_FEATURE_MASK_V2 0x00000132 ++#define MSR_INTEL_CPUID80000001_FEATURE_MASK_V2 0x00000133 ++#define MSR_INTEL_CPUIDD_01_FEATURE_MASK 0x00000134 ++ + /* MSRs & bits used for VMX enabling */ + #define MSR_IA32_VMX_BASIC 0x480 + #define MSR_IA32_VMX_PINBASED_CTLS 0x481 diff --git a/block-npiv b/block-npiv index 5aba965..e111ae2 100644 --- a/block-npiv +++ b/block-npiv @@ -12,7 +12,10 @@ dir=$(dirname "$0") case "$command" in add) # Params is one big arg, with fields separated by hyphens: - # FABRIC-VPWWPN-VPWWNN-TGTWWPN-LUN# + # single path: + # FABRIC-VPWWPN-VPWWNN-TGTWWPN-LUN# + # multipath: + # {FABRIC1,FABRIC2}-{VPWWPN1,VPWWPN2,VPWWPN3}-VPWWNN-TGTWWPN-LUN# # arg 2 - Fabric Name # arg 3 - VPORT's WWPN # arg 4 - VPORT's WWNN @@ -29,38 +32,56 @@ case "$command" in if test $TGTWWPN = $NPIVARGS ; then exit 1; fi VPORTWWNN=${NPIVARGS##*-*-}; NPIVARGS=${NPIVARGS%-*} if test $VPORTWWNN = $NPIVARGS ; then exit 1; fi - VPORTWWPN=${NPIVARGS##*-}; NPIVARGS=${NPIVARGS%-*} - if test $VPORTWWPN = $NPIVARGS ; then exit 1; fi - FABRICNM=$NPIVARGS + VPORTWWPNS=${NPIVARGS##*-}; NPIVARGS=${NPIVARGS%-*} + if test $VPORTWWPNS = $NPIVARGS ; then exit 1; fi + FABRICNMS=$NPIVARGS # Ensure we compare everything using lower-case hex characters TGTWWPN=`echo $TGTWWPN | tr A-Z a-z` - VPORTWWPN=`echo $VPORTWWPN | tr A-Z a-z` - VPORTWWNN=`echo $VPORTWWNN | tr A-Z a-z` - FABRICNM=`echo $FABRICNM | tr A-Z a-z` + VPORTWWPNS=`echo $VPORTWWPNS | tr A-Z a-z |sed 's/[{,}]/ /g'` + VPORTWWNN=`echo $VPORTWWNN | tr A-Z a-z` + FABRICNMS=`echo $FABRICNMS | tr A-Z a-z |sed 's/[{,}]/ /g'` + claim_lock "npiv" - - find_vhost $VPORTWWPN - if test -z "$vhost" ; then - create_vport $FABRICNM $VPORTWWPN $VPORTWWNN - if [ $? -ne 0 ] ; then exit 2; fi - sleep 8 - find_vhost $VPORTWWPN - if test -z "$vhost" ; then exit 3; fi - fi - find_sdev $vhost $TGTWWPN $LUN - if test -z "$dev"; then - echo "- - -" > /sys/class/scsi_host/$vhost/scan - sleep 2 - find_sdev $vhost $TGTWWPN $LUN - fi - + paths=0 + for FABRICNM in $FABRICNMS; do + for VPORTWWPN in $VPORTWWPNS; do + find_vhost $VPORTWWPN $FABRICNM + if test -z "$vhost" ; then + create_vport $FABRICNM $VPORTWWPN $VPORTWWNN + if [ $? -ne 0 ] ; then exit 2; fi + sleep 8 + find_vhost $VPORTWWPN $FABRICNM + if test -z "$vhost" ; then exit 3; fi + fi + find_sdev $vhost $TGTWWPN $LUN + if test -z "$dev"; then + echo "- - -" > /sys/class/scsi_host/$vhost/scan + sleep 2 + find_sdev $vhost $TGTWWPN $LUN + fi + if test -z "$dev"; then + exit 4 + fi + paths=$(($paths+1)) + done + done release_lock "npiv" - if test ! -z "$dev"; then - xenstore-write $XENBUS_PATH/node /dev/$dev - write_dev /dev/$dev + if test $paths -gt 1; then + xenstore-write $XENBUS_PATH/multipath 1 + /etc/init.d/multipathd start + if test $? -ne 0 ; then exit 4; fi + dm=`multipath -l /dev/$dev | grep dm | cut -f2 -d' '` + else + xenstore-write $XENBUS_PATH/multipath 0 + dm=$dev + fi + + if test ! -z "$dm"; then + xenstore-write $XENBUS_PATH/node /dev/$dm + write_dev /dev/$dm exit 0 fi @@ -69,14 +90,32 @@ case "$command" in remove) node=`xenstore-read $XENBUS_PATH/node` || true - #node=$2 - dev=$node; dev=${dev#/dev/} + multipath=`xenstore-read $XENBUS_PATH/multipath` || true # this is really screwy. the first delete of a lun will # terminate the entire vport (all luns) - find_vhost_from_dev $dev - if test -z "$vhost" ; then exit 5; fi - flush_nodes_on_vhost $vhost - delete_vhost $vhost + if test $multipath = 1; then + par=`xenstore-read $XENBUS_PATH/params` || true + NPIVARGS=$par; + FABRICNMS=${NPIVARGS%%-*}; NPIVARGS=${NPIVARGS#*-} + VPORTWWPNS=${NPIVARGS%%-*} + VPORTWWPNS=`echo $VPORTWWPNS | tr A-Z a-z |sed 's/[{,}]/ /g'` + FABRICNMS=`echo $FABRICNMS | tr A-Z a-z |sed 's/[{,}]/ /g'` + for FABRICNM in $FABRICNMS; do + for VPORTWWPN in $VPORTWWPNS; do + find_vhost $VPORTWWPN $FABRICNM + if test -z "$vhost" ; then exit 5; fi + flush_nodes_on_vhost $vhost + delete_vhost $vhost + done + done + else + dev=$node; dev=${dev#/dev/} + find_vhost_from_dev $dev + if test -z "$vhost" ; then exit 5; fi + flush_nodes_on_vhost $vhost + delete_vhost $vhost + fi + exit 0 ;; esac diff --git a/block-npiv-common.sh b/block-npiv-common.sh index 5a3d805..289fd41 100644 --- a/block-npiv-common.sh +++ b/block-npiv-common.sh @@ -2,6 +2,7 @@ # Look for the NPIV vport with the WWPN # $1 contains the WWPN (assumes it does not contain a leading "0x") +# $2 contains the FABRICNM (assumes it does not contain "0x") find_vhost() { unset vhost @@ -13,8 +14,11 @@ find_vhost() if test $wwpn = $1 ; then # Note: makes the assumption the vport will always have an scsi_host child vhost=`ls -d $fchost/device/host*` - vhost=`basename $vhost` - return + fname=`cat $fchost/fabric_name | sed -e s/^0x//` + if test $fname = $2 ; then + vhost=`basename $vhost` + return + fi fi fi done @@ -27,8 +31,11 @@ find_vhost() wwpn=`cat $fchost/port_name | sed -e s/^0x//` if test $wwpn = $1 ; then # Note: makes the assumption the vport will always have an scsi_host child - vhost=`basename $fchost` - return + fname=`cat $fchost/fabric_name | sed -e s/^0x//` + if test $fname = $2 ; then + vhost=`basename $fchost` + return + fi fi fi done diff --git a/block-npiv-vport b/block-npiv-vport index cab127b..082dc54 100644 --- a/block-npiv-vport +++ b/block-npiv-vport @@ -37,12 +37,12 @@ case "$command" in VPORTWWNN=`echo $VPORTWWNN | tr A-Z a-z` FABRICNM=`echo $FABRICNM | tr A-Z a-z` - find_vhost $VPORTWWPN + find_vhost $VPORTWWPN $FABRICNM if test -z "$vhost" ; then create_vport $FABRICNM $VPORTWWPN $VPORTWWNN if [ $? -ne 0 ] ; then exit 2; fi sleep 8 - find_vhost $VPORTWWPN + find_vhost $VPORTWWPN $FABRICNM if test -z "$vhost" ; then exit 3; fi fi @@ -57,7 +57,7 @@ case "$command" in # Ensure we compare everything using lower-case hex characters VPORTWWPN=`echo $VPORTWWPN | tr A-Z a-z` - find_vhost $VPORTWWPN + find_vhost $VPORTWWPN $FABRICNM if test -z "$vhost" ; then exit 4; fi delete_vhost $vhost diff --git a/hotplug.losetup.patch b/hotplug.losetup.patch index 57fb4fe..5e062c8 100644 --- a/hotplug.losetup.patch +++ b/hotplug.losetup.patch @@ -27,7 +27,7 @@ Index: xen-4.1.1-testing/tools/hotplug/Linux/block shared_list=$(losetup -a | - sed -n -e "s@^\([^:]\+\)\(:[[:blank:]]\[${dev}\]:${inode}[[:blank:]](${file})\)@\1@p" ) - for dev in "$shared_list" -+ sed -n -e "s@^\([^:]\+\)\(:[[:blank:]]\[${dev}\]:${inode}[[:blank:]](.*)\)@\1@p" ) ++ sed -n -e "s@^\([^:]\+\)\(:[[:blank:]]\[0*${dev}\]:${inode}[[:blank:]](.*)\)@\1@p" ) + for dev in $shared_list do if [ -n "$dev" ] diff --git a/x86-EFI-discard-comment.patch b/x86-EFI-discard-comment.patch deleted file mode 100644 index 636ff9f..0000000 --- a/x86-EFI-discard-comment.patch +++ /dev/null @@ -1,18 +0,0 @@ -The SuSE version of gcc produces a non-standard section named -.comment.SUSE.OPTs, but the PE32+ handling in binutils can't really -deal with any section to be placed at virtual address zero (and not -needing to be loaded). Even if binutils did, at least the UEFI -implementation in EDK 1.06 doesn't look at the section characteristics -at all, and hence would attempt to load such a section, and fail or -corrupt other data. - ---- a/xen/arch/x86/xen.lds.S -+++ b/xen/arch/x86/xen.lds.S -@@ -163,6 +163,7 @@ SECTIONS - *(.eh_frame) - #ifdef EFI - *(.comment) -+ *(.comment.*) - #endif - } - diff --git a/x86-show-page-walk-early.patch b/x86-show-page-walk-early.patch index 28c24ee..af77d83 100644 --- a/x86-show-page-walk-early.patch +++ b/x86-show-page-walk-early.patch @@ -11,7 +11,7 @@ (rangeset_is_empty((d)->iomem_caps) && \ --- a/xen/arch/x86/traps.c +++ b/xen/arch/x86/traps.c -@@ -1419,6 +1419,7 @@ asmlinkage void __init do_early_page_fau +@@ -1421,6 +1421,7 @@ asmlinkage void __init do_early_page_fau unsigned long *stk = (unsigned long *)regs; printk("Early fatal page fault at %04x:%p (cr2=%p, ec=%04x)\n", regs->cs, _p(regs->eip), _p(cr2), regs->error_code); diff --git a/xen-warnings-unused.diff b/xen-warnings-unused.diff index 5c0abec..a963cd3 100644 --- a/xen-warnings-unused.diff +++ b/xen-warnings-unused.diff @@ -435,17 +435,6 @@ switch ( cx->entry_method ) { ---- a/xen/arch/x86/cpu/intel.c -+++ b/xen/arch/x86/cpu/intel.c -@@ -35,7 +35,7 @@ struct movsl_mask movsl_mask __read_most - */ - static void __devinit set_cpuidmask(const struct cpuinfo_x86 *c) - { -- const char *extra = ""; -+ const char __attribute__((__unused__)) *extra = ""; - - if (!~(opt_cpuid_mask_ecx & opt_cpuid_mask_edx & - opt_cpuid_mask_ext_ecx & opt_cpuid_mask_ext_edx)) --- a/xen/arch/x86/cpu/intel_cacheinfo.c +++ b/xen/arch/x86/cpu/intel_cacheinfo.c @@ -170,7 +170,8 @@ unsigned int __cpuinit init_intel_cachei @@ -645,7 +634,7 @@ case 3: /* x86_32p */ --- a/xen/arch/x86/traps.c +++ b/xen/arch/x86/traps.c -@@ -1784,7 +1784,11 @@ static int emulate_privileged_op(struct +@@ -1818,7 +1818,11 @@ static int emulate_privileged_op(struct struct vcpu *v = current; unsigned long *reg, eip = regs->eip; u8 opcode, modrm_reg = 0, modrm_rm = 0, rep_prefix = 0, lock = 0, rex = 0; diff --git a/xen-warnings.diff b/xen-warnings.diff index 2b7543b..bbf73d3 100644 --- a/xen-warnings.diff +++ b/xen-warnings.diff @@ -216,3 +216,45 @@ Index: xen-4.1.1-testing/tools/blktap2/include/blktaplib.h #define WRITE 1 /*Control Messages between manager and tapdev*/ +--- xen-4.1.1-testing/tools/blktap/lib/Makefile.orig 2011-07-14 16:10:55.000000000 -0600 ++++ xen-4.1.1-testing/tools/blktap/lib/Makefile 2011-07-14 16:11:00.000000000 -0600 +@@ -28,6 +28,8 @@ OBJS_PIC = $(SRCS:.c=.opic) + IBINS := + + LIB = libblktap.a libblktap.so.$(MAJOR).$(MINOR) ++LIB_SO = libblktap.so.$(MAJOR).$(MINOR) ++LIB_AR = libblktap.a + + .PHONY: all + all: $(LIB) +@@ -36,7 +38,8 @@ all: $(LIB) + install: all + $(INSTALL_DIR) $(DESTDIR)$(LIBDIR) + $(INSTALL_DIR) $(DESTDIR)$(INCLUDEDIR) +- $(INSTALL_PROG) $(LIB) $(DESTDIR)$(LIBDIR) ++ $(INSTALL_PROG) $(LIB_SO) $(DESTDIR)$(LIBDIR) ++ $(INSTALL_DATA) $(LIB_AR) $(DESTDIR)$(LIBDIR) + ln -sf libblktap.so.$(MAJOR).$(MINOR) $(DESTDIR)$(LIBDIR)/libblktap.so.$(MAJOR) + ln -sf libblktap.so.$(MAJOR) $(DESTDIR)$(LIBDIR)/libblktap.so + $(INSTALL_DATA) blktaplib.h $(DESTDIR)$(INCLUDEDIR) +--- xen-4.1.1-testing/tools/blktap2/vhd/lib/Makefile.orig 2011-07-14 16:26:42.000000000 -0600 ++++ xen-4.1.1-testing/tools/blktap2/vhd/lib/Makefile 2011-07-14 16:29:10.000000000 -0600 +@@ -49,6 +49,8 @@ LIB-OBJS = $(patsubst %.c,%.o,$( + LIB-OBJS += $(LVM-UTIL-OBJ) + + LIBVHD = libvhd.a libvhd.so.$(LIBVHD-MAJOR).$(LIBVHD-MINOR) ++LIBVHD_SO = libvhd.so.$(LIBVHD-MAJOR).$(LIBVHD-MINOR) ++LIBVHD_AR = libvhd.a + + all: build + +@@ -63,7 +65,8 @@ libvhd.a: $(LIB-OBJS) + + install: all + $(INSTALL_DIR) -p $(DESTDIR)$(INST-DIR) +- $(INSTALL_PROG) $(LIBVHD) $(DESTDIR)$(INST-DIR) ++ $(INSTALL_PROG) $(LIBVHD_SO) $(DESTDIR)$(INST-DIR) ++ $(INSTALL_DATA) $(LIBVHD_AR) $(DESTDIR)$(INST-DIR) + ln -sf libvhd.so.$(LIBVHD-MAJOR).$(LIBVHD-MINOR) $(DESTDIR)$(INST-DIR)/libvhd.so.$(LIBVHD-MAJOR) + ln -sf libvhd.so.$(LIBVHD-MAJOR) $(DESTDIR)$(INST-DIR)/libvhd.so + diff --git a/xen.changes b/xen.changes index 676fd3d..d514e0e 100644 --- a/xen.changes +++ b/xen.changes @@ -1,3 +1,26 @@ +------------------------------------------------------------------- +Fri Jul 22 09:34:34 MDT 2011 - carnold@novell.com + +- Upstream patches from Jan + 23726-x86-intel-flexmigration.patch + 23706-fix-20892.patch + 23723-x86-CMOS-lock.patch + 23676-x86_64-image-map-bounds.patch + 23724-x86-smpboot-x2apic.patch + +------------------------------------------------------------------- +Mon Jul 11 17:19:53 CEST 2011 - ohering@suse.de + +- hotplug.losetup.patch + correct dev:inode detection, stat returns major:minor without + leading zeros, while losetup -a includes trailing zeros + +------------------------------------------------------------------- +Fri Jul 8 19:13:30 CST 2011 - cyliu@novell.com + +- fate#310635: xen npiv multipath support + update block-npiv* scripts for testing + ------------------------------------------------------------------- Thu Jul 7 10:17:08 MDT 2011 - carnold@novell.com diff --git a/xen.spec b/xen.spec index f24a85b..f67c8cf 100644 --- a/xen.spec +++ b/xen.spec @@ -25,7 +25,7 @@ ExclusiveArch: %ix86 x86_64 %define changeset 23079 %define xen_build_dir xen-4.1.1-testing %define with_kmp 1 -%define with_stubdom 0 +%define with_stubdom 1 %ifarch x86_64 %define with_dom0_support 1 %else @@ -73,7 +73,8 @@ BuildRequires: tetex %endif %ifarch x86_64 # EFI requires gcc45 or newer -BuildRequires: gcc45 +BuildRequires: gcc46 +BuildRequires: libgcc46 libgcc46-32bit BuildRequires: glibc-32bit glibc-devel-32bit BuildRequires: gcc-32bit BuildRequires: gcc43-32bit @@ -172,6 +173,11 @@ Patch39: 23613-EFI-headers.patch Patch40: 23614-x86_64-EFI-boot.patch Patch41: 23615-x86_64-EFI-runtime.patch Patch42: 23616-x86_64-EFI-MPS.patch +Patch43: 23676-x86_64-image-map-bounds.patch +Patch44: 23706-fix-20892.patch +Patch45: 23723-x86-CMOS-lock.patch +Patch46: 23724-x86-smpboot-x2apic.patch +Patch47: 23726-x86-intel-flexmigration.patch # Upstream qemu patches # Our patches Patch300: xen-config.diff @@ -226,7 +232,7 @@ Patch371: domu-usb-controller.patch Patch372: usb-list.patch Patch373: xend-devid-or-name.patch Patch374: suspend_evtchn_lock.patch -Patch375: log-guest-console.patch +Patch375: log-guest-console.patch # Patches for snapshot support Patch400: snapshot-ioemu-save.patch Patch401: snapshot-ioemu-restore.patch @@ -288,7 +294,6 @@ Patch511: supported_module.diff Patch512: magic_ioport_compat.patch Patch513: xen.sles11sp1.bug684297.xen_oldmem_pfn_is_ram.patch Patch514: xen.sles11sp1.fate311487.xen_platform_pci.dmistring.patch -Patch515: x86-EFI-discard-comment.patch Patch650: disable_emulated_device.diff Patch651: ioemu-disable-scsi.patch Patch652: ioemu-disable-emulated-ide-if-pv.patch @@ -432,7 +437,6 @@ Authors: Ian Pratt %if %{?with_dom0_support}0 - %package tools License: GPLv2+ Summary: Xen Virtualization: Control tools for domain 0 @@ -613,7 +617,6 @@ Xen, but is not available for release due to license restrictions. %endif %if %{?with_dom0_support}0 - %package doc-html License: GPLv2+ Summary: Xen Virtualization: HTML documentation @@ -700,6 +703,11 @@ tar xfj %{SOURCE2} -C $RPM_BUILD_DIR/%{xen_build_dir}/tools %patch40 -p1 %patch41 -p1 %patch42 -p1 +%patch43 -p1 +%patch44 -p1 +%patch45 -p1 +%patch46 -p1 +%patch47 -p1 %patch300 -p1 %patch301 -p1 %patch302 -p1 @@ -808,7 +816,6 @@ tar xfj %{SOURCE2} -C $RPM_BUILD_DIR/%{xen_build_dir}/tools %patch512 -p1 %patch513 -p1 %patch514 -p1 -%patch515 -p1 %patch650 -p1 %patch651 -p1 %patch652 -p1 @@ -879,7 +886,7 @@ export CFLAGS="$RPM_OPT_FLAGS" %if %{?with_dom0_support}0 # EFI %ifarch x86_64 -make -C xen install CC=gcc-4.5 max_phys_cpus=%{max_cpus} debug=n crash_debug=n DESTDIR=$RPM_BUILD_ROOT %{?_smp_mflags} +make -C xen install CC=gcc-4.6 max_phys_cpus=%{max_cpus} debug=n crash_debug=n DESTDIR=$RPM_BUILD_ROOT %{?_smp_mflags} make -C xen clean %endif install_xen() @@ -940,7 +947,7 @@ install -m644 %SOURCE20 $RPM_BUILD_ROOT/etc/modprobe.d/xen_pvdrivers.conf %if %{?with_dom0_support}0 # Stubdom %if %{?with_stubdom}0 -make stubdom %{?_smp_mflags} +make stubdom make -C stubdom install \ DESTDIR=$RPM_BUILD_ROOT MANDIR=%{_mandir} \ DOCDIR=%{_defaultdocdir}/xen INCDIR=%{_includedir} @@ -1062,7 +1069,6 @@ rm -f $RPM_BUILD_ROOT/%{_bindir}/xencons %endif %if %{?with_dom0_support}0 - %files %defattr(-,root,root) /boot/xen-%{version}-%{release}.gz @@ -1090,7 +1096,6 @@ rm -f $RPM_BUILD_ROOT/%{_bindir}/xencons %{_libdir}/*.so.* %if %{?with_dom0_support}0 - %files tools %defattr(-,root,root) /usr/bin/xenalyze @@ -1244,7 +1249,6 @@ rm -f $RPM_BUILD_ROOT/%{_bindir}/xencons /usr/include/* %if %{?with_dom0_support}0 - %files doc-html %defattr(-,root,root) %{_defaultdocdir}/xen/html @@ -1255,7 +1259,6 @@ rm -f $RPM_BUILD_ROOT/%{_bindir}/xencons %endif %if %{?with_dom0_support}0 - %post tools %if %{?with_xend}0 # with_xend