diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Makefile | 2 | ||||
-rw-r--r-- | lib/execve.c | 23 |
2 files changed, 25 insertions, 0 deletions
diff --git a/lib/Makefile b/lib/Makefile index ddf3e676e1f4..4d752be0edc0 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -35,6 +35,8 @@ ifneq ($(CONFIG_HAVE_DEC_LOCK),y) lib-y += dec_and_lock.o endif +lib-y += execve.o + obj-$(CONFIG_CRC_CCITT) += crc-ccitt.o obj-$(CONFIG_CRC16) += crc16.o obj-$(CONFIG_CRC32) += crc32.o diff --git a/lib/execve.c b/lib/execve.c new file mode 100644 index 000000000000..2667ebc15045 --- /dev/null +++ b/lib/execve.c @@ -0,0 +1,23 @@ +#include <asm/bug.h> +#include <asm/uaccess.h> + +#define __KERNEL_SYSCALLS__ +static int errno __attribute__((unused)); +#include <asm/unistd.h> + +#ifdef _syscall3 +int kernel_execve (const char *filename, char *const argv[], char *const envp[]) + __attribute__((__weak__)); +int kernel_execve (const char *filename, char *const argv[], char *const envp[]) +{ + mm_segment_t fs = get_fs(); + int ret; + + WARN_ON(segment_eq(fs, USER_DS)); + ret = execve(filename, (char **)argv, (char **)envp); + if (ret) + ret = -errno; + + return ret; +} +#endif |