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