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
|