10 AreaName SETS
"|.text|"
14 AREA
|.text
|,ALIGN
=2,CODE
,READONLY
15 AreaName SETS
"|.text|"
21 PrologName SETS
"$Name":CC
:"_Prolog"
22 FuncEndName SETS
"$Name":CC
:"_end"
23 AREA
|.pdata
|,ALIGN
=2,PDATA
25 EXPORT $FuncName
[FUNC
]
43 PrologName SETS
"Invalid Prolog"
44 FuncEndName SETS
"$Name":CC
:"_end"
46 EXPORT $FuncName
[FUNC
]
67 TRAP_EPILOG $SystemCall
73 /* Compatibility define */
85 .macro NESTED_ENTRY Name
87 PrologName
.equ
&Name
&_Prolog
88 FuncEndName
.equ
&Name
&_end
104 .macro TRAP_PROLOG Abort
114 // Save the bottom 4 registers
117 // Save the abort lr, sp, spsr, cpsr
123 // Switch to SVC mode
124 bic r2
, r2
, #CPSR_MODES
125 orr r2
, r2
, #CPSR_SVC_MODE
128 // Save the SVC sp before we modify it
131 // Make space for the trap frame
132 sub sp
, sp
, #TrapFrameLength
136 str lr
, [sp
, #TrSvcLr]
137 str r2
, [sp
, #TrSvcSp]
139 // Restore the saved SPSR
142 // Restore our 4 registers
146 // FIXME: Change to stmdb later
157 str r10
, [sp
, #TrR10]
158 str r11
, [sp
, #TrR11]
159 str r12
, [sp
, #TrR12]
161 add r12
, r12
, #TrUserSp
164 str r0
, [sp
, #TrSpsr]
166 str r0
, [sp
, #TrDbgArgMark]
169 .macro SYSCALL_PROLOG
170 // Make space for the trap frame
171 sub sp
, sp
, #TrapFrameLength
174 // FIXME: Change to stmdb later
185 str r10
, [sp
, #TrR10]
186 str r11
, [sp
, #TrR11]
187 str r12
, [sp
, #TrR12]
189 add r12
, r12
, #TrUserSp
191 str sp
, [sp
, #TrSvcSp]
194 str r0
, [sp
, #TrSpsr]
196 str r0
, [sp
, #TrDbgArgMark]
199 .macro TRAP_EPILOG SystemCall
200 // ASSERT(TrapFrame->DbgArgMark == 0xBADB0D00)
201 ldr r0
, [sp
, #TrDbgArgMark]
206 // Get the SPSR and restore it
207 ldr r0
, [sp
, #TrSpsr]
210 // Restore the registers
211 // FIXME: Use LDMIA later
213 add r0
, r0
, #TrUserSp
225 ldr r10
, [sp
, #TrR10]
226 ldr r11
, [sp
, #TrR11]
227 ldr r12
, [sp
, #TrR12]
229 // Restore program execution state
232 add sp
, sp
, #TrapFrameLength
236 ldmia sp
, {sp
, lr
, pc
}^