3939
4040. extern current_thread
4141. extern irq_handle
42- . extern syscall_handle
42+ . extern arch_syscall_handle
4343
4444. extern dumpstack
4545
@@ -118,8 +118,8 @@ __prepare_sig_handler:
118118 bne __stack_alignment_fault
119119
120120 @ Copy TLS to the new stack frame
121- ldr r0 , [ sp , #OFFSET_TLS_USR ]
122- str r0 , [ sp , #( - SVC_STACK_FRAME_SIZE + OFFSET_TLS_USR) ]
121+ ldr r1 , [ sp , #OFFSET_TLS_USR ]
122+ str r1 , [ sp , #( - SVC_STACK_FRAME_SIZE + OFFSET_TLS_USR) ]
123123
124124 str sp , [ sp , #( - SVC_STACK_FRAME_SIZE + OFFSET_SP) ] @ save sp
125125
@@ -203,8 +203,8 @@ syscall_interrupt:
203203 stmia lr , { sp , lr}^
204204
205205 @ Save user space TLS context
206- mrc p15 , 0 , r0 , c13 , c0 , 0
207- str r0 , [ sp , #OFFSET_TLS_USR ]
206+ mrc p15 , 0 , lr , c13 , c0 , 3
207+ str lr , [ sp , #OFFSET_TLS_USR ]
208208
209209 cmp r7 , #SYSCALL_sigreturn
210210 beq __after_push_sp_usr
@@ -223,7 +223,7 @@ __after_push_sp_usr:
223223 mov r0 , sp
224224
225225 cpsie i @ Re - enable interrupts
226- bl syscall_handle
226+ bl arch_syscall_handle
227227 cpsid i @ Re - disable interrupts to be safe in regs manipulation
228228
229229 @ Check if sigreturn has been called. In this case , we
@@ -235,20 +235,22 @@ __after_push_sp_usr:
235235 add sp , sp , #SVC_STACK_FRAME_SIZE
236236
237237__no_sigreturn:
238- __ret_from_fork:
239238
240239 @ Store the return value on the stack frame
241240 cmp r7 , #SYSCALL_sigreturn
242241 strne r0 , [ sp , #OFFSET_R0 ]
243242
243+ // Entry point for new user threads
244+ ret_from_fork:
245+
244246#ifdef CONFIG_IPC_SIGNAL
245247 @ Is there any pending signals for this process?
246248 check_pending_signal
247249#endif / * CONFIG_IPC_SIGNAL * /
248250
249251 @ Restore user space TLS context
250252 ldr lr , [ sp , #OFFSET_TLS_USR ]
251- mcr p15 , 0 , lr , c13 , c0 , 0
253+ mcr p15 , 0 , lr , c13 , c0 , 3
252254
253255 @ get the saved spsr and adjust the stack pointer
254256 ldr lr , [ sp , #OFFSET_PSR ]
@@ -266,14 +268,6 @@ __ret_from_fork:
266268
267269 ldmia sp , { sp , lr , pc}^
268270
269-
270-
271- @ Used at entry point of a fork'd process (setting the return value to 0 )
272- ret_from_fork:
273- mov r0 , # 0
274-
275- b __ret_from_fork
276-
277271. align 5
278272prefetch_abort:
279273
360354 stmeqia lr , { sp , lr}^
361355
362356 @ Save user space TLS context
363- mrc p15 , 0 , r0 , c13 , c0 , 0
364- str r0 , [ sp , #OFFSET_TLS_USR ]
357+ mrceq p15 , 0 , lr , c13 , c0 , 3
358+ streq lr , [ sp , #OFFSET_TLS_USR ]
365359
366360 @ Retrieve the lr_irq to set the pc out of this routine
367361 ldr lr , [ r0 , # 4 ] @ retrieve lr_irq to set lr_svc
@@ -388,10 +382,6 @@ irq:
388382 check_pending_signal
389383#endif / * CONFIG_IPC_SIGNAL * /
390384
391- @ Restore user space TLS context
392- ldr lr , [ sp , #OFFSET_TLS_USR ]
393- mcr p15 , 0 , lr , c13 , c0 , 0
394-
395385 ldr lr , [ sp , #OFFSET_PSR ] @ get the saved spsr and adjust the stack pointer
396386 msr spsr , lr
397387
@@ -403,6 +393,10 @@ irq:
403393 addeq lr , sp , #OFFSET_SP_USR
404394 ldmeqia lr , { sp , lr}^
405395
396+ @ Restore user space TLS context
397+ ldreq lr , [ sp , #OFFSET_TLS_USR ]
398+ mcreq p15 , 0 , lr , c13 , c0 , 3
399+
406400 @ Restore registers
407401 ldmia sp , {r0 - r12 }
408402
0 commit comments