UPSTREAM: arm64: Implement copy_thread_tls
commit a4376f2fbcc8084832f2f114577c8d68234c7903 upstream. This is required for clone3 which passes the TLS value through a struct rather than a register. Change-Id: I71e8124905e5ffc574ef6e01aeb23a8dd9bd8f1d Signed-off-by: Amanieu d'Antras <amanieu@gmail.com> Cc: linux-arm-kernel@lists.infradead.org Cc: <stable@vger.kernel.org> # 5.3.x Acked-by: Will Deacon <will@kernel.org> Link: https://lore.kernel.org/r/20200102172413.654385-3-amanieu@gmail.com Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
1 parent
3f0f0c96ad
commit
dea6b3a66d
2 files changed
+6
-5
No files matched your search
@@ -133,6 +133,7 @@ config ARM64
|
|||||||
select HAVE_CMPXCHG_DOUBLE
|
select HAVE_CMPXCHG_DOUBLE
|
||||||
select HAVE_CMPXCHG_LOCAL
|
select HAVE_CMPXCHG_LOCAL
|
||||||
select HAVE_CONTEXT_TRACKING
|
select HAVE_CONTEXT_TRACKING
|
||||||
|
select HAVE_COPY_THREAD_TLS
|
||||||
select HAVE_DEBUG_BUGVERBOSE
|
select HAVE_DEBUG_BUGVERBOSE
|
||||||
select HAVE_DEBUG_KMEMLEAK
|
select HAVE_DEBUG_KMEMLEAK
|
||||||
select HAVE_DMA_CONTIGUOUS
|
select HAVE_DMA_CONTIGUOUS
|
||||||
|
|||||||
@@ -394,8 +394,8 @@ int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src)
|
|||||||
|
|
||||||
asmlinkage void ret_from_fork(void) asm("ret_from_fork");
|
asmlinkage void ret_from_fork(void) asm("ret_from_fork");
|
||||||
|
|
||||||
int copy_thread(unsigned long clone_flags, unsigned long stack_start,
|
int copy_thread_tls(unsigned long clone_flags, unsigned long stack_start,
|
||||||
unsigned long stk_sz, struct task_struct *p)
|
unsigned long stk_sz, struct task_struct *p, unsigned long tls)
|
||||||
{
|
{
|
||||||
struct pt_regs *childregs = task_pt_regs(p);
|
struct pt_regs *childregs = task_pt_regs(p);
|
||||||
|
|
||||||
@@ -428,11 +428,11 @@ int copy_thread(unsigned long clone_flags, unsigned long stack_start,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If a TLS pointer was passed to clone (4th argument), use it
|
* If a TLS pointer was passed to clone, use it for the new
|
||||||
* for the new thread.
|
* thread.
|
||||||
*/
|
*/
|
||||||
if (clone_flags & CLONE_SETTLS)
|
if (clone_flags & CLONE_SETTLS)
|
||||||
p->thread.uw.tp_value = childregs->regs[3];
|
p->thread.uw.tp_value = tls;
|
||||||
} else {
|
} else {
|
||||||
memset(childregs, 0, sizeof(struct pt_regs));
|
memset(childregs, 0, sizeof(struct pt_regs));
|
||||||
childregs->pstate = PSR_MODE_EL1h;
|
childregs->pstate = PSR_MODE_EL1h;
|
||||||
|
|||||||
Reference in new issue
Block a user