0001
0002
0003
0004
0005
0006
0007 #include <signal.h>
0008 #include <sched.h>
0009 #include <asm/unistd.h>
0010 #include <sys/time.h>
0011 #include <as-layout.h>
0012 #include <ptrace_user.h>
0013 #include <stub-data.h>
0014 #include <sysdep/stub.h>
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024 void __attribute__ ((__section__ (".__syscall_stub")))
0025 stub_clone_handler(void)
0026 {
0027 struct stub_data *data = get_stub_page();
0028 long err;
0029
0030 err = stub_syscall2(__NR_clone, CLONE_PARENT | CLONE_FILES | SIGCHLD,
0031 (unsigned long)data + UM_KERN_PAGE_SIZE / 2);
0032 if (err) {
0033 data->parent_err = err;
0034 goto done;
0035 }
0036
0037 err = stub_syscall4(__NR_ptrace, PTRACE_TRACEME, 0, 0, 0);
0038 if (err) {
0039 data->child_err = err;
0040 goto done;
0041 }
0042
0043 remap_stack_and_trap();
0044
0045 done:
0046 trap_myself();
0047 }