1# 2# -*- Mode: Asm -*- 3# 4# This Source Code Form is subject to the terms of the Mozilla Public 5# License, v. 2.0. If a copy of the MPL was not distributed with this 6# file, You can obtain one at http://mozilla.org/MPL/2.0/. 7 8# 9# ** Assumed vtable layout (obtained by disassembling with gdb): 10# ** 4 bytes per vtable entry, skip 0th and 1st entries, so the mapping 11# ** from index to entry is (4 * index) + 8. 12# 13 14.text 15 .align 2 16# 17# NS_InvokeByIndex(nsISupports* that, uint32_t methodIndex, 18# uint32_t paramCount, nsXPTCVariant* params) 19# 20 21.globl __NS_InvokeByIndex 22__NS_InvokeByIndex: 23 mflr r0 24 stw r31,-4(r1) 25# 26# save off the incoming values in the callers parameter area 27# 28 stw r3,24(r1) ; that 29 stw r4,28(r1) ; methodIndex 30 stw r5,32(r1) ; paramCount 31 stw r6,36(r1) ; params 32 stw r0,8(r1) 33 stwu r1,-144(r1) ; 24 for linkage area, 34 ; 8*13 for fprData area, 35 ; 8 for saved registers, 36 ; 8 to keep stack 16-byte aligned 37 38# set up for and call 'invoke_count_words' to get new stack size 39# 40 mr r3,r5 41 mr r4,r6 42 43 stwu r1,-24(r1) 44 bl L_invoke_count_words$stub 45 lwz r1,0(r1) 46 47# prepare args for 'invoke_copy_to_stack' call 48# 49 lwz r4,176(r1) ; paramCount 50 lwz r5,180(r1) ; params 51 mr r6,r1 ; fprData 52 slwi r3,r3,2 ; number of stack bytes required 53 addi r3,r3,28 ; linkage area 54 mr r31,r1 ; save original stack top 55 sub r1,r1,r3 ; bump the stack 56 clrrwi r1,r1,4 ; keep the stack 16-byte aligned 57 addi r3,r31,144 ; act like real alloca, so 0(sp) always 58 stw r3,0(r1) ; points back to previous stack frame 59 addi r3,r1,28 ; parameter pointer excludes linkage area size + 'this' 60 61# create "temporary" stack frame for _invoke_copy_to_stack to operate in. 62 stwu r1,-40(r1) 63 bl L_invoke_copy_to_stack$stub 64# remove temporary stack frame. 65 lwz r1,0(r1) 66 67 lfd f1,0(r31) 68 lfd f2,8(r31) 69 lfd f3,16(r31) 70 lfd f4,24(r31) 71 lfd f5,32(r31) 72 lfd f6,40(r31) 73 lfd f7,48(r31) 74 lfd f8,56(r31) 75 lfd f9,64(r31) 76 lfd f10,72(r31) 77 lfd f11,80(r31) 78 lfd f12,88(r31) 79 lfd f13,96(r31) 80 81 lwz r3,168(r31) ; that 82 lwz r4,0(r3) ; get vTable from 'that' 83 lwz r5,172(r31) ; methodIndex 84 slwi r5,r5,2 ; methodIndex * 4 85 lwzx r12,r5,r4 ; get function pointer 86 87 lwz r4,28(r1) 88 lwz r5,32(r1) 89 lwz r6,36(r1) 90 lwz r7,40(r1) 91 lwz r8,44(r1) 92 lwz r9,48(r1) 93 lwz r10,52(r1) 94 95 mtlr r12 96 blrl 97 98 mr r1,r31 99 lwz r0,152(r1) 100 addi r1,r1,144 101 mtlr r0 102 lwz r31,-4(r1) 103 104 blr 105 106.picsymbol_stub 107L_invoke_count_words$stub: 108 .indirect_symbol _invoke_count_words 109 mflr r0 110 bcl 20,31,L1$pb 111L1$pb: 112 mflr r11 113 addis r11,r11,ha16(L1$lz-L1$pb) 114 mtlr r0 115 lwz r12,lo16(L1$lz-L1$pb)(r11) 116 mtctr r12 117 addi r11,r11,lo16(L1$lz-L1$pb) 118 bctr 119.lazy_symbol_pointer 120L1$lz: 121 .indirect_symbol _invoke_count_words 122 .long dyld_stub_binding_helper 123 124 125.picsymbol_stub 126L_invoke_copy_to_stack$stub: 127 .indirect_symbol _invoke_copy_to_stack 128 mflr r0 129 bcl 20,31,L2$pb 130L2$pb: 131 mflr r11 132 addis r11,r11,ha16(L2$lz-L2$pb) 133 mtlr r0 134 lwz r12,lo16(L2$lz-L2$pb)(r11) 135 mtctr r12 136 addi r11,r11,lo16(L2$lz-L2$pb) 137 bctr 138.lazy_symbol_pointer 139L2$lz: 140 .indirect_symbol _invoke_copy_to_stack 141 .long dyld_stub_binding_helper 142 143