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