// Copyright 2019 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // This provides a simplified version of getcontext and // setcontext. They are like the corresponding functions // in libc, but we only save/restore the callee-save // registers and PC, SP. Unlike the libc functions, we // don't save/restore the signal masks and floating point // environment. #if defined(__x86_64__) && defined(__linux__) && !defined(__CET__) #define RBP_OFF (0*8) #define RBX_OFF (1*8) #define R12_OFF (2*8) #define R13_OFF (3*8) #define R14_OFF (4*8) #define R15_OFF (5*8) #define SP_OFF (6*8) #define PC_OFF (7*8) .globl __go_getcontext .text __go_getcontext: movq %rbx, RBX_OFF(%rdi) movq %rbp, RBP_OFF(%rdi) movq %r12, R12_OFF(%rdi) movq %r13, R13_OFF(%rdi) movq %r14, R14_OFF(%rdi) movq %r15, R15_OFF(%rdi) movq (%rsp), %rax // return PC movq %rax, PC_OFF(%rdi) leaq 8(%rsp), %rax // the SP before pushing return PC movq %rax, SP_OFF(%rdi) ret .globl __go_setcontext .text __go_setcontext: movq RBX_OFF(%rdi), %rbx movq RBP_OFF(%rdi), %rbp movq R12_OFF(%rdi), %r12 movq R13_OFF(%rdi), %r13 movq R14_OFF(%rdi), %r14 movq R15_OFF(%rdi), %r15 movq SP_OFF(%rdi), %rsp movq PC_OFF(%rdi), %rdx jmp *%rdx .globl __go_makecontext .text __go_makecontext: addq %rcx, %rdx // Align the SP, and push a dummy return address. andq $~0xf, %rdx subq $8, %rdx movq $0, (%rdx) movq %rdx, SP_OFF(%rdi) movq %rsi, PC_OFF(%rdi) ret .section .note.GNU-split-stack,"",@progbits .section .note.GNU-no-split-stack,"",@progbits #endif .section .note.GNU-stack,"",@progbits