|
@@ -348,40 +348,40 @@ _syscall_trace_entry:
|
|
|
|
|
|
.type resume,@function
|
|
|
resume:
|
|
|
- subq 4, $sp
|
|
|
- move $srp, [$sp] ; Keep old/new PC on the stack.
|
|
|
+ subq 4, $sp ; Make space for srp.
|
|
|
+
|
|
|
add.d $r12, $r10 ; R10 = current tasks tss.
|
|
|
addoq +THREAD_ccs, $r10, $acr
|
|
|
+ move $srp, [$sp] ; Keep old/new PC on the stack.
|
|
|
move $ccs, [$acr] ; Save IRQ enable state.
|
|
|
di
|
|
|
|
|
|
addoq +THREAD_usp, $r10, $acr
|
|
|
+ subq 10*4, $sp ; Make room for R9.
|
|
|
move $usp, [$acr] ; Save user-mode stackpointer.
|
|
|
|
|
|
;; See copy_thread for the reason why register R9 is saved.
|
|
|
- subq 10*4, $sp
|
|
|
movem $r9, [$sp] ; Save non-scratch registers and R9.
|
|
|
|
|
|
addoq +THREAD_ksp, $r10, $acr
|
|
|
+ move.d $sp, $r10 ; Return last running task in R10.
|
|
|
move.d $sp, [$acr] ; Save kernel SP for old task.
|
|
|
|
|
|
- move.d $sp, $r10 ; Return last running task in R10.
|
|
|
and.d -8192, $r10 ; Get thread_info from stackpointer.
|
|
|
addoq +TI_task, $r10, $acr
|
|
|
- move.d [$acr], $r10 ; Get task.
|
|
|
add.d $r12, $r11 ; Find the new tasks tss.
|
|
|
+ move.d [$acr], $r10 ; Get task.
|
|
|
addoq +THREAD_ksp, $r11, $acr
|
|
|
move.d [$acr], $sp ; Switch to new stackframe.
|
|
|
+ addoq +THREAD_usp, $r11, $acr
|
|
|
movem [$sp+], $r9 ; Restore non-scratch registers and R9.
|
|
|
|
|
|
- addoq +THREAD_usp, $r11, $acr
|
|
|
move [$acr], $usp ; Restore user-mode stackpointer.
|
|
|
|
|
|
addoq +THREAD_ccs, $r11, $acr
|
|
|
+ move.d [$sp+], $r11
|
|
|
+ jump $r11 ; Restore PC.
|
|
|
move [$acr], $ccs ; Restore IRQ enable status.
|
|
|
- move.d [$sp+], $acr
|
|
|
- jump $acr ; Restore PC.
|
|
|
- nop
|
|
|
.size resume, . - resume
|
|
|
|
|
|
nmi_interrupt:
|