Hello community,

here is the log from the commit of package xen for openSUSE:Factory
checked in at Sun Aug 7 18:42:17 CEST 2011.



--------
--- xen/xen.changes     2011-07-07 18:20:16.000000000 +0200
+++ /mounts/work_src_done/STABLE/xen/xen.changes        2011-08-05 
22:04:45.000000000 +0200
@@ -1,0 +2,23 @@
+Fri Jul 22 09:34:34 MDT 2011 - [email protected]
+
+- 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 - [email protected]
+
+- 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 - [email protected]
+
+- fate#310635: xen npiv multipath support
+  update block-npiv* scripts for testing
+
+-------------------------------------------------------------------

calling whatdependson for head-i586


Old:
----
  x86-EFI-discard-comment.patch

New:
----
  23676-x86_64-image-map-bounds.patch
  23706-fix-20892.patch
  23723-x86-CMOS-lock.patch
  23724-x86-smpboot-x2apic.patch
  23726-x86-intel-flexmigration.patch

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ xen.spec ++++++
--- /var/tmp/diff_new_pack.ngRogI/_old  2011-08-07 18:41:29.000000000 +0200
+++ /var/tmp/diff_new_pack.ngRogI/_new  2011-08-07 18:41:29.000000000 +0200
@@ -25,7 +25,7 @@
 %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 @@
 %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
@@ -88,7 +89,7 @@
 BuildRequires:  kernel-source kernel-syms module-init-tools xorg-x11
 %endif
 Version:        4.1.1_02
-Release:        1
+Release:        3
 License:        GPLv2+
 Group:          System/Kernel
 AutoReqProv:    on
@@ -172,6 +173,11 @@
 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
@@ -288,7 +294,6 @@
 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
@@ -700,6 +705,11 @@
 %patch40 -p1
 %patch41 -p1
 %patch42 -p1
+%patch43 -p1
+%patch44 -p1
+%patch45 -p1
+%patch46 -p1
+%patch47 -p1
 %patch300 -p1
 %patch301 -p1
 %patch302 -p1
@@ -808,7 +818,6 @@
 %patch512 -p1
 %patch513 -p1
 %patch514 -p1
-%patch515 -p1
 %patch650 -p1
 %patch651 -p1
 %patch652 -p1
@@ -879,7 +888,7 @@
 %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 +949,7 @@
 %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}

++++++ 23614-x86_64-EFI-boot.patch ++++++
--- /var/tmp/diff_new_pack.ngRogI/_old  2011-08-07 18:41:30.000000000 +0200
+++ /var/tmp/diff_new_pack.ngRogI/_new  2011-08-07 18:41:30.000000000 +0200
@@ -42,6 +42,23 @@
 
 Signed-off-by: Jan Beulich <[email protected]>
 
