setjmp.S 876 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. /*
  3. * Copyright (C) 2018 Intel Corporation
  4. *
  5. * See arch/x86/include/asm/setjmp.h for jmp_buf format
  6. */
  7. #include <linux/linkage.h>
  8. .text
  9. .align 8
  10. ENTRY(setjmp)
  11. pop %rcx
  12. movq %rcx, (%rdi) /* Return address */
  13. movq %rsp, 8(%rdi)
  14. movq %rbp, 16(%rdi)
  15. movq %rbx, 24(%rdi)
  16. movq %r12, 32(%rdi)
  17. movq %r13, 40(%rdi)
  18. movq %r14, 48(%rdi)
  19. movq %r15, 56(%rdi)
  20. xorq %rax, %rax /* Direct invocation returns 0 */
  21. jmpq *%rcx
  22. ENDPROC(setjmp)
  23. .align 8
  24. ENTRY(longjmp)
  25. movq (%rdi), %rcx /* Return address */
  26. movq 8(%rdi), %rsp
  27. movq 16(%rdi), %rbp
  28. movq 24(%rdi), %rbx
  29. movq 32(%rdi), %r12
  30. movq 40(%rdi), %r13
  31. movq 48(%rdi), %r14
  32. movq 56(%rdi), %r15
  33. movq %rsi, %rax /* Value to be returned by setjmp() */
  34. testq %rax, %rax /* cannot be 0 in this case */
  35. jnz 1f
  36. incq %rax /* Return 1 instead */
  37. 1:
  38. jmpq *%rcx
  39. ENDPROC(longjmp)