mirror of https://github.com/roytam1/UXP
parent
02260b18f3
commit
769e5dad1e
23 changed files with 1 additions and 1226 deletions
@ -1,129 +0,0 @@ |
||||
# |
||||
# -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
# |
||||
# This Source Code Form is subject to the terms of the Mozilla Public |
||||
# License, v. 2.0. If a copy of the MPL was not distributed with this |
||||
# file, You can obtain one at http://mozilla.org/MPL/2.0/. |
||||
|
||||
.set r0,0; .set sp,1; .set RTOC,2; .set r3,3; .set r4,4
|
||||
.set r5,5; .set r6,6; .set r7,7; .set r8,8; .set r9,9
|
||||
.set r10,10; .set r11,11; .set r12,12; .set r13,13; .set r14,14
|
||||
.set r15,15; .set r16,16; .set r17,17; .set r18,18; .set r19,19
|
||||
.set r20,20; .set r21,21; .set r22,22; .set r23,23; .set r24,24
|
||||
.set r25,25; .set r26,26; .set r27,27; .set r28,28; .set r29,29
|
||||
.set r30,30; .set r31,31
|
||||
.set f0,0; .set f1,1; .set f2,2; .set f3,3; .set f4,4
|
||||
.set f5,5; .set f6,6; .set f7,7; .set f8,8; .set f9,9
|
||||
.set f10,10; .set f11,11; .set f12,12; .set f13,13; .set f14,14
|
||||
.set f15,15; .set f16,16; .set f17,17; .set f18,18; .set f19,19
|
||||
.set f20,20; .set f21,21; .set f22,22; .set f23,23; .set f24,24
|
||||
.set f25,25; .set f26,26; .set f27,27; .set f28,28; .set f29,29
|
||||
.set f30,30; .set f31,31
|
||||
.set BO_IF,12 |
||||
.set CR0_EQ,2 |
||||
|
||||
|
||||
|
||||
.rename H.10.NO_SYMBOL{PR},"" |
||||
.rename H.18.NS_InvokeByIndex{TC},"NS_InvokeByIndex" |
||||
|
||||
|
||||
# .text section
|
||||
|
||||
.csect H.10.NO_SYMBOL{PR} |
||||
.globl .NS_InvokeByIndex |
||||
.globl NS_InvokeByIndex{DS} |
||||
.extern .invoke_copy_to_stack |
||||
.extern ._ptrgl{PR} |
||||
|
||||
|
||||
# |
||||
# NS_InvokeByIndex(nsISupports* that, uint32_t methodIndex, |
||||
# uint32_t paramCount, nsXPTCVariant* params) |
||||
# |
||||
|
||||
.NS_InvokeByIndex: |
||||
mflr r0 |
||||
stw r31,-4(sp) |
||||
# |
||||
# save off the incoming values in the caller's parameter area |
||||
#
|
||||
stw r3,24(sp) # that |
||||
stw r4,28(sp) # methodIndex |
||||
stw r5,32(sp) # paramCount |
||||
stw r6,36(sp) # params |
||||
stw r0,8(sp) |
||||
stwu sp,-136(sp) # = 24 for linkage area, 8 * 13 for fprData area, 8 for saved registers |
||||
|
||||
# prepare args for 'invoke_copy_to_stack' call |
||||
#
|
||||
lwz r4,168(sp) # paramCount |
||||
lwz r5,172(sp) # params |
||||
mr r6,sp # fprData |
||||
slwi r3,r4,3 # number of bytes of stack required |
||||
# at most 8*paramCount |
||||
addi r3,r3,28 # linkage area |
||||
mr r31,sp # save original stack top |
||||
subfc sp,r3,sp # bump the stack |
||||
addi r3,sp,28 # parameter pointer excludes linkage area size + 'this' |
||||
|
||||
bl .invoke_copy_to_stack |
||||
nop |
||||
|
||||
lfd f1,0(r31) # Restore floating point registers |
||||
lfd f2,8(r31)
|
||||
lfd f3,16(r31)
|
||||
lfd f4,24(r31)
|
||||
lfd f5,32(r31)
|
||||
lfd f6,40(r31)
|
||||
lfd f7,48(r31)
|
||||
lfd f8,56(r31)
|
||||
lfd f9,64(r31)
|
||||
lfd f10,72(r31)
|
||||
lfd f11,80(r31)
|
||||
lfd f12,88(r31)
|
||||
lfd f13,96(r31)
|
||||
|
||||
lwz r3,160(r31) # that |
||||
lwz r4,0(r3) # get vTable from 'that' |
||||
lwz r5,164(r31) # methodIndex |
||||
slwi r5,r5,3 # methodIndex * 8 |
||||
addi r5,r5,8 # step over junk at start of vTable ! |
||||
lwzx r11,r5,r4 # get function pointer |
||||
|
||||
addi r5,r5,4 # We need to manually adjust the 'that' pointer, this is CFRONT based |
||||
lwzx r5,r4,r5 # offset = r4(vtable) + r5(methodIndex offset) - 4
|
||||
add r3,r5,r3 # adjust 'that' r3 = r3 + r5 |
||||
|
||||
lwz r4,28(sp) |
||||
lwz r5,32(sp) |
||||
lwz r6,36(sp) |
||||
lwz r7,40(sp) |
||||
lwz r8,44(sp) |
||||
lwz r9,48(sp) |
||||
lwz r10,52(sp) |
||||
|
||||
bl ._ptrgl{PR} |
||||
nop
|
||||
|
||||
mr sp,r31 |
||||
lwz r0,144(sp) |
||||
addi sp,sp,136 |
||||
mtlr r0 |
||||
lwz r31,-4(sp) |
||||
blr |
||||
|
||||
|
||||
# .data section
|
||||
|
||||
.toc # 0x00000038 |
||||
T.18.NS_InvokeByIndex: |
||||
.tc H.18.NS_InvokeByIndex{TC},NS_InvokeByIndex{DS} |
||||
|
||||
.csect NS_InvokeByIndex{DS} |
||||
.long .NS_InvokeByIndex # "\0\0\0\0" |
||||
.long TOC{TC0} # "\0\0\0008" |
||||
.long 0x00000000 # "\0\0\0\0" |
||||
# End csect NS_InvokeByIndex{DS} |
||||
|
||||
# .bss section |
@ -1,128 +0,0 @@ |
||||
# This Source Code Form is subject to the terms of the Mozilla Public |
||||
# License, v. 2.0. If a copy of the MPL was not distributed with this |
||||
# file, You can obtain one at http://mozilla.org/MPL/2.0/. |
||||
|
||||
.set r0,0; .set sp,1; .set RTOC,2; .set r3,3; .set r4,4
|
||||
.set r5,5; .set r6,6; .set r7,7; .set r8,8; .set r9,9
|
||||
.set r10,10; .set r11,11; .set r12,12; .set r13,13; .set r14,14
|
||||
.set r15,15; .set r16,16; .set r17,17; .set r18,18; .set r19,19
|
||||
.set r20,20; .set r21,21; .set r22,22; .set r23,23; .set r24,24
|
||||
.set r25,25; .set r26,26; .set r27,27; .set r28,28; .set r29,29
|
||||
.set r30,30; .set r31,31
|
||||
.set f0,0; .set f1,1; .set f2,2; .set f3,3; .set f4,4
|
||||
.set f5,5; .set f6,6; .set f7,7; .set f8,8; .set f9,9
|
||||
.set f10,10; .set f11,11; .set f12,12; .set f13,13; .set f14,14
|
||||
.set f15,15; .set f16,16; .set f17,17; .set f18,18; .set f19,19
|
||||
.set f20,20; .set f21,21; .set f22,22; .set f23,23; .set f24,24
|
||||
.set f25,25; .set f26,26; .set f27,27; .set f28,28; .set f29,29
|
||||
.set f30,30; .set f31,31
|
||||
.set BO_IF,12 |
||||
.set CR0_EQ,2 |
||||
|
||||
.rename H.10.NO_SYMBOL{PR},"" |
||||
.rename H.18.NS_InvokeByIndex{TC},"NS_InvokeByIndex" |
||||
|
||||
|
||||
# .text section
|
||||
|
||||
.csect H.10.NO_SYMBOL{PR} |
||||
.globl .NS_InvokeByIndex |
||||
.globl NS_InvokeByIndex{DS} |
||||
.extern .invoke_copy_to_stack |
||||
.extern ._ptrgl{PR} |
||||
|
||||
# |
||||
# NS_InvokeByIndex(nsISupports* that, uint32_t methodIndex, |
||||
# uint32_t paramCount, nsXPTCVariant* params) |
||||
# |
||||
|
||||
.NS_InvokeByIndex: |
||||
mflr r0 |
||||
std r31,-8(sp) |
||||
# |
||||
# save off the incoming values in the caller's parameter area |
||||
#
|
||||
std r3,48(sp) # that |
||||
std r4,56(sp) # methodIndex |
||||
std r5,64(sp) # paramCount |
||||
std r6,72(sp) # params |
||||
std r0,16(sp) |
||||
stdu sp,-168(sp) # 2*24=48 for linkage area,
|
||||
# 8*13=104 for fprData area |
||||
# 16 for saved registers |
||||
|
||||
# prepare args for 'invoke_copy_to_stack' call |
||||
#
|
||||
ld r4,232(sp) # paramCount (168+8+56) |
||||
ld r5,240(sp) # params |
||||
mr r6,sp # fprData |
||||
sldi r3,r4,3 # number of bytes of stack required |
||||
# is at most numParams*8 |
||||
addi r3,r3,56 # linkage area (48) + this (8) |
||||
mr r31,sp # save original stack top |
||||
subfc sp,r3,sp # bump the stack |
||||
addi r3,sp,56 # parameter pointer excludes linkage area |
||||
# size + 'this' |
||||
|
||||
bl .invoke_copy_to_stack |
||||
nop |
||||
|
||||
lfd f1,0(r31) # Restore floating point registers |
||||
lfd f2,8(r31) |
||||
lfd f3,16(r31) |
||||
lfd f4,24(r31) |
||||
lfd f5,32(r31) |
||||
lfd f6,40(r31) |
||||
lfd f7,48(r31) |
||||
lfd f8,56(r31) |
||||
lfd f9,64(r31) |
||||
lfd f10,72(r31) |
||||
lfd f11,80(r31) |
||||
lfd f12,88(r31) |
||||
lfd f13,96(r31) |
||||
|
||||
ld r3,216(r31) # that (168+48) |
||||
ld r4,0(r3) # get vTable from 'that' |
||||
ld r5,224(r31) # methodIndex (168+56) |
||||
sldi r5,r5,3 # methodIndex * 8 |
||||
# No junk at the start of 64bit vtable !!! |
||||
ldx r11,r5,r4 # get function pointer (this jumps |
||||
# either to the function if no adjustment |
||||
# is needed (displacement = 0), or it
|
||||
# jumps to the thunk code, which will jump |
||||
# to the function at the end) |
||||
|
||||
# No adjustment of the that pointer in 64bit mode, this is done |
||||
# by the thunk code |
||||
|
||||
ld r4,56(sp) |
||||
ld r5,64(sp) |
||||
ld r6,72(sp) |
||||
ld r7,80(sp) |
||||
ld r8,88(sp) |
||||
ld r9,96(sp) |
||||
ld r10,104(sp) |
||||
|
||||
bl ._ptrgl{PR} |
||||
nop |
||||
|
||||
mr sp,r31 |
||||
ld r0,184(sp) # 168+16 |
||||
addi sp,sp,168 |
||||
mtlr r0 |
||||
ld r31,-8(sp) |
||||
blr |
||||
|
||||
# .data section
|
||||
|
||||
.toc # 0x00000038 |
||||
T.18.NS_InvokeByIndex: |
||||
.tc H.18.NS_InvokeByIndex{TC},NS_InvokeByIndex{DS} |
||||
|
||||
.csect NS_InvokeByIndex{DS} |
||||
.llong .NS_InvokeByIndex # "\0\0\0\0" |
||||
.llong TOC{TC0} # "\0\0\0008" |
||||
.llong 0x00000000 # "\0\0\0\0" |
||||
# End csect NS_InvokeByIndex{DS} |
||||
|
||||
# .bss section
|
@ -1,124 +0,0 @@ |
||||
# |
||||
# -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
# |
||||
# This Source Code Form is subject to the terms of the Mozilla Public |
||||
# License, v. 2.0. If a copy of the MPL was not distributed with this |
||||
# file, You can obtain one at http://mozilla.org/MPL/2.0/. |
||||
|
||||
.set r0,0; .set sp,1; .set RTOC,2; .set r3,3; .set r4,4
|
||||
.set r5,5; .set r6,6; .set r7,7; .set r8,8; .set r9,9
|
||||
.set r10,10; .set r11,11; .set r12,12; .set r13,13; .set r14,14
|
||||
.set r15,15; .set r16,16; .set r17,17; .set r18,18; .set r19,19
|
||||
.set r20,20; .set r21,21; .set r22,22; .set r23,23; .set r24,24
|
||||
.set r25,25; .set r26,26; .set r27,27; .set r28,28; .set r29,29
|
||||
.set r30,30; .set r31,31
|
||||
.set f0,0; .set f1,1; .set f2,2; .set f3,3; .set f4,4
|
||||
.set f5,5; .set f6,6; .set f7,7; .set f8,8; .set f9,9
|
||||
.set f10,10; .set f11,11; .set f12,12; .set f13,13; .set f14,14
|
||||
.set f15,15; .set f16,16; .set f17,17; .set f18,18; .set f19,19
|
||||
.set f20,20; .set f21,21; .set f22,22; .set f23,23; .set f24,24
|
||||
.set f25,25; .set f26,26; .set f27,27; .set f28,28; .set f29,29
|
||||
.set f30,30; .set f31,31
|
||||
.set BO_IF,12 |
||||
.set CR0_EQ,2 |
||||
|
||||
|
||||
|
||||
.rename H.10.NO_SYMBOL{PR},"" |
||||
.rename H.18.NS_InvokeByIndex{TC},"NS_InvokeByIndex" |
||||
|
||||
|
||||
# .text section
|
||||
|
||||
.csect H.10.NO_SYMBOL{PR} |
||||
.globl .NS_InvokeByIndex |
||||
.globl NS_InvokeByIndex{DS} |
||||
.extern .invoke_copy_to_stack |
||||
.extern ._ptrgl{PR} |
||||
|
||||
|
||||
# |
||||
# NS_InvokeByIndex(nsISupports* that, uint32_t methodIndex, |
||||
# uint32_t paramCount, nsXPTCVariant* params) |
||||
# |
||||
|
||||
.NS_InvokeByIndex: |
||||
mflr r0 |
||||
stw r31,-4(sp) |
||||
# |
||||
# save off the incoming values in the caller's parameter area |
||||
#
|
||||
stw r3,24(sp) # that |
||||
stw r4,28(sp) # methodIndex |
||||
stw r5,32(sp) # paramCount |
||||
stw r6,36(sp) # params |
||||
stw r0,8(sp) |
||||
stwu sp,-136(sp) # = 24 for linkage area, 8 * 13 for fprData area, 8 for saved registers |
||||
|
||||
# prepare args for 'invoke_copy_to_stack' call |
||||
#
|
||||
lwz r4,168(sp) # paramCount |
||||
lwz r5,172(sp) # params |
||||
mr r6,sp # fprData |
||||
slwi r3,r4,3 # number of bytes of stack required |
||||
# at most 8*paramCount |
||||
addi r3,r3,28 # linkage area |
||||
mr r31,sp # save original stack top |
||||
subfc sp,r3,sp # bump the stack |
||||
addi r3,sp,28 # parameter pointer excludes linkage area size + 'this' |
||||
|
||||
bl .invoke_copy_to_stack |
||||
nop |
||||
|
||||
lfd f1,0(r31) # Restore floating point registers |
||||
lfd f2,8(r31)
|
||||
lfd f3,16(r31)
|
||||
lfd f4,24(r31)
|
||||
lfd f5,32(r31)
|
||||
lfd f6,40(r31)
|
||||
lfd f7,48(r31)
|
||||
lfd f8,56(r31)
|
||||
lfd f9,64(r31)
|
||||
lfd f10,72(r31)
|
||||
lfd f11,80(r31)
|
||||
lfd f12,88(r31)
|
||||
lfd f13,96(r31)
|
||||
|
||||
lwz r3,160(r31) # that |
||||
lwz r4,0(r3) # get vTable from 'that' |
||||
lwz r5,164(r31) # methodIndex |
||||
slwi r5,r5,2 # methodIndex * 4 |
||||
lwzx r11,r5,r4 # get function pointer |
||||
|
||||
lwz r4,28(sp) |
||||
lwz r5,32(sp) |
||||
lwz r6,36(sp) |
||||
lwz r7,40(sp) |
||||
lwz r8,44(sp) |
||||
lwz r9,48(sp) |
||||
lwz r10,52(sp) |
||||
|
||||
bl ._ptrgl{PR} |
||||
nop
|
||||
|
||||
mr sp,r31 |
||||
lwz r0,144(sp) |
||||
addi sp,sp,136 |
||||
mtlr r0 |
||||
lwz r31,-4(sp) |
||||
blr |
||||
|
||||
|
||||
# .data section
|
||||
|
||||
.toc # 0x00000038 |
||||
T.18.NS_InvokeByIndex: |
||||
.tc H.18.NS_InvokeByIndex{TC},NS_InvokeByIndex{DS} |
||||
|
||||
.csect NS_InvokeByIndex{DS} |
||||
.long .NS_InvokeByIndex # "\0\0\0\0" |
||||
.long TOC{TC0} # "\0\0\0008" |
||||
.long 0x00000000 # "\0\0\0\0" |
||||
# End csect NS_InvokeByIndex{DS} |
||||
|
||||
# .bss section |
@ -1,74 +0,0 @@ |
||||
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ |
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this |
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
/* Platform specific code to invoke XPCOM methods on native objects */ |
||||
|
||||
#include "xptcprivate.h" |
||||
|
||||
#ifndef AIX |
||||
#error "This code is for PowerPC only" |
||||
#endif |
||||
|
||||
extern "C" void |
||||
invoke_copy_to_stack(uint32_t* d, uint32_t paramCount, nsXPTCVariant* s, double *fprData) |
||||
{ |
||||
/*
|
||||
We need to copy the parameters for this function to locals and use them |
||||
from there since the parameters occupy the same stack space as the stack |
||||
we're trying to populate. |
||||
*/ |
||||
uint32_t *l_d = d; |
||||
nsXPTCVariant *l_s = s; |
||||
uint32_t l_paramCount = paramCount, fpCount = 0; |
||||
double *l_fprData = fprData; |
||||
|
||||
typedef struct { |
||||
uint32_t hi; |
||||
uint32_t lo; |
||||
} DU; // have to move 64 bit entities as 32 bit halves since
|
||||
// stack slots are not guaranteed 16 byte aligned
|
||||
|
||||
for(uint32_t i = 0; i < l_paramCount; i++, l_d++, l_s++) |
||||
{ |
||||
if(l_s->IsPtrData()) |
||||
{ |
||||
*((void**)l_d) = l_s->ptr; |
||||
continue; |
||||
} |
||||
switch(l_s->type) |
||||
{ |
||||
case nsXPTType::T_I8 : *((int32_t*) l_d) = l_s->val.i8; break; |
||||
case nsXPTType::T_I16 : *((int32_t*) l_d) = l_s->val.i16; break; |
||||
case nsXPTType::T_I32 : *((int32_t*) l_d) = l_s->val.i32; break; |
||||
case nsXPTType::T_I64 :
|
||||
case nsXPTType::T_U64 : |
||||
*((uint32_t*) l_d++) = ((DU *)l_s)->hi; |
||||
*((uint32_t*) l_d) = ((DU *)l_s)->lo; |
||||
break; |
||||
case nsXPTType::T_DOUBLE : |
||||
*((uint32_t*) l_d++) = ((DU *)l_s)->hi; |
||||
*((uint32_t*) l_d) = ((DU *)l_s)->lo; |
||||
if(fpCount < 13) |
||||
l_fprData[fpCount++] = l_s->val.d; |
||||
break; |
||||
case nsXPTType::T_U8 : *((uint32_t*) l_d) = l_s->val.u8; break; |
||||
case nsXPTType::T_U16 : *((uint32_t*) l_d) = l_s->val.u16; break; |
||||
case nsXPTType::T_U32 : *((uint32_t*) l_d) = l_s->val.u32; break; |
||||
case nsXPTType::T_FLOAT : |
||||
*((float*) l_d) = l_s->val.f; |
||||
if(fpCount < 13) |
||||
l_fprData[fpCount++] = l_s->val.f; |
||||
break; |
||||
case nsXPTType::T_BOOL : *((uint32_t*) l_d) = l_s->val.b; break; |
||||
case nsXPTType::T_CHAR : *((uint32_t*) l_d) = l_s->val.c; break; |
||||
case nsXPTType::T_WCHAR : *((int32_t*) l_d) = l_s->val.wc; break; |
||||
default: |
||||
// all the others are plain pointer types
|
||||
*((void**)l_d) = l_s->val.p; |
||||
break; |
||||
} |
||||
} |
||||
} |
||||
|
@ -1,63 +0,0 @@ |
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this |
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
/* Platform specific code to invoke XPCOM methods on native objects */ |
||||
|
||||
#include "xptcprivate.h" |
||||
|
||||
#ifdef _AIX |
||||
|
||||
extern "C" void |
||||
invoke_copy_to_stack(uint64_t* d, uint32_t paramCount, nsXPTCVariant* s, double *fprData) |
||||
{ |
||||
/*
|
||||
We need to copy the parameters for this function to locals and use them |
||||
from there since the parameters occupy the same stack space as the stack |
||||
we're trying to populate. |
||||
*/ |
||||
uint64_t *l_d = d; |
||||
nsXPTCVariant *l_s = s; |
||||
uint32_t l_paramCount = paramCount, fpCount = 0; |
||||
double *l_fprData = fprData; |
||||
|
||||
for(uint32_t i = 0; i < l_paramCount; i++, l_d++, l_s++) |
||||
{ |
||||
if(l_s->IsPtrData()) |
||||
{ |
||||
*l_d = (uint64_t)l_s->ptr; |
||||
continue; |
||||
} |
||||
switch(l_s->type) |
||||
{ |
||||
case nsXPTType::T_I8: *l_d = (uint64_t)l_s->val.i8; break; |
||||
case nsXPTType::T_I16: *l_d = (uint64_t)l_s->val.i16; break; |
||||
case nsXPTType::T_I32: *l_d = (uint64_t)l_s->val.i32; break; |
||||
case nsXPTType::T_I64: *l_d = (uint64_t)l_s->val.i64; break; |
||||
case nsXPTType::T_U8: *l_d = (uint64_t)l_s->val.u8; break; |
||||
case nsXPTType::T_U16: *l_d = (uint64_t)l_s->val.u16; break; |
||||
case nsXPTType::T_U32: *l_d = (uint64_t)l_s->val.u32; break; |
||||
case nsXPTType::T_U64: *l_d = (uint64_t)l_s->val.u64; break; |
||||
case nsXPTType::T_BOOL: *l_d = (uint64_t)l_s->val.b; break; |
||||
case nsXPTType::T_CHAR: *l_d = (uint64_t)l_s->val.c; break; |
||||
case nsXPTType::T_WCHAR: *l_d = (uint64_t)l_s->val.wc; break; |
||||
|
||||
case nsXPTType::T_DOUBLE: |
||||
*((double*)l_d) = l_s->val.d; |
||||
if(fpCount < 13) |
||||
l_fprData[fpCount++] = l_s->val.d; |
||||
break; |
||||
case nsXPTType::T_FLOAT: |
||||
*((float*)l_d) = l_s->val.f; |
||||
if(fpCount < 13) |
||||
l_fprData[fpCount++] = l_s->val.f; |
||||
break; |
||||
default: |
||||
// all the others are plain pointer types
|
||||
*l_d = (uint64_t)l_s->val.p; |
||||
break; |
||||
} |
||||
} |
||||
} |
||||
#endif |
||||
|
@ -1,119 +0,0 @@ |
||||
# This Source Code Form is subject to the terms of the Mozilla Public |
||||
# License, v. 2.0. If a copy of the MPL was not distributed with this |
||||
# file, You can obtain one at http://mozilla.org/MPL/2.0/. |
||||
|
||||
.set r0,0; .set sp,1; .set RTOC,2; .set r3,3; .set r4,4 |
||||
.set r5,5; .set r6,6; .set r7,7; .set r8,8; .set r9,9 |
||||
.set r10,10; .set r11,11; .set r12,12; .set r13,13; .set r14,14 |
||||
.set r15,15; .set r16,16; .set r17,17; .set r18,18; .set r19,19 |
||||
.set r20,20; .set r21,21; .set r22,22; .set r23,23; .set r24,24 |
||||
.set r25,25; .set r26,26; .set r27,27; .set r28,28; .set r29,29 |
||||
.set r30,30; .set r31,31 |
||||
.set f0,0; .set f1,1; .set f2,2; .set f3,3; .set f4,4 |
||||
.set f5,5; .set f6,6; .set f7,7; .set f8,8; .set f9,9 |
||||
.set f10,10; .set f11,11; .set f12,12; .set f13,13; .set f14,14 |
||||
.set f15,15; .set f16,16; .set f17,17; .set f18,18; .set f19,19 |
||||
.set f20,20; .set f21,21; .set f22,22; .set f23,23; .set f24,24 |
||||
.set f25,25; .set f26,26; .set f27,27; .set f28,28; .set f29,29 |
||||
.set f30,30; .set f31,31 |
||||
|
||||
# Define the correct name of the stub function based on the object model |
||||
|
||||
define(STUB_NAME, |
||||
ifelse(AIX_OBJMODEL, ibm, |
||||
`Stub'$1`__EI14nsXPTCStubBaseFv', |
||||
`Stub'$1`__14nsXPTCStubBaseFv')) |
||||
|
||||
define(STUB_ENTRY, ` |
||||
.rename H.10.NO_SYMBOL{PR},"" |
||||
.rename H.18.'STUB_NAME($1)`{TC},"'STUB_NAME($1)`" |
||||
.csect H.10.NO_SYMBOL{PR} |
||||
.globl .'STUB_NAME($1)` |
||||
.globl 'STUB_NAME($1)`{DS} |
||||
|
||||
.'STUB_NAME($1)`: |
||||
li r12, '$1` |
||||
b .SharedStub |
||||
nop |
||||
|
||||
|
||||
.toc |
||||
T.18.'STUB_NAME($1)`: |
||||
.tc H.18.'STUB_NAME($1)`{TC},'STUB_NAME($1)`{DS} |
||||
.csect 'STUB_NAME($1)`{DS} |
||||
.long .'STUB_NAME($1)` |
||||
.long TOC{TC0} |
||||
.long 0x00000000 |
||||
') |
||||
|
||||
define(SENTINEL_ENTRY, `') |
||||
|
||||
include(xptcstubsdef.inc) |
||||
|
||||
.rename H.10.NO_SYMBOL{PR},"" |
||||
.rename H.18.SharedStub{TC},"SharedStub" |
||||
|
||||
# .text section |
||||
.csect H.10.NO_SYMBOL{PR} |
||||
.globl .SharedStub |
||||
.globl SharedStub{DS} |
||||
.extern .PrepareAndDispatch |
||||
|
||||
.SharedStub: |
||||
mflr r0 |
||||
stw r0,8(sp) |
||||
|
||||
stwu sp,-176(sp) # room for linkage (24), fprData (104), gprData(28) |
||||
# outgoing params to PrepareAndDispatch (20) |
||||
|
||||
stw r4,44(sp) # link area (24) + PrepareAndDispatch params (20) |
||||
stw r5,48(sp) |
||||
stw r6,52(sp) |
||||
stw r7,56(sp) |
||||
stw r8,60(sp) |
||||
stw r9,64(sp) |
||||
stw r10,68(sp) |
||||
stfd f1,72(sp) |
||||
stfd f2,80(sp) |
||||
stfd f3,88(sp) |
||||
stfd f4,96(sp) |
||||
stfd f5,104(sp) |
||||
stfd f6,112(sp) |
||||
stfd f7,120(sp) |
||||
stfd f8,128(sp) |
||||
stfd f9,136(sp) |
||||
stfd f10,144(sp) |
||||
stfd f11,152(sp) |
||||
stfd f12,156(sp) |
||||
stfd f13,164(sp) |
||||
|
||||
addi r6,sp,44 # gprData |
||||
|
||||
addi r7,sp,72 # fprData |
||||
# r3 has the 'self' pointer already |
||||
mr r4,r12 # methodIndex selector (it is now LATER) |
||||
addi r5,sp,232 # pointer to callers args area, beyond r3-r10 |
||||
# mapped range |
||||
|
||||
bl .PrepareAndDispatch |
||||
nop |
||||
|
||||
|
||||
lwz r0,184(sp) |
||||
addi sp,sp,176 |
||||
mtlr r0 |
||||
blr |
||||
|
||||
# .data section |
||||
|
||||
.toc # 0x00000038 |
||||
T.18.SharedStub: |
||||
.tc H.18.SharedStub{TC},SharedStub{DS} |
||||
|
||||
.csect SharedStub{DS} |
||||
.long .SharedStub # "\0\0\0\0" |
||||
.long TOC{TC0} # "\0\0\0008" |
||||
.long 0x00000000 # "\0\0\0\0" |
||||
# End csect SharedStub{DS} |
||||
|
||||
# .bss section |
@ -1,97 +0,0 @@ |
||||
# This Source Code Form is subject to the terms of the Mozilla Public |
||||
# License, v. 2.0. If a copy of the MPL was not distributed with this |
||||
# file, You can obtain one at http://mozilla.org/MPL/2.0/. |
||||
|
||||
.set r0,0; .set sp,1; .set RTOC,2; .set r3,3; .set r4,4 |
||||
.set r5,5; .set r6,6; .set r7,7; .set r8,8; .set r9,9 |
||||
.set r10,10; .set r11,11; .set r12,12; .set r13,13; .set r14,14 |
||||
.set r15,15; .set r16,16; .set r17,17; .set r18,18; .set r19,19 |
||||
.set r20,20; .set r21,21; .set r22,22; .set r23,23; .set r24,24 |
||||
.set r25,25; .set r26,26; .set r27,27; .set r28,28; .set r29,29 |
||||
.set r30,30; .set r31,31 |
||||
.set f0,0; .set f1,1; .set f2,2; .set f3,3; .set f4,4 |
||||
.set f5,5; .set f6,6; .set f7,7; .set f8,8; .set f9,9 |
||||
.set f10,10; .set f11,11; .set f12,12; .set f13,13; .set f14,14 |
||||
.set f15,15; .set f16,16; .set f17,17; .set f18,18; .set f19,19 |
||||
.set f20,20; .set f21,21; .set f22,22; .set f23,23; .set f24,24 |
||||
.set f25,25; .set f26,26; .set f27,27; .set f28,28; .set f29,29 |
||||
.set f30,30; .set f31,31 |
||||
# Define the correct name of the stub function based on the object model |
||||
define(STUB_NAME, |
||||
ifelse(AIX_OBJMODEL, ibm, |
||||
`Stub'$1`__EI14nsXPTCStubBaseFv', |
||||
`Stub'$1`__14nsXPTCStubBaseFv')) |
||||
define(STUB_ENTRY, ` |
||||
.rename H.10.NO_SYMBOL{PR},"" |
||||
.rename H.18.'STUB_NAME($1)`{TC},"'STUB_NAME($1)`" |
||||
.csect H.10.NO_SYMBOL{PR} |
||||
.globl .'STUB_NAME($1)` |
||||
.globl 'STUB_NAME($1)`{DS} |
||||
.'STUB_NAME($1)`: |
||||
li r12, '$1` |
||||
b .SharedStub |
||||
nop |
||||
.toc |
||||
T.18.'STUB_NAME($1)`: |
||||
.tc H.18.'STUB_NAME($1)`{TC},'STUB_NAME($1)`{DS} |
||||
.csect 'STUB_NAME($1)`{DS} |
||||
.llong .'STUB_NAME($1)` |
||||
.llong TOC{TC0} |
||||
.llong 0x00000000 |
||||
') |
||||
define(SENTINEL_ENTRY, `') |
||||
include(xptcstubsdef.inc) |
||||
.rename H.10.NO_SYMBOL{PR},"" |
||||
.rename H.18.SharedStub{TC},"SharedStub" |
||||
# .text section |
||||
.csect H.10.NO_SYMBOL{PR} |
||||
.globl .SharedStub |
||||
.globl SharedStub{DS} |
||||
.extern .PrepareAndDispatch |
||||
.SharedStub: |
||||
mflr r0 |
||||
std r0,16(sp) |
||||
stdu sp,-248(sp) # room for linkage (24*2), fprData (104), gprData(28*2) |
||||
# outgoing params to PrepareAndDispatch (40) |
||||
std r4,88(sp) # link area (48) + PrepareAndDispatch params (20) |
||||
std r5,96(sp) |
||||
std r6,104(sp) |
||||
std r7,112(sp) |
||||
std r8,120(sp) |
||||
std r9,128(sp) |
||||
std r10,136(sp) |
||||
stfd f1,144(sp) |
||||
stfd f2,152(sp) |
||||
stfd f3,160(sp) |
||||
stfd f4,168(sp) |
||||
stfd f5,176(sp) |
||||
stfd f6,184(sp) |
||||
stfd f7,192(sp) |
||||
stfd f8,200(sp) |
||||
stfd f9,208(sp) |
||||
stfd f10,216(sp) |
||||
stfd f11,224(sp) |
||||
stfd f12,232(sp) |
||||
stfd f13,240(sp) |
||||
addi r6,sp,88 # gprData |
||||
addi r7,sp,144 # fprData |
||||
# r3 has the 'self' pointer already |
||||
mr r4,r12 # methodIndex selector (it is now LATER) |
||||
addi r5,sp,360 # pointer to callers args area, beyond r3-r10 |
||||
# mapped range |
||||
bl .PrepareAndDispatch |
||||
nop |
||||
ld r0,264(sp) |
||||
addi sp,sp,248 |
||||
mtlr r0 |
||||
blr |
||||
# .data section |
||||
.toc # 0x00000038 |
||||
T.18.SharedStub: |
||||
.tc H.18.SharedStub{TC},SharedStub{DS} |
||||
.csect SharedStub{DS} |
||||
.llong .SharedStub # "\0\0\0\0" |
||||
.llong TOC{TC0} # "\0\0\0008" |
||||
.llong 0x00000000 # "\0\0\0\0" |
||||
# End csect SharedStub{DS} |
||||
# .bss section |
@ -1,185 +0,0 @@ |
||||
/* -*- Mode: C; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ |
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this |
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
/* Implement shared vtbl methods. */ |
||||
|
||||
#include "xptcprivate.h" |
||||
#include "xptiprivate.h" |
||||
|
||||
#if defined(AIX) |
||||
|
||||
/*
|
||||
For PPC (AIX & MAC), the first 8 integral and the first 13 f.p. parameters
|
||||
arrive in a separate chunk of data that has been loaded from the registers.
|
||||
The args pointer has been set to the start of the parameters BEYOND the ones |
||||
arriving in registers |
||||
*/ |
||||
extern "C" nsresult ATTRIBUTE_USED |
||||
PrepareAndDispatch(nsXPTCStubBase* self, uint32_t methodIndex, uint32_t* args, uint32_t *gprData, double *fprData) |
||||
{ |
||||
typedef struct { |
||||
uint32_t hi; |
||||
uint32_t lo; // have to move 64 bit entities as 32 bit halves since
|
||||
} DU; // stack slots are not guaranteed 16 byte aligned
|
||||
|
||||
#define PARAM_BUFFER_COUNT 16 |
||||
#define PARAM_GPR_COUNT 7 |
||||
|
||||
nsXPTCMiniVariant paramBuffer[PARAM_BUFFER_COUNT]; |
||||
nsXPTCMiniVariant* dispatchParams = nullptr; |
||||
const nsXPTMethodInfo* info = nullptr; |
||||
uint8_t paramCount; |
||||
uint8_t i; |
||||
nsresult result = NS_ERROR_FAILURE; |
||||
|
||||
NS_ASSERTION(self,"no self"); |
||||
|
||||
self->mEntry->GetMethodInfo(uint16_t(methodIndex), &info); |
||||
NS_ASSERTION(info,"no method info"); |
||||
|
||||
paramCount = info->GetParamCount(); |
||||
|
||||
// setup variant array pointer
|
||||
if(paramCount > PARAM_BUFFER_COUNT) |
||||
dispatchParams = new nsXPTCMiniVariant[paramCount]; |
||||
else |
||||
dispatchParams = paramBuffer; |
||||
NS_ASSERTION(dispatchParams,"no place for params"); |
||||
|
||||
uint32_t* ap = args; |
||||
uint32_t iCount = 0; |
||||
uint32_t fpCount = 0; |
||||
for(i = 0; i < paramCount; i++) |
||||
{ |
||||
const nsXPTParamInfo& param = info->GetParam(i); |
||||
const nsXPTType& type = param.GetType(); |
||||
nsXPTCMiniVariant* dp = &dispatchParams[i]; |
||||
|
||||
if(param.IsOut() || !type.IsArithmetic()) |
||||
{ |
||||
if (iCount < PARAM_GPR_COUNT) |
||||
dp->val.p = (void*) gprData[iCount++]; |
||||
else |
||||
dp->val.p = (void*) *ap++; |
||||
continue; |
||||
} |
||||
// else
|
||||
switch(type) |
||||
{ |
||||
case nsXPTType::T_I8 : if (iCount < PARAM_GPR_COUNT) |
||||
dp->val.i8 = (int8_t) gprData[iCount++]; |
||||
else |
||||
dp->val.i8 = (int8_t) *ap++; |
||||
break; |
||||
case nsXPTType::T_I16 : if (iCount < PARAM_GPR_COUNT) |
||||
dp->val.i16 = (int16_t) gprData[iCount++]; |
||||
else |
||||
dp->val.i16 = (int16_t) *ap++; |
||||
break; |
||||
case nsXPTType::T_I32 : if (iCount < PARAM_GPR_COUNT) |
||||
dp->val.i32 = (int32_t) gprData[iCount++]; |
||||
else |
||||
dp->val.i32 = (int32_t) *ap++; |
||||
break; |
||||
case nsXPTType::T_I64 : if (iCount < PARAM_GPR_COUNT) |
||||
((DU *)dp)->hi = (int32_t) gprData[iCount++]; |
||||
else |
||||
((DU *)dp)->hi = (int32_t) *ap++; |
||||
if (iCount < PARAM_GPR_COUNT) |
||||
((DU *)dp)->lo = (uint32_t) gprData[iCount++]; |
||||
else |
||||
((DU *)dp)->lo = (uint32_t) *ap++; |
||||
break; |
||||
case nsXPTType::T_U8 : if (iCount < PARAM_GPR_COUNT) |
||||
dp->val.u8 = (uint8_t) gprData[iCount++]; |
||||
else |
||||
dp->val.u8 = (uint8_t) *ap++; |
||||
break; |
||||
case nsXPTType::T_U16 : if (iCount < PARAM_GPR_COUNT) |
||||
dp->val.u16 = (uint16_t) gprData[iCount++]; |
||||
else |
||||
dp->val.u16 = (uint16_t) *ap++; |
||||
break; |
||||
case nsXPTType::T_U32 : if (iCount < PARAM_GPR_COUNT) |
||||
dp->val.u32 = (uint32_t) gprData[iCount++]; |
||||
else |
||||
dp->val.u32 = (uint32_t) *ap++; |
||||
break; |
||||
case nsXPTType::T_U64 : if (iCount < PARAM_GPR_COUNT) |
||||
((DU *)dp)->hi = (uint32_t) gprData[iCount++]; |
||||
else |
||||
((DU *)dp)->hi = (uint32_t) *ap++; |
||||
if (iCount < PARAM_GPR_COUNT) |
||||
((DU *)dp)->lo = (uint32_t) gprData[iCount++]; |
||||
else |
||||
((DU *)dp)->lo = (uint32_t) *ap++; |
||||
break; |
||||
case nsXPTType::T_FLOAT : if (fpCount < 13) { |
||||
dp->val.f = (float) fprData[fpCount++]; |
||||
if (iCount < PARAM_GPR_COUNT) |
||||
++iCount; |
||||
else |
||||
++ap; |
||||
} |
||||
else |
||||
dp->val.f = *((float*) ap++); |
||||
break; |
||||
case nsXPTType::T_DOUBLE : if (fpCount < 13) { |
||||
dp->val.d = (double) fprData[fpCount++]; |
||||
if (iCount < PARAM_GPR_COUNT) |
||||
++iCount; |
||||
else |
||||
++ap; |
||||
if (iCount < PARAM_GPR_COUNT) |
||||
++iCount; |
||||
else |
||||
++ap; |
||||
} |
||||
else { |
||||
dp->val.f = *((double*) ap); |
||||
ap += 2; |
||||
} |
||||
break; |
||||
case nsXPTType::T_BOOL : if (iCount < PARAM_GPR_COUNT) |
||||
dp->val.b = (bool) gprData[iCount++]; |
||||
else |
||||
dp->val.b = (bool) *ap++; |
||||
break; |
||||
case nsXPTType::T_CHAR : if (iCount < PARAM_GPR_COUNT) |
||||
dp->val.c = (char) gprData[iCount++]; |
||||
else |
||||
dp->val.c = (char) *ap++; |
||||
break; |
||||
case nsXPTType::T_WCHAR : if (iCount < PARAM_GPR_COUNT) |
||||
dp->val.wc = (wchar_t) gprData[iCount++]; |
||||
else |
||||
dp->val.wc = (wchar_t) *ap++; |
||||
break; |
||||
default: |
||||
NS_ERROR("bad type"); |
||||
break; |
||||
} |
||||
} |
||||
|
||||
result = self->mOuter->CallMethod((uint16_t)methodIndex,info,dispatchParams); |
||||
|
||||
if(dispatchParams != paramBuffer) |
||||
delete [] dispatchParams; |
||||
|
||||
return result; |
||||
} |
||||
|
||||
#define STUB_ENTRY(n) |
||||
|
||||
#define SENTINEL_ENTRY(n) \ |
||||
nsresult nsXPTCStubBase::Sentinel##n() \
|
||||
{ \
|
||||
NS_ERROR("nsXPTCStubBase::Sentinel called"); \
|
||||
return NS_ERROR_NOT_IMPLEMENTED; \
|
||||
} |
||||
|
||||
#include "xptcstubsdef.inc" |
||||
|
||||
#endif /* AIX */ |
@ -1,172 +0,0 @@ |
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this |
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
/* Implement shared vtbl methods. */ |
||||
|
||||
#include "xptcprivate.h" |
||||
#include "xptiprivate.h" |
||||
|
||||
#if defined(AIX) |
||||
|
||||
/*
|
||||
For PPC (AIX & MAC), the first 8 integral and the first 13 f.p. parameters
|
||||
arrive in a separate chunk of data that has been loaded from the registers.
|
||||
The args pointer has been set to the start of the parameters BEYOND the ones |
||||
arriving in registers |
||||
*/ |
||||
extern "C" nsresult ATTRIBUTE_USED |
||||
PrepareAndDispatch(nsXPTCStubBase* self, uint64_t methodIndex, uint64_t* args, uint64_t *gprData, double *fprData) |
||||
{ |
||||
|
||||
#define PARAM_BUFFER_COUNT 16 |
||||
#define PARAM_GPR_COUNT 7 |
||||
|
||||
nsXPTCMiniVariant paramBuffer[PARAM_BUFFER_COUNT]; |
||||
nsXPTCMiniVariant* dispatchParams = nullptr; |
||||
const nsXPTMethodInfo* info = nullptr; |
||||
uint8_t paramCount; |
||||
uint8_t i; |
||||
nsresult result = NS_ERROR_FAILURE; |
||||
|
||||
NS_ASSERTION(self,"no self"); |
||||
|
||||
self->mEntry->GetMethodInfo(uint16_t(methodIndex), &info); |
||||
NS_ASSERTION(info,"no method info"); |
||||
|
||||
paramCount = info->GetParamCount(); |
||||
|
||||
// setup variant array pointer
|
||||
if(paramCount > PARAM_BUFFER_COUNT) |
||||
dispatchParams = new nsXPTCMiniVariant[paramCount]; |
||||
else |
||||
dispatchParams = paramBuffer; |
||||
NS_ASSERTION(dispatchParams,"no place for params"); |
||||
|
||||
uint64_t* ap = args; |
||||
uint32_t iCount = 0; |
||||
uint32_t fpCount = 0; |
||||
for(i = 0; i < paramCount; i++) |
||||
{ |
||||
const nsXPTParamInfo& param = info->GetParam(i); |
||||
const nsXPTType& type = param.GetType(); |
||||
nsXPTCMiniVariant* dp = &dispatchParams[i]; |
||||
|
||||
if(param.IsOut() || !type.IsArithmetic()) |
||||
{ |
||||
if (iCount < PARAM_GPR_COUNT) |
||||
dp->val.p = (void*) gprData[iCount++]; |
||||
else |
||||
dp->val.p = (void*) *ap++; |
||||
continue; |
||||
} |
||||
// else
|
||||
switch(type) |
||||
{ |
||||
case nsXPTType::T_I8 : if (iCount < PARAM_GPR_COUNT) |
||||
dp->val.i8 = (int8_t) gprData[iCount++]; |
||||
else |
||||
dp->val.i8 = (int8_t) *ap++; |
||||
break; |
||||
case nsXPTType::T_I16 : if (iCount < PARAM_GPR_COUNT) |
||||
dp->val.i16 = (int16_t) gprData[iCount++]; |
||||
else |
||||
dp->val.i16 = (int16_t) *ap++; |
||||
break; |
||||
case nsXPTType::T_I32 : if (iCount < PARAM_GPR_COUNT) |
||||
dp->val.i32 = (int32_t) gprData[iCount++]; |
||||
else |
||||
dp->val.i32 = (int32_t) *ap++; |
||||
break; |
||||
case nsXPTType::T_I64 : if (iCount < PARAM_GPR_COUNT) |
||||
dp->val.i64 = (int64_t) gprData[iCount++]; |
||||
else |
||||
dp->val.i64 = (int64_t) *ap++; |
||||
break; |
||||