diff options
| author | Chris Zankel <chris@zankel.net> | 2013-02-23 19:35:57 -0800 |
|---|---|---|
| committer | Chris Zankel <chris@zankel.net> | 2013-02-23 19:35:57 -0800 |
| commit | c50842df47970eab459f13490c152aac85fc02f2 (patch) | |
| tree | d2933b4d9641067002ba6d662b0abf6ee3011375 /arch/xtensa/kernel/process.c | |
| parent | b0c438e642699f8c47b84de957f30cf586cdbebd (diff) | |
| download | linux-c50842df47970eab459f13490c152aac85fc02f2.tar.gz linux-c50842df47970eab459f13490c152aac85fc02f2.tar.bz2 linux-c50842df47970eab459f13490c152aac85fc02f2.zip | |
xtensa: add support for TLS
The Xtensa architecture provides a global register called THREADPTR
for the purpose of Thread Local Storage (TLS) support. This allows us
to use a fairly simple implementation, keeping the thread pointer in
the regset and simply saving and restoring it upon entering/exiting
the from user space.
Signed-off-by: Chris Zankel <chris@zankel.net>
Diffstat (limited to 'arch/xtensa/kernel/process.c')
| -rw-r--r-- | arch/xtensa/kernel/process.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/arch/xtensa/kernel/process.c b/arch/xtensa/kernel/process.c index 0dd5784416d3..5cd82e9f601c 100644 --- a/arch/xtensa/kernel/process.c +++ b/arch/xtensa/kernel/process.c @@ -259,9 +259,10 @@ int copy_thread(unsigned long clone_flags, unsigned long usp_thread_fn, memcpy(&childregs->areg[XCHAL_NUM_AREGS - len/4], ®s->areg[XCHAL_NUM_AREGS - len/4], len); } -// FIXME: we need to set THREADPTR in thread_info... + + /* The thread pointer is passed in the '4th argument' (= a5) */ if (clone_flags & CLONE_SETTLS) - childregs->areg[2] = childregs->areg[6]; + childregs->threadptr = childregs->areg[5]; } else { p->thread.ra = MAKE_RA_FOR_CALL( (unsigned long)ret_from_kernel_thread, 1); |
