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 21void __attribute__ ((__section__ (".__syscall_stub"))) 22stub_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