On 10/24/07, Philippe Gerum <[EMAIL PROTECTED]> wrote:
> ROSSIER Daniel wrote:
> > Hi all,
> >
> > I've found a bug in arch/arm/xenomai/switch.S which solved the problem 
> > below. It actually comes from the iWMMXT (Intel Wireless MMX) coprocessor 
> > which is an extension of the ARM core in Xscale processor (and of course 
> > which is not available in the AT91 series ;-).
> >
> > When a thread switch occurs, rthal_thread_switch(in 
> > arch/arm/xenomai/switch.S) is called to perform switching of registers and 
> > stacks between threads. The PXA version must also perform a switch of MMX 
> > registers by invoking iwmmxt_task_switch(in arch/arm/kernel/iwmmxt.S). This 
> > is done in rthal_task_switch() as well.
> >
> > However, between Linux 2.6.15 and Linux 2.6.20, the general scheme of 
> > low-level task switching procedure changed a little bit: it is now relying 
> > on a call chain notifier-based mechanism. Therefore, the 
> > iwmmxt_task_switch() function has been updated since the function is called 
> > now from the notifier, and not directly from  __switch_to() as in 2.6.15. 
> > And the ipipe (ARM) patch did not take into account that.. and it fails.
> >
> > So, as a first workaround, I simply duplicated the iwmmxt_task_switch() 
> > function making the version (from 2.6.15) proprietary to ipipe by renaming 
> > to iwmmxt_task_switch_from_ipipe(), and modified arch/arm/xenomai/switch.S 
> > accordingly (be careful, switch.S is a symlink and actually belongs to 
> > Xenomai tree (ksrc/arch/arm).
> >
> > It seems to work so far, but further tests are needed (and will be done).
> >
> > I attached a patch to be applied in the (xenomai-patched) Linux tree.
> > (Linux 2.6.20, xenomai from today svn).
> >
>
> Task switching is not I-pipe's business, and we should refrain from
> recycling code from older kernel versions into recent ones. AFAICS, we
> only need to conform to some new internal API. Food for thought below:
>
> --- ksrc/arch/arm/switch.S      (revision 3095)
> +++ ksrc/arch/arm/switch.S      (working copy)
> @@ -18,6 +18,7 @@
>   */
>
>  #include <linux/linkage.h>
> +#include <linux/version.h>
>  #include <asm/assembler.h>
>  #include <asm/asm-offsets.h>
>
> @@ -86,7 +87,13 @@
>      VFPFMXR FPEXC, r4
>  #endif
>  #if defined(CONFIG_IWMMXT)
> +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
> +    mr      r0, r2
>      bl      iwmmxt_task_switch
> +    mr      r2, r0
> +#else
> +    bl      iwmmxt_task_switch
> +#endif
>  #elif defined(CONFIG_CPU_XSCALE)
>      add     r4, r2, #40                     @ cpu_context_save->extra
>      ldmib   r4, {r4, r5}

By greping THREAD_NOTIFY_SWITCH there appear to be other functions
which should be called upon task switch.

-- 
                                               Gilles Chanteperdrix

_______________________________________________
Xenomai-core mailing list
Xenomai-core@gna.org
https://mail.gna.org/listinfo/xenomai-core

Reply via email to