[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-ia64-devel] Re: mca handler



Hi,

You are right. The ar registers should not be destroyed.
So, I will try to make a patch which fixes it.

Thanks,
KAZ

From: Isaku Yamahata <yamahata@xxxxxxxxxxxxx>
Subject: mca handler
Date: Thu, 17 Jul 2008 11:54:46 +0900

> Hi.
> While I was debugging kexec/kdump, I have a question about the mca
> handler. I cited the related hunks below. Could you please clarify them?
> 
> On mca the firmware saves non-banked and banked general registers
> and the most of ar registers must be unchanged.
> However before ia64_os_mca_proc_state_dump saves such registers,
> the cited hunks unconditionally overwrite ar.k[36] so that
> they are destroyed. Am I missing anything?
> 
> 
> changeset:   12447:2afdc0066df6
> user:        awilliam@xxxxxxxxxxx
> date:        Sun Oct 29 09:27:11 2006 -0700
> files:       xen/arch/ia64/linux-xen/mca_asm.S
> description:
> [IA64] MCA support - Add percpu data physical addr mca_asm.S
> 
> Signed-off-by: Yutaka Ezaki <yutaka.ezaki@xxxxxxxxxxxxxx>
> Signed-off-by: Masaki Kanno <kanno.masaki@xxxxxxxxxxxxxx>
> Signed-off-by: Kazuhiro Suzuki <kaz@xxxxxxxxxxxxxx>
> ...
> ...
> @@ -132,7 +153,40 @@
>         .text
>         .align 16
>  
> -#ifndef XEN
> +#ifdef XEN
> +/*
> + * void set_per_cpu_data(void)
> + * {
> + *   int i;
> + *   for (i = 0; i < 64; i++) {
> + *     if (ia64_mca_tlb_list[i].cr_lid == ia64_getreg(_IA64_REG_CR_LID)) {
> + *       ia64_set_kr(IA64_KR_PER_CPU_DATA, 
> ia64_mca_tlb_list[i].percpu_paddr);
> + *       return;
> + *     }
> + *   }
> + *   while(1); // Endless loop on error
> + * }
> + */
> +#define SET_PER_CPU_DATA()                                     \
> +       LOAD_PHYSICAL(p0,r2,ia64_mca_tlb_list);;                \
> +       mov r7 = r0;                                            \
> +       mov r6 = r0;;                                           \
> +       adds r3 = IA64_MCA_PERCPU_OFFSET, r2;                   \
> +1:     add r4 = r6, r2;                                        \
> +       mov r5=cr.lid;;                                         \
> +       adds r7 = 1, r7;                                        \
> +       ld8 r4 = [r4];;                                         \
> +       cmp.ne p6, p7 = r5, r4;                                 \
> +       cmp4.lt p8, p9 = NR_CPUS-1, r7;                         \
> +(p7)   br.cond.dpnt 3f;                                        \
> +       adds r6 = 16, r6;                                       \
> +(p9)   br.cond.sptk 1b;                                        \
> +2:     br 2b;;                 /* Endless loop on error */     \
> +3:     add r4 = r6, r3;;                                       \
> +       ld8 r4 = [r4];;                                         \
> +       mov ar.k3=r4
> +#endif /* XEN */
> +
> ...
> @@ -235,6 +327,9 @@
>         cmp.ne  p6,p0=r4,r0
>  (p6)   br ia64_os_mca_spin
>  
> +#ifdef XEN
> +       SET_PER_CPU_DATA();;
> +#endif
>         // Save the SAL to OS MCA handoff state as defined
>         // by SAL SPEC 3.0
>         // NOTE : The order in which the state gets saved
> @@ -250,7 +345,19 @@
>  
>  ia64_os_mca_done_dump:
>  
> +#ifdef XEN
> +       // Set current to ar.k6
> +       GET_THIS_PADDR(r2,cpu_kr);;
> +       add r2=IA64_KR_CURRENT_OFFSET,r2;;
> +       ld8 r2=[r2];;
> +       mov ar.k6=r2;;
> +
> +       GET_THIS_PADDR(r2,ia64_sal_to_os_handoff_state_addr);;
> +       ld8 r2=[r2];;
> +       adds r16=56,r2
> +#else
>         LOAD_PHYSICAL(p0,r16,ia64_sal_to_os_handoff_state+56)
> +#endif
>         ;;
>         ld8 r18=[r16]           // Get processor state parameter on existing 
> PA
> LE_CHECK.
>         ;;
> ...
> @@ -874,12 +1003,6 @@
>         br      ia64_os_mca_done_restore;;
>  
>  
> //EndStub/////////////////////////////////////////////////////////////////////
> /
> -#else
> -ia64_os_mca_dispatch:
> -1:
> -       br.sptk 1b
> -ia64_os_mca_dispatch_end:
> -#endif /* !XEN */
>  
>  
>  // ok, the issue here is that we need to save state information so
> @@ -911,6 +1034,15 @@
>  
>  GLOBAL_ENTRY(ia64_monarch_init_handler)
>         .prologue
> +#ifdef XEN     /* Need in ia64_monarch_init_handler? */
> +       SET_PER_CPU_DATA();;
> +
> +       // Set current to ar.k6
> +       GET_THIS_PADDR(r2,cpu_kr);;
> +       add r2=IA64_KR_CURRENT_OFFSET,r2;;
> +       ld8 r2=[r2];;
> +       mov ar.k6=r2;;
> +#endif
>         // stash the information the SAL passed to os
>         SAL_TO_OS_MCA_HANDOFF_STATE_SAVE(r2)
>         ;;
> 
> 
> 
> -- 
> yamahata

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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.