1*4882a593Smuzhiyun/* 2*4882a593Smuzhiyun * (C) 2017 Theobroma Systems Design und Consulting GmbH 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0+ 5*4882a593Smuzhiyun */ 6*4882a593Smuzhiyun 7*4882a593Smuzhiyun#include <config.h> 8*4882a593Smuzhiyun#include <asm/assembler.h> 9*4882a593Smuzhiyun#include <linux/linkage.h> 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun.pushsection .text.setjmp, "ax" 12*4882a593SmuzhiyunENTRY(setjmp) 13*4882a593Smuzhiyun /* 14*4882a593Smuzhiyun * A subroutine must preserve the contents of the registers 15*4882a593Smuzhiyun * r4-r8, r10, r11 (v1-v5, v7 and v8) and SP (and r9 in PCS 16*4882a593Smuzhiyun * variants that designate r9 as v6). 17*4882a593Smuzhiyun */ 18*4882a593Smuzhiyun mov ip, sp 19*4882a593Smuzhiyun stm a1, {v1-v8, ip, lr} 20*4882a593Smuzhiyun mov a1, #0 21*4882a593Smuzhiyun bx lr 22*4882a593SmuzhiyunENDPROC(setjmp) 23*4882a593Smuzhiyun.popsection 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun.pushsection .text.longjmp, "ax" 26*4882a593SmuzhiyunENTRY(longjmp) 27*4882a593Smuzhiyun ldm a1, {v1-v8, ip, lr} 28*4882a593Smuzhiyun mov sp, ip 29*4882a593Smuzhiyun mov a1, a2 30*4882a593Smuzhiyun /* If we were passed a return value of zero, return one instead */ 31*4882a593Smuzhiyun cmp a1, #0 32*4882a593Smuzhiyun bne 1f 33*4882a593Smuzhiyun mov a1, #1 34*4882a593Smuzhiyun1: 35*4882a593Smuzhiyun bx lr 36*4882a593SmuzhiyunENDPROC(longjmp) 37*4882a593Smuzhiyun.popsection 38