Gilles Chanteperdrix wrote:
> Mark Saiia wrote:
>> Hello,
>>
>> The switchtest output is as follows.  This was run on 2.4.5 with 2.6.26.3
>> AMD Geode LX800 board.
>> In order to get it to run, I had to remove modprobe xeno_native from my
>> start-up script.  I don't know if that is an expected requirement prior to
>> running the test.
>>
>> == Testing FPU check routines...
>> r0: 1 != 2
>> r1: 1 != 2
>> r2: 1 != 2
>> r3: 1 != 2
>> r4: 1 != 2
>> r5: 1 != 2
>> r6: 1 != 2
>> r7: 1 != 2
>> == FPU check routines: OK.
>> == Threads: sleeper_ufps-0 rtk-1 rtk-2 rtk_fp-3 rtk_fp-4 rtk_fp_ufpp-5
>> rtk_fp_ufpp-6 rtup-7 rtup-8 rtup_ufpp-9 rtup_ufpp-10 rtus-11 rtus-12
>> rtus_ufps-13 rtus_ufps-14 rtuo-15 rtuo-16 rtuo_ufpp-17 rtuo_ufpp-18
>> rtuo_ufps-19 rtuo_ufps-20 rtuo_ufpp_ufps-21 rtuo_ufpp_ufps-22
>> RTT|  00:00:01
>> RTH|ctx switches|-------total
>> RTD|       17250|       17250
>> RTD|       17250|       34500
>> RTD|       17250|       51750
>> RTD|       17250|       69000
>> RTD|       17273|       86273
>> RTD|       17273|      103546
>> RTD|       17273|      120819
>> RTD|       17250|      138069
>> RTD|       17250|      155319
>> RTD|       17273|      172592
>> RTD|       17250|      189842
>> RTD|       17250|      207092
>> RTD|       17273|      224365
>> RTD|       17273|      241638
>> RTD|       17273|      258911
>> RTD|       17250|      276161
>> RTD|       17250|      293411
>> RTD|       17250|      310661
>> RTD|       17273|      327934
>> RTD|       17273|      345207
>> RTD|       17250|      362457
>>
>> Thanks in advance for any help.
>>
>> Mark Saiia
> 
> 
> Hi,
> 
> It seems you do not get the same error with switchtest as you get with
> your test program. I had a look at linux fpu handling, and it seems to
> be very different from Xenomai fpu handling. I need to dig a little bit
> more, but will send you a patch soon.

Here comes the promised patch.

Index: include/asm-x86/bits/pod_32.h
===================================================================
--- include/asm-x86/bits/pod_32.h       (revision 4355)
+++ include/asm-x86/bits/pod_32.h       (working copy)
@@ -194,16 +194,37 @@ static inline void xnarch_init_thread(xn
 static inline void xnarch_init_fpu(xnarchtcb_t * tcb)
 {
        struct task_struct *task = tcb->user_task;
+       x86_fpu_state *fpup = tcb->fpup;
        /* Initialize the FPU for a task. This must be run on behalf of the
           task. */
 
-       __asm__ __volatile__("clts; fninit");
+       if (cpu_has_fxsr) {
+               struct i837_fxsave_struct *fx = &fpup->fxsave;
 
-       if (cpu_has_xmm) {
-               unsigned long __mxcsr = 0x1f80UL & 0xffbfUL;
-               __asm__ __volatile__("ldmxcsr %0"::"m"(__mxcsr));
-       }
+               memset(fx, 0, sizeof(*fx));
+               fx->cwd = 0x37f;
+               if (cpu_has_xmm) {
+                       unsigned long __mxcsr = 0x1f80UL & 0xffbfUL;
+                       fx->mxcsr = __mxcsr;
+               }
+
+               clts();
+
+               __asm__ __volatile__("fxrstor %0": /* no output */ :"m"(*fx));
+       } else {
+               struct i387_fsave_struct *fp = &fpup->fsave;
+
+               memset(fp, 0, sizeof(*fp));
+               fp->cwd = 0xffff037fu;
+               fp->swd = 0xffff0000u;
+               fp->twd = 0xffffffffu;
+               fp->fos = 0xffff0000u;
+               
+               clts();
 
+               __asm__ __volatile__("frstor %0": /* no output */ :"m"(*fp));
+       }
+       
        if (task) {
                /* Real-time shadow FPU initialization: tell Linux that this
                   thread initialized its FPU hardware. The fpu usage bit is



-- 
                                            Gilles.

_______________________________________________
Xenomai-help mailing list
[email protected]
https://mail.gna.org/listinfo/xenomai-help

Reply via email to