diff options
Diffstat (limited to 'arch/arm/kernel/sys_arm.c')
-rw-r--r-- | arch/arm/kernel/sys_arm.c | 63 |
1 files changed, 0 insertions, 63 deletions
diff --git a/arch/arm/kernel/sys_arm.c b/arch/arm/kernel/sys_arm.c index 76cbb055dd05..c2a898aa57aa 100644 --- a/arch/arm/kernel/sys_arm.c +++ b/arch/arm/kernel/sys_arm.c | |||
@@ -59,69 +59,6 @@ asmlinkage int sys_vfork(struct pt_regs *regs) | |||
59 | return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, regs->ARM_sp, regs, 0, NULL, NULL); | 59 | return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, regs->ARM_sp, regs, 0, NULL, NULL); |
60 | } | 60 | } |
61 | 61 | ||
62 | /* sys_execve() executes a new program. | ||
63 | * This is called indirectly via a small wrapper | ||
64 | */ | ||
65 | asmlinkage int sys_execve(const char __user *filenamei, | ||
66 | const char __user *const __user *argv, | ||
67 | const char __user *const __user *envp, struct pt_regs *regs) | ||
68 | { | ||
69 | int error; | ||
70 | char * filename; | ||
71 | |||
72 | filename = getname(filenamei); | ||
73 | error = PTR_ERR(filename); | ||
74 | if (IS_ERR(filename)) | ||
75 | goto out; | ||
76 | error = do_execve(filename, argv, envp, regs); | ||
77 | putname(filename); | ||
78 | out: | ||
79 | return error; | ||
80 | } | ||
81 | |||
82 | int kernel_execve(const char *filename, | ||
83 | const char *const argv[], | ||
84 | const char *const envp[]) | ||
85 | { | ||
86 | struct pt_regs regs; | ||
87 | int ret; | ||
88 | |||
89 | memset(®s, 0, sizeof(struct pt_regs)); | ||
90 | ret = do_execve(filename, | ||
91 | (const char __user *const __user *)argv, | ||
92 | (const char __user *const __user *)envp, ®s); | ||
93 | if (ret < 0) | ||
94 | goto out; | ||
95 | |||
96 | /* | ||
97 | * Save argc to the register structure for userspace. | ||
98 | */ | ||
99 | regs.ARM_r0 = ret; | ||
100 | |||
101 | /* | ||
102 | * We were successful. We won't be returning to our caller, but | ||
103 | * instead to user space by manipulating the kernel stack. | ||
104 | */ | ||
105 | asm( "add r0, %0, %1\n\t" | ||
106 | "mov r1, %2\n\t" | ||
107 | "mov r2, %3\n\t" | ||
108 | "bl memmove\n\t" /* copy regs to top of stack */ | ||
109 | "mov r8, #0\n\t" /* not a syscall */ | ||
110 | "mov r9, %0\n\t" /* thread structure */ | ||
111 | "mov sp, r0\n\t" /* reposition stack pointer */ | ||
112 | "b ret_to_user" | ||
113 | : | ||
114 | : "r" (current_thread_info()), | ||
115 | "Ir" (THREAD_START_SP - sizeof(regs)), | ||
116 | "r" (®s), | ||
117 | "Ir" (sizeof(regs)) | ||
118 | : "r0", "r1", "r2", "r3", "r8", "r9", "ip", "lr", "memory"); | ||
119 | |||
120 | out: | ||
121 | return ret; | ||
122 | } | ||
123 | EXPORT_SYMBOL(kernel_execve); | ||
124 | |||
125 | /* | 62 | /* |
126 | * Since loff_t is a 64 bit type we avoid a lot of ABI hassle | 63 | * Since loff_t is a 64 bit type we avoid a lot of ABI hassle |
127 | * with a different argument ordering. | 64 | * with a different argument ordering. |