* [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
* [Xenomai-core] Re: [PATCH] Fix ppc64 thread switching
2006-01-12 13:59 [Xenomai-core] [PATCH] Fix ppc64 thread switching Heikki Lindholm
@ 2006-01-12 14:20 ` Philippe Gerum
0 siblings, 0 replies; 2+ messages in thread
From: Philippe Gerum @ 2006-01-12 14:20 UTC (permalink / raw)
To: Heikki Lindholm; +Cc: xenomai
Heikki Lindholm wrote:
> Add some polish, eg. make it work, for the recent thread switching
> changes for the ppc64.
>
Applied, thanks.
> -- Heikki Lindholm
>
>
> ------------------------------------------------------------------------
>
> 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
--
Philippe.
^ 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.