xref: /reactos/ntoskrnl/ke/i386/context.c (revision 50cf16b3)
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
21 KiSwapProcess(IN PKPROCESS NewProcess,
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         {
39             KeSetGdtSelector(KGDT_LDT,
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 
60