Taking clone.c to sys-*, making it a normal kernel object, trimming
stub.h
Signed-off-by: Al Viro <[EMAIL PROTECTED]>
----
diff -urN RC14-rc3-git4-base/arch/um/include/sysdep-i386/stub.h 
current/arch/um/include/sysdep-i386/stub.h
--- RC14-rc3-git4-base/arch/um/include/sysdep-i386/stub.h       2005-08-28 
23:09:40.000000000 -0400
+++ current/arch/um/include/sysdep-i386/stub.h  2005-10-03 23:31:59.000000000 
-0400
@@ -12,54 +12,7 @@
 extern void stub_segv_handler(int sig);
 extern void stub_clone_handler(void);
 
-#define STUB_SYSCALL_RET EAX
 #define STUB_MMAP_NR __NR_mmap2
 #define MMAP_OFFSET(o) ((o) >> PAGE_SHIFT)
 
-static inline long stub_syscall2(long syscall, long arg1, long arg2)
-{
-       long ret;
-
-       __asm__("movl %0, %%ecx; " : : "g" (arg2) : "%ecx");
-       __asm__("movl %0, %%ebx; " : : "g" (arg1) : "%ebx");
-       __asm__("movl %0, %%eax; " : : "g" (syscall) : "%eax");
-       __asm__("int $0x80;" : : : "%eax");
-       __asm__ __volatile__("movl %%eax, %0; " : "=g" (ret) :);
-       return(ret);
-}
-
-static inline long stub_syscall3(long syscall, long arg1, long arg2, long arg3)
-{
-       __asm__("movl %0, %%edx; " : : "g" (arg3) : "%edx");
-       return(stub_syscall2(syscall, arg1, arg2));
-}
-
-static inline long stub_syscall4(long syscall, long arg1, long arg2, long arg3,
-                                long arg4)
-{
-       __asm__("movl %0, %%esi; " : : "g" (arg4) : "%esi");
-       return(stub_syscall3(syscall, arg1, arg2, arg3));
-}
-
-static inline long stub_syscall6(long syscall, long arg1, long arg2, long arg3,
-                                long arg4, long arg5, long arg6)
-{
-       long ret;
-       __asm__("movl %0, %%eax; " : : "g" (syscall) : "%eax");
-       __asm__("movl %0, %%ebx; " : : "g" (arg1) : "%ebx");
-       __asm__("movl %0, %%ecx; " : : "g" (arg2) : "%ecx");
-       __asm__("movl %0, %%edx; " : : "g" (arg3) : "%edx");
-       __asm__("movl %0, %%esi; " : : "g" (arg4) : "%esi");
-       __asm__("movl %0, %%edi; " : : "g" (arg5) : "%edi");
-       __asm__ __volatile__("pushl %%ebp ; movl %1, %%ebp; "
-               "int $0x80; popl %%ebp ; "
-               "movl %%eax, %0; " : "=g" (ret) : "g" (arg6) : "%eax");
-       return(ret);
-}
-
-static inline void trap_myself(void)
-{
-       __asm("int3");
-}
-
 #endif
diff -urN RC14-rc3-git4-base/arch/um/include/sysdep-x86_64/stub.h 
current/arch/um/include/sysdep-x86_64/stub.h
--- RC14-rc3-git4-base/arch/um/include/sysdep-x86_64/stub.h     2005-08-28 
23:09:40.000000000 -0400
+++ current/arch/um/include/sysdep-x86_64/stub.h        2005-10-02 
23:04:09.000000000 -0400
@@ -13,46 +13,7 @@
 extern void stub_segv_handler(int sig);
 extern void stub_clone_handler(void);
 
-#define STUB_SYSCALL_RET PT_INDEX(RAX)
 #define STUB_MMAP_NR __NR_mmap
 #define MMAP_OFFSET(o) (o)
 
-static inline long stub_syscall2(long syscall, long arg1, long arg2)
-{
-       long ret;
-
-       __asm__("movq %0, %%rsi; " : : "g" (arg2) : "%rsi");
-       __asm__("movq %0, %%rdi; " : : "g" (arg1) : "%rdi");
-       __asm__("movq %0, %%rax; " : : "g" (syscall) : "%rax");
-       __asm__("syscall;" : : : "%rax", "%r11", "%rcx");
-       __asm__ __volatile__("movq %%rax, %0; " : "=g" (ret) :);
-       return(ret);
-}
-
-static inline long stub_syscall3(long syscall, long arg1, long arg2, long arg3)
-{
-       __asm__("movq %0, %%rdx; " : : "g" (arg3) : "%rdx");
-       return(stub_syscall2(syscall, arg1, arg2));
-}
-
-static inline long stub_syscall4(long syscall, long arg1, long arg2, long arg3,
-                                long arg4)
-{
-       __asm__("movq %0, %%r10; " : : "g" (arg4) : "%r10");
-       return(stub_syscall3(syscall, arg1, arg2, arg3));
-}
-
-static inline long stub_syscall6(long syscall, long arg1, long arg2, long arg3,
-                                long arg4, long arg5, long arg6)
-{
-       __asm__("movq %0, %%r9; " : : "g" (arg6) : "%r9");
-       __asm__("movq %0, %%r8; " : : "g" (arg5) : "%r8");
-       return(stub_syscall4(syscall, arg1, arg2, arg3, arg4));
-}
-
-static inline void trap_myself(void)
-{
-       __asm("int3");
-}
-
 #endif
