summaryrefslogtreecommitdiff
path: root/arch/x86/kernel/sys_i386_32.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86/kernel/sys_i386_32.c')
-rw-r--r--arch/x86/kernel/sys_i386_32.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/arch/x86/kernel/sys_i386_32.c b/arch/x86/kernel/sys_i386_32.c
new file mode 100644
index 00000000..0b0cb5fe
--- /dev/null
+++ b/arch/x86/kernel/sys_i386_32.c
@@ -0,0 +1,40 @@
+/*
+ * This file contains various random system calls that
+ * have a non-standard calling sequence on the Linux/i386
+ * platform.
+ */
+
+#include <linux/errno.h>
+#include <linux/sched.h>
+#include <linux/mm.h>
+#include <linux/fs.h>
+#include <linux/smp.h>
+#include <linux/sem.h>
+#include <linux/msg.h>
+#include <linux/shm.h>
+#include <linux/stat.h>
+#include <linux/syscalls.h>
+#include <linux/mman.h>
+#include <linux/file.h>
+#include <linux/utsname.h>
+#include <linux/ipc.h>
+
+#include <linux/uaccess.h>
+#include <linux/unistd.h>
+
+#include <asm/syscalls.h>
+
+/*
+ * Do a system call from kernel instead of calling sys_execve so we
+ * end up with proper pt_regs.
+ */
+int kernel_execve(const char *filename,
+ const char *const argv[],
+ const char *const envp[])
+{
+ long __res;
+ asm volatile ("int $0x80"
+ : "=a" (__res)
+ : "0" (__NR_execve), "b" (filename), "c" (argv), "d" (envp) : "memory");
+ return __res;
+}