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
83 /* Compatibility define */
95 .macro NESTED_ENTRY Name
97 PrologName
.equ
&Name
&_Prolog
98 FuncEndName
.equ
&Name
&_end
109 .macro ENTRY_END Name
114 .macro TRAP_PROLOG Abort
124 // Save the bottom 4 registers
127 // Save the abort lr, sp, spsr, cpsr
133 // Switch to SVC mode
134 bic r2
, r2
, #CPSR_MODES
135 orr r2
, r2
, #CPSR_SVC_MODE
138 // Save the SVC sp before we modify it
141 // Make space for the trap frame
142 sub sp
, sp
, #TrapFrameLength
146 str lr
, [sp
, #TrSvcLr]
147 str r2
, [sp
, #TrSvcSp]
149 // Restore the saved SPSR
152 // Restore our 4 registers
156 // FIXME: Change to stmdb later
167 str r10
, [sp
, #TrR10]
168 str r11
, [sp
, #TrR11]
169 str r12
, [sp
, #TrR12]
171 add r12
, r12
, #TrUserSp
174 str r0
, [sp
, #TrSpsr]
176 str r0
, [sp
, #TrDbgArgMark]
179 .macro SYSCALL_PROLOG
180 // Make space for the trap frame
181 sub sp
, sp
, #TrapFrameLength
184 // FIXME: Change to stmdb later
195 str r10
, [sp
, #TrR10]
196 str r11
, [sp
, #TrR11]
197 str r12
, [sp
, #TrR12]
199 add r12
, r12
, #TrUserSp
201 str sp
, [sp
, #TrSvcSp]
204 str r0
, [sp
, #TrSpsr]
206 str r0
, [sp
, #TrDbgArgMark]
209 .macro TRAP_EPILOG SystemCall
210 // ASSERT(TrapFrame->DbgArgMark == 0xBADB0D00)
211 ldr r0
, [sp
, #TrDbgArgMark]
216 // Get the SPSR and restore it
217 ldr r0
, [sp
, #TrSpsr]
220 // Restore the registers
221 // FIXME: Use LDMIA later
223 add r0
, r0
, #TrUserSp
235 ldr r10
, [sp
, #TrR10]
236 ldr r11
, [sp
, #TrR11]
237 ldr r12
, [sp
, #TrR12]
239 // Restore program execution state
242 add sp
, sp
, #TrapFrameLength
246 ldmia sp
, {sp
, lr
, pc
}^