darwin-tramp.asm revision 169690
1/* Special support for trampolines 2 * 3 * Copyright (C) 1996, 1997, 2000, 2004, 2005 Free Software Foundation, Inc. 4 * Written By Michael Meissner 5 * 6 * This file is free software; you can redistribute it and/or modify it 7 * under the terms of the GNU General Public License as published by the 8 * Free Software Foundation; either version 2, or (at your option) any 9 * later version. 10 * 11 * In addition to the permissions in the GNU General Public License, the 12 * Free Software Foundation gives you unlimited permission to link the 13 * compiled version of this file with other programs, and to distribute 14 * those programs without any restriction coming from the use of this 15 * file. (The General Public License restrictions do apply in other 16 * respects; for example, they cover modification of the file, and 17 * distribution when not linked into another program.) 18 * 19 * This file is distributed in the hope that it will be useful, but 20 * WITHOUT ANY WARRANTY; without even the implied warranty of 21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 22 * General Public License for more details. 23 * 24 * You should have received a copy of the GNU General Public License 25 * along with this program; see the file COPYING. If not, write to 26 * the Free Software Foundation, 51 Franklin Street, Fifth Floor, 27 * Boston, MA 02110-1301, USA. 28 * 29 * As a special exception, if you link this library with files 30 * compiled with GCC to produce an executable, this does not cause the 31 * resulting executable to be covered by the GNU General Public License. 32 * This exception does not however invalidate any other reasons why the 33 * executable file might be covered by the GNU General Public License. 34 */ 35 36#include "darwin-asm.h" 37 38/* Set up trampolines. */ 39 40.text 41 .align LOG2_GPR_BYTES 42Ltrampoline_initial: 43 mflr r0 44 bl 1f 45Lfunc = .-Ltrampoline_initial 46 .g_long 0 /* will be replaced with function address */ 47Lchain = .-Ltrampoline_initial 48 .g_long 0 /* will be replaced with static chain */ 491: mflr r11 50 lg r12,0(r11) /* function address */ 51 mtlr r0 52 mtctr r12 53 lg r11,GPR_BYTES(r11) /* static chain */ 54 bctr 55 56trampoline_size = .-Ltrampoline_initial 57 58/* R3 = stack address to store trampoline */ 59/* R4 = length of trampoline area */ 60/* R5 = function address */ 61/* R6 = static chain */ 62 63 .globl ___trampoline_setup 64___trampoline_setup: 65 mflr r0 /* save return address */ 66 bcl 20,31,LCF0 /* load up __trampoline_initial into r7 */ 67LCF0: 68 mflr r11 69 addis r7,r11,ha16(LTRAMP-LCF0) 70 lg r7,lo16(LTRAMP-LCF0)(r7) 71 subi r7,r7,4 72 li r8,trampoline_size /* verify trampoline big enough */ 73 cmpg cr1,r8,r4 74 srwi r4,r4,2 /* # words to move (insns always 4-byte) */ 75 addi r9,r3,-4 /* adjust pointer for lgu */ 76 mtctr r4 77 blt cr1,Labort 78 79 mtlr r0 80 81 /* Copy the instructions to the stack */ 82Lmove: 83 lwzu r10,4(r7) 84 stwu r10,4(r9) 85 bdnz Lmove 86 87 /* Store correct function and static chain */ 88 stg r5,Lfunc(r3) 89 stg r6,Lchain(r3) 90 91 /* Now flush both caches */ 92 mtctr r4 93Lcache: 94 icbi 0,r3 95 dcbf 0,r3 96 addi r3,r3,4 97 bdnz Lcache 98 99 /* Ensure cache-flushing has finished. */ 100 sync 101 isync 102 103 /* Make stack writeable. */ 104 b ___enable_execute_stack 105 106Labort: 107#ifdef __DYNAMIC__ 108 bl L_abort$stub 109.data 110.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 111 .align 2 112L_abort$stub: 113 .indirect_symbol _abort 114 mflr r0 115 bcl 20,31,L0$_abort 116L0$_abort: 117 mflr r11 118 addis r11,r11,ha16(L_abort$lazy_ptr-L0$_abort) 119 mtlr r0 120 lgu r12,lo16(L_abort$lazy_ptr-L0$_abort)(r11) 121 mtctr r12 122 bctr 123.data 124.lazy_symbol_pointer 125L_abort$lazy_ptr: 126 .indirect_symbol _abort 127 .g_long dyld_stub_binding_helper 128#else 129 bl _abort 130#endif 131.data 132 .align LOG2_GPR_BYTES 133LTRAMP: 134 .g_long Ltrampoline_initial 135 136