All of lore.kernel.org
 help / color / mirror / Atom feed
* [Xenomai-core] [PATCH] Fix ppc64 thread switching
@ 2006-01-12 13:59 Heikki Lindholm
  2006-01-12 14:20 ` [Xenomai-core] " Philippe Gerum
  0 siblings, 1 reply; 2+ messages in thread
From: Heikki Lindholm @ 2006-01-12 13:59 UTC (permalink / raw)
  To: xenomai

[-- Attachment #1: Type: text/plain, Size: 111 bytes --]

Add some polish, eg. make it work, for the recent thread switching 
changes for the ppc64.

-- Heikki Lindholm

[-- Attachment #2: xenomai-060112-ppc64-switch.patch --]
[-- Type: text/plain, Size: 4534 bytes --]

diff -Nru xenomai/include/asm-powerpc/hal.h xenomai-devel/include/asm-powerpc/hal.h
--- xenomai/include/asm-powerpc/hal.h	2006-01-11 11:55:17.000000000 +0200
+++ xenomai-devel/include/asm-powerpc/hal.h	2006-01-12 15:29:03.000000000 +0200
@@ -165,8 +165,14 @@
 
 #define RTHAL_SWITCH_FRAME_SIZE  (STACK_FRAME_OVERHEAD + sizeof(struct pt_regs))
 
+#ifdef CONFIG_PPC64
+asmlinkage void rthal_thread_switch(struct thread_struct *prev,
+				    struct thread_struct *next,
+				    int kernel_thread);
+#else /* !CONFIG_PPC64 */
 asmlinkage void rthal_thread_switch(struct thread_struct *prev,
 				    struct thread_struct *next);
+#endif /* CONFIG_PPC64 */
 
 asmlinkage void rthal_thread_trampoline(void);
 
diff -Nru xenomai/include/asm-powerpc/system.h xenomai-devel/include/asm-powerpc/system.h
--- xenomai/include/asm-powerpc/system.h	2006-01-11 11:55:17.000000000 +0200
+++ xenomai-devel/include/asm-powerpc/system.h	2006-01-12 15:35:31.000000000 +0200
@@ -239,8 +239,13 @@
 #endif /* CONFIG_PPC64 */
 	}
 
+#ifdef CONFIG_PPC64
+    rthal_thread_switch(out_tcb->tsp, in_tcb->tsp, 
+		    in_tcb->user_task == NULL ? 1 : 0);
+#else /* !CONFIG_PPC64 */
     rthal_thread_switch(out_tcb->tsp, in_tcb->tsp);
-
+#endif /* CONFIG_PPC64 */
+    
     barrier();
 }
 
@@ -299,12 +304,23 @@
     ksp = (unsigned long *)((unsigned long)tcb->stackbase + tcb->stacksize - RTHAL_SWITCH_FRAME_SIZE - 32);
     childregs = (struct pt_regs *)ksp;
     memset(childregs,0,sizeof(*childregs));
-    childregs->nip = (unsigned long)&rthal_thread_trampoline;
+    childregs->nip = ((unsigned long *)&rthal_thread_trampoline)[0];
+    childregs->gpr[2] = ((unsigned long *)&rthal_thread_trampoline)[1];
     childregs->gpr[14] = flags & ~(MSR_EE | MSR_FP);
     childregs->gpr[15] = ((unsigned long *)&xnarch_thread_trampoline)[0]; /* lr = entry addr. */
     childregs->gpr[16] = ((unsigned long *)&xnarch_thread_trampoline)[1]; /* r2 = TOC base. */
     childregs->gpr[17] = (unsigned long)tcb;
     tcb->ts.ksp = (unsigned long)childregs - STACK_FRAME_OVERHEAD;
+    if (cpu_has_feature(CPU_FTR_SLB)) { /* from process.c/copy_thread */
+	    unsigned long sp_vsid = get_kernel_vsid(tcb->ts.ksp);
+	    
+	    sp_vsid <<= SLB_VSID_SHIFT;
+	    sp_vsid |= SLB_VSID_KERNEL;
+	    if (cpu_has_feature(CPU_FTR_16M_PAGE))
+		    sp_vsid |= SLB_VSID_L;
+	    
+	    tcb->ts.ksp_vsid = sp_vsid;
+    }
 #else /* !CONFIG_PPC64 */
     ksp = (unsigned long *)((unsigned long)tcb->stackbase + tcb->stacksize - RTHAL_SWITCH_FRAME_SIZE - 4);
     childregs = (struct pt_regs *)ksp;
@@ -415,7 +431,7 @@
     tcb->user_task = NULL;
     tcb->active_task = NULL;
     tcb->tsp = &tcb->ts;
-    /* Note: .pgdir(ppc32)/.VSID(ppc64) == NULL for a Xenomai kthread. */
+    /* Note: .pgdir(ppc32) == NULL for a Xenomai kthread. */
     memset(&tcb->ts,0,sizeof(tcb->ts));
 #ifdef CONFIG_XENO_HW_FPU
     tcb->user_fpu_owner = NULL;
diff -Nru xenomai/ksrc/arch/powerpc/switch_64.S xenomai-devel/ksrc/arch/powerpc/switch_64.S
--- xenomai/ksrc/arch/powerpc/switch_64.S	2006-01-11 11:55:22.000000000 +0200
+++ xenomai-devel/ksrc/arch/powerpc/switch_64.S	2006-01-12 15:30:18.000000000 +0200
@@ -33,7 +33,7 @@
 #include <asm/mmu.h>
 
 /*
- * void rthal_thread_switch(struct thread_struct *prev, struct thread_struct *next)
+ * void rthal_thread_switch(struct thread_struct *prev, struct thread_struct *next, int kernel_thread)
  */
 	.align	7
 _GLOBAL(rthal_thread_switch)
@@ -68,17 +68,12 @@
 
 	ld	r8,KSP(r4)	/* new stack pointer */
 
-	lwz	r0,KSP_VSID(r4)
-        cmpwi   r0, 0
-        bne+ change_current
-	mr	r1,r8		/* start using new stack pointer */
-	b same_current
+	cmpwi	cr5,r5,0	/* is it a kernel thread */
+        bne-	cr5,10f		/* if so, don't touch 'current' */
 
-change_current:
-	
 	addi	r6,r4,-THREAD	/* Convert THREAD to 'current' */
 	std	r6,PACACURRENT(r13)	/* Set new 'current' */
-
+10:
 BEGIN_FTR_SECTION
 	clrrdi	r6,r8,28	/* get its ESID */
 	clrrdi	r9,r1,28	/* get current sp ESID */
@@ -98,16 +93,16 @@
 
 2:
 END_FTR_SECTION_IFSET(CPU_FTR_SLB)
+	bne-	cr5,11f		/* kernel thread: don't touch 'current' */
 	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
-
-	mr	r1,r8		/* start using new stack pointer */
 	std	r7,PACAKSAVE(r13)
-
-same_current:
+	
+11:
+	mr	r1,r8		/* start using new stack pointer */
 		
 	ld	r6,_CCR(r1)
 	mtcrf	0xFF,r6

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2006-01-12 14:20 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-01-12 13:59 [Xenomai-core] [PATCH] Fix ppc64 thread switching Heikki Lindholm
2006-01-12 14:20 ` [Xenomai-core] " Philippe Gerum

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.