Module: xenomai-3 Branch: wip/drivers Commit: d99ff61eaffa21d3674b26ae186c0f781182cf15 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=d99ff61eaffa21d3674b26ae186c0f781182cf15
Author: Philippe Gerum <r...@xenomai.org> Date: Thu Jul 7 10:52:41 2016 +0200 cobalt/powerpc: cleanup fpu support In order to support the Book3E architecture, we now rely on the regular kernel accessors for manipulating the MSR, instead of assuming Book3S. In the same move, some obsolete compat code for kernel releases prior to v3.10 (i.e. not supported by Cobalt) was dropped. --- kernel/cobalt/arch/powerpc/fpu.S | 58 +++++++++++++---------------------- kernel/cobalt/arch/powerpc/thread.c | 51 ++++++------------------------ 2 files changed, 31 insertions(+), 78 deletions(-) diff --git a/kernel/cobalt/arch/powerpc/fpu.S b/kernel/cobalt/arch/powerpc/fpu.S index bd9bcc1..186e922 100644 --- a/kernel/cobalt/arch/powerpc/fpu.S +++ b/kernel/cobalt/arch/powerpc/fpu.S @@ -23,46 +23,15 @@ #include <asm/ppc_asm.h> #include <asm/asm-offsets.h> -#ifdef CONFIG_PPC601_SYNC_FIX -#define SYNC \ -BEGIN_FTR_SECTION \ - sync; \ - isync; \ -END_FTR_SECTION_IFSET(CPU_FTR_601) -#else /* !CONFIG_PPC601_SYNC_FIX */ -#define SYNC -#endif /* CONFIG_PPC601_SYNC_FIX */ - -#ifdef CONFIG_PPC64 -#ifndef MTMSRD -#define MTMSRD(r) mtmsrd r -#endif -#ifndef MTFSF_L -#define MTFSF_L(REG) \ - .long (0xfc00058e | ((0xff) << 17) | ((REG) << 11) | (1 << 25)) -#endif -#else /* !CONFIG_PPC64 */ -#ifndef MTMSRD -#define MTMSRD(r) mtmsr r -#endif -#ifndef MTFSF_L -#define MTFSF_L(REG) mtfsf 0xff, (REG) -#endif -#endif /* !CONFIG_PPC64 */ - #ifdef THREAD_FPSTATE -#define FIXUP_REG_FPSTATE(__reg) addi __reg,__reg,THREAD_FPSTATE +#define FIXUP_REG_FPSTATE(__reg) addi __reg, __reg, THREAD_FPSTATE #else -#define FIXUP_REG_FPSTATE(__reg) -#ifndef THREAD_FPSCR /* - * The following accessor has to work with ancient kernel versions, - * for which THREAD_FPSCR is not usable for 64bit save/restore. + * v3.10 -> v3.13 do not have THREAD_FPSTATE yet, but still + * define THREAD_FPSCR. */ -#define FPSTATE_FPSCR(base) THREAD_FPR0+32*8(base) -#else -#define FPSTATE_FPSCR(base) THREAD_FPSCR(base) -#endif +#define FIXUP_REG_FPSTATE(__reg) +#define FPSTATE_FPSCR(__base) THREAD_FPSCR(__base) #endif /* r3 = &thread_struct (tcb->fpup) */ @@ -99,3 +68,20 @@ _GLOBAL(__asm_restore_fpu) MTFSF_L(fr0) REST_32FPRS(0,r3) blr + +_GLOBAL(__asm_disable_fpu) + mfmsr r5 + li r3,MSR_FP + andc r5,r5,r3 + SYNC + MTMSRD(r5) + isync + blr + +_GLOBAL(__asm_enable_fpu) + mfmsr r5 + ori r5,r5,MSR_FP + SYNC + MTMSRD(r5) + isync + blr diff --git a/kernel/cobalt/arch/powerpc/thread.c b/kernel/cobalt/arch/powerpc/thread.c index 7f6ff87..2a61d50 100644 --- a/kernel/cobalt/arch/powerpc/thread.c +++ b/kernel/cobalt/arch/powerpc/thread.c @@ -67,6 +67,10 @@ asmlinkage void __asm_save_fpu(struct thread_struct *ts); asmlinkage void __asm_restore_fpu(struct thread_struct *ts); +asmlinkage void __asm_disable_fpu(void); + +asmlinkage void __asm_enable_fpu(void); + #ifndef CONFIG_SMP #define get_fpu_owner(cur) last_task_used_math #else /* CONFIG_SMP */ @@ -77,53 +81,15 @@ asmlinkage void __asm_restore_fpu(struct thread_struct *ts); }) #endif /* CONFIG_SMP */ -#ifdef CONFIG_PPC64 -#define do_disable_fpu() ({ \ - register unsigned long _msr; \ - __asm__ __volatile__ ( "mfmsr %0" : "=r"(_msr) ); \ - __asm__ __volatile__ ( "mtmsrd %0" \ - : /* no output */ \ - : "r"(_msr & ~(MSR_FP)) \ - : "memory" ); \ -}) - -#define do_enable_fpu() ({ \ - register unsigned long _msr; \ - __asm__ __volatile__ ( "mfmsr %0" : "=r"(_msr) ); \ - __asm__ __volatile__ ( "mtmsrd %0" \ - : /* no output */ \ - : "r"(_msr | MSR_FP) \ - : "memory" ); \ -}) -#else /* !CONFIG_PPC64 */ -#define do_disable_fpu() ({ \ - register unsigned long _msr; \ - __asm__ __volatile__ ( "mfmsr %0" : "=r"(_msr) ); \ - __asm__ __volatile__ ( "mtmsr %0" \ - : /* no output */ \ - : "r"(_msr & ~(MSR_FP)) \ - : "memory" ); \ -}) - -#define do_enable_fpu() ({ \ - register unsigned long _msr; \ - __asm__ __volatile__ ( "mfmsr %0" : "=r"(_msr) ); \ - __asm__ __volatile__ ( "mtmsr %0" \ - : /* no output */ \ - : "r"(_msr | MSR_FP) \ - : "memory" ); \ -}) -#endif /* CONFIG_PPC64 */ - static void xnarch_enable_fpu(struct xnthread *thread) { struct xnarchtcb *tcb = xnthread_archtcb(thread); struct task_struct *task = tcb->core.host_task; if (task && task != tcb->core.user_fpu_owner) - do_disable_fpu(); + __asm_disable_fpu(); else - do_enable_fpu(); + __asm_enable_fpu(); } void xnarch_save_fpu(struct xnthread *thread) @@ -164,8 +130,9 @@ static void xnarch_restore_fpu(struct xnthread *thread) * FIXME: We restore FPU "as it was" when Xenomai preempted Linux, * whereas we could be much lazier. */ - if (tcb->core.host_task && tcb->core.host_task != tcb->core.user_fpu_owner) - do_disable_fpu(); + if (tcb->core.host_task && + tcb->core.host_task != tcb->core.user_fpu_owner) + __asm_disable_fpu(); } void xnarch_switch_fpu(struct xnthread *from, struct xnthread *to) _______________________________________________ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git