aboutsummaryrefslogtreecommitdiff
path: root/sys/powerpc
diff options
context:
space:
mode:
authorDavid Xu <davidxu@FreeBSD.org>2005-04-23 02:32:32 +0000
committerDavid Xu <davidxu@FreeBSD.org>2005-04-23 02:32:32 +0000
commit21fc3164307dc288ff6eb1f028a268f3c76cc6e5 (patch)
treee8274d07cfba3da625ef093c47b41f515a3a074f /sys/powerpc
parent0a5660df88347961063dfcef88f0712b672661c7 (diff)
downloadsrc-21fc3164307dc288ff6eb1f028a268f3c76cc6e5.tar.gz
src-21fc3164307dc288ff6eb1f028a268f3c76cc6e5.zip
Change cpu_set_kse_upcall to more generic style, so we can reuse it
in other codes. Add cpu_set_user_tls, use it to tweak user register and setup user TLS. I ever wanted to merge it into cpu_set_kse_upcall, but since cpu_set_kse_upcall is also used by M:N threads which may not need this feature, so I wrote a separated cpu_set_user_tls.
Notes
Notes: svn path=/head/; revision=145433
Diffstat (limited to 'sys/powerpc')
-rw-r--r--sys/powerpc/aim/vm_machdep.c18
-rw-r--r--sys/powerpc/powerpc/vm_machdep.c18
2 files changed, 26 insertions, 10 deletions
diff --git a/sys/powerpc/aim/vm_machdep.c b/sys/powerpc/aim/vm_machdep.c
index 71c5c79289ac..60274f32d70e 100644
--- a/sys/powerpc/aim/vm_machdep.c
+++ b/sys/powerpc/aim/vm_machdep.c
@@ -333,23 +333,31 @@ cpu_set_upcall(struct thread *td, struct thread *td0)
}
void
-cpu_set_upcall_kse(struct thread *td, struct kse_upcall *ku)
+cpu_set_upcall_kse(struct thread *td, void (*entry)(void *), void *arg,
+ stack_t *stack)
{
struct trapframe *tf;
uint32_t sp;
tf = td->td_frame;
/* align stack and alloc space for frame ptr and saved LR */
- sp = ((uint32_t)ku->ku_stack.ss_sp + ku->ku_stack.ss_size
+ sp = ((uint32_t)stack->ss_sp + stack->ss_size
- 2*sizeof(u_int32_t)) & ~0x1f;
bzero(tf, sizeof(struct trapframe));
tf->fixreg[1] = (register_t)sp;
- tf->fixreg[3] = (register_t)ku->ku_mailbox;
- tf->srr0 = (register_t)ku->ku_func;
+ 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)ku->ku_func;
+ td->td_retval[0] = (register_t)entry;
td->td_retval[1] = 0;
}
+
+void
+cpu_set_user_tls(struct thread *td, void *tls_base)
+{
+
+ td->td_frame->fixreg[2] = (register_t)tls_base;
+}
diff --git a/sys/powerpc/powerpc/vm_machdep.c b/sys/powerpc/powerpc/vm_machdep.c
index 71c5c79289ac..60274f32d70e 100644
--- a/sys/powerpc/powerpc/vm_machdep.c
+++ b/sys/powerpc/powerpc/vm_machdep.c
@@ -333,23 +333,31 @@ cpu_set_upcall(struct thread *td, struct thread *td0)
}
void
-cpu_set_upcall_kse(struct thread *td, struct kse_upcall *ku)
+cpu_set_upcall_kse(struct thread *td, void (*entry)(void *), void *arg,
+ stack_t *stack)
{
struct trapframe *tf;
uint32_t sp;
tf = td->td_frame;
/* align stack and alloc space for frame ptr and saved LR */
- sp = ((uint32_t)ku->ku_stack.ss_sp + ku->ku_stack.ss_size
+ sp = ((uint32_t)stack->ss_sp + stack->ss_size
- 2*sizeof(u_int32_t)) & ~0x1f;
bzero(tf, sizeof(struct trapframe));
tf->fixreg[1] = (register_t)sp;
- tf->fixreg[3] = (register_t)ku->ku_mailbox;
- tf->srr0 = (register_t)ku->ku_func;
+ 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)ku->ku_func;
+ td->td_retval[0] = (register_t)entry;
td->td_retval[1] = 0;
}
+
+void
+cpu_set_user_tls(struct thread *td, void *tls_base)
+{
+
+ td->td_frame->fixreg[2] = (register_t)tls_base;
+}