1*4882a593Smuzhiyun/* SPDX-License-Identifier: GPL-2.0-or-later */ 2*4882a593Smuzhiyun/* 3*4882a593Smuzhiyun * This file contains miscellaneous low-level functions. 4*4882a593Smuzhiyun * Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org) 5*4882a593Smuzhiyun * 6*4882a593Smuzhiyun * Largely rewritten by Cort Dougan (cort@cs.nmt.edu) 7*4882a593Smuzhiyun * and Paul Mackerras. 8*4882a593Smuzhiyun * 9*4882a593Smuzhiyun * PPC64 updates by Dave Engebretsen (engebret@us.ibm.com) 10*4882a593Smuzhiyun * 11*4882a593Smuzhiyun * setjmp/longjmp code by Paul Mackerras. 12*4882a593Smuzhiyun */ 13*4882a593Smuzhiyun#include <asm/ppc_asm.h> 14*4882a593Smuzhiyun#include <asm/unistd.h> 15*4882a593Smuzhiyun#include <asm/asm-compat.h> 16*4882a593Smuzhiyun#include <asm/asm-offsets.h> 17*4882a593Smuzhiyun#include <asm/export.h> 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun .text 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun/* 22*4882a593Smuzhiyun * Returns (address we are running at) - (address we were linked at) 23*4882a593Smuzhiyun * for use before the text and data are mapped to KERNELBASE. 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun * add_reloc_offset(x) returns x + reloc_offset(). 26*4882a593Smuzhiyun */ 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun_GLOBAL(reloc_offset) 29*4882a593Smuzhiyun li r3, 0 30*4882a593Smuzhiyun_GLOBAL(add_reloc_offset) 31*4882a593Smuzhiyun mflr r0 32*4882a593Smuzhiyun bl 1f 33*4882a593Smuzhiyun1: mflr r5 34*4882a593Smuzhiyun PPC_LL r4,(2f-1b)(r5) 35*4882a593Smuzhiyun subf r5,r4,r5 36*4882a593Smuzhiyun add r3,r3,r5 37*4882a593Smuzhiyun mtlr r0 38*4882a593Smuzhiyun blr 39*4882a593Smuzhiyun_ASM_NOKPROBE_SYMBOL(reloc_offset) 40*4882a593Smuzhiyun_ASM_NOKPROBE_SYMBOL(add_reloc_offset) 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun .align 3 43*4882a593Smuzhiyun2: PPC_LONG 1b 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun_GLOBAL(setjmp) 46*4882a593Smuzhiyun mflr r0 47*4882a593Smuzhiyun PPC_STL r0,0(r3) 48*4882a593Smuzhiyun PPC_STL r1,SZL(r3) 49*4882a593Smuzhiyun PPC_STL r2,2*SZL(r3) 50*4882a593Smuzhiyun#ifdef CONFIG_PPC32 51*4882a593Smuzhiyun mfcr r12 52*4882a593Smuzhiyun stmw r12, 3*SZL(r3) 53*4882a593Smuzhiyun#else 54*4882a593Smuzhiyun mfcr r0 55*4882a593Smuzhiyun PPC_STL r0,3*SZL(r3) 56*4882a593Smuzhiyun PPC_STL r13,4*SZL(r3) 57*4882a593Smuzhiyun PPC_STL r14,5*SZL(r3) 58*4882a593Smuzhiyun PPC_STL r15,6*SZL(r3) 59*4882a593Smuzhiyun PPC_STL r16,7*SZL(r3) 60*4882a593Smuzhiyun PPC_STL r17,8*SZL(r3) 61*4882a593Smuzhiyun PPC_STL r18,9*SZL(r3) 62*4882a593Smuzhiyun PPC_STL r19,10*SZL(r3) 63*4882a593Smuzhiyun PPC_STL r20,11*SZL(r3) 64*4882a593Smuzhiyun PPC_STL r21,12*SZL(r3) 65*4882a593Smuzhiyun PPC_STL r22,13*SZL(r3) 66*4882a593Smuzhiyun PPC_STL r23,14*SZL(r3) 67*4882a593Smuzhiyun PPC_STL r24,15*SZL(r3) 68*4882a593Smuzhiyun PPC_STL r25,16*SZL(r3) 69*4882a593Smuzhiyun PPC_STL r26,17*SZL(r3) 70*4882a593Smuzhiyun PPC_STL r27,18*SZL(r3) 71*4882a593Smuzhiyun PPC_STL r28,19*SZL(r3) 72*4882a593Smuzhiyun PPC_STL r29,20*SZL(r3) 73*4882a593Smuzhiyun PPC_STL r30,21*SZL(r3) 74*4882a593Smuzhiyun PPC_STL r31,22*SZL(r3) 75*4882a593Smuzhiyun#endif 76*4882a593Smuzhiyun li r3,0 77*4882a593Smuzhiyun blr 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun_GLOBAL(longjmp) 80*4882a593Smuzhiyun#ifdef CONFIG_PPC32 81*4882a593Smuzhiyun lmw r12, 3*SZL(r3) 82*4882a593Smuzhiyun mtcrf 0x38, r12 83*4882a593Smuzhiyun#else 84*4882a593Smuzhiyun PPC_LL r13,4*SZL(r3) 85*4882a593Smuzhiyun PPC_LL r14,5*SZL(r3) 86*4882a593Smuzhiyun PPC_LL r15,6*SZL(r3) 87*4882a593Smuzhiyun PPC_LL r16,7*SZL(r3) 88*4882a593Smuzhiyun PPC_LL r17,8*SZL(r3) 89*4882a593Smuzhiyun PPC_LL r18,9*SZL(r3) 90*4882a593Smuzhiyun PPC_LL r19,10*SZL(r3) 91*4882a593Smuzhiyun PPC_LL r20,11*SZL(r3) 92*4882a593Smuzhiyun PPC_LL r21,12*SZL(r3) 93*4882a593Smuzhiyun PPC_LL r22,13*SZL(r3) 94*4882a593Smuzhiyun PPC_LL r23,14*SZL(r3) 95*4882a593Smuzhiyun PPC_LL r24,15*SZL(r3) 96*4882a593Smuzhiyun PPC_LL r25,16*SZL(r3) 97*4882a593Smuzhiyun PPC_LL r26,17*SZL(r3) 98*4882a593Smuzhiyun PPC_LL r27,18*SZL(r3) 99*4882a593Smuzhiyun PPC_LL r28,19*SZL(r3) 100*4882a593Smuzhiyun PPC_LL r29,20*SZL(r3) 101*4882a593Smuzhiyun PPC_LL r30,21*SZL(r3) 102*4882a593Smuzhiyun PPC_LL r31,22*SZL(r3) 103*4882a593Smuzhiyun PPC_LL r0,3*SZL(r3) 104*4882a593Smuzhiyun mtcrf 0x38,r0 105*4882a593Smuzhiyun#endif 106*4882a593Smuzhiyun PPC_LL r0,0(r3) 107*4882a593Smuzhiyun PPC_LL r1,SZL(r3) 108*4882a593Smuzhiyun PPC_LL r2,2*SZL(r3) 109*4882a593Smuzhiyun mtlr r0 110*4882a593Smuzhiyun mr. r3, r4 111*4882a593Smuzhiyun bnelr 112*4882a593Smuzhiyun li r3, 1 113*4882a593Smuzhiyun blr 114*4882a593Smuzhiyun 115*4882a593Smuzhiyun_GLOBAL(current_stack_frame) 116*4882a593Smuzhiyun PPC_LL r3,0(r1) 117*4882a593Smuzhiyun blr 118*4882a593SmuzhiyunEXPORT_SYMBOL(current_stack_frame) 119