1998-12-16 15:24:51 -07:00
|
|
|
/* Special support for trampolines
|
1996-12-12 20:55:56 +00:00
|
|
|
*
|
2023-01-16 11:50:43 +01:00
|
|
|
* Copyright (C) 1996-2023 Free Software Foundation, Inc.
|
1996-12-12 20:55:56 +00:00
|
|
|
* Written By Michael Meissner
|
|
|
|
*
|
|
|
|
* This file is free software; you can redistribute it and/or modify it
|
|
|
|
* under the terms of the GNU General Public License as published by the
|
2009-04-09 17:00:19 +02:00
|
|
|
* Free Software Foundation; either version 3, or (at your option) any
|
1996-12-12 20:55:56 +00:00
|
|
|
* later version.
|
|
|
|
*
|
|
|
|
* This file is distributed in the hope that it will be useful, but
|
|
|
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
* General Public License for more details.
|
|
|
|
*
|
2009-04-09 17:00:19 +02:00
|
|
|
* Under Section 7 of GPL version 3, you are granted additional
|
|
|
|
* permissions described in the GCC Runtime Library Exception, version
|
|
|
|
* 3.1, as published by the Free Software Foundation.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License and
|
|
|
|
* a copy of the GCC Runtime Library Exception along with this program;
|
|
|
|
* see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
|
|
|
|
* <http://www.gnu.org/licenses/>.
|
1996-12-12 20:55:56 +00:00
|
|
|
*/
|
|
|
|
|
2001-11-15 05:21:09 +00:00
|
|
|
/* Set up trampolines. */
|
1996-12-12 20:55:56 +00:00
|
|
|
|
|
|
|
.section ".text"
|
2007-09-05 01:28:26 +02:00
|
|
|
#include "ppc-asm.h"
|
|
|
|
#include "config.h"
|
1996-12-12 20:55:56 +00:00
|
|
|
|
linux.h (NO_PROFILE_COUNTERS): Define to 1.
* config/i386/linux.h (NO_PROFILE_COUNTERS): Define to 1.
* config/i386/freebsd.h (NO_PROFILE_COUNTERS): Likewise.
* config/i386/netbsd-elf.h (NO_PROFILE_COUNTERS): Likewise.
* config/xtensa/xtensa.h (NO_PROFILE_COUTNERS): Likewise.
* config/darwin.h (NO_PROFILE_COUNTERS): Likewise.
* final.c (NO_PROFILE_COUNTERS): Define to 0 if not defined.
(profile_function): Allow NO_PROFILE_COUNTERS to be non-constant.
* config/rs6000/rs6000.c (output_profile_hook): Likewise.
* configure.in (powerpc*-*, s390*-*): Set tls_as_opt.
Pass it to $gcc_cv_as.
* configure: Rebuilt.
* config/rs6000/rs6000.c (rs6000_abi_name): Remove initializer.
(print_operand): Allow TARGET_AIX to be non-constant.
(rs6000_aix_emit_builtin_unwind_init, rs6000_emit_eh_toc_restore):
Define unconditionally.
(rs6000_elf_declare_function_name): New function.
* config/rs6000/rs6000.md (eh_return): Allow TARGET_AIX to be
non-constant.
* config/rs6000/linux64.h [!RS6000_BI_ARCH] (TARGET_64BIT): Define
to 1.
(DEFAULT_ARCH64_P, RS6000_BI_ARCH_P): Define.
[IN_LIBGCC2] (TARGET_64BIT): Define based on whether __powerpc64__
is defined.
(TARGET_AIX): Define to 1 if TARGET_64BIT.
(PROCESSOR_DEFAULT): Remove.
(TARGET_RELOCATABLE, RS6000_ABI_NAME, INVALID_64BIT,
INVALID_32BIT, SUBSUBTARGET_OVERRIDE_OPTIONS): Define.
[RS6000_BI_ARCH] (OVERRIDE_OPTIONS, ASM_FILE_START): Define.
(ASM_DEFAULT_SPEC, ASM_SPEC, LINK_OS_LINUX_SPEC): Define for both
-m32 and -m64.
(MULTILIB_DEFAULTS): Define.
(SUBSUBTARGET_EXTRA_SPECS): Define.
(ASM_SPEC32, ASM_SPEC64, ASM_SPEC_COMMON): Define.
(TARGET_TOC): Define only if !RS6000_BI_ARCH.
(TARGET_NO_TOC): Remove.
[!RS6000_BI_ARCH] (TARGET_RELOCATABLE, TARGET_EABI,
TARGET_PROTOTYPE): Define to 0.
(NO_PROFILE_COUNTERS): Define to TARGET_64BIT.
(PROFILE_HOOK): Only call output_profile_hook if TARGET_64BIT.
(ADJUST_FIELD_ALIGN, ROUND_TYPE_ALIGN): Adjust to work properly
if !TARGET_64BIT.
(USER_LABEL_PREFIX): Remove.
(JUMP_TABLES_IN_TEXT_SECTION): Define to TARGET_64BIT.
(SETUP_FRAME_ADDRESSES): Only call rs6000_aix_emit_builtin_unwind_init
if TARGET_64BIT.
(TARGET_OS_CPP_BUILTINS): Handle both -m32 and -m64.
(LINK_OS_LINUX_SPEC32, LINK_OS_LINUX_SPEC64): Define.
(STARTFILE_LINUX_SPEC, ENDFILE_LINUX_SPEC): Remove.
(TOC_SECTION_ASM_OP): Define depending on TARGET_64BIT.
(MINIMAL_TOC_SECTION_ASM_OP): Likewise.
(SIZE_TYPE, PTRDIFF_TYPE, WCHAR_TYPE): Define depending on
TARGET_64BIT.
(RS6000_CALL_GLUE): Likewise.
(SAVE_FP_PREFIX, SAVE_FP_SUFFIX, RESTORE_FP_PREFIX,
RESTORE_FP_SUFFIX): Likewise.
(ASM_DECLARE_FUNCTION_NAME): Remove.
(ASM_DECLARE_FUNCTION_SIZE, ASM_OUTPUT_SOURCE_LINE,
DBX_OUTPUT_BRAC, DBX_OUTPUT_NFUN): Only output dot before function
name if TARGET_64BIT.
(ASM_OUTPUT_SPECIAL_POOL_ENTRY_P): Handle both TARGET_64BIT and
!TARGET_64BIT.
(ASM_OUTPUT_REG_PUSH, ASM_OUTPUT_REG_POP): Remove undefs.
(ASM_PREFERRED_EH_DATA_FORMAT): Take TARGET_64BIT into account.
(DRAFT_V4_STRUCT_RET): Define.
(SIGNAL_FRAMESIZE): New enum value.
(MD_FALLBACK_FRAME_STATE_FOR): Define.
* config/rs6000/default64.h: New file.
* config/rs6000/sysv4.h (SUBTARGET_SWITCHES): Add -m32 and -m64
options.
(SUBTARGET_OVERRIDE_OPTIONS): If rs6000_abi_name is NULL, set it
to RS6000_ABI_NAME. Only disallow mixing of -fPIC with -mcall-aixdesc
if !TARGET_64BIT.
[!RS6000_BI_ARCH] (SUBSUBTARGET_OVERRIDE_OPTIONS): Define.
(ASM_DECLARE_FUNCTION_NAME): Use rs6000_elf_declare_function_name
function.
(TARGET_OS_SYSV_CPP_BUILTINS): Define.
(TARGET_OS_CPP_BUILTINS): Use it.
(CPP_SYSV_SPEC): Remove.
(CPP_SPEC): Remove cpp_sysv.
(SUBTARGET_EXTRA_SPECS): Remove cpp_sysv.
Add SUBSUBTARGET_EXTRA_SPECS.
(SUBSUBTARGET_EXTRA_SPECS): Define.
* config/rs6000/biarch64.h: New file.
* config/rs6000/rs6000-protos.h (rs6000_elf_declare_function_name):
New prototype.
* config/rs6000/x-linux64: New file.
* config/rs6000/t-linux64: Build -m64, -m32 and -m32 -msoft-float
multilibs.
* config/rs6000/eabi-ci.asm: Protect with #ifndef __powerpc64__.
* config/rs6000/eabi-cn.asm: Likewise.
* config/rs6000/tramp.asm: Likewise.
* config/rs6000/sol-ci.asm: Likewise.
* config/rs6000/sol-cn.asm: Likewise.
* config/rs6000/linux.h (TARGET_64BIT): Define to 0.
(TARGET_OS_CPP_BUILTINS): Use TARGET_OS_SYSV_CPP_BUILTINS.
* config/rs6000/ppc-asm.h: Move __powerpc64__ section before
_CALL_AIXDESC section.
* config.gcc (powerpc64-*-linux*): Configure a bi-arch compiler,
defaulting to -m64 unless --with-cpu= is one of the 32-bit CPUs
or default32.
Co-Authored-By: Alan Modra <amodra@bigpond.net.au>
From-SVN: r67442
2003-06-04 17:23:42 +02:00
|
|
|
#ifndef __powerpc64__
|
2000-03-16 03:16:41 +00:00
|
|
|
.type trampoline_initial,@object
|
1996-12-12 20:55:56 +00:00
|
|
|
.align 2
|
2000-03-16 03:16:41 +00:00
|
|
|
trampoline_initial:
|
1996-12-12 20:55:56 +00:00
|
|
|
mflr r0
|
configure.ac: Add --enable-secureplt.
* configure.ac: Add --enable-secureplt.
(HAVE_AS_REL16): Test for R_PPC_REL16 relocs.
* config.in: Regenerate.
* configure: Regenerate.
* config.gcc (powerpc64-*-linux*, powerpc-*-linux*): Add
rs6000/secureplt.h to tm_file when enable_secureplt.
* doc/invoke.texi (msecure-plt, mbss-plt): Document.
* doc/install.texi: Document --enable-targets and --enable-secureplt.
Correct xrefs to "Using the GNU Compiler Collection (GCC)".
* config/rs6000/secureplt.h: New file.
* config/rs6000/sysv4.h (TARGET_SECURE_PLT): Define.
(SUBTARGET_OVERRIDE_OPTIONS): Error if -msecure-plt given without
assembler support.
(CC1_SECURE_PLT_DEFAULT_SPEC): Define.
(CC1_SPEC): Delete duplicate mno-sdata. Invoke cc1_secure_plt_default.
(SUBTARGET_EXTRA_SPECS): Add cc1_secure_plt_default.
* config/rs6000/sysv4.opt (msecure-plt, bss-plt): Add options.
* config/rs6000/rs6000.h (TARGET_SECURE_PLT): Define.
* config/rs6000/rs6000.c (rs6000_emit_load_toc_table): Handle
TARGET_SECURE_PLT got register load sequence.
(rs6000_emit_prologue): Call rs6000_emit_load_toc_table when
TARGET_SECURE_PLT.
(rs6000_elf_declare_function_name): Don't emit toc address offset
word when TARGET_SECURE_PLT.
* config/rs6000/rs6000.md (elf_high, elf_low): Move past load_toc_*.
(load_toc_v4_PIC_1) Enable for TARGET_SECURE_PLT.
(load_toc_v4_PIC_3b, load_toc_v4_PIC_3c): New insns.
(call, call_value): Mark pic_offset_table_rtx used for sysv pic and
TARGET_SECURE_PLT.
(call_nonlocal_sysv, call_value_nonlocal_sysv, sibcall_nonlocal_sysv,
sibcall_value_nonlocal_sysv): Add 32768 offset when TARGET_SECURE_PLT
and -fPIC.
* config/rs6000/tramp.asm (trampoline_initial): Use "bcl 20,31".
(__trampoline_setup): Likewise. Init r30 before plt call.
From-SVN: r100415
2005-06-01 00:30:26 +00:00
|
|
|
bcl 20,31,1f
|
2000-03-16 03:16:41 +00:00
|
|
|
.Lfunc = .-trampoline_initial
|
1996-12-12 20:55:56 +00:00
|
|
|
.long 0 /* will be replaced with function address */
|
2000-03-16 03:16:41 +00:00
|
|
|
.Lchain = .-trampoline_initial
|
1996-12-12 20:55:56 +00:00
|
|
|
.long 0 /* will be replaced with static chain */
|
|
|
|
1: mflr r11
|
|
|
|
mtlr r0
|
|
|
|
lwz r0,0(r11) /* function address */
|
|
|
|
lwz r11,4(r11) /* static chain */
|
|
|
|
mtctr r0
|
|
|
|
bctr
|
|
|
|
|
2000-03-16 03:16:41 +00:00
|
|
|
trampoline_size = .-trampoline_initial
|
|
|
|
.size trampoline_initial,trampoline_size
|
1996-12-12 20:55:56 +00:00
|
|
|
|
|
|
|
|
|
|
|
/* R3 = stack address to store trampoline */
|
|
|
|
/* R4 = length of trampoline area */
|
|
|
|
/* R5 = function address */
|
|
|
|
/* R6 = static chain */
|
|
|
|
|
|
|
|
FUNC_START(__trampoline_setup)
|
2018-11-27 12:29:56 +10:30
|
|
|
.cfi_startproc
|
2000-03-16 03:16:41 +00:00
|
|
|
mflr r0 /* save return address */
|
configure.ac: Add --enable-secureplt.
* configure.ac: Add --enable-secureplt.
(HAVE_AS_REL16): Test for R_PPC_REL16 relocs.
* config.in: Regenerate.
* configure: Regenerate.
* config.gcc (powerpc64-*-linux*, powerpc-*-linux*): Add
rs6000/secureplt.h to tm_file when enable_secureplt.
* doc/invoke.texi (msecure-plt, mbss-plt): Document.
* doc/install.texi: Document --enable-targets and --enable-secureplt.
Correct xrefs to "Using the GNU Compiler Collection (GCC)".
* config/rs6000/secureplt.h: New file.
* config/rs6000/sysv4.h (TARGET_SECURE_PLT): Define.
(SUBTARGET_OVERRIDE_OPTIONS): Error if -msecure-plt given without
assembler support.
(CC1_SECURE_PLT_DEFAULT_SPEC): Define.
(CC1_SPEC): Delete duplicate mno-sdata. Invoke cc1_secure_plt_default.
(SUBTARGET_EXTRA_SPECS): Add cc1_secure_plt_default.
* config/rs6000/sysv4.opt (msecure-plt, bss-plt): Add options.
* config/rs6000/rs6000.h (TARGET_SECURE_PLT): Define.
* config/rs6000/rs6000.c (rs6000_emit_load_toc_table): Handle
TARGET_SECURE_PLT got register load sequence.
(rs6000_emit_prologue): Call rs6000_emit_load_toc_table when
TARGET_SECURE_PLT.
(rs6000_elf_declare_function_name): Don't emit toc address offset
word when TARGET_SECURE_PLT.
* config/rs6000/rs6000.md (elf_high, elf_low): Move past load_toc_*.
(load_toc_v4_PIC_1) Enable for TARGET_SECURE_PLT.
(load_toc_v4_PIC_3b, load_toc_v4_PIC_3c): New insns.
(call, call_value): Mark pic_offset_table_rtx used for sysv pic and
TARGET_SECURE_PLT.
(call_nonlocal_sysv, call_value_nonlocal_sysv, sibcall_nonlocal_sysv,
sibcall_value_nonlocal_sysv): Add 32768 offset when TARGET_SECURE_PLT
and -fPIC.
* config/rs6000/tramp.asm (trampoline_initial): Use "bcl 20,31".
(__trampoline_setup): Likewise. Init r30 before plt call.
From-SVN: r100415
2005-06-01 00:30:26 +00:00
|
|
|
bcl 20,31,.LCF0 /* load up __trampoline_initial into r7 */
|
2018-11-27 12:29:56 +10:30
|
|
|
.cfi_register lr,r0
|
1996-12-12 20:55:56 +00:00
|
|
|
.LCF0:
|
|
|
|
mflr r11
|
2000-03-16 03:16:41 +00:00
|
|
|
addi r7,r11,trampoline_initial-4-.LCF0 /* trampoline address -4 */
|
1996-12-12 20:55:56 +00:00
|
|
|
|
2021-04-23 18:16:03 -04:00
|
|
|
cmpwi cr1,r4,trampoline_size /* verify that the trampoline is big enough */
|
2000-03-16 03:16:41 +00:00
|
|
|
srwi r4,r4,2 /* # words to move */
|
|
|
|
addi r9,r3,-4 /* adjust pointer for lwzu */
|
1996-12-12 20:55:56 +00:00
|
|
|
mtctr r4
|
|
|
|
blt cr1,.Labort
|
|
|
|
|
|
|
|
mtlr r0
|
|
|
|
|
|
|
|
/* Copy the instructions to the stack */
|
|
|
|
.Lmove:
|
|
|
|
lwzu r10,4(r7)
|
|
|
|
stwu r10,4(r9)
|
|
|
|
bdnz .Lmove
|
|
|
|
|
|
|
|
/* Store correct function and static chain */
|
|
|
|
stw r5,.Lfunc(r3)
|
|
|
|
stw r6,.Lchain(r3)
|
|
|
|
|
|
|
|
/* Now flush both caches */
|
|
|
|
mtctr r4
|
|
|
|
.Lcache:
|
|
|
|
icbi 0,r3
|
|
|
|
dcbf 0,r3
|
|
|
|
addi r3,r3,4
|
|
|
|
bdnz .Lcache
|
|
|
|
|
|
|
|
/* Finally synchronize things & return */
|
|
|
|
sync
|
|
|
|
isync
|
|
|
|
blr
|
|
|
|
|
|
|
|
.Labort:
|
2012-05-25 08:20:03 +00:00
|
|
|
/* Use a longcall sequence in the non PIC case on VxWorks, to prevent
|
|
|
|
possible relocation errors if this is module-loaded very far away from
|
|
|
|
the 'abort' entry point. */
|
|
|
|
#if defined (__VXWORKS__) && ! (defined __PIC__ || defined __pic__)
|
|
|
|
lis r11,JUMP_TARGET(abort)@ha
|
|
|
|
addic r11,r11,JUMP_TARGET(abort)@l
|
|
|
|
mtlr r11
|
|
|
|
blrl
|
|
|
|
#else
|
|
|
|
|
2007-09-05 01:28:26 +02:00
|
|
|
#if (defined __PIC__ || defined __pic__) && defined HAVE_AS_REL16
|
configure.ac: Add --enable-secureplt.
* configure.ac: Add --enable-secureplt.
(HAVE_AS_REL16): Test for R_PPC_REL16 relocs.
* config.in: Regenerate.
* configure: Regenerate.
* config.gcc (powerpc64-*-linux*, powerpc-*-linux*): Add
rs6000/secureplt.h to tm_file when enable_secureplt.
* doc/invoke.texi (msecure-plt, mbss-plt): Document.
* doc/install.texi: Document --enable-targets and --enable-secureplt.
Correct xrefs to "Using the GNU Compiler Collection (GCC)".
* config/rs6000/secureplt.h: New file.
* config/rs6000/sysv4.h (TARGET_SECURE_PLT): Define.
(SUBTARGET_OVERRIDE_OPTIONS): Error if -msecure-plt given without
assembler support.
(CC1_SECURE_PLT_DEFAULT_SPEC): Define.
(CC1_SPEC): Delete duplicate mno-sdata. Invoke cc1_secure_plt_default.
(SUBTARGET_EXTRA_SPECS): Add cc1_secure_plt_default.
* config/rs6000/sysv4.opt (msecure-plt, bss-plt): Add options.
* config/rs6000/rs6000.h (TARGET_SECURE_PLT): Define.
* config/rs6000/rs6000.c (rs6000_emit_load_toc_table): Handle
TARGET_SECURE_PLT got register load sequence.
(rs6000_emit_prologue): Call rs6000_emit_load_toc_table when
TARGET_SECURE_PLT.
(rs6000_elf_declare_function_name): Don't emit toc address offset
word when TARGET_SECURE_PLT.
* config/rs6000/rs6000.md (elf_high, elf_low): Move past load_toc_*.
(load_toc_v4_PIC_1) Enable for TARGET_SECURE_PLT.
(load_toc_v4_PIC_3b, load_toc_v4_PIC_3c): New insns.
(call, call_value): Mark pic_offset_table_rtx used for sysv pic and
TARGET_SECURE_PLT.
(call_nonlocal_sysv, call_value_nonlocal_sysv, sibcall_nonlocal_sysv,
sibcall_value_nonlocal_sysv): Add 32768 offset when TARGET_SECURE_PLT
and -fPIC.
* config/rs6000/tramp.asm (trampoline_initial): Use "bcl 20,31".
(__trampoline_setup): Likewise. Init r30 before plt call.
From-SVN: r100415
2005-06-01 00:30:26 +00:00
|
|
|
bcl 20,31,1f
|
|
|
|
1: mflr r30
|
|
|
|
addis r30,r30,_GLOBAL_OFFSET_TABLE_-1b@ha
|
|
|
|
addi r30,r30,_GLOBAL_OFFSET_TABLE_-1b@l
|
|
|
|
#endif
|
2001-12-01 08:34:13 +00:00
|
|
|
bl JUMP_TARGET(abort)
|
2018-12-12 11:12:36 +01:00
|
|
|
#endif
|
2018-11-27 12:29:56 +10:30
|
|
|
.cfi_endproc
|
1996-12-12 20:55:56 +00:00
|
|
|
FUNC_END(__trampoline_setup)
|
2000-03-16 03:16:41 +00:00
|
|
|
|
2013-11-14 18:50:48 +00:00
|
|
|
#elif _CALL_ELF == 2
|
|
|
|
.type trampoline_initial,@object
|
|
|
|
.align 3
|
|
|
|
trampoline_initial:
|
|
|
|
ld r11,.Lchain(r12)
|
|
|
|
ld r12,.Lfunc(r12)
|
|
|
|
mtctr r12
|
|
|
|
bctr
|
|
|
|
.Lfunc = .-trampoline_initial
|
|
|
|
.quad 0 /* will be replaced with function address */
|
|
|
|
.Lchain = .-trampoline_initial
|
|
|
|
.quad 0 /* will be replaced with static chain */
|
|
|
|
|
|
|
|
trampoline_size = .-trampoline_initial
|
|
|
|
.size trampoline_initial,trampoline_size
|
|
|
|
|
|
|
|
|
|
|
|
/* R3 = stack address to store trampoline */
|
|
|
|
/* R4 = length of trampoline area */
|
|
|
|
/* R5 = function address */
|
|
|
|
/* R6 = static chain */
|
|
|
|
|
2020-09-28 16:42:33 +09:30
|
|
|
#ifndef __PCREL__
|
2013-11-14 18:50:48 +00:00
|
|
|
.pushsection ".toc","aw"
|
|
|
|
.LC0:
|
|
|
|
.quad trampoline_initial-8
|
|
|
|
.popsection
|
2020-09-28 16:42:33 +09:30
|
|
|
#endif
|
2013-11-14 18:50:48 +00:00
|
|
|
|
|
|
|
FUNC_START(__trampoline_setup)
|
2018-11-27 12:29:56 +10:30
|
|
|
.cfi_startproc
|
2020-09-28 16:42:33 +09:30
|
|
|
#ifdef __PCREL__
|
|
|
|
pla 7,(trampoline_initial-8)@pcrel
|
|
|
|
#else
|
2013-11-14 18:50:48 +00:00
|
|
|
addis 7,2,.LC0@toc@ha
|
|
|
|
ld 7,.LC0@toc@l(7) /* trampoline address -8 */
|
2020-09-28 16:42:33 +09:30
|
|
|
#endif
|
2013-11-14 18:50:48 +00:00
|
|
|
|
2021-04-23 18:16:03 -04:00
|
|
|
cmpwi cr1,r4,trampoline_size /* verify that the trampoline is big enough */
|
2013-11-14 18:50:48 +00:00
|
|
|
srwi r4,r4,3 /* # doublewords to move */
|
|
|
|
addi r9,r3,-8 /* adjust pointer for stdu */
|
|
|
|
mtctr r4
|
|
|
|
blt cr1,.Labort
|
|
|
|
|
|
|
|
/* Copy the instructions to the stack */
|
|
|
|
.Lmove:
|
|
|
|
ldu r10,8(r7)
|
|
|
|
stdu r10,8(r9)
|
|
|
|
bdnz .Lmove
|
|
|
|
|
|
|
|
/* Store correct function and static chain */
|
|
|
|
std r5,.Lfunc(r3)
|
|
|
|
std r6,.Lchain(r3)
|
|
|
|
|
|
|
|
/* Now flush both caches */
|
|
|
|
mtctr r4
|
|
|
|
.Lcache:
|
|
|
|
icbi 0,r3
|
|
|
|
dcbf 0,r3
|
|
|
|
addi r3,r3,8
|
|
|
|
bdnz .Lcache
|
|
|
|
|
|
|
|
/* Finally synchronize things & return */
|
|
|
|
sync
|
|
|
|
isync
|
|
|
|
blr
|
|
|
|
|
|
|
|
.Labort:
|
|
|
|
bl JUMP_TARGET(abort)
|
|
|
|
nop
|
2018-11-27 12:29:56 +10:30
|
|
|
.cfi_endproc
|
2013-11-14 18:50:48 +00:00
|
|
|
FUNC_END(__trampoline_setup)
|
|
|
|
|
2012-05-25 08:20:03 +00:00
|
|
|
#endif
|