0d1fb0a47c09b (Alex Dewar 2019-08-25 10:49:17 +0100 1) // SPDX-License-Identifier: GPL-2.0
ee56314b79039 (Jeff Dike 2008-02-04 22:30:43 -0800 2) /*
2eb5f31bc4ea2 (Anton Ivanov 2015-11-02 16:16:37 +0000 3) * Copyright (C) 2015 Thomas Meyer (thomas@m3y3r.de)
ee56314b79039 (Jeff Dike 2008-02-04 22:30:43 -0800 4) * Copyright (C) 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
ee56314b79039 (Jeff Dike 2008-02-04 22:30:43 -0800 5) */
ee56314b79039 (Jeff Dike 2008-02-04 22:30:43 -0800 6)
9786a8f3cbc61 (Bodo Stroesser 2005-07-07 17:56:50 -0700 7) #include <signal.h>
ee56314b79039 (Jeff Dike 2008-02-04 22:30:43 -0800 8) #include <sched.h>
9786a8f3cbc61 (Bodo Stroesser 2005-07-07 17:56:50 -0700 9) #include <asm/unistd.h>
ee56314b79039 (Jeff Dike 2008-02-04 22:30:43 -0800 10) #include <sys/time.h>
37185b3324087 (Al Viro 2012-10-08 03:27:32 +0100 11) #include <as-layout.h>
37185b3324087 (Al Viro 2012-10-08 03:27:32 +0100 12) #include <ptrace_user.h>
37185b3324087 (Al Viro 2012-10-08 03:27:32 +0100 13) #include <stub-data.h>
37185b3324087 (Al Viro 2012-10-08 03:27:32 +0100 14) #include <sysdep/stub.h>
9786a8f3cbc61 (Bodo Stroesser 2005-07-07 17:56:50 -0700 15)
ee56314b79039 (Jeff Dike 2008-02-04 22:30:43 -0800 16) /*
ee56314b79039 (Jeff Dike 2008-02-04 22:30:43 -0800 17) * This is in a separate file because it needs to be compiled with any
9786a8f3cbc61 (Bodo Stroesser 2005-07-07 17:56:50 -0700 18) * extraneous gcc flags (-pg, -fprofile-arcs, -ftest-coverage) disabled
aa1a64ee12ae1 (Jeff Dike 2005-11-21 21:32:10 -0800 19) *
aa1a64ee12ae1 (Jeff Dike 2005-11-21 21:32:10 -0800 20) * Use UM_KERN_PAGE_SIZE instead of PAGE_SIZE because that calls getpagesize
aa1a64ee12ae1 (Jeff Dike 2005-11-21 21:32:10 -0800 21) * on some systems.
9786a8f3cbc61 (Bodo Stroesser 2005-07-07 17:56:50 -0700 22) */
39d730ab87f07 (Jeff Dike 2005-11-21 21:32:04 -0800 23)
bf9a76a470d83 (Linus Torvalds 2020-10-26 15:39:37 -0700 24) void __attribute__ ((__section__ (".__syscall_stub")))
9786a8f3cbc61 (Bodo Stroesser 2005-07-07 17:56:50 -0700 25) stub_clone_handler(void)
9786a8f3cbc61 (Bodo Stroesser 2005-07-07 17:56:50 -0700 26) {
adf9ae0d159d3 (Johannes Berg 2021-07-13 23:47:10 +0200 27) struct stub_data *data = get_stub_page();
9786a8f3cbc61 (Bodo Stroesser 2005-07-07 17:56:50 -0700 28) long err;
9786a8f3cbc61 (Bodo Stroesser 2005-07-07 17:56:50 -0700 29)
9786a8f3cbc61 (Bodo Stroesser 2005-07-07 17:56:50 -0700 30) err = stub_syscall2(__NR_clone, CLONE_PARENT | CLONE_FILES | SIGCHLD,
558f9b2f94dbd (YiFei Zhu 2021-04-20 00:56:10 -0500 31) (unsigned long)data + UM_KERN_PAGE_SIZE / 2);
84b2789d61156 (Johannes Berg 2021-01-13 22:09:42 +0100 32) if (err) {
84b2789d61156 (Johannes Berg 2021-01-13 22:09:42 +0100 33) data->parent_err = err;
84b2789d61156 (Johannes Berg 2021-01-13 22:09:42 +0100 34) goto done;
84b2789d61156 (Johannes Berg 2021-01-13 22:09:42 +0100 35) }
9786a8f3cbc61 (Bodo Stroesser 2005-07-07 17:56:50 -0700 36)
9786a8f3cbc61 (Bodo Stroesser 2005-07-07 17:56:50 -0700 37) err = stub_syscall4(__NR_ptrace, PTRACE_TRACEME, 0, 0, 0);
84b2789d61156 (Johannes Berg 2021-01-13 22:09:42 +0100 38) if (err) {
84b2789d61156 (Johannes Berg 2021-01-13 22:09:42 +0100 39) data->child_err = err;
84b2789d61156 (Johannes Berg 2021-01-13 22:09:42 +0100 40) goto done;
84b2789d61156 (Johannes Berg 2021-01-13 22:09:42 +0100 41) }
9786a8f3cbc61 (Bodo Stroesser 2005-07-07 17:56:50 -0700 42)
9f0b4807a44ff (Johannes Berg 2021-01-13 22:09:43 +0100 43) remap_stack_and_trap();
5b7b15afee89d (Jeff Dike 2005-12-18 17:50:39 +0100 44)
5b7b15afee89d (Jeff Dike 2005-12-18 17:50:39 +0100 45) done:
9786a8f3cbc61 (Bodo Stroesser 2005-07-07 17:56:50 -0700 46) trap_myself();
9786a8f3cbc61 (Bodo Stroesser 2005-07-07 17:56:50 -0700 47) }