2#include "pedigree/kernel/process/Scheduler.h"
3#include "pedigree/kernel/process/Thread.h"
4#include "pedigree/kernel/process/Uninterruptible.h"
5#include "pedigree/kernel/processor/Processor.h"
6#include "pedigree/kernel/processor/ProcessorInformation.h"
7#include "pedigree/kernel/utilities/assert.h"
8#include "pedigree/kernel/utilities/utility.h"
10#include "PosixProcess.h"
11#include "PosixSubsystem.h"
13#include "trace-context.h"
17 if (&source == &destination)
19 const auto caller = source.snapshotCredentials();
20 const auto target = destination.snapshotCredentials();
21 return target.dumpable && caller.ruid == target.ruid && caller.ruid == target.euid &&
22 caller.ruid == target.suid && caller.rgid == target.rgid && caller.rgid == target.egid &&
23 caller.rgid == target.sgid;
26TraceStatus posix_trace_traceme() {
28 return TraceStatus::Unsupported;
32 auto* subsystem =
static_cast<PosixSubsystem*
>(process->getSubsystem());
35 auto status = subsystem->traceContext().reserveEnrollment(*current, admission);
36 if (status != TraceStatus::Success)
41 status = posix_trace_acquire_task(admission.tracer(), task);
42 if (status != TraceStatus::Success ||
44 return TraceStatus::Missing;
48 if (!subsystem->snapshotUserImage(image))
49 return TraceStatus::Missing;
50 if (!subsystem->tracePolicyAllowed())
51 return TraceStatus::Unsupported;
53 return TraceStatus::Missing;
55 return TraceStatus::Denied;
58 if (!relation || !relation->valid())
59 return TraceStatus::NoMemory;
60 status = tracerSubsystem->traceContext().registerTracee(admission.tracer(), relation);
61 if (status != TraceStatus::Success)
63 if (!current->tryRequireSignalFrames()) {
64 tracerSubsystem->traceContext().unregisterTracee(relation.get());
65 return TraceStatus::Unsupported;
67 status = subsystem->traceContext().commitEnrollment(admission, relation);
68 if (status != TraceStatus::Success) {
69 current->clearSignalFrameRequirement();
70 tracerSubsystem->traceContext().unregisterTracee(relation.get());
78 return TraceStatus::Missing;
81 auto* callerSubsystem =
static_cast<PosixSubsystem*
>(caller->getSubsystem());
83 if (!callerSubsystem->traceContext().taskToken(*current, owner))
84 return TraceStatus::Missing;
90 task->
getParent()->getType() != Process::Posix || !task->acceptingEvents() ||
92 return TraceStatus::Missing;
95 if (!subsystem || !subsystem->traceContext().taskToken(*task.get(), selected) ||
97 return TraceStatus::Missing;
102 auto* subsystem =
static_cast<PosixSubsystem*
>(process->getSubsystem());
104 if (!subsystem || !subsystem->snapshotUserImage(image) || !selected->live() ||
105 !subsystem->traceContext().acquireIncoming(relation) || relation->tracer() != owner ||
106 relation->tracee() != selected)
107 return TraceStatus::Missing;
108 if (!permitted(*caller, *
static_cast<PosixProcess*
>(process.get())))
109 return TraceStatus::Denied;
110 if (!relation->stopped())
111 return TraceStatus::NotStopped;
113 result = pedigree_std::move(relation);
114 return TraceStatus::Success;
117TraceStatus posix_trace_prepare_resume(
const TraceTaskRef& target,
int signal,
118 bool inheritReservation, int32_t pid, uint32_t uid,
121 const auto identity = target->snapshot();
122 if (
identity.state != TraceTaskToken::State::Live)
123 return TraceStatus::Missing;
126 process->getType() != Process::Posix)
127 return TraceStatus::Missing;
131 auto* subsystem =
static_cast<PosixSubsystem*
>(process->getSubsystem());
133 if (!subsystem || !subsystem->snapshotUserImage(image))
134 return TraceStatus::Missing;
135 if (!permitted(*caller, *
static_cast<PosixProcess*
>(process.get())))
136 return TraceStatus::Denied;
140 if (posix_trace_acquire_task(target, task) != TraceStatus::Success)
141 return TraceStatus::Missing;
142 return subsystem->prepareTraceSignal(*task.get(), signal, pid, uid, inheritReservation, result);
Memory-mapped file interface.
static MemoryMapManager & instance()
static ProcessorInformation & information()
static Scheduler & instance()
MUST_USE_RESULT bool acquireProcess(ProcessLease &lease, size_t n)
static SharedPointer< PosixTraceRelation > tryAllocate(Args...)
@ Continue
No unwind necessary, carry on as normal.
UnwindType getUnwindState()
Process * getParent() const