windows-nt/Source/XPSP1/NT/base/ntos/ke/amd64/procswap.c
2020-09-26 16:20:57 +08:00

97 lines
1.8 KiB
C

/*++
Copyright (c) 2000 Microsoft Corporation
Module Name:
procswap.c
Abstract:
This module implements the platform dependent kernel function to swap
processes.
Author:
David N. Cutler (davec) 10-Jun-2000
Environment:
Kernel mode only.
Revision History:
--*/
#include "ki.h"
BOOLEAN
KiSwapProcess (
IN PKPROCESS NewProcess,
IN PKPROCESS OldProcess
)
/*++
Routine Description:
This function swaps the address space to another process by flushing the
the translation buffer and establishings a new directory table base. It
also swaps the I/O permission map to the new process.
N.B. There is code similar to this code in swap context.
N.B. This code is executed at DPC level.
Arguments:
NewProcess - Supplies a pointer to the new process object.
Oldprocess - Supplies a pointer to the old process object.
Return Value:
None.
--*/
{
PKSPIN_LOCK_QUEUE LockQueue;
PKPRCB Prcb;
PKTSS64 TssBase;
//
// Acquire the context swap lock and update the active processor
// masks for the new and old process.
//
Prcb = KeGetCurrentPrcb();
#if !defined(NT_UP)
LockQueue = &Prcb->LockQueue[LockQueueContextSwapLock];
KeAcquireQueuedSpinLockAtDpcLevel(LockQueue);
OldProcess->ActiveProcessors ^= Prcb->SetMember;
ASSERT((OldProcess->ActiveProcessors & Prcb->SetMember) == 0);
NewProcess->ActiveProcessors ^= Prcb->SetMember;
ASSERT((NewProcess->ActiveProcessors & Prcb->SetMember) != 0);
KeReleaseQueuedSpinLockFromDpcLevel(LockQueue);
#endif // !defined(NT_UP)
//
// Set the offset of the I/O permissions map for the new process and
// load the new directory table base.
//
TssBase = KeGetPcr()->TssBase;
TssBase->IoMapBase = NewProcess->IopmOffset;
WriteCR3(NewProcess->DirectoryTableBase[0]);
return TRUE;
}