diff -urN RC14-rc3-git4-base/arch/um/kernel/skas/Makefile 
current/arch/um/kernel/skas/Makefile
--- RC14-rc3-git4-base/arch/um/kernel/skas/Makefile     2005-09-12 
14:33:28.000000000 -0400
+++ current/arch/um/kernel/skas/Makefile        2005-10-02 22:54:22.000000000 
-0400
@@ -3,12 +3,9 @@
 # Licensed under the GPL
 #
 
-obj-y := clone.o exec_kern.o mem.o mem_user.o mmu.o process.o process_kern.o \
+obj-y := exec_kern.o mem.o mem_user.o mmu.o process.o process_kern.o \
        syscall.o tlb.o trap_user.o uaccess.o
 
-USER_OBJS := process.o clone.o
+USER_OBJS := process.o
 
 include arch/um/scripts/Makefile.rules
-
-# clone.o is in the stub, so it can't be built with profiling
-$(obj)/clone.o : c_flags = -Wp,-MD,$(depfile) $(call unprofile,$(USER_CFLAGS))
diff -urN RC14-rc3-git4-base/arch/um/kernel/skas/include/stub-data.h 
current/arch/um/kernel/skas/include/stub-data.h
--- RC14-rc3-git4-base/arch/um/kernel/skas/include/stub-data.h  2005-08-28 
23:09:40.000000000 -0400
+++ current/arch/um/kernel/skas/include/stub-data.h     2005-10-02 
22:44:11.000000000 -0400
@@ -6,7 +6,11 @@
 #ifndef __STUB_DATA_H
 #define __STUB_DATA_H
 
+#ifdef __KERNEL__
+#include <linux/time.h>
+#else
 #include <sys/time.h>
