WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

Re: [Xen-ia64-devel] Re: [Xen-devel] Xen 3.1.1 -- initial patchqueue

To: Keir Fraser <Keir.Fraser@xxxxxxxxxxxx>, Alex Williamson <alex.williamson@xxxxxx>
Subject: Re: [Xen-ia64-devel] Re: [Xen-devel] Xen 3.1.1 -- initial patchqueue
From: Kouya Shimura <kouya@xxxxxxxxxxxxxx>
Date: Wed, 12 Sep 2007 15:33:30 +0900
Cc: xen-devel <xen-devel@xxxxxxxxxxxxxxxxxxx>, xen-ia64-devel <xen-ia64-devel@xxxxxxxxxxxxxxxxxxx>
Delivery-date: Tue, 11 Sep 2007 23:34:03 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
In-reply-to: <1189451923.6380.44.camel@lappy>
List-help: <mailto:xen-ia64-devel-request@lists.xensource.com?subject=help>
List-id: Discussion of the ia64 port of Xen <xen-ia64-devel.lists.xensource.com>
List-post: <mailto:xen-ia64-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-ia64-devel>, <mailto:xen-ia64-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-ia64-devel>, <mailto:xen-ia64-devel-request@lists.xensource.com?subject=unsubscribe>
References: <C30AC53B.15502%Keir.Fraser@xxxxxxxxxxxx> <1189451923.6380.44.camel@lappy>
Sender: xen-ia64-devel-bounces@xxxxxxxxxxxxxxxxxxx
Alex Williamson writes:
 >    Other ia64'ers, please speak up if there's something else missing.

Hi Keir and Alex,

Here's a list of additional(missing) patches for IA64:

Must have fixes for HVM:
http://xenbits.xensource.com/xen-unstable.hg?rev/8924215a5f95
15086-8924215a5f95 - fix VHPT insertion
http://xenbits.xensource.com/xen-unstable.hg?rev/31be207e005e
15113-31be207e005e - fix VHPT walk
http://xenbits.xensource.com/xen-unstable.hg?rev/7812598f65be
15115-7812598f65be - fix xen crash (vpd allocation)
http://xenbits.xensource.com/xen-unstable.hg?rev/d6309cfd1fdd
15116-d6309cfd1fdd - fix resource allocation (rid)
http://xenbits.xensource.com/xen-unstable.hg?rev/fd72e71de51a
15119-fd72e71de51a - fix Windows crash
http://xenbits.xensource.com/xen-unstable.hg?rev/afb27041a2ce
15122-afb27041a2ce - fix Windows crash
http://xenbits.xensource.com/xen-unstable.hg?rev/d30576123892
15307-d30576123892 - fix resource allocation (vpd size)
http://xenbits.xensource.com/xen-unstable.hg?rev/466f71b1e831
*15311-466f71b1e831 - fix crash of VTI domain
http://xenbits.xensource.com/xen-unstable.hg?rev/2fd72ec88a9a
15341-2fd72ec88a9a - fix boot of VTI domain

Must have fixes:
http://xenbits.xensource.com/xen-unstable.hg?rev/34f285b57b87
15568-34f285b57b87 - fix soft lock up 
http://xenbits.xensource.com/xen-unstable.hg?rev/9cd309378326
*15655-9cd309378326 - fix boot on NUMA systems
http://xenbits.xensource.com/xen-unstable.hg?rev/2796311c6a55
15742-2796311c6a55 - fix boot related MCA

Must have fixes for save/restore:
http://xenbits.xensource.com/xen-unstable.hg?rev/204046d99562
15090-204046d99562 - fix time_resume()
http://xenbits.xensource.com/xen-unstable.hg?rev/63263d715d43
15093-63263d715d43 - fix vcpu hotplug
http://xenbits.xensource.com/xen-unstable.hg?rev/1a010d9444ba
15103-1a010d9444ba - prevent softlock up message
http://xenbits.xensource.com/xen-unstable.hg?rev/8b9637467068
15107-8b9637467068 - fix save/restore

An attached patch can be applied to xen-3.1-testing.pq.hg.
Patches with an asterisk above are modified for xen-3.1-testing.hg.

Thanks,
Kouya

Signed-off-by: Kouya Shimura <kouya@xxxxxxxxxxxxxx>

 15086-8924215a5f95 |   80 ++++++++++++++++++++++++
 15090-204046d99562 |  103 +++++++++++++++++++++++++++++++
 15093-63263d715d43 |  141 +++++++++++++++++++++++++++++++++++++++++++
 15103-1a010d9444ba |   33 ++++++++++
 15107-8b9637467068 |  172 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 15113-31be207e005e |  170 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 15115-7812598f65be |   28 ++++++++
 15116-d6309cfd1fdd |   31 +++++++++
 15119-fd72e71de51a |  101 +++++++++++++++++++++++++++++++
 15122-afb27041a2ce |   81 ++++++++++++++++++++++++
 15307-d30576123892 |   25 +++++++
 15311-466f71b1e831 |   82 +++++++++++++++++++++++++
 15341-2fd72ec88a9a |   48 ++++++++++++++
 15568-34f285b57b87 |   69 +++++++++++++++++++++
 15655-9cd309378326 |   46 ++++++++++++++
 15742-2796311c6a55 |   23 +++++++
 16 files changed, 1233 insertions(+)

# HG changeset patch
# User Kouya Shimura <kouya@xxxxxxxxxxxxxx>
# Date 1189576945 -32400
# Node ID 41c9c4fcf3586947e3e79ad340da9d4ba7556294
# Parent  7ba52aa72ae5c0834df9570251ce7bf806a20a1d
Additional fixes for IA64.

