1 | // SPDX-License-Identifier: GPL-2.0 |
2 | /* |
3 | * Copyright (C) 2015 Thomas Meyer (thomas@m3y3r.de) |
4 | * Copyright (C) 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com) |
5 | */ |
6 | |
7 | #include <signal.h> |
8 | #include <sched.h> |
9 | #include <asm/unistd.h> |
10 | #include <sys/time.h> |
11 | #include <as-layout.h> |
12 | #include <ptrace_user.h> |
13 | #include <stub-data.h> |
14 | #include <sysdep/stub.h> |
15 | |
16 | /* |
17 | * This is in a separate file because it needs to be compiled with any |
18 | * extraneous gcc flags (-pg, -fprofile-arcs, -ftest-coverage) disabled |
19 | * |
20 | * Use UM_KERN_PAGE_SIZE instead of PAGE_SIZE because that calls getpagesize |
21 | * on some systems. |
22 | */ |
23 | |
24 | void __attribute__ ((__section__ (".__syscall_stub" ))) |
25 | stub_clone_handler(void) |
26 | { |
27 | struct stub_data *data = get_stub_data(); |
28 | long err; |
29 | |
30 | err = stub_syscall2(__NR_clone, CLONE_PARENT | CLONE_FILES | SIGCHLD, |
31 | (unsigned long)data + |
32 | STUB_DATA_PAGES * UM_KERN_PAGE_SIZE / 2); |
33 | if (err) { |
34 | data->parent_err = err; |
35 | goto done; |
36 | } |
37 | |
38 | err = stub_syscall4(__NR_ptrace, PTRACE_TRACEME, 0, 0, 0); |
39 | if (err) { |
40 | data->child_err = err; |
41 | goto done; |
42 | } |
43 | |
44 | remap_stack_and_trap(); |
45 | |
46 | done: |
47 | trap_myself(); |
48 | } |
49 | |