18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 28c2ecf20Sopenharmony_ci# 38c2ecf20Sopenharmony_ci# arch/x86_64/setjmp.S 48c2ecf20Sopenharmony_ci# 58c2ecf20Sopenharmony_ci# setjmp/longjmp for the x86-64 architecture 68c2ecf20Sopenharmony_ci# 78c2ecf20Sopenharmony_ci 88c2ecf20Sopenharmony_ci# 98c2ecf20Sopenharmony_ci# The jmp_buf is assumed to contain the following, in order: 108c2ecf20Sopenharmony_ci# %rbx 118c2ecf20Sopenharmony_ci# %rsp (post-return) 128c2ecf20Sopenharmony_ci# %rbp 138c2ecf20Sopenharmony_ci# %r12 148c2ecf20Sopenharmony_ci# %r13 158c2ecf20Sopenharmony_ci# %r14 168c2ecf20Sopenharmony_ci# %r15 178c2ecf20Sopenharmony_ci# <return address> 188c2ecf20Sopenharmony_ci# 198c2ecf20Sopenharmony_ci 208c2ecf20Sopenharmony_ci .text 218c2ecf20Sopenharmony_ci .align 4 228c2ecf20Sopenharmony_ci .globl kernel_setjmp 238c2ecf20Sopenharmony_ci .type kernel_setjmp, @function 248c2ecf20Sopenharmony_cikernel_setjmp: 258c2ecf20Sopenharmony_ci pop %rsi # Return address, and adjust the stack 268c2ecf20Sopenharmony_ci xorl %eax,%eax # Return value 278c2ecf20Sopenharmony_ci movq %rbx,(%rdi) 288c2ecf20Sopenharmony_ci movq %rsp,8(%rdi) # Post-return %rsp! 298c2ecf20Sopenharmony_ci push %rsi # Make the call/return stack happy 308c2ecf20Sopenharmony_ci movq %rbp,16(%rdi) 318c2ecf20Sopenharmony_ci movq %r12,24(%rdi) 328c2ecf20Sopenharmony_ci movq %r13,32(%rdi) 338c2ecf20Sopenharmony_ci movq %r14,40(%rdi) 348c2ecf20Sopenharmony_ci movq %r15,48(%rdi) 358c2ecf20Sopenharmony_ci movq %rsi,56(%rdi) # Return address 368c2ecf20Sopenharmony_ci RET 378c2ecf20Sopenharmony_ci 388c2ecf20Sopenharmony_ci .size kernel_setjmp,.-kernel_setjmp 398c2ecf20Sopenharmony_ci 408c2ecf20Sopenharmony_ci .text 418c2ecf20Sopenharmony_ci .align 4 428c2ecf20Sopenharmony_ci .globl kernel_longjmp 438c2ecf20Sopenharmony_ci .type kernel_longjmp, @function 448c2ecf20Sopenharmony_cikernel_longjmp: 458c2ecf20Sopenharmony_ci movl %esi,%eax # Return value (int) 468c2ecf20Sopenharmony_ci movq (%rdi),%rbx 478c2ecf20Sopenharmony_ci movq 8(%rdi),%rsp 488c2ecf20Sopenharmony_ci movq 16(%rdi),%rbp 498c2ecf20Sopenharmony_ci movq 24(%rdi),%r12 508c2ecf20Sopenharmony_ci movq 32(%rdi),%r13 518c2ecf20Sopenharmony_ci movq 40(%rdi),%r14 528c2ecf20Sopenharmony_ci movq 48(%rdi),%r15 538c2ecf20Sopenharmony_ci jmp *56(%rdi) 548c2ecf20Sopenharmony_ci 558c2ecf20Sopenharmony_ci .size kernel_longjmp,.-kernel_longjmp 56