1 #include <sched.h> 2 #include <signal.h> 3 #include <sys/mman.h> 4 #include <sys/time.h> 5 #include <asm/unistd.h> 6 #include <asm/page.h> 7 #include "ptrace_user.h" 8 #include "skas.h" 9 #include "stub-data.h" 10 #include "uml-config.h" 11 #include "sysdep/stub.h" 12 #include "kern_constants.h" 13 14 /* This is in a separate file because it needs to be compiled with any 15 * extraneous gcc flags (-pg, -fprofile-arcs, -ftest-coverage) disabled 16 * 17 * Use UM_KERN_PAGE_SIZE instead of PAGE_SIZE because that calls getpagesize 18 * on some systems. 19 */ 20 21 void __attribute__ ((__section__ (".__syscall_stub"))) 22 stub_clone_handler(void) 23 { 24 struct stub_data *data = (struct stub_data *) UML_CONFIG_STUB_DATA; 25 long err; 26 27 err = stub_syscall2(__NR_clone, CLONE_PARENT | CLONE_FILES | SIGCHLD, 28 UML_CONFIG_STUB_DATA + UM_KERN_PAGE_SIZE / 2 - 29 sizeof(void *)); 30 if(err != 0) 31 goto out; 32 33 err = stub_syscall4(__NR_ptrace, PTRACE_TRACEME, 0, 0, 0); 34 if(err) 35 goto out; 36 37 err = stub_syscall3(__NR_setitimer, ITIMER_VIRTUAL, 38 (long) &data->timer, 0); 39 if(err) 40 goto out; 41 42 remap_stack(data->fd, data->offset); 43 goto done; 44 45 out: 46 /* save current result. 47 * Parent: pid; 48 * child: retcode of mmap already saved and it jumps around this 49 * assignment 50 */ 51 data->err = err; 52 done: 53 trap_myself(); 54 } 55