diff -r 7ba52aa72ae5 -r 41c9c4fcf358 15086-8924215a5f95
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/15086-8924215a5f95        Wed Sep 12 15:02:25 2007 +0900
@@ -0,0 +1,80 @@
+# HG changeset patch
+# User Alex Williamson <alex.williamson@xxxxxx>
+# Date 1178222479 21600
+# Node ID 8924215a5f952d3127d24203a14e4b8d7e642a69
+# Parent  6cf6f49f26abd61e011a6513512478d7d2a0af70
+[IA64] Always insert entry to VHPT's head, or double TLB miss occurs.
+
+Always insert entry to VHPT head, or TLB miss will occur again although
+the translation exists in its collision chain.
+
+Signed-off-by: Zhang xiantao <xiantao.zhang@xxxxxxxxx>
+Signed-off-by: Anthony Xu <anthony.xu@xxxxxxxxx>
+xen-unstable changeset: 15086:8924215a5f952d3127d24203a14e4b8d7e642a69
+xen-unstable date: Thu May 03 14:01:19 2007 -0600
+
+diff -r 6cf6f49f26ab -r 8924215a5f95 xen/arch/ia64/vmx/vtlb.c
+--- a/xen/arch/ia64/vmx/vtlb.c Thu May 03 13:55:28 2007 -0600
++++ b/xen/arch/ia64/vmx/vtlb.c Thu May 03 14:01:19 2007 -0600
+@@ -150,33 +150,41 @@ static void vmx_vhpt_insert(thash_cb_t *
+     tag = ia64_ttag(ifa);
+     cch = head;
+     while (cch) {    
+-        if (INVALID_VHPT(cch)) {
+-            len = cch->len;
+-            cch->page_flags = pte;
+-            cch->len = len;
+-            cch->itir = rr.ps << 2;
+-            cch->etag = tag;
+-            return;
+-        }
++        if (INVALID_VHPT(cch))
++            break;
+         cch = cch->next;
+     }
+-
+-    if(head->len>=MAX_CCN_DEPTH){
+-        thash_recycle_cch(hcb, head);
+-        cch = cch_alloc(hcb);
++    if (cch) {
++        if (cch == head) {
++            len = head->len;
++        } else {
++            local_irq_disable();
++            cch->page_flags = head->page_flags;
++            cch->itir = head->itir;
++            cch->etag  = head->etag;
++            len = head->len;
++            local_irq_enable();
++        }
+     }
+     else{
+-        cch = __alloc_chain(hcb);
+-    }
+-    local_irq_disable();
+-    *cch = *head;
++        if (head->len >= MAX_CCN_DEPTH) {
++            thash_recycle_cch(hcb, head);
++            cch = cch_alloc(hcb);
++        } else {
++            cch = __alloc_chain(hcb);
++        }
++        local_irq_disable();
++        *cch = *head;
++        head->next = cch;
++        len = cch->len+1;
++        cch->len = 0;
++        local_irq_enable();
++    }
++
+     head->page_flags=pte;
++    head->len = len;
+     head->itir = rr.ps << 2;
+     head->etag=tag;
+-    head->next = cch;
+-    head->len = cch->len+1;
+-    cch->len = 0;
+-    local_irq_enable();
+     return;
+ }
+ 
diff -r 7ba52aa72ae5 -r 41c9c4fcf358 15090-204046d99562
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/15090-204046d99562        Wed Sep 12 15:02:25 2007 +0900
@@ -0,0 +1,103 @@
+# HG changeset patch
+# User Alex Williamson <alex.williamson@xxxxxx>
+# Date 1178223699 21600
+# Node ID 204046d995621fe88649daaaffa32ee42c18cdd4
+# Parent  a141484a91d0c420f1227e0914d61aaf74fb406b
+[IA64] Fix time_resume()
+
+Add missing exclusion in time_resume() and steal time accounting
+reinitialization after resume.
+
+Signed-off-by: Isaku Yamahata <yamahata@xxxxxxxxxxxxx>
+xen-unstable changeset: 15090:204046d995621fe88649daaaffa32ee42c18cdd4
+xen-unstable date: Thu May 03 14:21:39 2007 -0600
+
+diff -r a141484a91d0 -r 204046d99562 
linux-2.6-xen-sparse/arch/ia64/kernel/time.c
+--- a/linux-2.6-xen-sparse/arch/ia64/kernel/time.c     Thu May 03 14:14:41 
2007 -0600
++++ b/linux-2.6-xen-sparse/arch/ia64/kernel/time.c     Thu May 03 14:21:39 
2007 -0600
+@@ -267,6 +267,62 @@ static void init_missing_ticks_accountin
+       per_cpu(processed_stolen_time, cpu) = runstate->time[RUNSTATE_runnable]
+                                           + runstate->time[RUNSTATE_offline];
+ }
++
++static int xen_ia64_settimefoday_after_resume;
++
++static int __init __xen_ia64_settimeofday_after_resume(char *str)
++{
++      xen_ia64_settimefoday_after_resume = 1;
++      return 1;
++}
++
++__setup("xen_ia64_settimefoday_after_resume",
++       __xen_ia64_settimeofday_after_resume);
++
++/* Called after suspend, to resume time.  */
++void
++time_resume(void)
++{
++      unsigned int cpu;
++      
++      /* Just trigger a tick.  */
++      ia64_cpu_local_tick();
++
++      if (xen_ia64_settimefoday_after_resume) {
++              /* do_settimeofday() resets timer interplator */
++              struct timespec xen_time;
++              int ret;
++              efi_gettimeofday(&xen_time);
++
++              ret = do_settimeofday(&xen_time);
++              WARN_ON(ret);
++      } else {
++#if 0
++              /* adjust EFI time */
++              struct timespec my_time = CURRENT_TIME;
++              struct timespec xen_time;
++              static timespec diff;
++              struct xen_domctl domctl;
++              int ret;
++
++              efi_gettimeofday(&xen_time);
++              diff = timespec_sub(&xen_time, &my_time);
++              domctl.cmd = XEN_DOMCTL_settimeoffset;
++              domctl.domain = DOMID_SELF;
++              domctl.u.settimeoffset.timeoffset_seconds = diff.tv_sec;
++              ret = HYPERVISOR_domctl_op(&domctl);
++              WARN_ON(ret);
++#endif
++              /* Time interpolator remembers the last timer status.
++                 Forget it */
++              write_seqlock_irq(&xtime_lock);
++              time_interpolator_reset();
++              write_sequnlock_irq(&xtime_lock);
++      }
++
++      for_each_online_cpu(cpu)
++              init_missing_ticks_accounting(cpu);
++}
+ #else
+ #define init_missing_ticks_accounting(cpu) do {} while (0)
+ #endif
+diff -r a141484a91d0 -r 204046d99562 
linux-2.6-xen-sparse/arch/ia64/xen/hypervisor.c
+--- a/linux-2.6-xen-sparse/arch/ia64/xen/hypervisor.c  Thu May 03 14:14:41 
2007 -0600
++++ b/linux-2.6-xen-sparse/arch/ia64/xen/hypervisor.c  Thu May 03 14:21:39 
2007 -0600
+@@ -863,19 +863,6 @@ direct_remap_pfn_range(struct vm_area_st
+ }
+ 
+ 
+-/* Called after suspend, to resume time.  */
+-void
+-time_resume(void)
+-{
+-      extern void ia64_cpu_local_tick(void);
+-
+-      /* Just trigger a tick.  */
+-      ia64_cpu_local_tick();
+-
+-      /* Time interpolator remembers the last timer status.  Forget it */
+-      time_interpolator_reset();
+-}
+-
+ ///////////////////////////////////////////////////////////////////////////
+ // expose p2m table
+ #ifdef CONFIG_XEN_IA64_EXPOSE_P2M
diff -r 7ba52aa72ae5 -r 41c9c4fcf358 15093-63263d715d43
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/15093-63263d715d43        Wed Sep 12 15:02:25 2007 +0900
@@ -0,0 +1,141 @@
+# HG changeset patch
+# User Alex Williamson <alex.williamson@xxxxxx>
+# Date 1178224706 21600
+# Node ID 63263d715d4309e7bccdd43d0f9c5c49be8c52ac
+# Parent  f8aede89c7065a5376a544c0b9bd49d4b22ac954
+[IA64] Fix vcpu hotplug
+
+When domain is saved and restored, the following message is printed out.
+bind_ipi_to_irqhandler()/bind_virq_to_irqhandler() should be called
+in process context.  Move the call from cpu_init() to __cpu_init() like x86.
+
+BUG: sleeping function called from invalid context at 
/src1/yamahata/hg/xen/ia64
+/my150/compile/test-0/xen-ia64-unstable.hg/linux-2.6.18-xen/mm/slab.c:2901
+in_atomic():0, irqs_disabled():1
+
+Call Trace:
+ [<a00000010001b190>] show_stack+0x50/0xa0
+                                sp=e0000000004ff8b0 bsp=e0000000004f9358
+ [<a00000010001b210>] dump_stack+0x30/0x60
+                                sp=e0000000004ffa80 bsp=e0000000004f9340
+ [<a000000100070f40>] __might_sleep+0x2c0/0x2e0
+                                sp=e0000000004ffa80 bsp=e0000000004f9318
+ [<a00000010012c230>] __kmalloc+0xb0/0x320
+                                sp=e0000000004ffa90 bsp=e0000000004f92e0
+ [<a0000001001a98d0>] proc_create+0x110/0x1c0
+                                sp=e0000000004ffa90 bsp=e0000000004f9298
+ [<a0000001001a9ca0>] proc_mkdir_mode+0x40/0xe0
+                                sp=e0000000004ffaa0 bsp=e0000000004f9268
+ [<a0000001001a9d70>] proc_mkdir+0x30/0x60
+                                sp=e0000000004ffab0 bsp=e0000000004f9240
+ [<a0000001000e97e0>] register_handler_proc+0x1a0/0x1e0
+                                sp=e0000000004ffab0 bsp=e0000000004f91f0
+ [<a0000001000e6420>] setup_irq+0x440/0x4e0
+                                sp=e0000000004ffb30 bsp=e0000000004f9198
+ [<a0000001000e68c0>] request_irq+0x140/0x1a0
+                                sp=e0000000004ffb30 bsp=e0000000004f9150
+ [<a0000001003e7a20>] bind_ipi_to_irqhandler+0x260/0x2c0
+                                sp=e0000000004ffb30 bsp=e0000000004f90e8
+ [<a000000100019780>] xen_register_percpu_irq+0x2c0/0x880
+                                sp=e0000000004ffb40 bsp=e0000000004f9098
+ [<a00000010001a1f0>] xen_smp_intr_init+0x170/0x1c0
+                                sp=e0000000004ffb40 bsp=e0000000004f9070
+ [<a00000010003d350>] cpu_init+0x1090/0x10e0
+                                sp=e0000000004ffb50 bsp=e0000000004f8fe0
+ [<a0000001000607a0>] start_secondary+0xc0/0x520
+                                sp=e0000000004ffe30 bsp=e0000000004f8f90
+ [<a0000001000105f0>] __end_ivt_text+0x6d0/0x700
+                                sp=e0000000004ffe30 bsp=e0000000004f8f90
+
+Signed-off-by: Isaku Yamahata <yamahata@xxxxxxxxxxxxx>
+xen-unstable changeset: 15093:63263d715d4309e7bccdd43d0f9c5c49be8c52ac
+xen-unstable date: Thu May 03 14:38:26 2007 -0600
+
+diff -r f8aede89c706 -r 63263d715d43 
linux-2.6-xen-sparse/arch/ia64/kernel/irq_ia64.c
+--- a/linux-2.6-xen-sparse/arch/ia64/kernel/irq_ia64.c Thu May 03 14:27:26 
2007 -0600
++++ b/linux-2.6-xen-sparse/arch/ia64/kernel/irq_ia64.c Thu May 03 14:38:26 
2007 -0600
+@@ -319,9 +319,9 @@ static struct irqaction resched_irqactio
+  * required.
+  */
+ static void
+-xen_register_percpu_irq (unsigned int vec, struct irqaction *action, int save)
+-{
+-      unsigned int cpu = smp_processor_id();
++xen_register_percpu_irq(unsigned int cpu, unsigned int vec,
++                       struct irqaction *action, int save)
++{
+       irq_desc_t *desc;
+       int irq = 0;
+ 
+@@ -423,7 +423,8 @@ xen_bind_early_percpu_irq (void)
+        * BSP will face with such step shortly
+        */
+       for (i = 0; i < late_irq_cnt; i++)
+-              xen_register_percpu_irq(saved_percpu_irqs[i].irq,
++              xen_register_percpu_irq(smp_processor_id(),
++                                      saved_percpu_irqs[i].irq,
+                                       saved_percpu_irqs[i].action, 0);
+ }
+ 
+@@ -479,11 +480,21 @@ static struct notifier_block unbind_evtc
+ #endif
+ 
+ DECLARE_PER_CPU(int, ipi_to_irq[NR_IPIS]);
++void xen_smp_intr_init_early(unsigned int cpu)
++{
++#ifdef CONFIG_SMP
++      unsigned int i;
++
++      for (i = 0; i < saved_irq_cnt; i++)
++              xen_register_percpu_irq(cpu, saved_percpu_irqs[i].irq,
++                                      saved_percpu_irqs[i].action, 0);
++#endif
++}
++
+ void xen_smp_intr_init(void)
+ {
+ #ifdef CONFIG_SMP
+       unsigned int cpu = smp_processor_id();
+-      unsigned int i = 0;
+       struct callback_register event = {
+               .type = CALLBACKTYPE_event,
+               .address = (unsigned long)&xen_event_callback,
+@@ -500,12 +511,9 @@ void xen_smp_intr_init(void)
+ 
+       /* This should be piggyback when setup vcpu guest context */
+       BUG_ON(HYPERVISOR_callback_op(CALLBACKOP_register, &event));
+-
+-      for (i = 0; i < saved_irq_cnt; i++)
+-              xen_register_percpu_irq(saved_percpu_irqs[i].irq,
+-                                      saved_percpu_irqs[i].action, 0);
+ #endif /* CONFIG_SMP */
+ }
++
+ #endif /* CONFIG_XEN */
+ 
+ void
+@@ -516,7 +524,8 @@ register_percpu_irq (ia64_vector vec, st
+ 
+ #ifdef CONFIG_XEN
+       if (is_running_on_xen())
+-              return xen_register_percpu_irq(vec, action, 1);
++              return xen_register_percpu_irq(smp_processor_id(), 
++                                             vec, action, 1);
+ #endif
+ 
+       for (irq = 0; irq < NR_IRQS; ++irq)
+@@ -572,6 +581,14 @@ ia64_send_ipi (int cpu, int vector, int 
+               /* TODO: we need to call vcpu_up here */
+               if (unlikely(vector == ap_wakeup_vector)) {
+                       extern void xen_send_ipi (int cpu, int vec);
++
++                      /* XXX
++                       * This should be in __cpu_up(cpu) in ia64 smpboot.c
++                       * like x86. But don't want to modify it,
++                       * keep it untouched.
++                       */
++                      xen_smp_intr_init_early(cpu);
++
+                       xen_send_ipi (cpu, vector);
+                       //vcpu_prepare_and_up(cpu);
+                       return;
diff -r 7ba52aa72ae5 -r 41c9c4fcf358 15103-1a010d9444ba
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/15103-1a010d9444ba        Wed Sep 12 15:02:25 2007 +0900
@@ -0,0 +1,33 @@
+# HG changeset patch
+# User Alex Williamson <alex.williamson@xxxxxx>
+# Date 1178565164 21600
+# Node ID 1a010d9444baa9c1b44f42856f607ab584574315
+# Parent  7c176473786b4e96723f8fb3cd794cc4db8923e9
+[IA64] Prevent softlock up message when domain is restored.
+
+Signed-off-by: Isaku Yamahata <yamahata@xxxxxxxxxxxxx>
+xen-unstable changeset: 15103:1a010d9444baa9c1b44f42856f607ab584574315
+xen-unstable date: Mon May 07 13:12:44 2007 -0600
+
+diff -r 7c176473786b -r 1a010d9444ba 
linux-2.6-xen-sparse/arch/ia64/kernel/time.c
+--- a/linux-2.6-xen-sparse/arch/ia64/kernel/time.c     Mon May 07 10:37:16 
2007 -0600
++++ b/linux-2.6-xen-sparse/arch/ia64/kernel/time.c     Mon May 07 13:12:44 
2007 -0600
+@@ -322,6 +322,8 @@ time_resume(void)
+ 
+       for_each_online_cpu(cpu)
+               init_missing_ticks_accounting(cpu);
++
++      touch_softlockup_watchdog();
+ }
+ #else
+ #define init_missing_ticks_accounting(cpu) do {} while (0)
+@@ -412,6 +414,9 @@ ia64_init_itm (void)
+       if (is_running_on_xen())
+               init_missing_ticks_accounting(smp_processor_id());
+ 
++      /* avoid softlock up message when cpu is unplug and plugged again. */
++      touch_softlockup_watchdog();
++
+       /* Setup the CPU local timer tick */
+       ia64_cpu_local_tick();
+ }
diff -r 7ba52aa72ae5 -r 41c9c4fcf358 15107-8b9637467068
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/15107-8b9637467068        Wed Sep 12 15:02:25 2007 +0900
@@ -0,0 +1,172 @@
+# HG changeset patch
+# User Alex Williamson <alex.williamson@xxxxxx>
+# Date 1178642391 21600
+# Node ID 8b96374670680257cbb988a17dfb88516ef0e7d7
+# Parent  d7303c4a9dabdc7b461e7915fb8cd9d03ff7570c
+[IA64] Make p2m exposure compatible with suspend/resume and fix one bug.
+
+Signed-off-by: Isaku Yamahata <yamahata@xxxxxxxxxxxxx>
+xen-unstable changeset: 15107:8b96374670680257cbb988a17dfb88516ef0e7d7
+xen-unstable date: Tue May 08 10:39:51 2007 -0600
+
+diff -r d7303c4a9dab -r 8b9637467068 
linux-2.6-xen-sparse/arch/ia64/xen/hypervisor.c
+--- a/linux-2.6-xen-sparse/arch/ia64/xen/hypervisor.c  Tue May 08 09:09:17 
2007 -0600
++++ b/linux-2.6-xen-sparse/arch/ia64/xen/hypervisor.c  Tue May 08 10:39:51 
2007 -0600
+@@ -48,6 +48,7 @@ static int p2m_expose_init(void);
+ static int p2m_expose_init(void);
+ #else
+ #define p2m_expose_init() (-ENOSYS)
++#define p2m_expose_resume() ((void)0)
+ #endif
+ 
+ EXPORT_SYMBOL(__hypercall);
+@@ -882,6 +883,8 @@ static struct resource p2m_resource = {
+ };
+ static unsigned long p2m_assign_start_pfn __read_mostly;
+ static unsigned long p2m_assign_end_pfn __read_mostly;
++static unsigned long p2m_expose_size; // this is referenced only when resume.
++                                      // so __read_mostly doesn't make sense.
+ volatile const pte_t* p2m_pte __read_mostly;
+ 
+ #define GRNULE_PFN    PTRS_PER_PTE
+@@ -942,8 +945,15 @@ p2m_expose_dtr_call(struct notifier_bloc
+       unsigned int cpu = (unsigned int)(long)ptr;
+       if (event != CPU_ONLINE)
+               return 0;
+-      if (!(p2m_initialized && xen_ia64_p2m_expose_use_dtr))
+-              smp_call_function_single(cpu, &p2m_itr, &p2m_itr_arg, 1, 1);
++      if (p2m_initialized && xen_ia64_p2m_expose_use_dtr) {
++              unsigned int me = get_cpu();
++              if (cpu == me)
++                      p2m_itr(&p2m_itr_arg);
++              else
++                      smp_call_function_single(cpu, &p2m_itr, &p2m_itr_arg,
++                                               1, 1);
++              put_cpu();
++      }
+       return 0;
+ }
+ 
+@@ -958,7 +968,6 @@ p2m_expose_init(void)
+ p2m_expose_init(void)
+ {
+       unsigned long num_pfn;
+-      unsigned long size = 0;
+       unsigned long p2m_size = 0;
+       unsigned long align = ~0UL;
+       int error = 0;
+@@ -1010,7 +1019,7 @@ p2m_expose_init(void)
+                       p2m_convert_max_pfn = ROUNDUP(p2m_max_low_pfn,
+                                                     granule_pfn);
+                       num_pfn = p2m_convert_max_pfn - p2m_convert_min_pfn;
+-                      size = num_pfn << PAGE_SHIFT;
++                      p2m_expose_size = num_pfn << PAGE_SHIFT;
+                       p2m_size = num_pfn / PTRS_PER_PTE;
+                       p2m_size = ROUNDUP(p2m_size, granule_pfn << PAGE_SHIFT);
+                       if (p2m_size == page_size)
+@@ -1030,7 +1039,7 @@ p2m_expose_init(void)
+                                               p2m_granule_pfn);
+               p2m_convert_max_pfn = ROUNDUP(p2m_max_low_pfn, p2m_granule_pfn);
+               num_pfn = p2m_convert_max_pfn - p2m_convert_min_pfn;
+-              size = num_pfn << PAGE_SHIFT;
++              p2m_expose_size = num_pfn << PAGE_SHIFT;
+               p2m_size = num_pfn / PTRS_PER_PTE;
+               p2m_size = ROUNDUP(p2m_size, p2m_granule_pfn << PAGE_SHIFT);
+               align = max(privcmd_resource_align,
+@@ -1054,14 +1063,14 @@ p2m_expose_init(void)
+       
+       error = HYPERVISOR_expose_p2m(p2m_convert_min_pfn,
+                                     p2m_assign_start_pfn,
+-                                    size, p2m_granule_pfn);
++                                    p2m_expose_size, p2m_granule_pfn);
+       if (error) {
+               printk(KERN_ERR P2M_PREFIX "failed expose p2m hypercall %d\n",
+                      error);
+               printk(KERN_ERR P2M_PREFIX "conv 0x%016lx assign 0x%016lx "
+-                     "size 0x%016lx granule 0x%016lx\n",
++                     "expose_size 0x%016lx granule 0x%016lx\n",
+                      p2m_convert_min_pfn, p2m_assign_start_pfn,
+-                     size, p2m_granule_pfn);;
++                     p2m_expose_size, p2m_granule_pfn);;
+               release_resource(&p2m_resource);
+               goto out;
+       }
+@@ -1104,6 +1113,49 @@ p2m_expose_cleanup(void)
+ }
+ #endif
+ 
++static void
++p2m_expose_resume(void)
++{
++      int error;
++
++      if (!xen_ia64_p2m_expose || !p2m_initialized)
++              return;
++
++      /*
++       * We can't call {lock, unlock}_cpu_hotplug() because
++       * they require process context.
++       * We don't need them because we're the only one cpu and
++       * interrupts are masked when resume.
++       */
++      error = HYPERVISOR_expose_p2m(p2m_convert_min_pfn,
++                                    p2m_assign_start_pfn,
++                                    p2m_expose_size, p2m_granule_pfn);
++      if (error) {
++              printk(KERN_ERR P2M_PREFIX "failed expose p2m hypercall %d\n",
++                     error);
++              printk(KERN_ERR P2M_PREFIX "conv 0x%016lx assign 0x%016lx "
++                     "expose_size 0x%016lx granule 0x%016lx\n",
++                     p2m_convert_min_pfn, p2m_assign_start_pfn,
++                     p2m_expose_size, p2m_granule_pfn);;
++              p2m_initialized = 0;
++              smp_mb();
++              ia64_ptr(0x2, p2m_itr_arg.vaddr, p2m_itr_arg.log_page_size);
++              
++              /*
++               * We can't call those clean up functions because they
++               * require process context.
++               */
++#if 0
++#ifdef CONFIG_XEN_IA64_EXPOSE_P2M_USE_DTR
++              if (xen_ia64_p2m_expose_use_dtr)
++                      unregister_cpu_notifier(
++                              &p2m_expose_dtr_hotplug_notifier);
++#endif
++              release_resource(&p2m_resource);
++#endif
++      }
++}
++
+ //XXX inlinize?
+ unsigned long
+ p2m_phystomach(unsigned long gpfn)
+@@ -1187,3 +1239,15 @@ xen_ia64_unmap_resource(struct resource*
+       xen_ia64_release_resource(res);
+ }
+ EXPORT_SYMBOL_GPL(xen_ia64_unmap_resource);
++
++///////////////////////////////////////////////////////////////////////////
++// suspend/resume
++void
++xen_post_suspend(int suspend_cancelled)
++{
++      if (suspend_cancelled)
++              return;
++      
++      p2m_expose_resume();
++      /* add more if necessary */
++}
+diff -r d7303c4a9dab -r 8b9637467068 
linux-2.6-xen-sparse/include/asm-ia64/hypervisor.h
+--- a/linux-2.6-xen-sparse/include/asm-ia64/hypervisor.h       Tue May 08 
09:09:17 2007 -0600
++++ b/linux-2.6-xen-sparse/include/asm-ia64/hypervisor.h       Tue May 08 
10:39:51 2007 -0600
+@@ -168,6 +168,9 @@ xen_destroy_contiguous_region(unsigned l
+               __xen_destroy_contiguous_region(vstart, order);
+ }
+ 
++/* For drivers/xen/core/machine_reboot.c */
++#define HAVE_XEN_POST_SUSPEND
++void xen_post_suspend(int suspend_cancelled);
+ #endif /* !CONFIG_VMX_GUEST */
+ 
+ // for netfront.c, netback.c
diff -r 7ba52aa72ae5 -r 41c9c4fcf358 15113-31be207e005e
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/15113-31be207e005e        Wed Sep 12 15:02:25 2007 +0900
@@ -0,0 +1,170 @@
+# HG changeset patch
+# User Alex Williamson <alex.williamson@xxxxxx>
+# Date 1178833590 21600
+# Node ID 31be207e005eaf178c87c047d8827998d6122282
+# Parent  8745300bec4ec254b3e2426e4fb5e3f4a9e0e0bc
+[IA64] Handle speculative vhpt walk
+
+Since processor may support speculative VHPT walk,
+The long format VHPT head entry needs to be disabled
+before programming it.
+
+Signed-off-by: Anthony Xu <anthony.xu@xxxxxxxxx>
+xen-unstable changeset: 15113:31be207e005eaf178c87c047d8827998d6122282
+xen-unstable date: Thu May 10 15:46:30 2007 -0600
+
+diff -r 8745300bec4e -r 31be207e005e xen/arch/ia64/vmx/vmx_ivt.S
+--- a/xen/arch/ia64/vmx/vmx_ivt.S      Thu May 10 15:18:27 2007 -0600
++++ b/xen/arch/ia64/vmx/vmx_ivt.S      Thu May 10 15:46:30 2007 -0600
+@@ -168,11 +168,11 @@ vmx_itlb_loop:
+     adds r16 = VLE_TITAG_OFFSET, r17
+     adds r19 = VLE_CCHAIN_OFFSET, r17
+     ;;
+-    ld8 r22 = [r16]
++    ld8 r24 = [r16]
+     ld8 r23 = [r19]
+     ;;
+     lfetch [r23]
+-    cmp.eq  p6,p7 = r20, r22
++    cmp.eq  p6,p7 = r20, r24
+     ;;
+ (p7)mov r17 = r23;
+ (p7)br.sptk vmx_itlb_loop
+@@ -180,10 +180,12 @@ vmx_itlb_loop:
+     ld8 r25 = [r17]
+     ld8 r27 = [r18]
+     ld8 r29 = [r28]
++    dep r22 = -1,r24,63,1    //set ti=1
+     ;;
+     st8 [r16] = r29, VLE_ITIR_OFFSET - VLE_TITAG_OFFSET
+     st8 [r28] = r22, VLE_ITIR_OFFSET - VLE_TITAG_OFFSET
+     extr.u r19 = r27, 56, 4
++    mf
+     ;;
+     ld8 r29 = [r16]
+     ld8 r22 = [r28]
+@@ -191,10 +193,11 @@ vmx_itlb_loop:
+     dep r25 = r19, r25, 56, 4
+     ;;
+     st8 [r16] = r22
+-    st8 [r28] = r29
++    st8 [r28] = r29, VLE_TITAG_OFFSET - VLE_ITIR_OFFSET
+     st8 [r18] = r25
+     st8 [r17] = r27
+     ;;
++    st8.rel [r28] = r24
+     itc.i r25
+     dv_serialize_data
+     mov r17=cr.isr
+@@ -246,11 +249,11 @@ vmx_dtlb_loop:
+     adds r16 = VLE_TITAG_OFFSET, r17
+     adds r19 = VLE_CCHAIN_OFFSET, r17
+     ;;
+-    ld8 r22 = [r16]
++    ld8 r24 = [r16]
+     ld8 r23 = [r19]
+     ;;
+     lfetch [r23]
+-    cmp.eq  p6,p7 = r20, r22
++    cmp.eq  p6,p7 = r20, r24
+     ;;
+ (p7)mov r17 = r23;
+ (p7)br.sptk vmx_dtlb_loop
+@@ -258,10 +261,12 @@ vmx_dtlb_loop:
+     ld8 r25 = [r17]
+     ld8 r27 = [r18]
+     ld8 r29 = [r28]
++    dep r22 = -1,r24,63,1    //set ti=1
+     ;;
+     st8 [r16] = r29, VLE_ITIR_OFFSET - VLE_TITAG_OFFSET
+     st8 [r28] = r22, VLE_ITIR_OFFSET - VLE_TITAG_OFFSET
+     extr.u r19 = r27, 56, 4
++    mf
+     ;;
+     ld8 r29 = [r16]
+     ld8 r22 = [r28]
+@@ -269,10 +274,11 @@ vmx_dtlb_loop:
+     dep r25 = r19, r25, 56, 4
+     ;;
+     st8 [r16] = r22
+-    st8 [r28] = r29
++    st8 [r28] = r29, VLE_TITAG_OFFSET - VLE_ITIR_OFFSET
+     st8 [r18] = r25
+     st8 [r17] = r27
+-    ;;    
++    ;;
++    st8.rel [r28] = r24 
+     itc.d r25
+     dv_serialize_data
+     mov r17=cr.isr
+diff -r 8745300bec4e -r 31be207e005e xen/arch/ia64/vmx/vtlb.c
+--- a/xen/arch/ia64/vmx/vtlb.c Thu May 10 15:18:27 2007 -0600
++++ b/xen/arch/ia64/vmx/vtlb.c Thu May 10 15:46:30 2007 -0600
+@@ -141,7 +141,7 @@ static void thash_recycle_cch(thash_cb_t
+ 
+ static void vmx_vhpt_insert(thash_cb_t *hcb, u64 pte, u64 itir, u64 ifa)
+ {
+-    u64 tag ,len;
++    u64 tag;
+     ia64_rr rr;
+     thash_data_t *head, *cch;
+     pte = pte & ~PAGE_FLAGS_RV_MASK;
+@@ -155,14 +155,12 @@ static void vmx_vhpt_insert(thash_cb_t *
+         cch = cch->next;
+     }
+     if (cch) {
+-        if (cch == head) {
+-            len = head->len;
+-        } else {
++        if (cch != head) {
+             local_irq_disable();
+             cch->page_flags = head->page_flags;
+             cch->itir = head->itir;
+             cch->etag  = head->etag;
+-            len = head->len;
++            head->ti = 1;
+             local_irq_enable();
+         }
+     }
+@@ -175,16 +173,17 @@ static void vmx_vhpt_insert(thash_cb_t *
+         }
+         local_irq_disable();
+         *cch = *head;
++        head->ti = 1;
+         head->next = cch;
+-        len = cch->len+1;
++        head->len = cch->len + 1;
+         cch->len = 0;
+         local_irq_enable();
+     }
+-
++    //here head is invalid
++    wmb();
+     head->page_flags=pte;
+-    head->len = len;
+     head->itir = rr.ps << 2;
+-    head->etag=tag;
++    *(volatile unsigned long*)&head->etag = tag;
+     return;
+ }
+ 
+diff -r 8745300bec4e -r 31be207e005e xen/arch/ia64/xen/vhpt.c
+--- a/xen/arch/ia64/xen/vhpt.c Thu May 10 15:18:27 2007 -0600
++++ b/xen/arch/ia64/xen/vhpt.c Thu May 10 15:46:30 2007 -0600
+@@ -78,11 +78,13 @@ void vhpt_insert (unsigned long vadr, un
+       struct vhpt_lf_entry *vlfe = (struct vhpt_lf_entry *)ia64_thash(vadr);
+       unsigned long tag = ia64_ttag (vadr);
+ 
+-      /* No need to first disable the entry, since VHPT is per LP
+-         and VHPT is TR mapped.  */
++      /* Even though VHPT is per VCPU, still need to first disable the entry,
++       * because the processor may support speculative VHPT walk.  */
++      vlfe->ti_tag = INVALID_TI_TAG;
++      wmb();
+       vlfe->itir = logps;
+       vlfe->page_flags = pte | _PAGE_P;
+-      vlfe->ti_tag = tag;
++      *(volatile unsigned long*)&vlfe->ti_tag = tag;
+ }
+ 
+ void vhpt_multiple_insert(unsigned long vaddr, unsigned long pte, unsigned 
long logps)
diff -r 7ba52aa72ae5 -r 41c9c4fcf358 15115-7812598f65be
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/15115-7812598f65be        Wed Sep 12 15:02:25 2007 +0900
@@ -0,0 +1,28 @@
+# HG changeset patch
+# User Alex Williamson <alex.williamson@xxxxxx>
+# Date 1178910424 21600
+# Node ID 7812598f65beaf4934cec9e01e0f538ada097da6
+# Parent  7d8acd319d5b5927ce40230d48132ba4301edf44
+[IA64] Return ENOMEM if VPD allocation failed
+
+Usually ASSRET() is "(void)0".  Therefore if VPD allocation
+fails with xenheap shortage or fragmentation, NULL pointer
+access occurs in vmx_final_setup_guest().
+This patch fixes it.
+
+Signed-off-by: Masaki Kanno <kanno.masaki@xxxxxxxxxxxxxx>
+xen-unstable changeset: 15115:7812598f65beaf4934cec9e01e0f538ada097da6
+xen-unstable date: Fri May 11 13:07:04 2007 -0600
+
+diff -r 7d8acd319d5b -r 7812598f65be xen/arch/ia64/vmx/vmx_init.c
+--- a/xen/arch/ia64/vmx/vmx_init.c     Thu May 10 15:55:22 2007 -0600
++++ b/xen/arch/ia64/vmx/vmx_init.c     Fri May 11 13:07:04 2007 -0600
+@@ -299,6 +299,8 @@ vmx_final_setup_guest(struct vcpu *v)
+ 
+       vpd = alloc_vpd();
+       ASSERT(vpd);
++      if (!vpd)
++              return -ENOMEM;
+ 
+       v->arch.privregs = (mapped_regs_t *)vpd;
+       vcpu_share_privregs_with_guest(v);
diff -r 7ba52aa72ae5 -r 41c9c4fcf358 15116-d6309cfd1fdd
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/15116-d6309cfd1fdd        Wed Sep 12 15:02:25 2007 +0900
@@ -0,0 +1,31 @@
+# HG changeset patch
+# User Alex Williamson <alex.williamson@xxxxxx>
+# Date 1178910552 21600
+# Node ID d6309cfd1fdd53c23fd8daf32afe67abb68b35d6
+# Parent  7812598f65beaf4934cec9e01e0f538ada097da6
+[IA64] Fix allocate_rid_range()
+
+Though there is a free ridblock_owner[], allocate_rid_range()
+cannot allocate it.
+
+Signed-off-by: Masaki Kanno <kanno.masaki@xxxxxxxxxxxxxx>
+xen-unstable changeset: 15116:d6309cfd1fdd53c23fd8daf32afe67abb68b35d6
+xen-unstable date: Fri May 11 13:09:12 2007 -0600
+
+diff -r 7812598f65be -r d6309cfd1fdd xen/arch/ia64/xen/regionreg.c
+--- a/xen/arch/ia64/xen/regionreg.c    Fri May 11 13:07:04 2007 -0600
++++ b/xen/arch/ia64/xen/regionreg.c    Fri May 11 13:09:12 2007 -0600
+@@ -157,9 +157,12 @@ int allocate_rid_range(struct domain *d,
+       for (i = n_rid_blocks; i < MAX_RID_BLOCKS; i += n_rid_blocks) {
+               if (ridblock_owner[i] == NULL) {
+                       for (j = i; j < i + n_rid_blocks; ++j) {
+-                              if (ridblock_owner[j])
++                              if (ridblock_owner[j]) {
++                                      ++j;
+                                       break;
++                              }
+                       }
++                      --j;
+                       if (ridblock_owner[j] == NULL)
+                               break;
+               }
diff -r 7ba52aa72ae5 -r 41c9c4fcf358 15119-fd72e71de51a
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/15119-fd72e71de51a        Wed Sep 12 15:02:25 2007 +0900
@@ -0,0 +1,101 @@
+# HG changeset patch
+# User Alex Williamson <alex.williamson@xxxxxx>
+# Date 1179165121 21600
+# Node ID fd72e71de51a53f865e4e82d2bcca1c7664c9b04
+# Parent  c0de8feef4cda1cfe6bd926f8b9adbc1fbc8589b
+[IA64] Fix ptc.ga emulation
+
+cset14829(c42ae7839750) was incomplete.
+
+The region register 0 will be clobbered as follows.
+
+time    pcpu0   pcpu1   pcpu2
+ |      vcpu0   vcpu1   idle  // assignment of vcpu
+ V
+        1.vcpu0 issues ptc.ga
+        2.vcpu0 sends IPI to vcpu1(pcpu1)
+                3.vcpu1 migrates from pcpu1 to pcpu2
+                4.pcpu1 receives IPI of 2 and exec ptc_ga_remote_func()
+                5.pcpu1 saves and modifies vrr[0]
+                        6.vcpu1(pcpu2) modifies vrr[0]
+                7.pcpu1 restores vrr[0]         // vrr[0] of 6 is lost
+
+Windows will crash due to this issue.
+
+Signed-off-by: Kouya Shimura <kouya@xxxxxxxxxxxxxx>
+xen-unstable changeset: 15119:fd72e71de51a53f865e4e82d2bcca1c7664c9b04
+xen-unstable date: Mon May 14 11:52:01 2007 -0600
+
+diff -r c0de8feef4cd -r fd72e71de51a xen/arch/ia64/vmx/vmmu.c
+--- a/xen/arch/ia64/vmx/vmmu.c Mon May 14 11:13:24 2007 -0600
++++ b/xen/arch/ia64/vmx/vmmu.c Mon May 14 11:52:01 2007 -0600
+@@ -563,11 +563,17 @@ struct ptc_ga_args {
+ 
+ static void ptc_ga_remote_func (void *varg)
+ {
+-    u64 oldrid, moldrid, mpta, oldpsbits, vadr;
++    u64 oldrid, moldrid, mpta, oldpsbits, vadr, flags;
+     struct ptc_ga_args *args = (struct ptc_ga_args *)varg;
+     VCPU *v = args->vcpu;
+     vadr = args->vadr;
+ 
++    /* Try again if VCPU has migrated. */
++    if (v->processor != current->processor)
++        return;
++    vcpu_schedule_lock_irqsave(v, flags);
++    if (v->processor != current->processor)
++        goto bail;
+     oldrid = VMX(v, vrr[0]);
+     VMX(v, vrr[0]) = args->rid;
+     oldpsbits = VMX(v, psbits[0]);
+@@ -584,6 +590,9 @@ static void ptc_ga_remote_func (void *va
+     ia64_set_rr(0x0,moldrid);
+     ia64_set_pta(mpta);
+     ia64_dv_serialize_data();
++    args->vcpu = NULL;
++bail:
++    vcpu_schedule_unlock_irqrestore(v, flags);
+ }
+ 
+ 
+@@ -602,28 +611,21 @@ IA64FAULT vmx_vcpu_ptc_ga(VCPU *vcpu, u6
+         if (!v->is_initialised)
+             continue;
+ 
++        if (v == vcpu) {
++            vmx_vcpu_ptc_l(v, va, ps);
++            continue;
++        }
++
+         args.vcpu = v;
+-again: /* Try again if VCPU has migrated.  */
+-        proc = v->processor;
+-        if (proc != vcpu->processor) {
+-            /* Flush VHPT on remote processors.  */
+-            smp_call_function_single(v->processor,
+-                                     &ptc_ga_remote_func, &args, 0, 1);
+-            if (proc != v->processor)
+-                goto again;
+-        } else if (v == vcpu) {
+-            vmx_vcpu_ptc_l(v, va, ps);
+-        } else {
+-            vcpu_schedule_lock_irq(v);
++        do {
+             proc = v->processor;
+-            if (proc == vcpu->processor)
++            if (proc != vcpu->processor)
++                /* Flush VHPT on remote processors. */
++                smp_call_function_single(proc, &ptc_ga_remote_func,
++                                         &args, 0, 1);
++            else
+                 ptc_ga_remote_func(&args);
+-            else
+-                proc = INVALID_PROCESSOR;
+-            vcpu_schedule_unlock_irq(v);
+-            if (proc == INVALID_PROCESSOR)
+-                goto again;
+-        }
++        } while (args.vcpu != NULL);
+     }
+     return IA64_NO_FAULT;
+ }
diff -r 7ba52aa72ae5 -r 41c9c4fcf358 15122-afb27041a2ce
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/15122-afb27041a2ce        Wed Sep 12 15:02:25 2007 +0900
@@ -0,0 +1,81 @@
+# HG changeset patch
+# User Alex Williamson <alex.williamson@xxxxxx>
+# Date 1179333727 21600
+# Node ID afb27041a2ce4493b6c1d9cf87939858a96136d0
+# Parent  8c5ebe559a4ddfa05a6291a9b33ae29ea202a462
+[IA64] Fix deadlock of ptc.ga emulation
+
+ptc_ga_remote_func() might be invoked by IPI with a schedule_lock
+that is acquired. (e.g., inside of vcpu_migrate())
+It will cause a deadlock.
+
+Signed-off-by: Kouya Shimura <kouya@xxxxxxxxxxxxxx>
+xen-unstable changeset: 15122:afb27041a2ce4493b6c1d9cf87939858a96136d0
+xen-unstable date: Wed May 16 10:42:07 2007 -0600
+
+diff -r 8c5ebe559a4d -r afb27041a2ce xen/arch/ia64/vmx/vmmu.c
+--- a/xen/arch/ia64/vmx/vmmu.c Tue May 15 15:32:23 2007 -0600
++++ b/xen/arch/ia64/vmx/vmmu.c Wed May 16 10:42:07 2007 -0600
+@@ -563,13 +563,16 @@ static void ptc_ga_remote_func (void *va
+     struct ptc_ga_args *args = (struct ptc_ga_args *)varg;
+     VCPU *v = args->vcpu;
+     vadr = args->vadr;
++    int cpu = v->processor;
+ 
+     /* Try again if VCPU has migrated. */
+-    if (v->processor != current->processor)
++    if (cpu != current->processor)
+         return;
+-    vcpu_schedule_lock_irqsave(v, flags);
+-    if (v->processor != current->processor)
+-        goto bail;
++    local_irq_save(flags);
++    if (!spin_trylock(&per_cpu(schedule_data, cpu).schedule_lock))
++        goto bail2;
++    if (v->processor != cpu)
++        goto bail1;
+     oldrid = VMX(v, vrr[0]);
+     VMX(v, vrr[0]) = args->rid;
+     oldpsbits = VMX(v, psbits[0]);
+@@ -587,8 +590,10 @@ static void ptc_ga_remote_func (void *va
+     ia64_set_pta(mpta);
+     ia64_dv_serialize_data();
+     args->vcpu = NULL;
+-bail:
+-    vcpu_schedule_unlock_irqrestore(v, flags);
++bail1:
++    spin_unlock(&per_cpu(schedule_data, cpu).schedule_lock);
++bail2:
++    local_irq_restore(flags);
+ }
+ 
+ 
+@@ -598,7 +603,7 @@ IA64FAULT vmx_vcpu_ptc_ga(VCPU *vcpu, u6
+     struct domain *d = vcpu->domain;
+     struct vcpu *v;
+     struct ptc_ga_args args;
+-    int proc;
++    int cpu;
+ 
+     args.vadr = va;
+     vcpu_get_rr(vcpu, va, &args.rid);
+@@ -614,13 +619,15 @@ IA64FAULT vmx_vcpu_ptc_ga(VCPU *vcpu, u6
+ 
+         args.vcpu = v;
+         do {
+-            proc = v->processor;
+-            if (proc != vcpu->processor)
++            cpu = v->processor;
++            if (cpu != current->processor) {
++                spin_unlock_wait(&per_cpu(schedule_data, cpu).schedule_lock);
+                 /* Flush VHPT on remote processors. */
+-                smp_call_function_single(proc, &ptc_ga_remote_func,
++                smp_call_function_single(cpu, &ptc_ga_remote_func,
+                                          &args, 0, 1);
+-            else
++            } else {
+                 ptc_ga_remote_func(&args);
++            }
+         } while (args.vcpu != NULL);
+     }
+     return IA64_NO_FAULT;
diff -r 7ba52aa72ae5 -r 41c9c4fcf358 15307-d30576123892
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/15307-d30576123892        Wed Sep 12 15:02:25 2007 +0900
@@ -0,0 +1,25 @@
+# HG changeset patch
+# User Alex Williamson <alex.williamson@xxxxxx>
+# Date 1179779409 21600
+# Node ID d305761238924735fc00fc091b3cf0bb5949517d
+# Parent  6450f6287898ea5b2e7420647bf13cf709f949ce
+[IA64] Fix vpd size
+
+New pal has fixed vpd size issue, so change it to 64K to conform to Spec.
+
+Signed-off-by: Zhang xiantao <xiantao.zhang@xxxxxxxxx>
+xen-unstable changeset: 15307:d305761238924735fc00fc091b3cf0bb5949517d
+xen-unstable date: Mon May 21 14:30:09 2007 -0600
+
+diff -r 6450f6287898 -r d30576123892 xen/include/asm-ia64/vmx_vpd.h
+--- a/xen/include/asm-ia64/vmx_vpd.h   Mon May 21 14:09:27 2007 -0600
++++ b/xen/include/asm-ia64/vmx_vpd.h   Mon May 21 14:30:09 2007 -0600
+@@ -29,7 +29,7 @@
+ #include <public/xen.h>
+ #include <xen/spinlock.h>
+ 
+-#define VPD_SHIFT     17      /* 128K requirement */
++#define VPD_SHIFT     16
+ #define VPD_SIZE      (1 << VPD_SHIFT)
+ 
+ typedef struct {
diff -r 7ba52aa72ae5 -r 41c9c4fcf358 15311-466f71b1e831
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/15311-466f71b1e831        Wed Sep 12 15:02:25 2007 +0900
@@ -0,0 +1,82 @@
+# HG changeset patch
+# User Alex Williamson <alex.williamson@xxxxxx>
+# Date 1180037788 21600
+# Node ID 466f71b1e8319927dca16bd16b05faa09fad0cdd
+# Parent  40542d29da2bda69fb3ed17b303e01d723b0aa9a
+[IA64] Fix ld.s emulation
+
+With this patch,
+* XEN correctly emulates ld.s for HVM
+* original memory attribute is preserved in vcpu->arch.vtlb
+
+Without this, XEN infrequently calls panic_domain() by mistake for windows.
+
+Signed-off-by: Kouya Shimura <kouya@xxxxxxxxxxxxxx>
+Signed-off-by: Akio Takebe <takebe_akio@xxxxxxxxxxxxxx>
+xen-unstable changeset: 15311:466f71b1e8319927dca16bd16b05faa09fad0cdd
+xen-unstable date: Thu May 24 14:16:28 2007 -0600
+
+diff -r d2ef85c6bf84 xen/arch/ia64/vmx/vmx_process.c
+--- a/xen/arch/ia64/vmx/vmx_process.c  Tue May 08 10:38:06 2007 +0100
++++ b/xen/arch/ia64/vmx/vmx_process.c  Wed Sep 12 14:46:46 2007 +0900
+@@ -311,6 +311,8 @@ vmx_hpw_miss(u64 vadr , u64 vec, REGS* r
+ 
+     if(is_physical_mode(v)&&(!(vadr<<1>>62))){
+         if(vec==2){
++            if (misr.sp) /* Refer to SDM Vol2 Table 4-11,4-12 */
++                return vmx_handle_lds(regs);
+             if (v->domain != dom0
+                 && __gpfn_is_io(v->domain, (vadr << 1) >> (PAGE_SHIFT + 1))) {
+                 emulate_io_inst(v,((vadr<<1)>>1),4);   //  UC
+@@ -323,9 +325,16 @@ vmx_hpw_miss(u64 vadr , u64 vec, REGS* r
+ 
+     if((data=vtlb_lookup(v, vadr,type))!=0){
+         if (v->domain != dom0 && type == DSIDE_TLB) {
++            if (misr.sp) { /* Refer to SDM Vol2 Table 4-10,4-12 */
++                if ((data->ma == VA_MATTR_UC) || (data->ma == VA_MATTR_UCE))
++                    return vmx_handle_lds(regs);
++            }
+             gppa = (vadr & ((1UL << data->ps) - 1)) +
+                    (data->ppn >> (data->ps - 12) << data->ps);
+             if (__gpfn_is_io(v->domain, gppa >> PAGE_SHIFT)) {
++                if (misr.sp)
++                    panic_domain(NULL, "ld.s on I/O page not with UC attr."
++                                 " pte=0x%lx\n", data->page_flags);
+                 if (data->pl >= ((regs->cr_ipsr >> IA64_PSR_CPL0_BIT) & 3))
+                     emulate_io_inst(v, gppa, data->ma);
+                 else {
+diff -r d2ef85c6bf84 xen/arch/ia64/vmx/vtlb.c
+--- a/xen/arch/ia64/vmx/vtlb.c Tue May 08 10:38:06 2007 +0100
++++ b/xen/arch/ia64/vmx/vtlb.c Wed Sep 12 14:46:46 2007 +0900
+@@ -500,6 +500,13 @@ u64 translate_phy_pte(VCPU *v, u64 *pte,
+         *pte |= VTLB_PTE_IO;
+         return -1;
+     }
++    /* Ensure WB attribute if pte is related to a normal mem page,
++     * which is required by vga acceleration since qemu maps shared
++     * vram buffer with WB.
++     */
++    if (phy_pte.ma != VA_MATTR_NATPAGE)
++        phy_pte.ma = VA_MATTR_WB;
++
+ //    rr.rrval = ia64_get_rr(va);
+ //    ps = rr.ps;
+     maddr = ((maddr & _PAGE_PPN_MASK) & PAGE_MASK) | (paddr & ~PAGE_MASK);
+@@ -521,14 +528,10 @@ void thash_purge_and_insert(VCPU *v, u64
+     vcpu_get_rr(current, ifa, &vrr.rrval);
+     mrr.rrval = ia64_get_rr(ifa);
+     if(VMX_DOMAIN(v)){
+-        /* Ensure WB attribute if pte is related to a normal mem page,
+-         * which is required by vga acceleration since qemu maps shared
+-         * vram buffer with WB.
+-         */
+-        if (!(pte & VTLB_PTE_IO) && ((pte & _PAGE_MA_MASK) != _PAGE_MA_NAT))
+-            pte &= ~_PAGE_MA_MASK;
+-
+         phy_pte = translate_phy_pte(v, &pte, itir, ifa);
++
++        if (pte & VTLB_PTE_IO)
++            ret = 1;
+         vtlb_purge(v, ifa, ps);
+         vhpt_purge(v, ifa, ps);
+         if (ps == mrr.ps) {
diff -r 7ba52aa72ae5 -r 41c9c4fcf358 15341-2fd72ec88a9a
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/15341-2fd72ec88a9a        Wed Sep 12 15:02:25 2007 +0900
@@ -0,0 +1,48 @@
+# HG changeset patch
+# User Alex Williamson <alex.williamson@xxxxxx>
+# Date 1181142830 21600
+# Node ID 2fd72ec88a9afa1af005b261d835ef8b42bbb5e8
+# Parent  9daa40cae3d6548f404bcfd4300e604185db6b64
+[IA64] Fix HVM boot failure
+
+HVM sometimes fails to boot with the message
+"Guest nested fault vector=0x5400!".
+
+The cause of this issue is that cr.ifs never be initialized in very
+first context switching. To optimize hypercall on HVM, cr.ifs is only
+set with the predicate pNonSys(pr5)=1.
+
+Signed-off-by: Kouya Shimura <kouya@xxxxxxxxxxxxxx>
+xen-unstable changeset: 15341:2fd72ec88a9afa1af005b261d835ef8b42bbb5e8
+xen-unstable date: Wed Jun 06 09:13:50 2007 -0600
+
+diff -r 9daa40cae3d6 -r 2fd72ec88a9a xen/arch/ia64/vmx/vmx_init.c
+--- a/xen/arch/ia64/vmx/vmx_init.c     Wed Jun 06 09:10:52 2007 -0600
++++ b/xen/arch/ia64/vmx/vmx_init.c     Wed Jun 06 09:13:50 2007 -0600
+@@ -51,6 +51,7 @@
+ #include <asm/viosapic.h>
+ #include <xen/event.h>
+ #include <asm/vlsapic.h>
++#include "entry.h"
+ 
+ /* Global flag to identify whether Intel vmx feature is on */
+ u32 vmx_enabled = 0;
+@@ -296,6 +297,7 @@ vmx_final_setup_guest(struct vcpu *v)
+ {
+       vpd_t *vpd;
+       int rc;
++      struct switch_stack *sw;
+ 
+       vpd = alloc_vpd();
+       ASSERT(vpd);
+@@ -331,6 +333,10 @@ vmx_final_setup_guest(struct vcpu *v)
+       /* Set up guest 's indicator for VTi domain*/
+       set_bit(ARCH_VMX_DOMAIN, &v->arch.arch_vmx.flags);
+ 
++      /* Initialize pNonSys=1 for the first context switching */
++      sw = (struct switch_stack *)vcpu_regs(v) - 1;
++      sw->pr = (1UL << PRED_NON_SYSCALL);
++
+       return 0;
+ }
+ 
diff -r 7ba52aa72ae5 -r 41c9c4fcf358 15568-34f285b57b87
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/15568-34f285b57b87        Wed Sep 12 15:02:25 2007 +0900
@@ -0,0 +1,69 @@
+# HG changeset patch
+# User Alex Williamson <alex.williamson@xxxxxx>
+# Date 1183662240 21600
+# Node ID 34f285b57b87e94948f9af22df80888452d85dce
+# Parent  40608e5e394ee4bcc5b68a4cbf49973f39327981
+[IA64] Fix soft lock up caused by xen_timer_interrupt()
+
+This patch intends to fix softlockup caused by xen_timer_interrupt().
+This is caused by local_cpu_data->itm_next and stime_irq, itc_at_irq
+inconsistency at CPU0 of hypervisor.  This patch sets stime_irq and
+itc_at_irq every time in xen_timer_interrupt() to avoid this soft
+lock up.
+
+In other words, it is caused by competition of local_cpu_data->itm_next
+and domain_itm in xen_timer_interrupt() and reprogram_timer() (more
+specific vcpu_set_next_timer()).
+
+For example:
+ 1) reprogram_timer() runs and set local_cpu_data->itm_next and set
+    domain_itm as next itm.
+ 2) xen_timer_interrupt() called but following condition is not satisfied:
+    while(time_after(ia64_get_itc(), local_cpu_data->itm_next)
+    This skips stime_irq and itc_at_irq setting.
+ 3) goto 1)
+ 4) sometimes local_cpu_data->itm_next is rollback because
+    ns_to_cycle()/IA64 is representing almost 32bit.
+    (This occured at reprogram_timer())
+ 5) It causes soft lock up.
+ 6) Hypervisor returns to work(not hang).
+
+To reproduce this issue, I do following configuration.
+
+ 1) boot Xen with pcpu=4 and Dom0 with vcpu=4
+ 2) boot domU1 with vcpu with vcpu-pin 0-1
+ 3) boot domU2 with vcpu with vcpu-pin 0-1
+ 4) run yes > /dev/null  2 process on domU1
+ 5) run nothing on domU2(to check softlock up occured or not)
+ 6) run kernel compile with -j4 on Dom0 continuously
+ 7) wait 4 or 8 hours to occur softlockup.
+
+Signed-off-by: Atsushi SAKAI <sakaia@xxxxxxxxxxxxxx>
+xen-unstable changeset: 15568:34f285b57b87e94948f9af22df80888452d85dce
+xen-unstable date: Thu Jul 05 13:04:00 2007 -0600
+
+diff -r 40608e5e394e -r 34f285b57b87 xen/arch/ia64/xen/xentime.c
+--- a/xen/arch/ia64/xen/xentime.c      Mon Jul 02 21:06:46 2007 -0600
++++ b/xen/arch/ia64/xen/xentime.c      Thu Jul 05 13:04:00 2007 -0600
+@@ -126,9 +126,7 @@ xen_timer_interrupt (int irq, void *dev_
+ 
+ 
+       new_itm = local_cpu_data->itm_next;
+-      while (time_after(ia64_get_itc(), new_itm)) {
+-              new_itm += local_cpu_data->itm_delta;
+-
++      while (1) {
+               if (smp_processor_id() == TIME_KEEPER_ID) {
+                       /*
+                        * Here we are in the timer irq handler. We have irqs 
locally
+@@ -150,6 +148,10 @@ xen_timer_interrupt (int irq, void *dev_
+ 
+               local_cpu_data->itm_next = new_itm;
+ 
++              if (time_after(new_itm, ia64_get_itc())) 
++                      break;
++
++              new_itm += local_cpu_data->itm_delta;
+       }
+ 
+       if (!is_idle_domain(current->domain) && !VMX_DOMAIN(current)) {
diff -r 7ba52aa72ae5 -r 41c9c4fcf358 15655-9cd309378326
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/15655-9cd309378326        Wed Sep 12 15:02:25 2007 +0900
@@ -0,0 +1,46 @@
+# HG changeset patch
+# User kfraser@xxxxxxxxxxxxxxxxxxxxx
+# Date 1185791296 -3600
+# Node ID 9cd309378326c6efe4ae8a1454faa730597d1560
+# Parent  c0fbee66aff63978addc5f8b263947553f606d08
+[IA64] Disable ACPI SRAT,SLIT table of dom0.
+
+  On some ia64 NUMA machine, we cannot boot dom0.
+  This issue is caused by different infomation LSAPIC and SRAT.
+  Xen-ia64 modify LSAPIC IDs of dom0, but it does not modify SRAT.
+  So we decide disabling SRAT, SLIT of dom0 as first step of NUMA
+  work.
+
+Signed-off-by: Akio Takebe <takebe_akio@xxxxxxxxxxxxxx>
+xen-unstable changeset: 15655:9cd309378326c6efe4ae8a1454faa730597d1560
+xen-unstable date: Mon Jul 30 11:28:16 2007 +0100
+
+diff -r d2ef85c6bf84 xen/arch/ia64/xen/dom_fw.c
+--- a/xen/arch/ia64/xen/dom_fw.c       Tue May 08 10:38:06 2007 +0100
++++ b/xen/arch/ia64/xen/dom_fw.c       Wed Sep 12 14:48:58 2007 +0900
+@@ -287,12 +287,25 @@ acpi_update_madt_checksum (unsigned long
+ /* base is physical address of acpi table */
+ static void touch_acpi_table(void)
+ {
++      int result;
+       lsapic_nbr = 0;
+       if (acpi_table_parse_madt(ACPI_MADT_LSAPIC, acpi_update_lsapic, 0) < 0)
+               printk("Error parsing MADT - no LAPIC entries\n");
+       if (acpi_table_parse_madt(ACPI_MADT_PLAT_INT_SRC,
+                                 acpi_patch_plat_int_src, 0) < 0)
+               printk("Error parsing MADT - no PLAT_INT_SRC entries\n");
++
++      result = acpi_table_disable(ACPI_SRAT);
++      if ( result == 0 )
++              printk("Success Disabling SRAT\n");
++      else if ( result != -ENOENT )
++              printk("ERROR: Failed Disabling SRAT\n");
++
++      result = acpi_table_disable(ACPI_SLIT);
++      if ( result == 0 )
++              printk("Success Disabling SLIT\n");
++      else if ( result != -ENOENT )
++              printk("ERROR: Failed Disabling SLIT\n");
+ 
+       acpi_table_parse(ACPI_APIC, acpi_update_madt_checksum);
+ 
diff -r 7ba52aa72ae5 -r 41c9c4fcf358 15742-2796311c6a55
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/15742-2796311c6a55        Wed Sep 12 15:02:25 2007 +0900
@@ -0,0 +1,23 @@
+# HG changeset patch
+# User Alex Williamson <alex.williamson@xxxxxx>
+# Date 1184527976 21600
+# Node ID 2796311c6a5537cff38bba20b74a1e64a1d9e909
+# Parent  f536eb8576eeb7363212911b02fbaff4918172df
+[IA64] Fix a memory allocation bug in MCA
+
+Signed-off-by: Kazuhiro Suzuki <kaz@xxxxxxxxxxxxxx>
+xen-unstable changeset: 15742:2796311c6a5537cff38bba20b74a1e64a1d9e909
+xen-unstable date: Sun Jul 15 13:32:56 2007 -0600
+
+diff -r f536eb8576ee -r 2796311c6a55 xen/arch/ia64/linux-xen/mca.c
+--- a/xen/arch/ia64/linux-xen/mca.c    Wed Jul 11 11:32:30 2007 -0600
++++ b/xen/arch/ia64/linux-xen/mca.c    Sun Jul 15 13:32:56 2007 -0600
+@@ -184,7 +184,7 @@ static ia64_state_log_t ia64_state_log[I
+ #define IA64_LOG_ALLOCATE(it, size) \
+       do { \
+               unsigned int pageorder; \
+-              pageorder  = get_order_from_bytes(sizeof(struct ia64_mca_cpu)); 
\
++              pageorder = get_order_from_bytes(size); \
+               ia64_state_log[it].isl_log[IA64_LOG_CURR_INDEX(it)] = \
+                 (ia64_err_rec_t *)alloc_xenheap_pages(pageorder); \
+               ia64_state_log[it].isl_log[IA64_LOG_NEXT_INDEX(it)] = \
_______________________________________________
Xen-ia64-devel mailing list
Xen-ia64-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-ia64-devel