Author: ros-arm-bringup
Date: Wed Jun 11 23:32:45 2008
New Revision: 33940
URL:
http://svn.reactos.org/svn/reactos?rev=33940&view=rev
Log:
- We now implement more proper context switching.
- This fixes an issue where code was using PCR->CurrentThread but x86/shared routines
use PRCB->CurrentThread.
- Added a note to explain the difference, and we now set both.
- We currently stop at Phase 1 HAL Initialization.
Modified:
trunk/reactos/include/reactos/armddk.h
trunk/reactos/ntoskrnl/ex/init.c
trunk/reactos/ntoskrnl/ke/arm/trapc.c
Modified: trunk/reactos/include/reactos/armddk.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/include/reactos/armddk.h?r…
==============================================================================
--- trunk/reactos/include/reactos/armddk.h [iso-8859-1] (original)
+++ trunk/reactos/include/reactos/armddk.h [iso-8859-1] Wed Jun 11 23:32:45 2008
@@ -111,6 +111,8 @@
PVOID InitialStack;
PVOID StackLimit;
ULONG QuantumEnd;
+ PVOID PerfGlobalGroupMask;
+ ULONG ContextSwitches;
} KPCR, *PKPCR;
//
Modified: trunk/reactos/ntoskrnl/ex/init.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ex/init.c?rev=339…
==============================================================================
--- trunk/reactos/ntoskrnl/ex/init.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/ex/init.c [iso-8859-1] Wed Jun 11 23:32:45 2008
@@ -1269,7 +1269,7 @@
DPRINT1("*** Phase 1 Initialization Thread\n");
DPRINT1("Beginning consistency checks...\n");
// CHECK STACKS, IRQLS, DISPATCHER AND MAKE SURE WE ARE GOOD TO GO!
- while (TRUE);
+ //while (TRUE);
#endif
/* Allocate the initialization buffer */
Modified: trunk/reactos/ntoskrnl/ke/arm/trapc.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ke/arm/trapc.c?re…
==============================================================================
--- trunk/reactos/ntoskrnl/ke/arm/trapc.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/ke/arm/trapc.c [iso-8859-1] Wed Jun 11 23:32:45 2008
@@ -33,11 +33,14 @@
VOID FASTCALL
HalClearSoftwareInterrupt(IN KIRQL Request);
-VOID
+BOOLEAN
KiSwapContextInternal(IN PKTHREAD OldThread,
IN PKTHREAD NewThread)
{
PKEXCEPTION_FRAME ExFrame = NewThread->KernelStack;
+ PKPCR Pcr = (PKPCR)KeGetPcr();
+ PKPRCB Prcb = Pcr->Prcb;
+ PKPROCESS OldProcess, NewProcess;
DPRINT1("Switching from: %p to %p\n", OldThread, NewThread);
DPRINT1("Stacks: %p %p\n", OldThread->KernelStack,
NewThread->KernelStack);
DPRINT1("Thread Registers:\n"
@@ -61,10 +64,91 @@
ExFrame->R11,
ExFrame->Psr,
ExFrame->Lr);
-
- //
- // FIXME: Todo
- //
+ DPRINT1("Old priority: %lx\n", OldThread->Priority);
+
+ //
+ // Increase context switch count
+ //
+ Pcr->ContextSwitches++;
+
+ //
+ // Check if WMI tracing is enabled
+ //
+ if (Pcr->PerfGlobalGroupMask)
+ {
+ //
+ // FIXME: TODO
+ //
+ DPRINT1("WMI Tracing not supported\n");
+ while (TRUE);
+ }
+
+ //
+ // Check if the processes are also different
+ //
+ OldProcess = OldThread->ApcState.Process;
+ NewProcess = NewThread->ApcState.Process;
+ if (OldProcess != NewProcess)
+ {
+ //
+ // Check if address space switch is needed
+ //
+ if (OldProcess->DirectoryTableBase.LowPart !=
+ NewProcess->DirectoryTableBase.LowPart)
+ {
+ //
+ // FIXME: TODO
+ //
+ DPRINT1("Address space switch not implemented\n");
+ while (TRUE);
+ }
+ }
+
+ //
+ // Increase thread context switches
+ //
+ NewThread->ContextSwitches++;
+
+ //
+ // Set us as the current thread
+ // NOTE: On RISC Platforms, there is both a KPCR CurrentThread, and a
+ // KPRCB CurrentThread.
+ // The latter is set just like on x86-based builds, the former is only set
+ // when actually doing the context switch (here).
+ // Recall that the reason for the latter is due to the fact that the KPCR
+ // is shared with user-mode (read-only), so that information is exposed
+ // there as well.
+ //
+ Pcr->CurrentThread = NewThread;
+
+ //
+ // DPCs shouldn't be active
+ //
+ if (Prcb->DpcRoutineActive)
+ {
+ //
+ // FIXME: FAIL
+ //
+ DPRINT1("DPCS ACTIVE!!!\n");
+ while (TRUE);
+ }
+
+ //
+ // Kernel APCs may be pending
+ //
+ if (NewThread->ApcState.KernelApcPending)
+ {
+ //
+ // FIXME: TODO
+ //
+ DPRINT1("APCs pending!\n");
+ while (TRUE);
+ }
+
+ //
+ // Return
+ //
+ return FALSE;
}
VOID