[CMAKE]
[reactos.git] / ntoskrnl / ke / arm / ctxswtch.s
1 /*
2 * PROJECT: ReactOS Kernel
3 * LICENSE: BSD - See COPYING.ARM in the top level directory
4 * FILE: ntoskrnl/ke/arm/ctxswtch.s
5 * PURPOSE: Context Switch and Idle Thread on ARM
6 * PROGRAMMERS: ReactOS Portable Systems Group
7 */
8
9 .title "ARM Context Switching"
10 .include "ntoskrnl/include/internal/arm/kxarm.h"
11 .include "ntoskrnl/include/internal/arm/ksarm.h"
12
13 TEXTAREA
14 NESTED_ENTRY KiSwapContext
15 PROLOG_END KiSwapContext
16
17 // BUSTEDDDD
18 b .
19
20 //
21 // a1 = Old Thread
22 // a2 = New Thread
23 //
24
25 //
26 // Make space for the trap frame
27 //
28 sub sp, sp, #ExceptionFrameLength
29
30 //
31 // Build exception frame
32 // FIXME-PERF: Change to stmdb later
33 //
34 str r4, [sp, #ExR4]
35 str r5, [sp, #ExR5]
36 str r6, [sp, #ExR6]
37 str r7, [sp, #ExR7]
38 str r8, [sp, #ExR8]
39 str r9, [sp, #ExR9]
40 str r10, [sp, #ExR10]
41 str r11, [sp, #ExR11]
42 str lr, [sp, #ExLr]
43 mrs r4, spsr_all
44 str r4, [sp, #ExSpsr]
45
46 //
47 // Switch stacks
48 //
49 str sp, [a1, #ThKernelStack]
50 ldr sp, [a2, #ThKernelStack]
51
52 //
53 // Call the C context switch code
54 //
55 bl KiSwapContextInternal
56
57 //
58 // Get the SPSR and restore it
59 //
60 ldr r4, [sp, #ExSpsr]
61 msr spsr_all, r4
62
63 //
64 // Restore the registers
65 // FIXME-PERF: Use LDMIA later
66 //
67 ldr r4, [sp, #ExR4]
68 ldr r5, [sp, #ExR5]
69 ldr r6, [sp, #ExR6]
70 ldr r7, [sp, #ExR7]
71 ldr r8, [sp, #ExR8]
72 ldr r9, [sp, #ExR9]
73 ldr r10, [sp, #ExR10]
74 ldr r11, [sp, #ExR11]
75 ldr lr, [sp, #ExLr]
76
77 //
78 // Restore stack
79 //
80 add sp, sp, #ExceptionFrameLength
81
82 //
83 // Jump to saved restore address
84 //
85 mov pc, lr
86
87 ENTRY_END KiSwapContext
88
89 NESTED_ENTRY KiThreadStartup
90 PROLOG_END KiThreadStartup
91
92 //
93 // Lower to APC_LEVEL
94 //
95 mov a1, #1
96 bl KeLowerIrql
97
98 //
99 // Set the start address and startup context
100 //
101 mov a1, r6
102 mov a2, r5
103 blx r7
104
105 //
106 // Oh noes, we are back!
107 //
108 b .
109
110 ENTRY_END KiThreadStartup
111
112 NESTED_ENTRY KiSwitchThreads
113 PROLOG_END KiSwitchThreads
114
115 // BUSTEDDDD
116 b .
117
118 ENTRY_END KiSwitchThreads
119
120 NESTED_ENTRY KiSwapContextInternal
121 PROLOG_END KiSwapContextInternal
122
123 // BUSTEDDDD
124 b .
125
126 ENTRY_END KiSwapContextInternal