svn commit: r203570 - in projects/ppc64/sys/powerpc: aim powerpc
Nathan Whitehorn
nwhitehorn at FreeBSD.org
Sat Feb 6 20:40:47 UTC 2010
Author: nwhitehorn
Date: Sat Feb 6 20:40:47 2010
New Revision: 203570
URL: http://svn.freebsd.org/changeset/base/203570
Log:
Provide a working thread implementation for powerpc64.
Modified:
projects/ppc64/sys/powerpc/aim/vm_machdep.c
projects/ppc64/sys/powerpc/powerpc/exec_machdep.c
Modified: projects/ppc64/sys/powerpc/aim/vm_machdep.c
==============================================================================
--- projects/ppc64/sys/powerpc/aim/vm_machdep.c Sat Feb 6 20:36:14 2010 (r203569)
+++ projects/ppc64/sys/powerpc/aim/vm_machdep.c Sat Feb 6 20:40:47 2010 (r203570)
@@ -397,106 +397,3 @@ is_physical_memory(addr)
return 1;
}
-/*
- * Threading functions
- */
-void
-cpu_thread_exit(struct thread *td)
-{
-}
-
-void
-cpu_thread_clean(struct thread *td)
-{
-}
-
-void
-cpu_thread_alloc(struct thread *td)
-{
- struct pcb *pcb;
-
- pcb = (struct pcb *)((td->td_kstack + td->td_kstack_pages * PAGE_SIZE -
- sizeof(struct pcb)) & ~0x2fU);
- td->td_pcb = pcb;
- td->td_frame = (struct trapframe *)pcb - 1;
-}
-
-void
-cpu_thread_free(struct thread *td)
-{
-}
-
-void
-cpu_thread_swapin(struct thread *td)
-{
-}
-
-void
-cpu_thread_swapout(struct thread *td)
-{
-}
-
-void
-cpu_set_upcall(struct thread *td, struct thread *td0)
-{
- struct pcb *pcb2;
- struct trapframe *tf;
- struct callframe *cf;
-
- pcb2 = td->td_pcb;
-
- /* Copy the upcall pcb */
- bcopy(td0->td_pcb, pcb2, sizeof(*pcb2));
-
- /* Create a stack for the new thread */
- tf = td->td_frame;
- bcopy(td0->td_frame, tf, sizeof(struct trapframe));
- tf->fixreg[FIRSTARG] = 0;
- tf->fixreg[FIRSTARG + 1] = 0;
- tf->cr &= ~0x10000000;
-
- /* Set registers for trampoline to user mode. */
- cf = (struct callframe *)tf - 1;
- memset(cf, 0, sizeof(struct callframe));
- cf->cf_func = (register_t)fork_return;
- cf->cf_arg0 = (register_t)td;
- cf->cf_arg1 = (register_t)tf;
-
- pcb2->pcb_sp = (register_t)cf;
- #ifdef __powerpc64__
- pcb2->pcb_lr = ((register_t *)fork_trampoline)[0];
- pcb2->pcb_toc = ((register_t *)fork_trampoline)[1];
- #else
- pcb2->pcb_lr = (register_t)fork_trampoline;
- #endif
- pcb2->pcb_cpu.aim.usr_vsid = 0;
- pcb2->pcb_cpu.aim.usr_esid = 0;
-
- /* Setup to release spin count in fork_exit(). */
- td->td_md.md_spinlock_count = 1;
- td->td_md.md_saved_msr = PSL_KERNSET;
-}
-
-void
-cpu_set_upcall_kse(struct thread *td, void (*entry)(void *), void *arg,
- stack_t *stack)
-{
- struct trapframe *tf;
- uintptr_t sp;
-
- tf = td->td_frame;
- /* align stack and alloc space for frame ptr and saved LR */
- sp = ((uintptr_t)stack->ss_sp + stack->ss_size - sizeof(uint64_t)) &
- ~0x1f;
- bzero(tf, sizeof(struct trapframe));
-
- tf->fixreg[1] = (register_t)sp;
- tf->fixreg[3] = (register_t)arg;
- tf->srr0 = (register_t)entry;
- tf->srr1 = PSL_MBO | PSL_USERSET | PSL_FE_DFLT;
- td->td_pcb->pcb_flags = 0;
-
- td->td_retval[0] = (register_t)entry;
- td->td_retval[1] = 0;
-}
-
Modified: projects/ppc64/sys/powerpc/powerpc/exec_machdep.c
==============================================================================
--- projects/ppc64/sys/powerpc/powerpc/exec_machdep.c Sat Feb 6 20:36:14 2010 (r203569)
+++ projects/ppc64/sys/powerpc/powerpc/exec_machdep.c Sat Feb 6 20:40:47 2010 (r203570)
@@ -902,14 +902,132 @@ cpu_set_syscall_retval(struct thread *td
}
}
+/*
+ * Threading functions
+ */
+void
+cpu_thread_exit(struct thread *td)
+{
+}
+
+void
+cpu_thread_clean(struct thread *td)
+{
+}
+
+void
+cpu_thread_alloc(struct thread *td)
+{
+ struct pcb *pcb;
+
+ pcb = (struct pcb *)((td->td_kstack + td->td_kstack_pages * PAGE_SIZE -
+ sizeof(struct pcb)) & ~0x2fU);
+ td->td_pcb = pcb;
+ td->td_frame = (struct trapframe *)pcb - 1;
+}
+
+void
+cpu_thread_free(struct thread *td)
+{
+}
+
+void
+cpu_thread_swapin(struct thread *td)
+{
+}
+
+void
+cpu_thread_swapout(struct thread *td)
+{
+}
+
int
cpu_set_user_tls(struct thread *td, void *tls_base)
{
if (td->td_proc->p_sysent->sv_flags & SV_LP64)
- td->td_frame->fixreg[13] = (register_t)tls_base + 0x8000;
+ td->td_frame->fixreg[13] = (register_t)tls_base + 0x7010;
else
td->td_frame->fixreg[2] = (register_t)tls_base + 0x7008;
return (0);
}
+void
+cpu_set_upcall(struct thread *td, struct thread *td0)
+{
+ struct pcb *pcb2;
+ struct trapframe *tf;
+ struct callframe *cf;
+
+ pcb2 = td->td_pcb;
+
+ /* Copy the upcall pcb */
+ bcopy(td0->td_pcb, pcb2, sizeof(*pcb2));
+
+ /* Create a stack for the new thread */
+ tf = td->td_frame;
+ bcopy(td0->td_frame, tf, sizeof(struct trapframe));
+ tf->fixreg[FIRSTARG] = 0;
+ tf->fixreg[FIRSTARG + 1] = 0;
+ tf->cr &= ~0x10000000;
+
+ /* Set registers for trampoline to user mode. */
+ cf = (struct callframe *)tf - 1;
+ memset(cf, 0, sizeof(struct callframe));
+ cf->cf_func = (register_t)fork_return;
+ cf->cf_arg0 = (register_t)td;
+ cf->cf_arg1 = (register_t)tf;
+
+ pcb2->pcb_sp = (register_t)cf;
+ #ifdef __powerpc64__
+ pcb2->pcb_lr = ((register_t *)fork_trampoline)[0];
+ pcb2->pcb_toc = ((register_t *)fork_trampoline)[1];
+ #else
+ pcb2->pcb_lr = (register_t)fork_trampoline;
+ #endif
+ pcb2->pcb_cpu.aim.usr_vsid = 0;
+ pcb2->pcb_cpu.aim.usr_esid = 0;
+
+ /* Setup to release spin count in fork_exit(). */
+ td->td_md.md_spinlock_count = 1;
+ td->td_md.md_saved_msr = PSL_KERNSET;
+}
+
+void
+cpu_set_upcall_kse(struct thread *td, void (*entry)(void *), void *arg,
+ stack_t *stack)
+{
+ struct trapframe *tf;
+ uintptr_t sp;
+
+ tf = td->td_frame;
+ /* align stack and alloc space for frame ptr and saved LR */
+ sp = ((uintptr_t)stack->ss_sp + stack->ss_size - sizeof(uint64_t)) &
+ ~0x1f;
+ bzero(tf, sizeof(struct trapframe));
+
+ tf->fixreg[1] = (register_t)sp;
+ tf->fixreg[3] = (register_t)arg;
+ if (td->td_proc->p_sysent->sv_flags & SV_ILP32) {
+ tf->srr0 = (register_t)entry;
+ #ifdef AIM
+ tf->srr1 = PSL_MBO | PSL_USERSET | PSL_FE_DFLT;
+ #else
+ tf->srr1 = PSL_USERSET;
+ #endif
+ } else {
+ #ifdef __powerpc64__
+ register_t entry_desc[3];
+ (void)copyin((void *)entry, entry_desc, sizeof(entry_desc));
+ tf->srr0 = entry_desc[0];
+ tf->fixreg[2] = entry_desc[1];
+ tf->fixreg[11] = entry_desc[2];
+ tf->srr1 = PSL_SF | PSL_MBO | PSL_USERSET | PSL_FE_DFLT;
+ #endif
+ }
+ td->td_pcb->pcb_flags = 0;
+
+ td->td_retval[0] = (register_t)entry;
+ td->td_retval[1] = 0;
+}
+
More information about the svn-src-projects
mailing list