github.com/golang/gofrontend@v0.0.0-20240429183944-60f985a78526/libgo/runtime/go-context.S (about)

     1  // Copyright 2019 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  // This provides a simplified version of getcontext and
     6  // setcontext. They are like the corresponding functions
     7  // in libc, but we only save/restore the callee-save
     8  // registers and PC, SP. Unlike the libc functions, we
     9  // don't save/restore the signal masks and floating point
    10  // environment.
    11  
    12  #if defined(__x86_64__) && defined(__linux__) && !defined(__CET__)
    13  
    14  #define RBP_OFF	(0*8)
    15  #define RBX_OFF	(1*8)
    16  #define R12_OFF	(2*8)
    17  #define R13_OFF	(3*8)
    18  #define R14_OFF	(4*8)
    19  #define R15_OFF	(5*8)
    20  #define SP_OFF	(6*8)
    21  #define PC_OFF	(7*8)
    22  
    23  .globl __go_getcontext
    24  .text
    25  __go_getcontext:
    26  	movq	%rbx, RBX_OFF(%rdi)
    27  	movq	%rbp, RBP_OFF(%rdi)
    28  	movq	%r12, R12_OFF(%rdi)
    29  	movq	%r13, R13_OFF(%rdi)
    30  	movq	%r14, R14_OFF(%rdi)
    31  	movq	%r15, R15_OFF(%rdi)
    32  
    33  	movq	(%rsp), %rax	// return PC
    34  	movq	%rax, PC_OFF(%rdi)
    35  	leaq	8(%rsp), %rax	// the SP before pushing return PC
    36  	movq	%rax, SP_OFF(%rdi)
    37  
    38  	ret
    39  
    40  .globl __go_setcontext
    41  .text
    42  __go_setcontext:
    43  	movq	RBX_OFF(%rdi), %rbx
    44  	movq	RBP_OFF(%rdi), %rbp
    45  	movq	R12_OFF(%rdi), %r12
    46  	movq	R13_OFF(%rdi), %r13
    47  	movq	R14_OFF(%rdi), %r14
    48  	movq	R15_OFF(%rdi), %r15
    49  	movq	SP_OFF(%rdi), %rsp
    50  	movq	PC_OFF(%rdi), %rdx
    51  
    52  	jmp	*%rdx
    53  
    54  .globl __go_makecontext
    55  .text
    56  __go_makecontext:
    57  	addq	%rcx, %rdx
    58  
    59  	// Align the SP, and push a dummy return address.
    60  	andq	$~0xf, %rdx
    61  	subq	$8, %rdx
    62  	movq	$0, (%rdx)
    63  
    64  	movq	%rdx, SP_OFF(%rdi)
    65  	movq	%rsi, PC_OFF(%rdi)
    66  
    67  	ret
    68  
    69  	.section	.note.GNU-split-stack,"",@progbits
    70  	.section	.note.GNU-no-split-stack,"",@progbits
    71  
    72  #endif
    73  
    74  	.section	.note.GNU-stack,"",@progbits