+# HG changeset patch
+# User Jan Beulich <[email protected]>
+# 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 <[email protected]>
+
 --- a/xen/Makefile
 +++ b/xen/Makefile
 @@ -11,6 +11,8 @@ export XEN_DOMAIN    ?= $(shell ([ -x /bin/
@@ -2294,7 +2311,7 @@
  PHDRS
  {
    text PT_LOAD ;
-@@ -122,12 +141,29 @@ SECTIONS
+@@ -122,12 +141,30 @@ SECTIONS
    } :text
    _end = . ;
  
@@ -2320,6 +2337,7 @@
         *(.eh_frame)
 +#ifdef EFI
 +       *(.comment)
++       *(.comment.*)
 +#endif
    }
  

++++++ 23615-x86_64-EFI-runtime.patch ++++++
--- /var/tmp/diff_new_pack.ngRogI/_old  2011-08-07 18:41:30.000000000 +0200
+++ /var/tmp/diff_new_pack.ngRogI/_new  2011-08-07 18:41:30.000000000 +0200
@@ -30,6 +30,20 @@
 
 Signed-off-by: Jan Beulich <[email protected]>
 
+# HG changeset patch
+# User Jan Beulich <[email protected]>
+# 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 <[email protected]>
+
 --- a/xen/arch/x86/efi/boot.c
 +++ b/xen/arch/x86/efi/boot.c
 @@ -16,6 +16,7 @@
@@ -636,15 +650,7 @@
  #include <asm/msr.h>
  #include <asm/regs.h>
  #include <asm/mc146818rtc.h>
-@@ -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);
  

++++++ 23676-x86_64-image-map-bounds.patch ++++++
# HG changeset patch
# User Jan Beulich <[email protected]>
# 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 <[email protected]>

--- 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 <xen/config.h>
 #include <asm/types.h>
 
+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;
++++++ 23706-fix-20892.patch ++++++
# HG changeset patch
# User Jan Beulich <[email protected]>
# 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 <[email protected]>
Acked-by: Ian Campbell <[email protected]>

--- 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;
++++++ 23723-x86-CMOS-lock.patch ++++++
# HG changeset patch
# User Jan Beulich <[email protected]>
# 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 <[email protected]>

--- a/xen/arch/x86/efi/runtime.c
+++ b/xen/arch/x86/efi/runtime.c
@@ -3,6 +3,7 @@
 #include <xen/errno.h>
 #include <xen/guest_access.h>
 #include <xen/time.h>
+#include <asm/mc146818rtc.h>
 
 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 <asm/mc146818rtc.h>
 
-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 <asm/hypercall.h>
 #include <asm/mce.h>
 #include <asm/apic.h>
+#include <asm/mc146818rtc.h>
+#include <asm/hpet.h>
 #include <public/arch-x86/cpuid.h>
 
 /*
@@ -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;
 }
++++++ 23724-x86-smpboot-x2apic.patch ++++++
# HG changeset patch
# User Tim Deegan <[email protected]>
# 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 <[email protected]>

--- 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 )
++++++ 23726-x86-intel-flexmigration.patch ++++++
# HG changeset patch
# User Jan Beulich <[email protected]>
# 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 <[email protected]>

# HG changeset patch
# User Jan Beulich <[email protected]>
# 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 <[email protected]>

--- 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
++++++ block-npiv ++++++
--- /var/tmp/diff_new_pack.ngRogI/_old  2011-08-07 18:41:30.000000000 +0200
+++ /var/tmp/diff_new_pack.ngRogI/_new  2011-08-07 18:41:30.000000000 +0200
@@ -12,7 +12,10 @@
 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 @@
     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
 
+    claim_lock "npiv"
+    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 @@
 
   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

++++++ block-npiv-common.sh ++++++
--- /var/tmp/diff_new_pack.ngRogI/_old  2011-08-07 18:41:30.000000000 +0200
+++ /var/tmp/diff_new_pack.ngRogI/_new  2011-08-07 18:41:30.000000000 +0200
@@ -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 @@
       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 @@
       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

++++++ block-npiv-vport ++++++
--- /var/tmp/diff_new_pack.ngRogI/_old  2011-08-07 18:41:30.000000000 +0200
+++ /var/tmp/diff_new_pack.ngRogI/_new  2011-08-07 18:41:30.000000000 +0200
@@ -37,12 +37,12 @@
     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 @@
     # 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
 

++++++ hotplug.losetup.patch ++++++
--- /var/tmp/diff_new_pack.ngRogI/_old  2011-08-07 18:41:30.000000000 +0200
+++ /var/tmp/diff_new_pack.ngRogI/_new  2011-08-07 18:41:30.000000000 +0200
@@ -27,7 +27,7 @@
            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" ]

++++++ x86-show-page-walk-early.patch ++++++
--- /var/tmp/diff_new_pack.ngRogI/_old  2011-08-07 18:41:31.000000000 +0200
+++ /var/tmp/diff_new_pack.ngRogI/_new  2011-08-07 18:41:31.000000000 +0200
@@ -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);

++++++ xen-warnings-unused.diff ++++++
--- /var/tmp/diff_new_pack.ngRogI/_old  2011-08-07 18:41:31.000000000 +0200
+++ /var/tmp/diff_new_pack.ngRogI/_new  2011-08-07 18:41:31.000000000 +0200
@@ -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;

++++++ xen-warnings.diff ++++++
--- /var/tmp/diff_new_pack.ngRogI/_old  2011-08-07 18:41:32.000000000 +0200
+++ /var/tmp/diff_new_pack.ngRogI/_new  2011-08-07 18:41:32.000000000 +0200
@@ -216,3 +216,45 @@
  #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
+ 



++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++



Remember to have fun...

-- 
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to