diff options
author | David Xu <davidxu@FreeBSD.org> | 2005-04-23 02:32:32 +0000 |
---|---|---|
committer | David Xu <davidxu@FreeBSD.org> | 2005-04-23 02:32:32 +0000 |
commit | 21fc3164307dc288ff6eb1f028a268f3c76cc6e5 (patch) | |
tree | e8274d07cfba3da625ef093c47b41f515a3a074f /sys/powerpc | |
parent | 0a5660df88347961063dfcef88f0712b672661c7 (diff) | |
download | src-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.c | 18 | ||||
-rw-r--r-- | sys/powerpc/powerpc/vm_machdep.c | 18 |
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; +} |