root/arch/x86/um/setjmp_64.S

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

/* [<][>][^][v][top][bottom][index][help] */