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