Module: xenomai-3
Branch: master
Commit: bca687971ec5fbec89b026e8812337474bebc7e2
URL:    
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=bca687971ec5fbec89b026e8812337474bebc7e2

Author: Philippe Gerum <r...@xenomai.org>
Date:   Thu Nov 13 16:28:32 2014 +0100

cobalt/powerpc: use regular context switch routines

Since we don't have to care for hybrid scheduling anymore
(i.e. involving foreign/non-linux stack contexts), we may use the
regular context switching code, both for 32 and 64bit ports.

---

 kernel/cobalt/arch/powerpc/Makefile    |    2 +-
 kernel/cobalt/arch/powerpc/switch_32.S |  111 ---------------------
 kernel/cobalt/arch/powerpc/switch_64.S |  168 --------------------------------
 kernel/cobalt/arch/powerpc/thread.c    |    6 +-
 4 files changed, 4 insertions(+), 283 deletions(-)

diff --git a/kernel/cobalt/arch/powerpc/Makefile 
b/kernel/cobalt/arch/powerpc/Makefile
index adfca75..4e728d5 100644
--- a/kernel/cobalt/arch/powerpc/Makefile
+++ b/kernel/cobalt/arch/powerpc/Makefile
@@ -1,7 +1,7 @@
 
 obj-$(CONFIG_XENOMAI) += xenomai.o
 
-xenomai-y := machine.o mayday.o thread.o switch_$(CONFIG_WORD_SIZE).o
+xenomai-y := machine.o mayday.o thread.o
 
 xenomai-$(CONFIG_XENO_ARCH_FPU) += fpu.o
 
