2#include "pedigree/kernel/LockGuard.h"
3#include "pedigree/kernel/Log.h"
4#include "pedigree/kernel/process/Process.h"
5#include "pedigree/kernel/process/Thread.h"
6#include "pedigree/kernel/processor/Processor.h"
7#include "pedigree/kernel/processor/UserReturnFrame.h"
10 : m_Owner(&owner), m_StateLevel(0), m_Frame(&frame), m_Previous(nullptr), m_Record() {
13 FATAL(
"User-return frame scope has a foreign owner");
14 m_StateLevel = owner.m_nStateLevel;
15 m_Previous = owner.m_StateLevels[m_StateLevel].m_UserReturnFrame;
16 owner.armStateCleanup(m_Record, &UserReturnFrameScope::restore,
this);
17 owner.m_StateLevels[m_StateLevel].m_UserReturnFrame = &frame;
20Thread::UserReturnFrameScope::~UserReturnFrameScope() {
23 m_Owner->disarmStateCleanup(m_Record);
28void Thread::UserReturnFrameScope::restore(
void* context) {
29 auto& scope = *
static_cast<UserReturnFrameScope*
>(context);
34 FATAL(
"User-return frame scope retired on a foreign Thread");
35 auto& slot = scope.m_Owner->m_StateLevels[scope.m_StateLevel].m_UserReturnFrame;
36 if (slot != scope.m_Frame)
37 FATAL(
"User-return frame scopes retired out of order");
38 slot = scope.m_Previous;
39 scope.m_Owner =
nullptr;
49bool Thread::tryRequireSignalFrames() {
52 m_SignalFramesRequired)
54 __atomic_store_n(&m_SignalFramesRequired,
true, __ATOMIC_RELEASE);
55 markUserReturnWorkFlag(UserReturnSignalFrames);
59void Thread::clearSignalFrameRequirement() {
61 __atomic_store_n(&m_SignalFramesRequired,
false, __ATOMIC_RELEASE);
62 clearUserReturnWorkFlag(UserReturnSignalFrames);
66 return event->requiresExactUserReturnState() ||
67 (m_SignalFramesRequired &&
event->isSignalEvent() &&
event->getNumber() != 9);
70void Thread::setUserReturnSignalParked(
bool parked) {
73 FATAL(
"User-return signal park has a foreign owner");
74 m_UserReturnSignalParked = parked;
76 markUserReturnWorkPending();
79bool Thread::canSkipUserReturnWork() {
81 const bool workPending = userReturnWorkPending();
83 !workPending && m_OriginalSyscallState ==
nullptr;
86bool Thread::clearUserReturnWorkIfIdle() {
91 state.m_DeferredSignalMaskRestore || m_UserReturnSignalParked || m_SignalFramesRequired ||
93 m_OriginalSyscallState) {
96 __atomic_store_n(&m_UserReturnWorkPending,
static_cast<size_t>(0), __ATOMIC_RELEASE);
static ProcessorInformation & information()
size_t m_DeferredSubsystemExceptionState
@ Continue
No unwind necessary, carry on as normal.
size_t m_EventDeferralDepth
UnwindType getUnwindState()
bool eventNeedsUserReturnFrameUnlocked(Event *event) const
size_t m_TerminationDeferralDepth
List< Event * > m_EventQueue