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-ia64-devel

Re: [Xen-ia64-devel] Serial woes with kexec on an HP RX2620

On Mon, May 28, 2007 at 01:12:28PM +0900, Horms wrote:
> On Fri, May 25, 2007 at 03:09:32PM +0900, Akio Takebe wrote:
> > Hi, Horms
> > 
> > >I did find one thing which is interesting, which is that if
> > >I boot into the first kernel with xencons_poll, and the second
> > >kernel without it, then the console in both kernels works.
> > >I wonder if perhaps the first kernel needs to unhook something
> > >irq related.
> > >
> > >For completeness I tested all the combinations of booting with
> > >and without xencons_poll
> > >
> > >First Kernel     Second Kernel
> > >     -                -          No input on serial console
> > >     -           xencons_poll    Success
> > >xencons_poll          -          Success
> > >xencons_poll     xencons_poll    Success
> > I think RTE information don't be cleared.
> > Or first kernel may have to write EOI to ioapic (please see 
> > kexec_disable_iosapic() in linux code).
> > 
> > How about calling iosapic_unregister_intr() for serial console
> > before booting second kernel?
> 
> Calling iosapic_unregister_intr() as you suggest seems to work :-)
> I'll play around a bit more and get a patch together.

Hi Takebe-san,

thanks a lot for all your help with this problem.
With a bit of luck we now have a solution.

I found that by porting kexec_disable_iosapic() to xen (which involved
cut and paste only) and calling it from the right places, the serial port
on the rx2620 works just fine in the second kernel.

The patch below applies on top of the latest xen-ia64-kexec release
that I made. Let me know if you need a new release that incoporates this
patch.

http://www.vergenet.net/linux/kexec/ia64-xen/20070417/

-- 
Horms
  H: http://www.vergenet.net/~horms/
  W: http://www.valinux.co.jp/en/

From: Simon Horman <horms@xxxxxxxxxxxx>
Subject: [ia64,kexec] Add kexec_disable_iosapic

Ported from Linux, this shuts down iosapic before preforming kexec.
This resolves a problem whereby the serial port on an HP RX2620
(which uses IOSAPIC) was not able to accept input. It probably
resolves a bunch of other as yet unseen problems too.

Thanks to Takebe-san for working out the solution to this puzzle.

Cc: Akio Takebe <takebe_akio@xxxxxxxxxxxxxx>
Signed-off-by: Simon Horman <horms@xxxxxxxxxxxx>

Index: xen-ia64-unstable.hg/xen/arch/ia64/linux-xen/iosapic.c
===================================================================
--- xen-ia64-unstable.hg.orig/xen/arch/ia64/linux-xen/iosapic.c 2007-05-28 
14:19:45.000000000 +0900
+++ xen-ia64-unstable.hg/xen/arch/ia64/linux-xen/iosapic.c      2007-05-28 
14:19:51.000000000 +0900
@@ -268,6 +268,24 @@ nop (unsigned int vector)
        /* do nothing... */
 }
 
+void
+kexec_disable_iosapic(void)
+{
+        struct iosapic_intr_info *info;
+        struct iosapic_rte_info *rte;
+        u8 vec = 0;
+        for (info = iosapic_intr_info; info <
+                        iosapic_intr_info + IA64_NUM_VECTORS; ++info, ++vec) {
+                list_for_each_entry(rte, &info->rtes,
+                                rte_list) {
+                        iosapic_write(rte->addr,
+                                        IOSAPIC_RTE_LOW(rte->rte_index),
+                                        IOSAPIC_MASK|vec);
+                        iosapic_eoi(rte->addr, vec);
+                }
+        }
+}
+
 static void
 mask_irq (unsigned int irq)
 {
Index: xen-ia64-unstable.hg/xen/arch/ia64/xen/crash.c
===================================================================
--- xen-ia64-unstable.hg.orig/xen/arch/ia64/xen/crash.c 2007-05-28 
14:19:51.000000000 +0900
+++ xen-ia64-unstable.hg/xen/arch/ia64/xen/crash.c      2007-05-28 
14:19:51.000000000 +0900
@@ -30,6 +30,7 @@ void machine_crash_shutdown(void)
     dom0_mm_pgd_mfn = __pa(dom0->arch.mm.pgd) >> PAGE_SHIFT;
     memcpy((char *)info + offsetof(crash_xen_info_t, dom0_mm_pgd_mfn),
           &dom0_mm_pgd_mfn, sizeof(dom0_mm_pgd_mfn));
+    kexec_disable_iosapic();
 #ifdef CONFIG_SMP
     smp_send_stop();
 #endif
Index: xen-ia64-unstable.hg/xen/include/xen/kexec.h
===================================================================
--- xen-ia64-unstable.hg.orig/xen/include/xen/kexec.h   2007-05-28 
14:19:45.000000000 +0900
+++ xen-ia64-unstable.hg/xen/include/xen/kexec.h        2007-05-28 
14:19:51.000000000 +0900
@@ -27,6 +27,7 @@ void machine_kexec_reserved(xen_kexec_re
 void machine_reboot_kexec(xen_kexec_image_t *image);
 void machine_kexec(xen_kexec_image_t *image);
 void kexec_crash(void);
+void kexec_disable_iosapic(void);
 void kexec_crash_save_cpu(void);
 crash_xen_info_t *kexec_crash_save_info(void);
 void machine_crash_shutdown(void);
Index: xen-ia64-unstable.hg/xen/arch/ia64/xen/machine_kexec.c
===================================================================
--- xen-ia64-unstable.hg.orig/xen/arch/ia64/xen/machine_kexec.c 2007-05-28 
14:19:51.000000000 +0900
+++ xen-ia64-unstable.hg/xen/arch/ia64/xen/machine_kexec.c      2007-05-28 
14:19:51.000000000 +0900
@@ -89,6 +89,7 @@ static void ia64_machine_kexec(struct un
 
 void machine_kexec(xen_kexec_image_t *image)
 {
+       kexec_disable_iosapic();
        unw_init_running(ia64_machine_kexec, image);
        for(;;);
        ia64_machine_kexec(NULL, image);

_______________________________________________
Xen-ia64-devel mailing list
Xen-ia64-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-ia64-devel