diff --git a/kernel/cobalt/arch/powerpc/switch_32.S 
b/kernel/cobalt/arch/powerpc/switch_32.S
deleted file mode 100644
index 0188083..0000000
--- a/kernel/cobalt/arch/powerpc/switch_32.S
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Most of the following code has been lifted from the original _switch()
- * routine from linux/arch/powerpc/kernel/entry.S.
- *
- * Xenomai updates Copyright (C) 2004 Philippe Gerum.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, Inc., 675 Mass Ave, Cambridge MA 02139,
- * USA; either version 2 of the License, or (at your option) any later
- * version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#include <linux/version.h>
-#include <asm/processor.h>
-#include <asm/page.h>
-#include <asm/ppc_asm.h>
-#include <asm/cputable.h>
-#include <asm/asm-offsets.h>
-#include <asm/ptrace.h>
-
-/*
- * struct task_struct *
- * __asm_thread_switch(struct thread_struct *prev, struct thread_struct *next)
- */
-       .align  7
-_GLOBAL(__asm_thread_switch)
-       stwu    r1,-INT_FRAME_SIZE(r1)
-       mflr    r0
-       stw     r0,INT_FRAME_SIZE+4(r1)
-       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
-       oris    r0,r0,MSR_VEC@h /* Disable altivec */
-       mfspr   r12,SPRN_VRSAVE /* save vrsave register value */
-       stw     r12,THREAD_VRSAVE(r3)
-END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
-#endif /* CONFIG_ALTIVEC */
-#ifdef CONFIG_SPE
-#ifdef CPU_FTR_SPE
-BEGIN_FTR_SECTION
-#endif
-       oris    r0,r0,MSR_SPE@h  /* Disable SPE */
-       mfspr   r12,SPRN_SPEFSCR /* save spefscr register value */
-       stw     r12,THREAD_SPEFSCR(r3)
-#ifdef CPU_FTR_SPE
-END_FTR_SECTION_IFSET(CPU_FTR_SPE)
-#endif
-#endif /* CONFIG_SPE */
-       and.    r0,r0,r11       /* FP or altivec or SPE enabled? */
-       beq+    1f
-       andc    r11,r11,r0
-       MTMSRD(r11)
-       isync
-1:     stw     r11,_MSR(r1)
-       mfcr    r10
-       stw     r10,_CCR(r1)
-       stw     r1,KSP(r3)      /* Save old stack pointer */
-
-#ifdef CONFIG_SMP
-       sync
-#endif /* CONFIG_SMP */
-
-       lwz     r1,KSP(r4)      /* Load new stack pointer */
-       mr      r3,r2
-       lwz     r0,PGDIR(r4)
-       tophys(r0,r4)
-       CLR_TOP32(r0)
-       mtspr   SPRN_SPRG3,r0   /* Update current THREAD phys addr */
-       addi    r2,r4,-THREAD   /* Update current */
-
-#ifdef CONFIG_ALTIVEC
-BEGIN_FTR_SECTION
-       lwz     r0,THREAD_VRSAVE(r4)
-       mtspr   SPRN_VRSAVE,r0          /* if G4, restore VRSAVE reg */
-END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
-#endif /* CONFIG_ALTIVEC */
-#ifdef CONFIG_SPE
-#ifdef CPU_FTR_SPE
-BEGIN_FTR_SECTION
-#endif
-       lwz     r0,THREAD_SPEFSCR(r4)
-       mtspr   SPRN_SPEFSCR,r0         /* restore SPEFSCR reg */
-#ifdef CPU_FTR_SPE
-END_FTR_SECTION_IFSET(CPU_FTR_SPE)
-#endif
-#endif /* CONFIG_SPE */
-
-       lwz     r0,_CCR(r1)
-       mtcrf   0xFF,r0
-       REST_NVGPRS(r1)
-
-       lwz     r4,_NIP(r1)
-       mtlr    r4
-       addi    r1,r1,INT_FRAME_SIZE
-       blr
diff --git a/kernel/cobalt/arch/powerpc/switch_64.S 
b/kernel/cobalt/arch/powerpc/switch_64.S
deleted file mode 100644
index 2b88b66..0000000
--- a/kernel/cobalt/arch/powerpc/switch_64.S
+++ /dev/null
@@ -1,168 +0,0 @@
-/*
- * Most of the following code has been lifted from the original _switch()
- * routine from linux/arch/powerpc/kernel/entry_64.S.
- *
- * Xenomai updates Copyright (C) 2004 Philippe Gerum.
- *
- * 64-bit PowerPC adoption
- *   copyright (C) 2005 Taneli Vähäkangas and Heikki Lindholm 
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, Inc., 675 Mass Ave, Cambridge MA 02139,
- * USA; either version 2 of the License, or (at your option) any later
- * version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#include <linux/version.h>
-#include <asm/processor.h>
-#include <asm/thread_info.h>
-#include <asm/cputable.h>
-#include <asm/ppc_asm.h>
-#include <asm/asm-offsets.h>
-#include <asm/page.h>
-#include <asm/mmu.h>
-#include <asm/ptrace.h>
-
-/*
- * struct task_struct *
- * __asm_thread_switch(struct thread_struct *prev, struct thread_struct *next)
- */
-_GLOBAL(__asm_thread_switch)
-       mflr    r0
-       std     r0,16(r1)
-       stdu    r1,-SWITCH_FRAME_SIZE(r1)
-       /* r3-r13 are caller saved -- Cort */
-       SAVE_8GPRS(14, r1)
-       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
-       oris    r0,r0,MSR_VSX@h /* Disable VSX */
-END_FTR_SECTION_IFSET(CPU_FTR_VSX)
-#endif /* CONFIG_VSX */
-#ifdef CONFIG_ALTIVEC
-BEGIN_FTR_SECTION
-       oris    r0,r0,MSR_VEC@h /* Disable altivec */
-       mfspr   r24,SPRN_VRSAVE /* save vrsave register value */
-       std     r24,THREAD_VRSAVE(r3)
-END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
-#endif /* CONFIG_ALTIVEC */
-       and.    r0,r0,r22
-       beq+    1f
-       andc    r22,r22,r0
-       MTMSRD(r22)
-       isync
-1:     std     r20,_NIP(r1)
-       mfcr    r23
-       std     r23,_CCR(r1)
-       std     r1,KSP(r3)      /* Set old stack pointer */
-
-#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 */
-
-       ld      r8,KSP(r4)      /* new stack pointer */
-       ld      r3,PACACURRENT(r13) /* we must return "prev" when paired to 
switch_to() */
-
-       addi    r6,r4,-THREAD   /* Convert THREAD to 'current' */
-       std     r6,PACACURRENT(r13)     /* Set new 'current' */
-#ifdef CONFIG_PPC_BOOK3S
-BEGIN_FTR_SECTION
-  BEGIN_FTR_SECTION_NESTED(95)
-       clrrdi  r6,r8,28        /* get its ESID */
-       clrrdi  r9,r1,28        /* get current sp ESID */
-  FTR_SECTION_ELSE_NESTED(95)
-       clrrdi  r6,r8,40        /* get its 1T ESID */
-       clrrdi  r9,r1,40        /* get current sp 1T ESID */
-  ALT_FTR_SECTION_END_NESTED_IFCLR(MMU_FTR_1T_SEGMENT, 95)
-FTR_SECTION_ELSE
-       b       2f
-ALT_FTR_SECTION_END_IFSET(MMU_FTR_SLB)
-       clrldi. r0,r6,2         /* is new ESID c00000000? */
-       cmpd    cr1,r6,r9       /* or is new ESID the same as current ESID? */
-       cror    eq,4*cr1+eq,eq
-       beq     2f              /* if yes, don't slbie it */
-
-       /* Bolt in the new stack SLB entry */
-       ld      r7,KSP_VSID(r4) /* Get new stack's VSID */
-       oris    r0,r6,(SLB_ESID_V)@h
-       ori     r0,r0,(SLB_NUM_BOLTED-1)@l
-BEGIN_FTR_SECTION
-       li      r9,MMU_SEGSIZE_1T       /* insert B field */
-       oris    r6,r6,(MMU_SEGSIZE_1T << SLBIE_SSIZE_SHIFT)@h
-       rldimi  r7,r9,SLB_VSID_SSIZE_SHIFT,0
-END_FTR_SECTION_IFSET(MMU_FTR_1T_SEGMENT)
-
-       /* Update the last bolted SLB.  No write barriers are needed
-        * here, provided we only update the current CPU's SLB shadow
-        * buffer.
-        */
-       ld      r9,PACA_SLBSHADOWPTR(r13)
-       li      r12,0
-       std     r12,SLBSHADOW_STACKESID(r9) /* Clear ESID */
-       std     r7,SLBSHADOW_STACKVSID(r9)  /* Save VSID */
-       std     r0,SLBSHADOW_STACKESID(r9)  /* Save ESID */
-
-       /* No need to check for CPU_FTR_NO_SLBIE_B here, since when
-        * we have 1TB segments, the only CPUs known to have the errata
-        * only support less than 1TB of system memory and we'll never
-        * actually hit this code path.
-        */
-
-       slbie   r6
-       slbie   r6              /* Workaround POWER5 < DD2.1 issue */
-       slbmte  r7,r0
-       isync
-2:
-#endif /* !CONFIG_PPC_BOOK3S */
-       clrrdi  r7,r8,THREAD_SHIFT      /* base of new stack */
-       /* Note: this uses SWITCH_FRAME_SIZE rather than INT_FRAME_SIZE
-          because we don't need to leave the 288-byte ABI gap at the
-          top of the kernel stack. */
-       addi    r7,r7,THREAD_SIZE-SWITCH_FRAME_SIZE
-       std     r7,PACAKSAVE(r13)
-
-11:
-       mr      r1,r8           /* start using new stack pointer */
-       ld      r6,_CCR(r1)
-       mtcrf   0xFF,r6
-
-#ifdef CONFIG_ALTIVEC
-BEGIN_FTR_SECTION
-       ld      r0,THREAD_VRSAVE(r4)
-       mtspr   SPRN_VRSAVE,r0          /* if G4, restore VRSAVE reg */
-END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
-#endif /* CONFIG_ALTIVEC */
-
-       /* r3-r13 are destroyed -- Cort */
-       REST_8GPRS(14, r1)
-       REST_10GPRS(22, r1)
-
-       ld      r7,_NIP(r1)     /* Return to _switch caller in new task */
-       mtlr    r7
-       addi    r1,r1,SWITCH_FRAME_SIZE
-       blr
diff --git a/kernel/cobalt/arch/powerpc/thread.c 
b/kernel/cobalt/arch/powerpc/thread.c
index a648ba1..3dae95a 100644
--- a/kernel/cobalt/arch/powerpc/thread.c
+++ b/kernel/cobalt/arch/powerpc/thread.c
@@ -27,8 +27,7 @@
 #include <cobalt/kernel/thread.h>
 
 asmlinkage struct task_struct *
-__asm_thread_switch(struct thread_struct *prev,
-                   struct thread_struct *next);
+_switch(struct thread_struct *prev, struct thread_struct *next);
 
 void xnarch_switch_to(struct xnthread *out, struct xnthread *in)
 {
@@ -56,7 +55,8 @@ void xnarch_switch_to(struct xnthread *out, struct xnthread 
*in)
                        enter_lazy_tlb(prev_mm, next);
        }
 
-       __asm_thread_switch(out_tcb->core.tsp, in_tcb->core.tsp);
+       hard_local_irq_disable();
+       _switch(out_tcb->core.tsp, in_tcb->core.tsp);
 }
 
 #ifdef CONFIG_XENO_ARCH_FPU


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

Reply via email to