Add guarded region support
All checks were successful
Builds / ExectOS (amd64, debug) (push) Successful in 43s
Builds / ExectOS (amd64, release) (push) Successful in 42s
Builds / ExectOS (i686, debug) (push) Successful in 41s
Builds / ExectOS (i686, release) (push) Successful in 40s

This commit is contained in:
2026-08-06 16:03:56 +02:00
parent 0a66c8a3a3
commit 7e66630c1b
2 changed files with 91 additions and 0 deletions

View File

@@ -24,6 +24,8 @@ namespace KE
STATIC XTAPI VOID AttachThread(IN PKTHREAD Thread);
STATIC XTFASTCALL VOID EnterCriticalRegion();
STATIC XTFASTCALL VOID EnterCriticalRegion(IN PKTHREAD Thread);
STATIC XTFASTCALL VOID EnterGuardedRegion();
STATIC XTFASTCALL VOID EnterGuardedRegion(IN PKTHREAD Thread);
STATIC XTAPI PETHREAD GetInitialThread(VOID);
STATIC XTAPI XTSTATUS InitializeIdleThread(IN PKPROCESS IdleProcess,
IN OUT PKTHREAD IdleThread,
@@ -40,6 +42,8 @@ namespace KE
IN BOOLEAN AttachToProcess);
STATIC XTFASTCALL VOID LeaveCriticalRegion();
STATIC XTFASTCALL VOID LeaveCriticalRegion(IN PKTHREAD Thread);
STATIC XTFASTCALL VOID LeaveGuardedRegion();
STATIC XTFASTCALL VOID LeaveGuardedRegion(IN PKTHREAD Thread);
private:
STATIC XTAPI VOID HandleSystemThreadExit(VOID);

View File

@@ -111,6 +111,42 @@ KE::KThread::EnterCriticalRegion(IN PKTHREAD Thread)
AR::CpuFunctions::ReadWriteBarrier();
}
/**
* Disables the delivery of special APCs for the current thread.
*
* @return This routine does not return any value.
*
* @since XT 1.0
*/
XTFASTCALL
VOID
KE::KThread::EnterGuardedRegion()
{
/* Prevent the thread from being preempted by an APC */
EnterGuardedRegion(KE::Processor::GetCurrentThread());
}
/**
* Disables the delivery of special APCs for the specified thread.
*
* @param Thread
* Supplies a pointer to the thread object whose APC delivery is to be disabled.
*
* @return This routine does not return any value.
*
* @since XT 1.0
*/
XTFASTCALL
VOID
KE::KThread::EnterGuardedRegion(IN PKTHREAD Thread)
{
/* Disable Special APCs */
Thread->SpecialApcDisable--;
/* Prevent the compiler from reordering code */
AR::CpuFunctions::ReadWriteBarrier();
}
/**
* Retrieves a pointer to the system's initial executive thread object.
*
@@ -437,6 +473,57 @@ KE::KThread::LeaveCriticalRegion(IN PKTHREAD Thread)
}
}
/**
* Re-enables the delivery of special APCs for the current thread.
*
* @return This routine does not return any value.
*
* @since XT 1.0
*/
XTFASTCALL
VOID
KE::KThread::LeaveGuardedRegion()
{
/* Allow APCs to preempt the thread */
LeaveGuardedRegion(KE::Processor::GetCurrentThread());
}
/**
* Re-enables the delivery of special APCs for the specified thread.
*
* @param Thread
* Supplies a pointer to the thread object whose APC delivery is to be re-enabled.
*
* @return This routine does not return any value.
*
* @since XT 1.0
*/
XTFASTCALL
VOID
KE::KThread::LeaveGuardedRegion(IN PKTHREAD Thread)
{
/* Ensure the compiler does not reorder code */
AR::CpuFunctions::ReadWriteBarrier();
/* Re-enable APC delivery */
Thread->SpecialApcDisable++;
/* Check if APC delivery is enabled */
if(!Thread->SpecialApcDisable)
{
/* Memory barrier */
AR::CpuFunctions::MemoryBarrier();
/* Check for any pending kernel APCs */
if(!RTL::LinkedList::ListEmpty(&Thread->ApcState.ApcListHead[KernelMode]))
{
/* Initiate delivery of the pending APCs */
KE::Apc::CheckApcDelivery();
}
}
}
/**
* Suspend APC-built thread NOP routine. It takes no actions.
*