+#endif
 
 struct stub_data {
        long offset;
diff -urN RC14-rc3-git4-base/arch/um/sys-i386/Makefile 
current/arch/um/sys-i386/Makefile
--- RC14-rc3-git4-base/arch/um/sys-i386/Makefile        2005-10-04 
13:19:47.000000000 -0400
+++ current/arch/um/sys-i386/Makefile   2005-10-04 07:35:43.000000000 -0400
@@ -6,6 +6,7 @@
 subarch-obj-$(CONFIG_HIGHMEM) += mm/highmem.o
 subarch-obj-$(CONFIG_MODULES) += kernel/module.o
 
+obj-$(CONFIG_MODE_SKAS) += clone.o
 
 USER_OBJS := bugs.o ptrace_user.o sigcontext.o fault.o
 
@@ -13,5 +14,5 @@
 
 extra-$(CONFIG_MODE_TT) += unmap.o
 
-$(obj)/stub_segv.o $(obj)/unmap.o: \
+$(obj)/stub_segv.o $(obj)/clone.o $(obj)/unmap.o: \
        _c_flags = $(call unprofile,$(CFLAGS))
diff -urN RC14-rc3-git4-base/arch/um/sys-i386/clone.c 
current/arch/um/sys-i386/clone.c
--- RC14-rc3-git4-base/arch/um/sys-i386/clone.c 1969-12-31 19:00:00.000000000 
-0500
+++ current/arch/um/sys-i386/clone.c    2005-10-02 22:54:52.000000000 -0400
@@ -0,0 +1,47 @@
+#include <linux/config.h>
+#include <asm/unistd.h>
+#include <linux/mman.h>
+#include <linux/ptrace.h>
+#include "stub-data.h"
+
+static int errno;
+
+static inline _syscall2(int,clone,unsigned long,flags,unsigned long,newsp)
+static inline _syscall4(long,ptrace,long,request,
+                       pid_t,pid,void *,addr,void *,data);
+static inline _syscall3(int,setitimer,int,which, const struct itimerval 
*,value,
+                       struct itimerval *,ovalue);
+static inline _syscall6(void *,mmap2,void 
*,addr,size_t,len,int,prot,int,flags,int,fd,off_t,offset)
+
+static inline void trap_myself(void)
+{
+       __asm("int3");
+}
+
+void __attribute__ ((__section__ (".__syscall_stub")))
+stub_clone_handler(void)
+{
+       long err;
+       struct stub_data *from = (struct stub_data *) CONFIG_STUB_DATA;
+
+       err = clone(CLONE_PARENT | CLONE_FILES | SIGCHLD,
+                   CONFIG_STUB_DATA + PAGE_SIZE / 2 - sizeof(void *));
+       if (err)
+               goto out;
+
+       err = ptrace(PTRACE_TRACEME, 0, NULL, NULL);
+       if (err)
+               goto out;
+
+       err = setitimer(ITIMER_VIRTUAL, &from->timer, NULL);
+       if (err)
+               goto out;
+
+       err = (long)mmap2((void *)CONFIG_STUB_DATA, PAGE_SIZE,
+                           PROT_READ | PROT_WRITE, MAP_FIXED | MAP_SHARED,
+                           from->fd, from->offset);
+out:
+       /* save current result. Parent: pid; child: retcode of mmap */
+       from->err = err == -1 ? errno : err;
+       trap_myself();
+}
diff -urN RC14-rc3-git4-base/arch/um/sys-x86_64/Makefile 
current/arch/um/sys-x86_64/Makefile
--- RC14-rc3-git4-base/arch/um/sys-x86_64/Makefile      2005-10-04 
13:19:47.000000000 -0400
+++ current/arch/um/sys-x86_64/Makefile 2005-10-04 07:37:19.000000000 -0400
@@ -8,6 +8,7 @@
        signal.o stub.o stub_segv.o syscalls.o syscall_table.o sysrq.o ksyms.o
 
 obj-$(CONFIG_MODULES) += um_module.o
+obj-$(CONFIG_MODE_SKAS) += clone.o
 
 subarch-obj-y = lib/bitops.o lib/csum-partial.o lib/memcpy.o lib/thunk.o
 subarch-obj-$(CONFIG_MODULES) += kernel/module.o
@@ -18,5 +19,5 @@
 
 extra-$(CONFIG_MODE_TT) += unmap.o
 
-$(obj)/stub_segv.o $(obj)/unmap.o: \
+$(obj)/stub_segv.o $(obj)/clone.o $(obj)/unmap.o: \
        _c_flags = $(call unprofile,$(CFLAGS))
diff -urN RC14-rc3-git4-base/arch/um/sys-x86_64/clone.c 
current/arch/um/sys-x86_64/clone.c
--- RC14-rc3-git4-base/arch/um/sys-x86_64/clone.c       1969-12-31 
19:00:00.000000000 -0500
+++ current/arch/um/sys-x86_64/clone.c  2005-10-02 22:57:53.000000000 -0400
@@ -0,0 +1,47 @@
+#include <linux/config.h>
+#include <asm/unistd.h>
+#include <linux/mman.h>
+#include <linux/ptrace.h>
+#include "stub-data.h"
+
+static int errno;
+
+static inline _syscall2(int,clone,unsigned long,flags,unsigned long,newsp)
+static inline _syscall4(long,ptrace,long,request,
+                       pid_t,pid,void *,addr,void *,data);
+static inline _syscall3(int,setitimer,int,which, const struct itimerval 
*,value,
+                       struct itimerval *,ovalue);
+static inline _syscall6(void *,mmap,void 
*,addr,size_t,len,int,prot,int,flags,int,fd,off_t,offset)
+
+static inline void trap_myself(void)
+{
+       __asm("int3");
+}
+
+void __attribute__ ((__section__ (".__syscall_stub")))
+stub_clone_handler(void)
+{
+       long err;
+       struct stub_data *from = (struct stub_data *) CONFIG_STUB_DATA;
+
+       err = clone(CLONE_PARENT | CLONE_FILES | SIGCHLD,
+                   CONFIG_STUB_DATA + PAGE_SIZE / 2 - sizeof(void *));
+       if (err)
+               goto out;
+
+       err = ptrace(PTRACE_TRACEME, 0, NULL, NULL);
+       if (err)
+               goto out;
+
+       err = setitimer(ITIMER_VIRTUAL, &from->timer, NULL);
+       if (err)
+               goto out;
+
+       err = (long)mmap((void *)CONFIG_STUB_DATA, PAGE_SIZE,
+                           PROT_READ | PROT_WRITE, MAP_FIXED | MAP_SHARED,
+                           from->fd, from->offset);
+out:
+       /* save current result. Parent: pid; child: retcode of mmap */
+       from->err = err == -1 ? errno : err;
+       trap_myself();
+}


-------------------------------------------------------
This SF.Net email is sponsored by:
Power Architecture Resource Center: Free content, downloads, discussions,
and more. http://solutions.newsforge.com/ibmarch.tmpl
_______________________________________________
User-mode-linux-devel mailing list
User-mode-linux-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/user-mode-linux-devel

Reply via email to