Home | History | Annotate | Download | only in x86_64
      1 #
      2 # arch/x86_64/setjmp.S
      3 #
      4 # setjmp/longjmp for the x86-64 architecture
      5 #
      6 
      7 #
      8 # The jmp_buf is assumed to contain the following, in order:
      9 #	%rbx
     10 #	%rsp (post-return)
     11 #	%rbp
     12 #	%r12
     13 #	%r13
     14 #	%r14
     15 #	%r15
     16 #	<return address>
     17 #
     18 
     19 	.text
     20 	.align 4
     21 	.globl setjmp
     22 	.type setjmp, @function
     23 setjmp:
     24 	pop  %rsi			# Return address, and adjust the stack
     25 	xorl %eax,%eax			# Return value
     26 	movq %rbx,(%rdi)
     27 	movq %rsp,8(%rdi)		# Post-return %rsp!
     28 	push %rsi			# Make the call/return stack happy
     29 	movq %rbp,16(%rdi)
     30 	movq %r12,24(%rdi)
     31 	movq %r13,32(%rdi)
     32 	movq %r14,40(%rdi)
     33 	movq %r15,48(%rdi)
     34 	movq %rsi,56(%rdi)		# Return address
     35 	ret
     36 
     37 	.size setjmp,.-setjmp
     38 
     39 	.text
     40 	.align 4
     41 	.globl longjmp
     42 	.type longjmp, @function
     43 longjmp:
     44 	movl %esi,%eax			# Return value (int)
     45 	movq (%rdi),%rbx
     46 	movq 8(%rdi),%rsp
     47 	movq 16(%rdi),%rbp
     48 	movq 24(%rdi),%r12
     49 	movq 32(%rdi),%r13
     50 	movq 40(%rdi),%r14
     51 	movq 48(%rdi),%r15
     52 	jmp *56(%rdi)
     53 
     54 	.size longjmp,.-longjmp
     55