aboutsummaryrefslogtreecommitdiff
path: root/sys/powerpc
diff options
context:
space:
mode:
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;
+}