.file "custom_stack_callback_x86_64.s" .text .global custom_stack_callback .type custom_stack_callback, @function .align 16 custom_stack_callback: # rdi = new stack adress (passed as parameter) # r12 temporary for restoring old stack (callee saved, so we get the correct value in case of a return) push %r12 # store the callee saved register as required movq %rsp, %r12 # store current stack pointer movq %rdi, %rsp # update stack pointer to new user level stack call callback # enter next tasks (will not return if continuation is stolen) movq %r12, %rsp # restore to the old stack pointer pop %r12 # restore the callee saved register as required ret