* [PATCH 0/3] xtensa: conversion to generic kernel_thread and friends
@ 2012-10-24 1:48 Max Filippov
2012-10-24 1:48 ` [PATCH 1/3] xtensa: switch to generic kernel_thread() Max Filippov
` (2 more replies)
0 siblings, 3 replies; 7+ messages in thread
From: Max Filippov @ 2012-10-24 1:48 UTC (permalink / raw)
To: Chris Zankel
Cc: linux-xtensa, linux-arch, Marc Gauthier, Al Viro, Max Filippov
Hi.
This series converts xtensa arch to use kernel_thread, kernel_execve and
generic sys_execve.
Max Filippov (3):
xtensa: switch to generic kernel_thread()
xtensa: switch to generic kernel_execve()
xtensa: switch to generic sys_execve()
arch/xtensa/Kconfig | 2 +
arch/xtensa/include/asm/processor.h | 3 -
arch/xtensa/include/asm/syscall.h | 2 +-
arch/xtensa/include/asm/unistd.h | 1 +
arch/xtensa/include/uapi/asm/unistd.h | 2 +-
arch/xtensa/kernel/entry.S | 57 +++++---------------
arch/xtensa/kernel/process.c | 97 +++++++++++++++------------------
arch/xtensa/kernel/xtensa_ksyms.c | 1 -
8 files changed, 62 insertions(+), 103 deletions(-)
--
1.7.7.6
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH 1/3] xtensa: switch to generic kernel_thread()
2012-10-24 1:48 [PATCH 0/3] xtensa: conversion to generic kernel_thread and friends Max Filippov
@ 2012-10-24 1:48 ` Max Filippov
2012-10-24 1:48 ` [PATCH 2/3] xtensa: switch to generic kernel_execve() Max Filippov
2012-10-24 1:48 ` [PATCH 3/3] xtensa: switch to generic sys_execve() Max Filippov
2 siblings, 0 replies; 7+ messages in thread
From: Max Filippov @ 2012-10-24 1:48 UTC (permalink / raw)
To: Chris Zankel
Cc: linux-xtensa, linux-arch, Marc Gauthier, Al Viro, Max Filippov
Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
---
arch/xtensa/Kconfig | 1 +
arch/xtensa/include/asm/processor.h | 3 -
arch/xtensa/kernel/entry.S | 41 ++++++-------------
arch/xtensa/kernel/process.c | 72 +++++++++++++++++++++-------------
arch/xtensa/kernel/xtensa_ksyms.c | 1 -
5 files changed, 58 insertions(+), 60 deletions(-)
diff --git a/arch/xtensa/Kconfig b/arch/xtensa/Kconfig
index cdcb48a..9525b70 100644
--- a/arch/xtensa/Kconfig
+++ b/arch/xtensa/Kconfig
@@ -13,6 +13,7 @@ config XTENSA
select GENERIC_CPU_DEVICES
select MODULES_USE_ELF_RELA
select GENERIC_PCI_IOMAP
+ select GENERIC_KERNEL_THREAD
select ARCH_WANT_OPTIONAL_GPIOLIB
help
Xtensa processors are 32-bit RISC machines designed by Tensilica
diff --git a/arch/xtensa/include/asm/processor.h b/arch/xtensa/include/asm/processor.h
index 5c371d8..a8642da 100644
--- a/arch/xtensa/include/asm/processor.h
+++ b/arch/xtensa/include/asm/processor.h
@@ -168,9 +168,6 @@ struct mm_struct;
/* Free all resources held by a thread. */
#define release_thread(thread) do { } while(0)
-/* Create a kernel thread without removing it from tasklists */
-extern int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags);
-
/* Copy and release all segment info associated with a VM */
#define copy_segments(p, mm) do { } while(0)
#define release_segments(mm) do { } while(0)
diff --git a/arch/xtensa/kernel/entry.S b/arch/xtensa/kernel/entry.S
index 18453067..d4ec138 100644
--- a/arch/xtensa/kernel/entry.S
+++ b/arch/xtensa/kernel/entry.S
@@ -1833,34 +1833,6 @@ ENTRY(system_call)
/*
- * Create a kernel thread
- *
- * int kernel_thread(int (*fn)(void *), void *arg, unsigned long flags)
- * a2 a2 a3 a4
- */
-
-ENTRY(kernel_thread)
- entry a1, 16
-
- mov a5, a2 # preserve fn over syscall
- mov a7, a3 # preserve args over syscall
-
- movi a3, _CLONE_VM | _CLONE_UNTRACED
- movi a2, __NR_clone
- or a6, a4, a3 # arg0: flags
- mov a3, a1 # arg1: sp
- syscall
-
- beq a3, a1, 1f # branch if parent
- mov a6, a7 # args
- callx4 a5 # fn(args)
-
- movi a2, __NR_exit
- syscall # return value of fn(args) still in a6
-
-1: retw
-
-/*
* Do a system call from kernel instead of calling sys_execve, so we end up
* with proper pt_regs.
*
@@ -1958,3 +1930,16 @@ ENTRY(ret_from_fork)
j common_exception_return
+/*
+ * Kernel thread creation helper
+ * On entry, set up by copy_thread: a2 = thread_fn, a3 = thread_fn arg
+ * left from _switch_to: a6 = prev
+ */
+ENTRY(ret_from_kernel_thread)
+
+ call4 schedule_tail
+ mov a6, a3
+ callx4 a2
+ call4 do_exit
+
+ENDPROC(ret_from_kernel_thread)
diff --git a/arch/xtensa/kernel/process.c b/arch/xtensa/kernel/process.c
index 1908f66..fd538bb 100644
--- a/arch/xtensa/kernel/process.c
+++ b/arch/xtensa/kernel/process.c
@@ -45,6 +45,7 @@
#include <asm/regs.h>
extern void ret_from_fork(void);
+extern void ret_from_kernel_thread(void);
struct task_struct *current_set[NR_CPUS] = {&init_task, };
@@ -158,18 +159,30 @@ int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src)
/*
* Copy thread.
*
+ * There are two modes in which this function is called:
+ * 1) Userspace thread creation,
+ * regs != NULL, usp_thread_fn is userspace stack pointer.
+ * It is expected to copy parent regs (in case CLONE_VM is not set
+ * in the clone_flags) and set up passed usp in the childregs.
+ * 2) Kernel thread creation,
+ * regs == NULL, usp_thread_fn is the function to run in the new thread
+ * and thread_fn_arg is its parameter.
+ * childregs are not used for the kernel threads.
+ *
* The stack layout for the new thread looks like this:
*
- * +------------------------+ <- sp in childregs (= tos)
+ * +------------------------+
* | childregs |
* +------------------------+ <- thread.sp = sp in dummy-frame
* | dummy-frame | (saved in dummy-frame spill-area)
* +------------------------+
*
- * We create a dummy frame to return to ret_from_fork:
- * a0 points to ret_from_fork (simulating a call4)
+ * We create a dummy frame to return to either ret_from_fork or
+ * ret_from_kernel_thread:
+ * a0 points to ret_from_fork/ret_from_kernel_thread (simulating a call4)
* sp points to itself (thread.sp)
- * a2, a3 are unused.
+ * a2, a3 are unused for userspace threads,
+ * a2 points to thread_fn, a3 holds thread_fn arg for kernel threads.
*
* Note: This is a pristine frame, so we don't need any spill region on top of
* childregs.
@@ -185,41 +198,35 @@ int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src)
* involved. Much simpler to just not copy those live frames across.
*/
-int copy_thread(unsigned long clone_flags, unsigned long usp,
- unsigned long unused,
+int copy_thread(unsigned long clone_flags, unsigned long usp_thread_fn,
+ unsigned long thread_fn_arg,
struct task_struct * p, struct pt_regs * regs)
{
- struct pt_regs *childregs;
- unsigned long tos;
- int user_mode = user_mode(regs);
+ struct pt_regs *childregs = task_pt_regs(p);
#if (XTENSA_HAVE_COPROCESSORS || XTENSA_HAVE_IO_PORTS)
struct thread_info *ti;
#endif
- /* Set up new TSS. */
- tos = (unsigned long)task_stack_page(p) + THREAD_SIZE;
- if (user_mode)
- childregs = (struct pt_regs*)(tos - PT_USER_SIZE);
- else
- childregs = (struct pt_regs*)tos - 1;
-
- /* This does not copy all the regs. In a bout of brilliance or madness,
- ARs beyond a0-a15 exist past the end of the struct. */
- *childregs = *regs;
-
/* Create a call4 dummy-frame: a0 = 0, a1 = childregs. */
*((int*)childregs - 3) = (unsigned long)childregs;
*((int*)childregs - 4) = 0;
- childregs->areg[2] = 0;
p->set_child_tid = p->clear_child_tid = NULL;
- p->thread.ra = MAKE_RA_FOR_CALL((unsigned long)ret_from_fork, 0x1);
p->thread.sp = (unsigned long)childregs;
- if (user_mode(regs)) {
+ if (regs) {
+ p->thread.ra = MAKE_RA_FOR_CALL(
+ (unsigned long)ret_from_fork, 0x1);
+
+ /* This does not copy all the regs.
+ * In a bout of brilliance or madness,
+ * ARs beyond a0-a15 exist past the end of the struct.
+ */
+ *childregs = *regs;
+ childregs->areg[1] = usp_thread_fn;
+ childregs->areg[2] = 0;
- childregs->areg[1] = usp;
if (clone_flags & CLONE_VM) {
childregs->wmask = 1; /* can't share live windows */
} else {
@@ -230,11 +237,20 @@ int copy_thread(unsigned long clone_flags, unsigned long usp,
// FIXME: we need to set THREADPTR in thread_info...
if (clone_flags & CLONE_SETTLS)
childregs->areg[2] = childregs->areg[6];
-
} else {
- /* In kernel space, we start a new thread with a new stack. */
- childregs->wmask = 1;
- childregs->areg[1] = tos;
+ p->thread.ra = MAKE_RA_FOR_CALL(
+ (unsigned long)ret_from_kernel_thread, 1);
+
+ /* pass parameters to ret_from_kernel_thread:
+ * a2 = thread_fn, a3 = thread_fn arg
+ */
+ *((int *)childregs - 1) = thread_fn_arg;
+ *((int *)childregs - 2) = usp_thread_fn;
+
+ /* Childregs are only used when we're going to userspace
+ * in which case start_thread will set them up.
+ */
+ memset(childregs, 0, sizeof(*childregs));
}
#if (XTENSA_HAVE_COPROCESSORS || XTENSA_HAVE_IO_PORTS)
diff --git a/arch/xtensa/kernel/xtensa_ksyms.c b/arch/xtensa/kernel/xtensa_ksyms.c
index a8b9f1f..afe058b 100644
--- a/arch/xtensa/kernel/xtensa_ksyms.c
+++ b/arch/xtensa/kernel/xtensa_ksyms.c
@@ -43,7 +43,6 @@ EXPORT_SYMBOL(__strncpy_user);
EXPORT_SYMBOL(clear_page);
EXPORT_SYMBOL(copy_page);
-EXPORT_SYMBOL(kernel_thread);
EXPORT_SYMBOL(empty_zero_page);
/*
--
1.7.7.6
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 2/3] xtensa: switch to generic kernel_execve()
2012-10-24 1:48 [PATCH 0/3] xtensa: conversion to generic kernel_thread and friends Max Filippov
2012-10-24 1:48 ` [PATCH 1/3] xtensa: switch to generic kernel_thread() Max Filippov
@ 2012-10-24 1:48 ` Max Filippov
2012-10-24 1:48 ` [PATCH 3/3] xtensa: switch to generic sys_execve() Max Filippov
2 siblings, 0 replies; 7+ messages in thread
From: Max Filippov @ 2012-10-24 1:48 UTC (permalink / raw)
To: Chris Zankel
Cc: linux-xtensa, linux-arch, Marc Gauthier, Al Viro, Max Filippov
Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
---
arch/xtensa/Kconfig | 1 +
arch/xtensa/kernel/entry.S | 18 +-----------------
2 files changed, 2 insertions(+), 17 deletions(-)
diff --git a/arch/xtensa/Kconfig b/arch/xtensa/Kconfig
index 9525b70..0d1f36a 100644
--- a/arch/xtensa/Kconfig
+++ b/arch/xtensa/Kconfig
@@ -14,6 +14,7 @@ config XTENSA
select MODULES_USE_ELF_RELA
select GENERIC_PCI_IOMAP
select GENERIC_KERNEL_THREAD
+ select GENERIC_KERNEL_EXECVE
select ARCH_WANT_OPTIONAL_GPIOLIB
help
Xtensa processors are 32-bit RISC machines designed by Tensilica
diff --git a/arch/xtensa/kernel/entry.S b/arch/xtensa/kernel/entry.S
index d4ec138..90bfc1d 100644
--- a/arch/xtensa/kernel/entry.S
+++ b/arch/xtensa/kernel/entry.S
@@ -1833,22 +1833,6 @@ ENTRY(system_call)
/*
- * Do a system call from kernel instead of calling sys_execve, so we end up
- * with proper pt_regs.
- *
- * int kernel_execve(const char *fname, char *const argv[], charg *const envp[])
- * a2 a2 a3 a4
- */
-
-ENTRY(kernel_execve)
- entry a1, 16
- mov a6, a2 # arg0 is in a6
- movi a2, __NR_execve
- syscall
-
- retw
-
-/*
* Task switch.
*
* struct task* _switch_to (struct task* prev, struct task* next)
@@ -1940,6 +1924,6 @@ ENTRY(ret_from_kernel_thread)
call4 schedule_tail
mov a6, a3
callx4 a2
- call4 do_exit
+ j common_exception_return
ENDPROC(ret_from_kernel_thread)
--
1.7.7.6
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 3/3] xtensa: switch to generic sys_execve()
2012-10-24 1:48 [PATCH 0/3] xtensa: conversion to generic kernel_thread and friends Max Filippov
2012-10-24 1:48 ` [PATCH 1/3] xtensa: switch to generic kernel_thread() Max Filippov
2012-10-24 1:48 ` [PATCH 2/3] xtensa: switch to generic kernel_execve() Max Filippov
@ 2012-10-24 1:48 ` Max Filippov
2012-10-24 2:41 ` Al Viro
2 siblings, 1 reply; 7+ messages in thread
From: Max Filippov @ 2012-10-24 1:48 UTC (permalink / raw)
To: Chris Zankel
Cc: linux-xtensa, linux-arch, Marc Gauthier, Al Viro, Max Filippov
Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
---
arch/xtensa/include/asm/syscall.h | 2 +-
arch/xtensa/include/asm/unistd.h | 1 +
arch/xtensa/include/uapi/asm/unistd.h | 2 +-
arch/xtensa/kernel/process.c | 25 -------------------------
4 files changed, 3 insertions(+), 27 deletions(-)
diff --git a/arch/xtensa/include/asm/syscall.h b/arch/xtensa/include/asm/syscall.h
index c1dacca..124aeee 100644
--- a/arch/xtensa/include/asm/syscall.h
+++ b/arch/xtensa/include/asm/syscall.h
@@ -10,7 +10,7 @@
struct pt_regs;
struct sigaction;
-asmlinkage long xtensa_execve(char*, char**, char**, struct pt_regs*);
+asmlinkage long sys_execve(char*, char**, char**, struct pt_regs*);
asmlinkage long xtensa_clone(unsigned long, unsigned long, struct pt_regs*);
asmlinkage long xtensa_ptrace(long, long, long, long);
asmlinkage long xtensa_sigreturn(struct pt_regs*);
diff --git a/arch/xtensa/include/asm/unistd.h b/arch/xtensa/include/asm/unistd.h
index 9ef1c31..e83e966 100644
--- a/arch/xtensa/include/asm/unistd.h
+++ b/arch/xtensa/include/asm/unistd.h
@@ -8,6 +8,7 @@
* Copyright (C) 2001 - 2005 Tensilica Inc.
*/
+#define __ARCH_WANT_SYS_EXECVE
#include <uapi/asm/unistd.h>
diff --git a/arch/xtensa/include/uapi/asm/unistd.h b/arch/xtensa/include/uapi/asm/unistd.h
index ac37eb4..c5d736f 100644
--- a/arch/xtensa/include/uapi/asm/unistd.h
+++ b/arch/xtensa/include/uapi/asm/unistd.h
@@ -269,7 +269,7 @@ __SYSCALL(115, sys_sendmmsg, 4)
#define __NR_clone 116
__SYSCALL(116, xtensa_clone, 5)
#define __NR_execve 117
-__SYSCALL(117, xtensa_execve, 3)
+__SYSCALL(117, sys_execve, 3)
#define __NR_exit 118
__SYSCALL(118, sys_exit, 1)
#define __NR_exit_group 119
diff --git a/arch/xtensa/kernel/process.c b/arch/xtensa/kernel/process.c
index fd538bb..58e50ff 100644
--- a/arch/xtensa/kernel/process.c
+++ b/arch/xtensa/kernel/process.c
@@ -350,28 +350,3 @@ long xtensa_clone(unsigned long clone_flags, unsigned long newsp,
newsp = regs->areg[1];
return do_fork(clone_flags, newsp, regs, 0, parent_tid, child_tid);
}
-
-/*
- * xtensa_execve() executes a new program.
- */
-
-asmlinkage
-long xtensa_execve(const char __user *name,
- const char __user *const __user *argv,
- const char __user *const __user *envp,
- long a3, long a4, long a5,
- struct pt_regs *regs)
-{
- long error;
- struct filename *filename;
-
- filename = getname(name);
- error = PTR_ERR(filename);
- if (IS_ERR(filename))
- goto out;
- error = do_execve(filename->name, argv, envp, regs);
- putname(filename);
-out:
- return error;
-}
-
--
1.7.7.6
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH 3/3] xtensa: switch to generic sys_execve()
2012-10-24 1:48 ` [PATCH 3/3] xtensa: switch to generic sys_execve() Max Filippov
@ 2012-10-24 2:41 ` Al Viro
2012-10-24 9:16 ` Max Filippov
0 siblings, 1 reply; 7+ messages in thread
From: Al Viro @ 2012-10-24 2:41 UTC (permalink / raw)
To: Max Filippov; +Cc: Chris Zankel, linux-xtensa, linux-arch, Marc Gauthier
On Wed, Oct 24, 2012 at 05:48:37AM +0400, Max Filippov wrote:
> Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
> ---
> arch/xtensa/include/asm/syscall.h | 2 +-
> arch/xtensa/include/asm/unistd.h | 1 +
> arch/xtensa/include/uapi/asm/unistd.h | 2 +-
> arch/xtensa/kernel/process.c | 25 -------------------------
> 4 files changed, 3 insertions(+), 27 deletions(-)
All three applied, but there's a couple of things I'd like to have on top
of that. Are you OK with the following incremental?
1) ->{set,clear}_child_tid is set by the caller; no need to set it
in copy_thread().
2) for later work it would be easier if copy_thread() hadn't looked
at regs argument at all; telling kernel_thread(9) from clone(2) can be done
by checking p->flags & PF_KTHREAD and for clone(2) it's always going to get
current_pt_regs().
3) interpretation of zero newsp is probably better off in copy_thread()
as well. Eventually we are going to kill regs argument of do_fork() et.al.
diff --git a/arch/xtensa/kernel/process.c b/arch/xtensa/kernel/process.c
index 58e50ff..9d8f387 100644
--- a/arch/xtensa/kernel/process.c
+++ b/arch/xtensa/kernel/process.c
@@ -200,7 +200,7 @@ int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src)
int copy_thread(unsigned long clone_flags, unsigned long usp_thread_fn,
unsigned long thread_fn_arg,
- struct task_struct * p, struct pt_regs * regs)
+ struct task_struct * p, struct pt_regs *unused)
{
struct pt_regs *childregs = task_pt_regs(p);
@@ -212,10 +212,10 @@ int copy_thread(unsigned long clone_flags, unsigned long usp_thread_fn,
*((int*)childregs - 3) = (unsigned long)childregs;
*((int*)childregs - 4) = 0;
- p->set_child_tid = p->clear_child_tid = NULL;
p->thread.sp = (unsigned long)childregs;
- if (regs) {
+ if (!(p->flags & PF_KTHREAD)) {
+ struct pt_regs *regs = current_pt_regs();
p->thread.ra = MAKE_RA_FOR_CALL(
(unsigned long)ret_from_fork, 0x1);
@@ -224,7 +224,8 @@ int copy_thread(unsigned long clone_flags, unsigned long usp_thread_fn,
* ARs beyond a0-a15 exist past the end of the struct.
*/
*childregs = *regs;
- childregs->areg[1] = usp_thread_fn;
+ if (usp_thread_fn)
+ childregs->areg[1] = usp_thread_fn;
childregs->areg[2] = 0;
if (clone_flags & CLONE_VM) {
@@ -346,7 +347,5 @@ long xtensa_clone(unsigned long clone_flags, unsigned long newsp,
void __user *child_tid, long a5,
struct pt_regs *regs)
{
- if (!newsp)
- newsp = regs->areg[1];
return do_fork(clone_flags, newsp, regs, 0, parent_tid, child_tid);
}
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH 3/3] xtensa: switch to generic sys_execve()
2012-10-24 2:41 ` Al Viro
@ 2012-10-24 9:16 ` Max Filippov
2012-10-24 14:01 ` Al Viro
0 siblings, 1 reply; 7+ messages in thread
From: Max Filippov @ 2012-10-24 9:16 UTC (permalink / raw)
To: Al Viro; +Cc: Chris Zankel, linux-xtensa, linux-arch, Marc Gauthier
On Wed, Oct 24, 2012 at 6:41 AM, Al Viro <viro@zeniv.linux.org.uk> wrote:
> On Wed, Oct 24, 2012 at 05:48:37AM +0400, Max Filippov wrote:
>> Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
>> ---
>> arch/xtensa/include/asm/syscall.h | 2 +-
>> arch/xtensa/include/asm/unistd.h | 1 +
>> arch/xtensa/include/uapi/asm/unistd.h | 2 +-
>> arch/xtensa/kernel/process.c | 25 -------------------------
>> 4 files changed, 3 insertions(+), 27 deletions(-)
>
> All three applied, but there's a couple of things I'd like to have on top
> of that. Are you OK with the following incremental?
Yes. Looks like I need to send v2 to address Chris' comments,
I can put these changes there as well.
> 1) ->{set,clear}_child_tid is set by the caller; no need to set it
> in copy_thread().
> 2) for later work it would be easier if copy_thread() hadn't looked
> at regs argument at all; telling kernel_thread(9) from clone(2) can be done
> by checking p->flags & PF_KTHREAD and for clone(2) it's always going to get
> current_pt_regs().
> 3) interpretation of zero newsp is probably better off in copy_thread()
> as well. Eventually we are going to kill regs argument of do_fork() et.al.
>
> diff --git a/arch/xtensa/kernel/process.c b/arch/xtensa/kernel/process.c
> index 58e50ff..9d8f387 100644
> --- a/arch/xtensa/kernel/process.c
> +++ b/arch/xtensa/kernel/process.c
> @@ -200,7 +200,7 @@ int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src)
>
> int copy_thread(unsigned long clone_flags, unsigned long usp_thread_fn,
> unsigned long thread_fn_arg,
> - struct task_struct * p, struct pt_regs * regs)
> + struct task_struct * p, struct pt_regs *unused)
> {
> struct pt_regs *childregs = task_pt_regs(p);
>
> @@ -212,10 +212,10 @@ int copy_thread(unsigned long clone_flags, unsigned long usp_thread_fn,
> *((int*)childregs - 3) = (unsigned long)childregs;
> *((int*)childregs - 4) = 0;
>
> - p->set_child_tid = p->clear_child_tid = NULL;
> p->thread.sp = (unsigned long)childregs;
>
> - if (regs) {
> + if (!(p->flags & PF_KTHREAD)) {
> + struct pt_regs *regs = current_pt_regs();
> p->thread.ra = MAKE_RA_FOR_CALL(
> (unsigned long)ret_from_fork, 0x1);
>
> @@ -224,7 +224,8 @@ int copy_thread(unsigned long clone_flags, unsigned long usp_thread_fn,
> * ARs beyond a0-a15 exist past the end of the struct.
> */
> *childregs = *regs;
> - childregs->areg[1] = usp_thread_fn;
> + if (usp_thread_fn)
> + childregs->areg[1] = usp_thread_fn;
> childregs->areg[2] = 0;
>
> if (clone_flags & CLONE_VM) {
> @@ -346,7 +347,5 @@ long xtensa_clone(unsigned long clone_flags, unsigned long newsp,
> void __user *child_tid, long a5,
> struct pt_regs *regs)
> {
> - if (!newsp)
> - newsp = regs->areg[1];
> return do_fork(clone_flags, newsp, regs, 0, parent_tid, child_tid);
> }
--
Thanks.
-- Max
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 3/3] xtensa: switch to generic sys_execve()
2012-10-24 9:16 ` Max Filippov
@ 2012-10-24 14:01 ` Al Viro
0 siblings, 0 replies; 7+ messages in thread
From: Al Viro @ 2012-10-24 14:01 UTC (permalink / raw)
To: Max Filippov; +Cc: Chris Zankel, linux-xtensa, linux-arch, Marc Gauthier
On Wed, Oct 24, 2012 at 01:16:39PM +0400, Max Filippov wrote:
> On Wed, Oct 24, 2012 at 6:41 AM, Al Viro <viro@zeniv.linux.org.uk> wrote:
> > On Wed, Oct 24, 2012 at 05:48:37AM +0400, Max Filippov wrote:
> >> Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
> >> ---
> >> arch/xtensa/include/asm/syscall.h | 2 +-
> >> arch/xtensa/include/asm/unistd.h | 1 +
> >> arch/xtensa/include/uapi/asm/unistd.h | 2 +-
> >> arch/xtensa/kernel/process.c | 25 -------------------------
> >> 4 files changed, 3 insertions(+), 27 deletions(-)
> >
> > All three applied, but there's a couple of things I'd like to have on top
> > of that. Are you OK with the following incremental?
>
> Yes. Looks like I need to send v2 to address Chris' comments,
> I can put these changes there as well.
Please, do.
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2012-10-24 14:02 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-10-24 1:48 [PATCH 0/3] xtensa: conversion to generic kernel_thread and friends Max Filippov
2012-10-24 1:48 ` [PATCH 1/3] xtensa: switch to generic kernel_thread() Max Filippov
2012-10-24 1:48 ` [PATCH 2/3] xtensa: switch to generic kernel_execve() Max Filippov
2012-10-24 1:48 ` [PATCH 3/3] xtensa: switch to generic sys_execve() Max Filippov
2012-10-24 2:41 ` Al Viro
2012-10-24 9:16 ` Max Filippov
2012-10-24 14:01 ` Al Viro
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).