Re: [Xenomai-core] [PowerPC] Registers Corruption at Context Switch

2008-06-20 Thread Philippe Gerum
Benjamin ZORES wrote:
> Hi,
> 
> I'm facing a problem with the PowerPC version of Xenomai/Adeos that I 
> have difficulties
> to identify the exact source.
> 
> I'm running a Xenomai RT kernel thread that use to crash sometimes due 
> to potential register corruption.
> Problem occurs after a context switch and, in some cases, if the task 
> gets interrupted and reschedule,
> its registers values are not the same as they used to be before context 
> switch.
> 
> The code is a bit complex and so, makes use of register that is 
> generally rarely used (GPR r26 to be accurate).
> Driver is compiled with -02 and compiling with -O0 (so disabling 
> optimizations and so, not using r26) works fine
> but is not what I'm looking for.
> 
> Can someone tell me where exactly in Adeos/Xenomai is context switching 
> actually performed and where are the registers save/restore functions ? 
> I've seen there is specific code for FPU registers handling but can't 
> find the equivalent for GPR.
> 
> FYI, I'm running on PowerPC 603e core with Linux 2.6.23, Adeos 2.0-09 
> (latest) and Xenomai 2.3.4 (latest).
> I've seen there are adeos updates (but for updated kernels) but is there 
> some ChangeLog of Adeos changes ?
> Maybe this is a known bug that has been fixed in updated Adeos release ?
> 
> Thx to anyone who can help me on this,
> 

See arch/powerpc/switch_32.S, rthal_switch_threads(), for the part that does the
actual stack switching.

Note that this code is obfuscated by the fact that we have to handle so-called
"hybrid" switching, between Xenomai kernel threads (which do not rely on a
task_struct), and Linux tasks (Xenomai userland, Linux kthreads, or regular
userland Linux). Fortunately, what is saved on the stack in any case is easy to
find out.


> Ben
> 
> 
> ___
> Xenomai-core mailing list
> Xenomai-core@gna.org
> https://mail.gna.org/listinfo/xenomai-core
> 


-- 
Philippe.

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


Re: [Xenomai-core] [PowerPC] Registers Corruption at Context Switch

2008-06-20 Thread Philippe Gerum
Benjamin ZORES wrote:
> Philippe Gerum a écrit :
>> See arch/powerpc/switch_32.S, rthal_switch_threads(), for the part that does 
>> the
>> actual stack switching.
>>
>> Note that this code is obfuscated by the fact that we have to handle 
>> so-called
>> "hybrid" switching, between Xenomai kernel threads (which do not rely on a
>> task_struct), and Linux tasks (Xenomai userland, Linux kthreads, or regular
>> userland Linux). Fortunately, what is saved on the stack in any case is easy 
>> to
>> find out.
>>   
> Thx for the info.
> Can you tell me why GPR registers would be saved there and FPU ones in 
> another function ?
> 

Because FPU management with Xenomai involves additional handling, e.g. FPU state
fixup during primary/secondary mode switch, Linux to Xenomai real-time
transitions. That support has to be provided independently from the pure task
switching code.

-- 
Philippe.

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


Re: [Xenomai-core] [PowerPC] Registers Corruption at Context Switch

2008-06-20 Thread Philippe Gerum
Benjamin ZORES wrote:
> Philippe Gerum a écrit :
>>> FYI, I'm running on PowerPC 603e core with Linux 2.6.23, Adeos 2.0-09
>>> (latest) and Xenomai 2.3.4 (latest).
>>> 
> read Xenomai 2.4.4 here, of course ...
>>
>> See arch/powerpc/switch_32.S, rthal_switch_threads(), for the part
>> that does the
>> actual stack switching.
>>
>> Note that this code is obfuscated by the fact that we have to handle
>> so-called
>> "hybrid" switching, between Xenomai kernel threads (which do not rely
>> on a
>> task_struct), and Linux tasks (Xenomai userland, Linux kthreads, or
>> regular
>> userland Linux). Fortunately, what is saved on the stack in any case
>> is easy to
>> find out.
>>   
> Ok, I've dig a bit more at sources and found out something strange.
> 
> In xenomai arch/powerpc/xenomai/switch_32.S in rthal_thread_switch() we
> have:
> 
> 
> #ifdef CONFIG_SMP
>sync
> #endif /* CONFIG_SMP */
> 
>lwzr1,KSP(r4)/* Load new stack pointer */
> 
>mrr3,r2
>lwzr0,PGDIR(r4)
>cmpwi   r0, 0
>beq-same_current
> 
>tophys(r0,r4)
>CLR_TOP32(r0)
>mtsprSPRN_SPRG3,r0/* Update current THREAD phys addr */
>addir2,r4,-THREAD/* Update current */
> 
> same_current:
> **
> 
> While, in arch/powerpc/kernel/entry_32.S in _switch() we have:
> 
> **
> #ifdef CONFIG_SMP
>/* We need a sync somewhere here to make sure that if the
> * previous task gets rescheduled on another CPU, it sees all
> * stores it has performed on this one.
> */
>sync
> #endif /* CONFIG_SMP */
> 
>tophys(r0,r4)
>CLR_TOP32(r0)
>mtsprSPRN_SPRG3,r0/* Update current THREAD phys addr */
>lwzr1,KSP(r4)/* Load new stack pointer */
> 
>/* save the old current 'last' for return value */
>mrr3,r2
>addir2,r4,-THREAD/* Update current */
> 
> 
> As we can see, the code differs from kernel, as
> 
>tophys(r0,r4)
>CLR_TOP32(r0)
>mtsprSPRN_SPRG3,r0/* Update current THREAD phys addr */
> 
> is done _before_ loading new stack pointer in kernel and _after_ doing
> so in xenomai.
> 
> Is there a good reason for that or is this unintended ??
> 

