diff options
Diffstat (limited to 'arch/mn10300/include/asm')
-rw-r--r-- | arch/mn10300/include/asm/frame.inc | 2 | ||||
-rw-r--r-- | arch/mn10300/include/asm/processor.h | 13 | ||||
-rw-r--r-- | arch/mn10300/include/asm/unistd.h | 1 |
3 files changed, 5 insertions, 11 deletions
diff --git a/arch/mn10300/include/asm/frame.inc b/arch/mn10300/include/asm/frame.inc index 2ee58e3eb6b3..1c3eb4fda958 100644 --- a/arch/mn10300/include/asm/frame.inc +++ b/arch/mn10300/include/asm/frame.inc | |||
@@ -61,7 +61,7 @@ | |||
61 | ############################################################################### | 61 | ############################################################################### |
62 | .macro RESTORE_ALL | 62 | .macro RESTORE_ALL |
63 | # peel back the stack to the calling frame | 63 | # peel back the stack to the calling frame |
64 | # - this permits execve() to discard extra frames due to kernel syscalls | 64 | # - we need that when returning from interrupts to kernel mode |
65 | GET_THREAD_INFO a0 | 65 | GET_THREAD_INFO a0 |
66 | mov (TI_frame,a0),fp | 66 | mov (TI_frame,a0),fp |
67 | mov fp,sp | 67 | mov fp,sp |
diff --git a/arch/mn10300/include/asm/processor.h b/arch/mn10300/include/asm/processor.h index 247928c9f549..0b844a254067 100644 --- a/arch/mn10300/include/asm/processor.h +++ b/arch/mn10300/include/asm/processor.h | |||
@@ -119,20 +119,13 @@ struct thread_struct { | |||
119 | 119 | ||
120 | /* | 120 | /* |
121 | * do necessary setup to start up a newly executed thread | 121 | * do necessary setup to start up a newly executed thread |
122 | * - need to discard the frame stacked by the kernel thread invoking the execve | ||
123 | * syscall (see RESTORE_ALL macro) | ||
124 | */ | 122 | */ |
125 | static inline void start_thread(struct pt_regs *regs, | 123 | static inline void start_thread(struct pt_regs *regs, |
126 | unsigned long new_pc, unsigned long new_sp) | 124 | unsigned long new_pc, unsigned long new_sp) |
127 | { | 125 | { |
128 | struct thread_info *ti = current_thread_info(); | 126 | regs->epsw = EPSW_nSL | EPSW_IE | EPSW_IM; |
129 | struct pt_regs *frame0; | 127 | regs->pc = new_pc; |
130 | 128 | regs->sp = new_sp; | |
131 | frame0 = thread_info_to_uregs(ti); | ||
132 | frame0->epsw = EPSW_nSL | EPSW_IE | EPSW_IM; | ||
133 | frame0->pc = new_pc; | ||
134 | frame0->sp = new_sp; | ||
135 | ti->frame = frame0; | ||
136 | } | 129 | } |
137 | 130 | ||
138 | 131 | ||
diff --git a/arch/mn10300/include/asm/unistd.h b/arch/mn10300/include/asm/unistd.h index a965de47b2bd..044c770adbb6 100644 --- a/arch/mn10300/include/asm/unistd.h +++ b/arch/mn10300/include/asm/unistd.h | |||
@@ -383,6 +383,7 @@ | |||
383 | #define __ARCH_WANT_SYS_RT_SIGACTION | 383 | #define __ARCH_WANT_SYS_RT_SIGACTION |
384 | #define __ARCH_WANT_SYS_RT_SIGSUSPEND | 384 | #define __ARCH_WANT_SYS_RT_SIGSUSPEND |
385 | #define __ARCH_WANT_SYS_EXECVE | 385 | #define __ARCH_WANT_SYS_EXECVE |
386 | #define __ARCH_WANT_KERNEL_EXECVE | ||
386 | 387 | ||
387 | /* | 388 | /* |
388 | * "Conditional" syscalls | 389 | * "Conditional" syscalls |