2#include <clues/syscalls/process.hxx>
6#ifdef CLUES_HAVE_ARCH_PRCTL
7void ArchPrctlSystemCall::prepareNewSystemCall() {
9 m_pars.erase(m_pars.begin() + 1, m_pars.end());
17 setReturnItem(*result);
20bool ArchPrctlSystemCall::check2ndPass(
const Tracee &) {
22 using enum item::ArchOpParameter::Operation;
24 switch (op.operation()) {
26 on_off.emplace(item::ULongValue{
"enable"});
27 addParameters(*on_off);
32 setReturnItem(*on_off_ret);
34 case SET_FS: [[fallthrough]];
37 addParameters(*set_addr);
39 case GET_FS: [[fallthrough]];
42 get_addr->setBase(Base::HEX);
43 addParameters(*get_addr);
67 static_assert(
sizeof(int) ==
sizeof(pid_t),
"sizeof(int) != sizeof(pid_t)" );
68 using enum cosmos::CloneFlag;
69 const auto clone_flags = this->flags.flags();
71 auto maybe_add_unused_par = [
this](
const size_t need_index) {
72 while (need_index >
m_pars.size()) {
73 addParameters(item::unused);
77 auto maybe_add_settid_par = [
this, clone_flags, maybe_add_unused_par](
const size_t pos) {
78 if (clone_flags[CHILD_SETTID]) {
80 maybe_add_unused_par(pos);
85 auto maybe_add_settls_par = [
this, clone_flags, maybe_add_unused_par](
const size_t pos) {
86 if (clone_flags[SETTLS]) {
89 maybe_add_unused_par(pos);
95 if (clone_flags[PARENT_SETTID]) {
97 "parent_tid",
"pointer to child TID in parent's memory"});
99 }
else if (clone_flags[PIDFD]) {
101 "pidfd",
"pointer to pidfd in parent's memory (alternative use of parent_tid)"});
102 addParameters(*
pidfd);
126 maybe_add_settid_par(3);
127 maybe_add_settls_par(4);
128 }
else if (
abi == ABI::AARCH64 ||
abi == ABI::I386) {
129 maybe_add_settls_par(3);
130 maybe_add_settid_par(4);
137 const auto args =
cl_args.args();
141 }
else if (args->flags()[cosmos::CloneFlag::PIDFD]) {
143 trackFD(proc, std::move(info));
ABI abi() const
Returns the system call ABi seen during system call entry.
ParameterVector m_pars
The array of system call parameters, if any.
Base class for traced processes.
A pointer to an integral data type which will be filled in by the kernel.
An always-success return value.
@ RETVAL
A system call return value.
@ X32
X86_64 with 32-bit pointers.
item::CloneArgs cl_args
Combined clone arguments.
void updateFDTracking(const Tracee &proc) override
Update file descriptor tracking.
std::optional< item::GenericPointerValue > tls
Thread-local-storage data for the new child.
std::optional< item::PointerToScalar< cosmos::FileNum > > pidfd
PID file descriptor referring to the new child.
std::optional< item::GenericPointerValue > child_tid
TID of the new child written out to a pid_* in the child.
void prepareNewSystemCall() override
Perform any necessary actions before processing a new system call entry event.
std::optional< item::PointerToScalar< cosmos::ProcessID > > parent_tid
TID of the new child written out to a pid_t* in the parent.
bool check2ndPass(const Tracee &) override
Check whether a second pass needs to be made processing parameters.
Contextual information about a file descriptor in a Tracee.
@ PID_FD
created by pidfd_open(), clone(), ...