1/* -*- Mode: asm -*- */ 2/* This Source Code Form is subject to the terms of the Mozilla Public 3 * License, v. 2.0. If a copy of the MPL was not distributed with this 4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 5 6 .text 7 .globl _SharedStub 8dnl 9define(STUB_MANGLED_ENTRY, 10` .globl '$2` 11 .align 2 12'$2`: 13 addi r12, 0,'$1` 14 b _SharedStub') 15dnl 16define(STUB_ENTRY, 17` .if '$1` < 10 18STUB_MANGLED_ENTRY('$1`, `__ZN14nsXPTCStubBase5Stub'$1`Ev') 19 .elseif '$1` < 100 20STUB_MANGLED_ENTRY('$1`, `__ZN14nsXPTCStubBase6Stub'$1`Ev') 21 .elseif '$1` < 1000 22STUB_MANGLED_ENTRY('$1`, `__ZN14nsXPTCStubBase7Stub'$1`Ev') 23 .else 24 .err "Stub'$1` >= 1000 not yet supported." 25 .endif 26') 27dnl 28define(SENTINEL_ENTRY, `') 29dnl 30include(xptcstubsdef.inc) 31dnl 32// See also xptcstubs_ppc_rhapsody.cpp:PrepareAndDispatch. 33_SharedStub: 34 // Prolog(ue) 35 mflr r0 // Save the link register in the caller's 36 stw r0, 8(r1) // stack frame 37 stwu r1,-176(r1) // Allocate stack space for our own frame and 38 // adjust stack pointer 39 40 // Linkage area, 0(r1) to 24(r1) 41 // Original sp saved at 0(r1) 42 43 // Parameter area, 20 bytes from 24(r1) to 44 // 44(r1) to accomodate 5 arguments passed 45 // to PrepareAndDispatch 46 47 // Local variables, 132 bytes from 44(r1) 48 // to 176(r1), to accomodate 5 words and 49 // 13 doubles 50 51 stw r4, 44(r1) // Save parameters passed in GPRs r4-r10; 52 stw r5, 48(r1) // a pointer to here will be passed to 53 stw r6, 52(r1) // PrepareAndDispatch for access to 54 stw r7, 56(r1) // arguments passed in registers. r3, 55 stw r8, 60(r1) // the self pointer, is used for the 56 stw r9, 64(r1) // call but isn't otherwise needed in 57 stw r10, 68(r1) // PrepareAndDispatch, so it is not saved. 58 59 stfd f1, 72(r1) // Do the same for floating-point parameters 60 stfd f2, 80(r1) // passed in FPRs f1-f13 61 stfd f3, 88(r1) 62 stfd f4, 96(r1) 63 stfd f5, 104(r1) 64 stfd f6, 112(r1) 65 stfd f7, 120(r1) 66 stfd f8, 128(r1) 67 stfd f9, 136(r1) 68 stfd f10, 144(r1) 69 stfd f11, 152(r1) 70 stfd f12, 160(r1) 71 stfd f13, 168(r1) 72 73 // Set up parameters for call to 74 // PrepareAndDispatch. argument= 75 // 0, pointer to self, already in r3 76 mr r4,r12 // 1, stub number 77 addi r5, r1, 204 // 2, pointer to the parameter area in our 78 // caller's stack, for access to 79 // parameters beyond those passed in 80 // registers. Skip past the first parameter 81 // (corresponding to r3) for the same reason 82 // as above. 176 (size of our frame) + 24 83 // (size of caller's linkage) + 4 (skipped 84 // parameter) 85 addi r6, r1, 44 // 3, pointer to saved GPRs 86 addi r7, r1, 72 // 4, pointer to saved FPRs 87 88 bl L_PrepareAndDispatch$stub 89 // Do it 90 nop // Leave room for linker magic 91 92 // Epilog(ue) 93 lwz r0, 184(r1) // Retrieve old link register value 94 addi r1, r1, 176 // Restore stack pointer 95 mtlr r0 // Restore link register 96 blr // Return 97 98.picsymbol_stub 99L_PrepareAndDispatch$stub: // Standard PIC symbol stub 100 .indirect_symbol _PrepareAndDispatch 101 mflr r0 102 bcl 20,31,L1$pb 103L1$pb: 104 mflr r11 105 addis r11,r11,ha16(L1$lz-L1$pb) 106 mtlr r0 107 lwz r12,lo16(L1$lz-L1$pb)(r11) 108 mtctr r12 109 addi r11,r11,lo16(L1$lz-L1$pb) 110 bctr 111.lazy_symbol_pointer 112L1$lz: 113 .indirect_symbol _PrepareAndDispatch 114 .long dyld_stub_binding_helper 115