blob: 39c0d7145d310b946d4b82425754c64b9949bfdc [file] [log] [blame]
Bodo Stroesser9786a8f2005-07-07 17:56:50 -07001#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
13/* This is in a separate file because it needs to be compiled with any
14 * extraneous gcc flags (-pg, -fprofile-arcs, -ftest-coverage) disabled
15 */
Jeff Dike39d730a2005-11-21 21:32:04 -080016
17#define STUB_DATA(field) (((struct stub_data *) UML_CONFIG_STUB_DATA)->field)
18
Bodo Stroesser9786a8f2005-07-07 17:56:50 -070019void __attribute__ ((__section__ (".__syscall_stub")))
20stub_clone_handler(void)
21{
22 long err;
Bodo Stroesser9786a8f2005-07-07 17:56:50 -070023
24 err = stub_syscall2(__NR_clone, CLONE_PARENT | CLONE_FILES | SIGCHLD,
25 UML_CONFIG_STUB_DATA + PAGE_SIZE / 2 -
26 sizeof(void *));
27 if(err != 0)
28 goto out;
29
30 err = stub_syscall4(__NR_ptrace, PTRACE_TRACEME, 0, 0, 0);
31 if(err)
32 goto out;
33
34 err = stub_syscall3(__NR_setitimer, ITIMER_VIRTUAL,
Jeff Dike39d730a2005-11-21 21:32:04 -080035 (long) &STUB_DATA(timer), 0);
Bodo Stroesser9786a8f2005-07-07 17:56:50 -070036 if(err)
37 goto out;
38
39 err = stub_syscall6(STUB_MMAP_NR, UML_CONFIG_STUB_DATA, PAGE_SIZE,
40 PROT_READ | PROT_WRITE, MAP_FIXED | MAP_SHARED,
Jeff Dike39d730a2005-11-21 21:32:04 -080041 STUB_DATA(fd), STUB_DATA(offset));
Bodo Stroesser9786a8f2005-07-07 17:56:50 -070042 out:
43 /* save current result. Parent: pid; child: retcode of mmap */
Jeff Dike39d730a2005-11-21 21:32:04 -080044 STUB_DATA(err) = err;
Bodo Stroesser9786a8f2005-07-07 17:56:50 -070045 trap_myself();
46}