diff --git a/reactos/ntoskrnl/include/internal/arm/ksarm.h b/reactos/ntoskrnl/include/internal/arm/ksarm.h
index 98b95061618..17c06dc67b2 100644
--- a/reactos/ntoskrnl/include/internal/arm/ksarm.h
+++ b/reactos/ntoskrnl/include/internal/arm/ksarm.h
@@ -55,6 +55,11 @@
*/
.equ PcCurrentIrql, 0x14C
+/*
+ * KTHREAD Offsets
+ */
+.equ ThKernelStack, 0x20
+
#else
/*
diff --git a/reactos/ntoskrnl/ke/arm/ctxswtch.s b/reactos/ntoskrnl/ke/arm/ctxswtch.s
new file mode 100644
index 00000000000..6b28048ed91
--- /dev/null
+++ b/reactos/ntoskrnl/ke/arm/ctxswtch.s
@@ -0,0 +1,50 @@
+/*
+ * PROJECT: ReactOS Kernel
+ * LICENSE: GPL - See COPYING in the top level directory
+ * FILE: ntoskrnl/ke/arm/ctxswtch.s
+ * PURPOSE: Context Switch and Idle Thread on ARM
+ * PROGRAMMERS: ReactOS Portable Systems Group
+ */
+
+ .title "ARM Context Switching"
+ .include "ntoskrnl/include/internal/arm/kxarm.h"
+ .include "ntoskrnl/include/internal/arm/ksarm.h"
+
+ TEXTAREA
+ NESTED_ENTRY KiSwapContext
+ PROLOG_END KiSwapContext
+ //
+ // a1 = Old Thread
+ // a2 = New Thread
+ //
+
+ //
+ // Save volatile registers for the OLD thread
+ //
+
+ //
+ // Switch stacks
+ //
+ str sp, [a1, #ThKernelStack]
+ ldr sp, [a2, #ThKernelStack]
+
+ //
+ // Call the C context switch code
+ //
+ bl KiSwapContextInternal
+
+ //
+ // Restore volatile registers for the NEW thread
+ //
+
+ //
+ // Jump to saved restore address
+ //
+
+ //
+ // FIXME: TODO
+ //
+ b .
+
+ ENTRY_END KiSwapContext
+
diff --git a/reactos/ntoskrnl/ke/arm/stubs.c b/reactos/ntoskrnl/ke/arm/stubs.c
index 6eafcbecfcd..b18c76407ba 100644
--- a/reactos/ntoskrnl/ke/arm/stubs.c
+++ b/reactos/ntoskrnl/ke/arm/stubs.c
@@ -2,6 +2,8 @@
#define NDEBUG
#include "debug.h"
+CCHAR KeNumberProcessors;
+ULONG KeDcacheFlushCount;
ULONG KeActiveProcessors;
ULONG KeProcessorArchitecture;
ULONG KeProcessorLevel;
diff --git a/reactos/ntoskrnl/ke/arm/stubs_asm.s b/reactos/ntoskrnl/ke/arm/stubs_asm.s
index ea6442f09b7..8e2b242e01a 100644
--- a/reactos/ntoskrnl/ke/arm/stubs_asm.s
+++ b/reactos/ntoskrnl/ke/arm/stubs_asm.s
@@ -12,17 +12,14 @@ GENERATE_ARM_STUB _local_unwind2
//
// Exported Ke Arch-Specific APIs
//
-GENERATE_ARM_STUB KiSwapContext
GENERATE_ARM_STUB DbgBreakPointWithStatus
GENERATE_ARM_STUB KeConnectInterrupt
-GENERATE_ARM_STUB KeDcacheFlushCount
GENERATE_ARM_STUB KeDisconnectInterrupt
GENERATE_ARM_STUB KeFlushEntireTb
GENERATE_ARM_STUB KeGetRecommendedSharedDataAlignment
GENERATE_ARM_STUB KeIcacheFlushCount
GENERATE_ARM_STUB KeInitializeInterrupt
GENERATE_ARM_STUB KeInvalidateAllCaches
-GENERATE_ARM_STUB KeNumberProcessors
GENERATE_ARM_STUB KeQueryActiveProcessors
GENERATE_ARM_STUB KeRaiseUserException
GENERATE_ARM_STUB KeSaveStateForHibernate
diff --git a/reactos/ntoskrnl/ke/arm/trapc.c b/reactos/ntoskrnl/ke/arm/trapc.c
index 13da1a188ba..05e5f7dafd4 100644
--- a/reactos/ntoskrnl/ke/arm/trapc.c
+++ b/reactos/ntoskrnl/ke/arm/trapc.c
@@ -24,7 +24,6 @@ KiSystemCall(
IN PULONG Arguments,
IN ULONG ArgumentCount
);
-
/* FUNCTIONS ******************************************************************/
@@ -34,6 +33,18 @@ HalGetInterruptSource(VOID);
VOID FASTCALL
HalClearSoftwareInterrupt(IN KIRQL Request);
+VOID
+KiSwapContextInternal(IN PKTHREAD OldThread,
+ IN PKTHREAD NewThread)
+{
+ //
+ // FIXME: TODO
+ //
+ DPRINT1("Switching from: %p to %p\n", OldThread, NewThread);
+ DPRINT1("Stacks: %p %p\n", OldThread->KernelStack, NewThread->KernelStack);
+ while (TRUE);
+}
+
VOID
KiDispatchInterrupt(VOID)
{
@@ -107,9 +118,12 @@ KiDispatchInterrupt(VOID)
//
// Swap to the new thread
+ // On ARM we call KiSwapContext instead of KiSwapContextInternal,
+ // because we're calling this from C code and not assembly.
+ // This is similar to how it gets called for unwaiting, on x86
//
DPRINT1("Swapping context!\n");
- //KiSwapContextInternal();
+ KiSwapContext(OldThread, NewThread);
while (TRUE);
}
}
diff --git a/reactos/ntoskrnl/ntoskrnl-generic.rbuild b/reactos/ntoskrnl/ntoskrnl-generic.rbuild
index 51c35f9c41a..b5e1fd572ce 100644
--- a/reactos/ntoskrnl/ntoskrnl-generic.rbuild
+++ b/reactos/ntoskrnl/ntoskrnl-generic.rbuild
@@ -63,6 +63,7 @@
boot.s
arm_kprintf.c
cpu.c
+ ctxswtch.s
exp.c
kiinit.c
stubs_asm.s