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 "as-layout.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 *) STUB_DATA; 25 long err; 26 27 err = stub_syscall2(__NR_clone, CLONE_PARENT | CLONE_FILES | SIGCHLD, 28 STUB_DATA + UM_KERN_PAGE_SIZE / 2 - sizeof(void *)); 29 if(err != 0) 30 goto out; 31 32 err = stub_syscall4(__NR_ptrace, PTRACE_TRACEME, 0, 0, 0); 33 if(err) 34 goto out; 35 36 err = stub_syscall3(__NR_setitimer, ITIMER_VIRTUAL, 37 (long) &data->timer, 0); 38 if(err) 39 goto out; 40 41 remap_stack(data->fd, data->offset); 42 goto done; 43 44 out: 45 /* save current result. 46 * Parent: pid; 47 * child: retcode of mmap already saved and it jumps around this 48 * assignment 49 */ 50 data->err = err; 51 done: 52 trap_myself(); 53 } 54