1 /* 2 * PROJECT: ReactOS Kernel 3 * LICENSE: GPL - See COPYING in the top level directory 4 * FILE: ntoskrnl/ps/i386/psctx.c 5 * PURPOSE: Process Manager: Set/Get Context for i386 6 * PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org) 7 */ 8 9 /* INCLUDES *******************************************************************/ 10 11 #include <ntoskrnl.h> 12 #define NDEBUG 13 #include <debug.h> 14 15 /* FUNCTIONS ******************************************************************/ 16 17 VOID 18 NTAPI 19 PspGetContext(IN PKTRAP_FRAME TrapFrame, 20 IN PVOID NonVolatileContext, 21 IN OUT PCONTEXT Context) 22 { 23 PAGED_CODE(); 24 25 /* Convert the trap frame to a context */ 26 KeTrapFrameToContext(TrapFrame, NULL, Context); 27 } 28 29 VOID 30 NTAPI 31 PspSetContext(OUT PKTRAP_FRAME TrapFrame, 32 OUT PVOID NonVolatileContext, 33 IN PCONTEXT Context, 34 IN KPROCESSOR_MODE Mode) 35 { 36 PAGED_CODE(); 37 38 /* Convert the context to a trap frame structure */ 39 KeContextToTrapFrame(Context, NULL, TrapFrame, Context->ContextFlags, Mode); 40 } 41 42 VOID 43 NTAPI 44 PspGetOrSetContextKernelRoutine(IN PKAPC Apc, 45 IN OUT PKNORMAL_ROUTINE* NormalRoutine, 46 IN OUT PVOID* NormalContext, 47 IN OUT PVOID* SystemArgument1, 48 IN OUT PVOID* SystemArgument2) 49 { 50 PGET_SET_CTX_CONTEXT GetSetContext; 51 PKEVENT Event; 52 PCONTEXT Context; 53 PETHREAD Thread; 54 KPROCESSOR_MODE Mode; 55 PKTRAP_FRAME TrapFrame = NULL; 56 PAGED_CODE(); 57 58 /* Get the Context Structure */ 59 GetSetContext = CONTAINING_RECORD(Apc, GET_SET_CTX_CONTEXT, Apc); 60 Context = &GetSetContext->Context; 61 Event = &GetSetContext->Event; 62 Mode = GetSetContext->Mode; 63 Thread = Apc->SystemArgument2; 64 65 /* If this is a kernel-mode request, grab the saved trap frame */ 66 if (Mode == KernelMode) TrapFrame = Thread->Tcb.TrapFrame; 67 68 /* If we don't have one, grab it from the stack */ 69 if (!TrapFrame) 70 { 71 /* Trap frame is right under our initial stack */ 72 TrapFrame = KeGetTrapFrame(&Thread->Tcb); 73 } 74 75 /* Check if it's a set or get */ 76 if (Apc->SystemArgument1) 77 { 78 /* Set the Context */ 79 PspSetContext(TrapFrame, NULL, Context, Mode); 80 } 81 else 82 { 83 /* Get the Context */ 84 PspGetContext(TrapFrame, NULL, Context); 85 } 86 87 /* Notify the Native API that we are done */ 88 KeSetEvent(Event, IO_NO_INCREMENT, FALSE); 89 } 90 91 /* EOF */ 92