Module: xenomai-rpm Branch: for-upstream Commit: 4d5b03802b92e911f030d5ce88387a7ce038917d URL: http://git.xenomai.org/?p=xenomai-rpm.git;a=commit;h=4d5b03802b92e911f030d5ce88387a7ce038917d
Author: Philippe Gerum <r...@xenomai.org> Date: Wed Jan 4 14:14:11 2012 +0100 hal/powerpc: plug race in thread context switch Since rthal_thread_switch() is entered with hw IRQs enabled when CONFIG_XENO_HW_UNLOCKED_SWITCH is in effect, we ought to mask them around the register swap. This is in essence an overdue fix for the issue spotted and solved quite some time ago by Jesper Christensen, see: https://mail.gna.org/public/xenomai-core/2011-04/msg00095.html. Configurations with CONFIG_XENO_HW_UNLOCKED_SWITCH disabled are immune to this issue. --- ksrc/arch/powerpc/switch_32.S | 3 +++ ksrc/arch/powerpc/switch_64.S | 16 ++++++++++++++++ 2 files changed, 19 insertions(+), 0 deletions(-) diff --git a/ksrc/arch/powerpc/switch_32.S b/ksrc/arch/powerpc/switch_32.S index d170df4..dfca54c 100644 --- a/ksrc/arch/powerpc/switch_32.S +++ b/ksrc/arch/powerpc/switch_32.S @@ -46,6 +46,9 @@ _GLOBAL(rthal_thread_switch) SAVE_NVGPRS(r1) stw r0,_NIP(r1) /* Return to switch caller */ mfmsr r11 + rlwinm r0,r11,0,17,15 /* clear MSR_EE in r0 */ + MTMSRD(r11) + isync li r0,MSR_FP /* Disable floating-point */ #ifdef CONFIG_ALTIVEC BEGIN_FTR_SECTION diff --git a/ksrc/arch/powerpc/switch_64.S b/ksrc/arch/powerpc/switch_64.S index aaafaee..d67a1cf 100644 --- a/ksrc/arch/powerpc/switch_64.S +++ b/ksrc/arch/powerpc/switch_64.S @@ -139,6 +139,14 @@ _GLOBAL(rthal_thread_switch) SAVE_10GPRS(22, r1) mflr r20 /* Return to switch caller */ mfmsr r22 +#ifdef CONFIG_PPC_BOOK3E + wrteei 0 +#else + rldicl r0,r22,48,1 /* clear MSR_EE */ + rotldi r0,r0,16 + MTMSRD(r0) + isync +#endif /* CONFIG_PPC_BOOK3E */ li r0, MSR_FP #ifdef CONFIG_VSX BEGIN_FTR_SECTION @@ -274,6 +282,14 @@ _GLOBAL(rthal_thread_switch) SAVE_10GPRS(22, r1) mflr r20 /* Return to switch caller */ mfmsr r22 +#ifdef CONFIG_PPC_BOOK3E + wrteei 0 +#else + rldicl r0,r22,48,1 /* clear MSR_EE */ + rotldi r0,r0,16 + MTMSRD(r0) + isync +#endif /* CONFIG_PPC_BOOK3E */ li r0, MSR_FP #ifdef CONFIG_VSX BEGIN_FTR_SECTION _______________________________________________ Xenomai-git mailing list Xenomai-git@gna.org https://mail.gna.org/listinfo/xenomai-git