ReactOS  0.4.15-dev-1171-gab82533
context.c
Go to the documentation of this file.
1 /*
2  * PROJECT: ReactOS Kernel
3  * LICENSE: BSD - See COPYING.ARM in the top level directory
4  * FILE: ntoskrnl/ke/i386/context.c
5  * PURPOSE: Context Switching Related Code
6  * PROGRAMMERS: ReactOS Portable Systems Group
7  */
8 
9 /* INCLUDES *******************************************************************/
10 
11 #include <ntoskrnl.h>
12 #define NDEBUG
13 #include <debug.h>
14 
15 /* GLOBALS ********************************************************************/
16 
17 /* FUNCTIONS ******************************************************************/
18 
19 VOID
20 NTAPI
22  IN PKPROCESS OldProcess)
23 {
24  PKIPCR Pcr = (PKIPCR)KeGetPcr();
25 #ifdef CONFIG_SMP
26  LONG SetMember;
27 
28  /* Update active processor mask */
29  SetMember = (LONG)Pcr->SetMember;
30  InterlockedXor((PLONG)&NewProcess->ActiveProcessors, SetMember);
31  InterlockedXor((PLONG)&OldProcess->ActiveProcessors, SetMember);
32 #endif
33 
34  /* Check for new LDT */
35  if (NewProcess->LdtDescriptor.LimitLow != OldProcess->LdtDescriptor.LimitLow)
36  {
37  if (NewProcess->LdtDescriptor.LimitLow)
38  {
40  ((PULONG)&NewProcess->LdtDescriptor)[0],
41  ((PULONG)&NewProcess->LdtDescriptor)[1]);
42  Ke386SetLocalDescriptorTable(KGDT_LDT);
43  }
44  else
45  {
46  Ke386SetLocalDescriptorTable(0);
47  }
48  }
49 
50  /* Update CR3 */
51  __writecr3(NewProcess->DirectoryTableBase[0]);
52 
53  /* Clear GS */
54  Ke386SetGs(0);
55 
56  /* Update IOPM offset */
57  Pcr->TSS->IoMapBase = NewProcess->IopmOffset;
58 }
59 
#define IN
Definition: typedefs.h:39
struct _KIPCR * PKIPCR
#define KeGetPcr()
Definition: ke.h:25
__INTRIN_INLINE void __writecr3(unsigned int Data)
Definition: intrin_x86.h:1689
#define KGDT_LDT
Definition: ketypes.h:83
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
Definition: IoEaTest.cpp:117
VOID KeSetGdtSelector(ULONG Entry, ULONG Value1, ULONG Value2)
Definition: ldt.c:107
long LONG
Definition: pedump.c:60
KAFFINITY SetMember
Definition: ketypes.h:763
VOID NTAPI KiSwapProcess(IN PKPROCESS NewProcess, IN PKPROCESS OldProcess)
Definition: context.c:21
struct _KTSS * TSS
Definition: ketypes.h:760
unsigned int * PULONG
Definition: retypes.h:1
signed int * PLONG
Definition: retypes.h:5
#define InterlockedXor
Definition: interlocked.h:266