.code64 .extern THREAD_sp .global ml_thread_switch .type ml_thread_switch, @function // %rdi = (struct thread *) current thread. // %rsi = (struct thread *) next thread. ml_thread_switch: 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 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 .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