It's just code placement to avoid additional branches depending on whether we
want to update SPRG3 upon switch or not (when switching to a Xenomai kernel
thread, we don't). I see no dependency from that code on the stack pointer and
conversely. Do you see any?

-- 
Philippe.

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


Re: [Xenomai-core] [PowerPC] Registers Corruption at Context Switch

2008-06-20 Thread Benjamin ZORES
Philippe Gerum a écrit :
> See arch/powerpc/switch_32.S, rthal_switch_threads(), for the part that does 
> the
> actual stack switching.
>
> Note that this code is obfuscated by the fact that we have to handle so-called
> "hybrid" switching, between Xenomai kernel threads (which do not rely on a
> task_struct), and Linux tasks (Xenomai userland, Linux kthreads, or regular
> userland Linux). Fortunately, what is saved on the stack in any case is easy 
> to
> find out.
>   
Thx for the info.
Can you tell me why GPR registers would be saved there and FPU ones in 
another function ?

Ben

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


Re: [Xenomai-core] [PowerPC] Registers Corruption at Context Switch

2008-06-20 Thread Benjamin ZORES
Philippe Gerum a écrit :
>> FYI, I'm running on PowerPC 603e core with Linux 2.6.23, Adeos 2.0-09 
>> (latest) and Xenomai 2.3.4 (latest).
>> 
read Xenomai 2.4.4 here, of course ...
>
> See arch/powerpc/switch_32.S, rthal_switch_threads(), for the part that does 
> the
> actual stack switching.
>
> Note that this code is obfuscated by the fact that we have to handle so-called
> "hybrid" switching, between Xenomai kernel threads (which do not rely on a
> task_struct), and Linux tasks (Xenomai userland, Linux kthreads, or regular
> userland Linux). Fortunately, what is saved on the stack in any case is easy 
> to
> find out.
>   
Ok, I've dig a bit more at sources and found out something strange.

In xenomai arch/powerpc/xenomai/switch_32.S in rthal_thread_switch() we 
have:


#ifdef CONFIG_SMP
sync
#endif /* CONFIG_SMP */

lwzr1,KSP(r4)/* Load new stack pointer */

mrr3,r2
lwzr0,PGDIR(r4)
cmpwi   r0, 0
beq-same_current

tophys(r0,r4)
CLR_TOP32(r0)
mtsprSPRN_SPRG3,r0/* Update current THREAD phys addr */
addir2,r4,-THREAD/* Update current */

same_current:
**

While, in arch/powerpc/kernel/entry_32.S in _switch() we have:

**
#ifdef CONFIG_SMP
/* We need a sync somewhere here to make sure that if the
 * previous task gets rescheduled on another CPU, it sees all
 * stores it has performed on this one.
 */
sync
#endif /* CONFIG_SMP */

tophys(r0,r4)
CLR_TOP32(r0)
mtsprSPRN_SPRG3,r0/* Update current THREAD phys addr */
lwzr1,KSP(r4)/* Load new stack pointer */

/* save the old current 'last' for return value */
mrr3,r2
addir2,r4,-THREAD/* Update current */


As we can see, the code differs from kernel, as

tophys(r0,r4)
CLR_TOP32(r0)
mtsprSPRN_SPRG3,r0/* Update current THREAD phys addr */

is done _before_ loading new stack pointer in kernel and _after_ doing 
so in xenomai.

Is there a good reason for that or is this unintended ??

Ben


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