Module: xenomai-forge
Branch: next
Commit: ddfec37d9c7d510d174db531cef81c46636fdc4a
URL:    
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=ddfec37d9c7d510d174db531cef81c46636fdc4a

Author: Jan Kiszka <jan.kis...@siemens.com>
Date:   Wed Jan 30 17:00:58 2013 +0100

x86-64: Clean up fxsave/fxrstor

We always work against kernel memory and state here, and we did not
check the returned error code anyway. So downgrade __save_i387_checking/
__restore_i387_checking to non-checking versions and clean up the
corresponding assembly lines.

At this chance, we can pick up the kernel's micro-optimization when
CONFIG_AS_FXSAVEQ is set, i.e. we do not deal with prehistoric gas.

Signed-off-by: Jan Kiszka <jan.kis...@siemens.com>

---

 kernel/cobalt/arch/x86/thread.c |   57 +++++++++++----------------------------
 1 files changed, 16 insertions(+), 41 deletions(-)

diff --git a/kernel/cobalt/arch/x86/thread.c b/kernel/cobalt/arch/x86/thread.c
index 61cb365..a75539e 100644
--- a/kernel/cobalt/arch/x86/thread.c
+++ b/kernel/cobalt/arch/x86/thread.c
@@ -157,62 +157,39 @@ void xnarch_switch_to(struct xnarchtcb *out_tcb, struct 
xnarchtcb *in_tcb)
 
 #ifdef CONFIG_XENO_HW_FPU
 
-static inline int __do_save_i387(x86_fpustate *fpup)
+static inline void __do_save_i387(x86_fpustate *fpup)
 {
-       int err = 0;
-
 #ifdef CONFIG_X86_32
        if (cpu_has_fxsr)
                __asm__ __volatile__("fxsave %0; fnclex":"=m"(*fpup));
        else
                __asm__ __volatile__("fnsave %0; fwait":"=m"(*fpup));
 #else /* CONFIG_X86_64 */
-       struct i387_fxsave_struct *fx = &fpup->fxsave;
-
-       asm volatile("1:  rex64/fxsave (%[fx])\n\t"
-                    "2:\n"
-                    ".section .fixup,\"ax\"\n"
-                    "3:  movl $-1,%[err]\n"
-                    "    jmp  2b\n"
-                    ".previous\n"
-                    ".section __ex_table,\"a\"\n"
-                    "   .align 8\n"
-                    "   .quad  1b,3b\n"
-                    ".previous"
-                    : [err] "=r" (err), "=m" (*fx)
-                    : [fx] "cdaSDb" (fx), "0" (0));
+#ifdef CONFIG_AS_FXSAVEQ
+       asm volatile("fxsaveq %0" : "=m" (fpup->fxsave));
+#else /* !CONFIG_AS_FXSAVEQ */
+       asm volatile("rex64/fxsave (%[fx])"
+                    : "=m" (fpup->fxsave)
+                    : [fx] "R" (&fpup->fxsave));
+#endif /* !CONFIG_AS_FXSAVEQ */
 #endif /* CONFIG_X86_64 */
-
-       return err;
 }
 
-static inline int __do_restore_i387(x86_fpustate *fpup)
+static inline void __do_restore_i387(x86_fpustate *fpup)
 {
-       int err = 0;
-
 #ifdef CONFIG_X86_32
        if (cpu_has_fxsr)
                __asm__ __volatile__("fxrstor %0": /* no output */ :"m"(*fpup));
        else
                __asm__ __volatile__("frstor %0": /* no output */ :"m"(*fpup));
 #else /* CONFIG_X86_64 */
-       struct i387_fxsave_struct *fx = &fpup->fxsave;
-
-       asm volatile("1:  rex64/fxrstor (%[fx])\n\t"
-                    "2:\n"
-                    ".section .fixup,\"ax\"\n"
-                    "3:  movl $-1,%[err]\n"
-                    "    jmp  2b\n"
-                    ".previous\n"
-                    ".section __ex_table,\"a\"\n"
-                    "   .align 8\n"
-                    "   .quad  1b,3b\n"
-                    ".previous"
-                    : [err] "=r" (err)
-                    : [fx] "cdaSDb" (fx), "m" (*fx), "0" (0));
+#ifdef CONFIG_AS_FXSAVEQ
+       asm volatile("fxrstorq %0" : : "m" (fpup->fxsave));
+#else /* !CONFIG_AS_FXSAVEQ */
+       asm volatile("rex64/fxrstor (%0)"
+                    : : "R" (&fpup->fxsave), "m" (fpup->fxsave));
+#endif /* !CONFIG_AS_FXSAVEQ */
 #endif /* CONFIG_X86_64 */
-
-       return err;
 }
 
 int xnarch_handle_fpu_fault(struct xnarchtcb *tcb)
@@ -250,11 +227,9 @@ void xnarch_restore_fpu(struct xnarchtcb *tcb)
 {
        struct task_struct *p = tcb->core.host_task;
 
-       if (tcb->is_root || tsk_used_math(p) == 0) {
+       if (tcb->is_root || tsk_used_math(p) == 0)
                /* Restore lazy mode */
                return;
-       }
-       
 
        /*
         * Restore the FPU hardware with valid fp registers from a


_______________________________________________
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git

Reply via email to