linux/arch/x86/um/setjmp_64.S
<<
>>
Prefs
   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
  24kernel_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
  44kernel_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
  56