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
[email protected]
https://mail.gna.org/listinfo/xenomai-core