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