2026-02-08 11:36:16 +00:00
|
|
|
.code64
|
2023-04-30 14:27:57 +01:00
|
|
|
|
2026-02-08 11:36:16 +00:00
|
|
|
.extern THREAD_sp
|
|
|
|
|
|
2026-02-08 11:58:27 +00:00
|
|
|
.global ml_thread_switch
|
|
|
|
|
.type ml_thread_switch, @function
|
2023-04-30 14:27:57 +01:00
|
|
|
|
|
|
|
|
// %rdi = (struct thread *) current thread.
|
|
|
|
|
// %rsi = (struct thread *) next thread.
|
2026-02-08 11:58:27 +00:00
|
|
|
ml_thread_switch:
|
2023-04-30 14:27:57 +01:00
|
|
|
pushfq
|
|
|
|
|
|
|
|
|
|
push %rax
|
|
|
|
|
push %rcx
|
|
|
|
|
push %rdx
|
|
|
|
|
push %rbx
|
|
|
|
|
pushq $0
|
|
|
|
|
push %rbp
|
|
|
|
|
push %rsi
|
|
|
|
|
push %rdi
|
|
|
|
|
push %r8
|
|
|
|
|
push %r9
|
|
|
|
|
push %r10
|
|
|
|
|
push %r11
|
|
|
|
|
push %r12
|
|
|
|
|
push %r13
|
|
|
|
|
push %r14
|
|
|
|
|
push %r15
|
2026-02-08 11:36:16 +00:00
|
|
|
|
2023-04-30 14:27:57 +01:00
|
|
|
movq %rsp, THREAD_sp(%rdi)
|
|
|
|
|
movq THREAD_sp(%rsi), %rsp
|
|
|
|
|
|
|
|
|
|
pop %r15
|
|
|
|
|
pop %r14
|
|
|
|
|
pop %r13
|
|
|
|
|
pop %r12
|
|
|
|
|
pop %r11
|
|
|
|
|
pop %r10
|
|
|
|
|
pop %r9
|
|
|
|
|
pop %r8
|
|
|
|
|
pop %rdi
|
|
|
|
|
pop %rsi
|
|
|
|
|
pop %rbp
|
|
|
|
|
add $8, %rsp
|
|
|
|
|
pop %rbx
|
|
|
|
|
pop %rdx
|
|
|
|
|
pop %rcx
|
|
|
|
|
pop %rax
|
|
|
|
|
|
|
|
|
|
popfq
|
|
|
|
|
|
|
|
|
|
ret
|
2026-02-08 11:58:27 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
.global ml_thread_switch_user
|
|
|
|
|
.type ml_thread_switch_user, @function
|
|
|
|
|
ml_thread_switch_user:
|
|
|
|
|
pop %r15
|
|
|
|
|
pop %r14
|
|
|
|
|
pop %r13
|
|
|
|
|
pop %r12
|
|
|
|
|
pop %r11
|
|
|
|
|
pop %r10
|
|
|
|
|
pop %r9
|
|
|
|
|
pop %r8
|
|
|
|
|
pop %rdi
|
|
|
|
|
pop %rsi
|
|
|
|
|
pop %rbp
|
|
|
|
|
add $8, %rsp
|
|
|
|
|
pop %rbx
|
|
|
|
|
pop %rdx
|
|
|
|
|
pop %rcx
|
|
|
|
|
pop %rax
|
|
|
|
|
|
|
|
|
|
add $16, %rsp
|
|
|
|
|
iretq
|