Login
[x]
Log in using an account from:
Fedora Account System
Red Hat Associate
Red Hat Customer
Or login using a Red Hat Bugzilla account
Forgot Password
Login:
Hide Forgot
Create an Account
Red Hat Bugzilla – Attachment 885624 Details for
Bug 1086937
Add ppc64le support to Thunderbird
[?]
New
Simple Search
Advanced Search
My Links
Browse
Requests
Reports
Current State
Search
Tabular reports
Graphical reports
Duplicates
Other Reports
User Changes
Plotly Reports
Bug Status
Bug Severity
Non-Defaults
|
Product Dashboard
Help
Page Help!
Bug Writing Guidelines
What's new
Browser Support Policy
5.0.4.rh83 Release notes
FAQ
Guides index
User guide
Web Services
Contact
Legal
This site requires JavaScript to be enabled to function correctly, please enable it.
[patch]
Part 3: xptcall port
ppc64le-xptcall.patch (text/plain), 13.34 KB, created by
Gustavo Luiz Duarte
on 2014-04-11 21:34:13 UTC
(
hide
)
Description:
Part 3: xptcall port
Filename:
MIME Type:
Creator:
Gustavo Luiz Duarte
Created:
2014-04-11 21:34:13 UTC
Size:
13.34 KB
patch
obsolete
>Author: Ulrich Weigand <uweigand@de.ibm.com> >Subject: [PATCH 3/4] Add ppc64le support -- xptcall > >Backport to mozilla-24 by Gustavo Luiz Duarte <gustavold@linux.vnet.ibm.com> >Orignal patch sent to Mozilla bug #976648 > >--- > .../xpcom/reflect/xptcall/src/md/unix/Makefile.in | 2 +- > .../xpcom/reflect/xptcall/src/md/unix/moz.build | 2 +- > .../src/md/unix/xptcinvoke_asm_ppc64_linux.s | 61 +++++++++++++++++----- > .../xptcall/src/md/unix/xptcinvoke_ppc64_linux.cpp | 2 + > .../src/md/unix/xptcstubs_asm_ppc64_linux.s | 28 +++++++++- > .../xptcall/src/md/unix/xptcstubs_ppc64_linux.cpp | 40 ++++++++++++++ > 6 files changed, 119 insertions(+), 16 deletions(-) > >diff --git a/mozilla/xpcom/reflect/xptcall/src/md/unix/Makefile.in b/mozilla/xpcom/reflect/xptcall/src/md/unix/Makefile.in >index 6290bdc..8752565 100644 >--- a/mozilla/xpcom/reflect/xptcall/src/md/unix/Makefile.in >+++ b/mozilla/xpcom/reflect/xptcall/src/md/unix/Makefile.in >@@ -175,7 +175,7 @@ endif > # > # Linux/PPC64 > # >-ifneq (,$(filter Linuxpowerpc64 FreeBSDpowerpc64,$(OS_ARCH)$(OS_TEST))) >+ifneq (,$(filter Linuxpowerpc64 Linuxpowerpc64le FreeBSDpowerpc64,$(OS_ARCH)$(OS_TEST))) > ASFILES := xptcinvoke_asm_ppc64_linux.s xptcstubs_asm_ppc64_linux.s > AS := $(CC) -c -x assembler-with-cpp > endif >diff --git a/mozilla/xpcom/reflect/xptcall/src/md/unix/moz.build b/mozilla/xpcom/reflect/xptcall/src/md/unix/moz.build >index 0081168..be9e28f 100644 >--- a/mozilla/xpcom/reflect/xptcall/src/md/unix/moz.build >+++ b/mozilla/xpcom/reflect/xptcall/src/md/unix/moz.build >@@ -191,7 +191,7 @@ if CONFIG['OS_TEST'] == 'powerpc': > 'xptcstubs_ppc_linux.cpp', > ] > >-if CONFIG['OS_TEST'] == 'powerpc64': >+if CONFIG['OS_TEST'] in ('powerpc64', 'powerpc64le'): > if CONFIG['OS_ARCH'] in ('Linux', 'FreeBSD'): > CPP_SOURCES += [ > 'xptcinvoke_ppc64_linux.cpp', >diff --git a/mozilla/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_asm_ppc64_linux.s b/mozilla/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_asm_ppc64_linux.s >index 5d4f70c..37211c8 100644 >--- a/mozilla/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_asm_ppc64_linux.s >+++ b/mozilla/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_asm_ppc64_linux.s >@@ -17,12 +17,38 @@ > .set f25,25; .set f26,26; .set f27,27; .set f28,28; .set f29,29 > .set f30,30; .set f31,31 > >+# The ABI defines a fixed stack frame area of 4 doublewords (ELFv2) >+# or 6 doublewords (ELFv1); the last of these doublewords is used >+# as TOC pointer save area. The fixed area is followed by a parameter >+# save area of 8 doublewords (used for vararg routines), followed >+# by space for parameters passed on the stack. >+# >+# We set STACK_TOC to the offset of the TOC pointer save area, and >+# STACK_PARAMS to the offset of the first on-stack parameter. >+ >+#if _CALL_ELF == 2 >+#define STACK_TOC 24 >+#define STACK_PARAMS 96 >+#else >+#define STACK_TOC 40 >+#define STACK_PARAMS 112 >+#endif > > # > # NS_InvokeByIndex(nsISupports* that, uint32_t methodIndex, > # uint32_t paramCount, nsXPTCVariant* params) > # > >+#if _CALL_ELF == 2 >+ .section ".text" >+ .type NS_InvokeByIndex,@function >+ .globl NS_InvokeByIndex >+ .align 2 >+NS_InvokeByIndex: >+0: addis 2,12,(.TOC.-0b)@ha >+ addi 2,2,(.TOC.-0b)@l >+ .localentry NS_InvokeByIndex,.-NS_InvokeByIndex >+#else > .section ".toc","aw" > .section ".text" > .align 2 >@@ -34,6 +60,7 @@ NS_InvokeByIndex: > .previous > .type NS_InvokeByIndex,@function > .NS_InvokeByIndex: >+#endif > mflr 0 > std 0,16(r1) > >@@ -50,13 +77,12 @@ NS_InvokeByIndex: > # we don't actually need stack space for those. We must ensure > # that the stack remains 16-byte aligned. > # >- # | ..128-byte stack frame.. | | 7 GP | 13 FP | 3 NV | >- # | |(params)........| regs | regs | regs | >- # (r1)...........(+112)....(+128) >- # (-23*8).(-16*8).(-3*8)..(r31) >+ # | (fixed area + | | 7 GP | 13 FP | 3 NV | >+ # | param. save) |(params)........| regs | regs | regs | >+ # (r1)......(+STACK_PARAMS)... (-23*8).(-16*8).(-3*8)..(r31) > > # +stack frame, -unused stack params, +regs storage, +1 for alignment >- addi r7,r5,((112/8)-7+7+13+3+1) >+ addi r7,r5,((STACK_PARAMS/8)-7+7+13+3+1) > rldicr r7,r7,3,59 # multiply by 8 and mask with ~15 > neg r7,r7 > stdux r1,r1,r7 >@@ -67,12 +93,13 @@ NS_InvokeByIndex: > # uint64_t* d)) > > # r5, r6 are passed through intact (paramCount, params) >- # r7 (d) has to be r1+112 -- where parameters are passed on the stack. >+ # r7 (d) has to be r1+STACK_PARAMS >+ # -- where parameters are passed on the stack. > # r3, r4 are above that, easier to address from r31 than from r1 > > subi r3,r31,(23*8) # r3 --> GPRS > subi r4,r31,(16*8) # r4 --> FPRS >- addi r7,r1,112 # r7 --> params >+ addi r7,r1,STACK_PARAMS # r7 --> params > bl invoke_copy_to_stack > nop > >@@ -83,14 +110,18 @@ NS_InvokeByIndex: > > sldi r30,r30,3 # Find function descriptor > add r9,r9,r30 >- ld r9,0(r9) >+ ld r12,0(r9) > >- ld r0,0(r9) # Actual address from fd. >- std r2,40(r1) # Save r2 (TOC pointer) >+ std r2,STACK_TOC(r1) # Save r2 (TOC pointer) > >+#if _CALL_ELF == 2 >+ mtctr r12 >+#else >+ ld r0,0(r12) # Actual address from fd. > mtctr 0 >- ld r11,16(r9) # Environment pointer from fd. >- ld r2,8(r9) # TOC pointer from fd. >+ ld r11,16(r12) # Environment pointer from fd. >+ ld r2,8(r12) # TOC pointer from fd. >+#endif > > # Load FP and GP registers as required > ld r4, -(23*8)(r31) >@@ -117,7 +148,7 @@ NS_InvokeByIndex: > > bctrl # Do it > >- ld r2,40(r1) # Load our own TOC pointer >+ ld r2,STACK_TOC(r1) # Load our own TOC pointer > ld r1,0(r1) # Revert stack frame > ld 0,16(r1) # Reload lr > ld 29,-24(r1) # Restore NVGPRS >@@ -126,7 +157,11 @@ NS_InvokeByIndex: > mtlr 0 > blr > >+#if _CALL_ELF == 2 >+ .size NS_InvokeByIndex,.-NS_InvokeByIndex >+#else > .size NS_InvokeByIndex,.-.NS_InvokeByIndex >+#endif > > # Magic indicating no need for an executable stack > .section .note.GNU-stack, "", @progbits ; .previous >diff --git a/mozilla/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_ppc64_linux.cpp b/mozilla/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_ppc64_linux.cpp >index e20e67e..c93dc46 100644 >--- a/mozilla/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_ppc64_linux.cpp >+++ b/mozilla/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_ppc64_linux.cpp >@@ -74,7 +74,9 @@ invoke_copy_to_stack(uint64_t* gpregs, > fpregs[i] = s->val.f; // if passed in registers, floats are promoted to doubles > } else { > float *p = (float *)d; >+#ifndef __LITTLE_ENDIAN__ > p++; >+#endif > *p = s->val.f; > } > } >diff --git a/mozilla/xpcom/reflect/xptcall/src/md/unix/xptcstubs_asm_ppc64_linux.s b/mozilla/xpcom/reflect/xptcall/src/md/unix/xptcstubs_asm_ppc64_linux.s >index 6e0d416..a7a4615 100644 >--- a/mozilla/xpcom/reflect/xptcall/src/md/unix/xptcstubs_asm_ppc64_linux.s >+++ b/mozilla/xpcom/reflect/xptcall/src/md/unix/xptcstubs_asm_ppc64_linux.s >@@ -17,6 +17,27 @@ > .set f25,25; .set f26,26; .set f27,27; .set f28,28; .set f29,29 > .set f30,30; .set f31,31 > >+#if _CALL_ELF == 2 >+#define STACK_PARAMS 96 >+#else >+#define STACK_PARAMS 112 >+#endif >+ >+#if _CALL_ELF == 2 >+ .section ".text" >+ .type SharedStub,@function >+ .globl SharedStub >+ # Make the symbol hidden so that the branch from the stub does >+ # not go via a PLT. This is not only better for performance, >+ # but may be necessary to avoid linker errors since there is >+ # no place to restore the TOC register in a sibling call. >+ .hidden SharedStub >+ .align 2 >+SharedStub: >+0: addis 2,12,(.TOC.-0b)@ha >+ addi 2,2,(.TOC.-0b)@l >+ .localentry SharedStub,.-SharedStub >+#else > .section ".text" > .align 2 > .globl SharedStub >@@ -29,6 +50,7 @@ SharedStub: > .type SharedStub,@function > > .SharedStub: >+#endif > mflr r0 > > std r4, -56(r1) # Save all GPRS >@@ -55,7 +77,7 @@ SharedStub: > > subi r6,r1,56 # r6 --> gprData > subi r7,r1,160 # r7 --> fprData >- addi r5,r1,112 # r5 --> extra stack args >+ addi r5,r1,STACK_PARAMS # r5 --> extra stack args > > std r0, 16(r1) > >@@ -75,7 +97,11 @@ SharedStub: > mtlr r0 > blr > >+#if _CALL_ELF == 2 >+ .size SharedStub,.-SharedStub >+#else > .size SharedStub,.-.SharedStub >+#endif > > # Magic indicating no need for an executable stack > .section .note.GNU-stack, "", @progbits ; .previous >diff --git a/mozilla/xpcom/reflect/xptcall/src/md/unix/xptcstubs_ppc64_linux.cpp b/mozilla/xpcom/reflect/xptcall/src/md/unix/xptcstubs_ppc64_linux.cpp >index da6a965..004466c 100644 >--- a/mozilla/xpcom/reflect/xptcall/src/md/unix/xptcstubs_ppc64_linux.cpp >+++ b/mozilla/xpcom/reflect/xptcall/src/md/unix/xptcstubs_ppc64_linux.cpp >@@ -83,7 +83,9 @@ PrepareAndDispatch(nsXPTCStubBase* self, > dp->val.f = (float) fprData[i]; // in registers floats are passed as doubles > else { > float *p = (float *)ap; >+#ifndef __LITTLE_ENDIAN__ > p++; >+#endif > dp->val.f = *p; > } > } else { /* integer type or pointer */ >@@ -153,6 +155,43 @@ PrepareAndDispatch(nsXPTCStubBase* self, > // etc. > // Use assembler directives to get the names right... > >+#if _CALL_ELF == 2 >+# define STUB_ENTRY(n) \ >+__asm__ ( \ >+ ".section \".text\" \n\t" \ >+ ".align 2 \n\t" \ >+ ".if "#n" < 10 \n\t" \ >+ ".globl _ZN14nsXPTCStubBase5Stub"#n"Ev \n\t" \ >+ ".type _ZN14nsXPTCStubBase5Stub"#n"Ev,@function \n\n" \ >+"_ZN14nsXPTCStubBase5Stub"#n"Ev: \n\t" \ >+ "0: addis 2,12,.TOC.-0b@ha \n\t" \ >+ "addi 2,2,.TOC.-0b@l \n\t" \ >+ ".localentry _ZN14nsXPTCStubBase5Stub"#n"Ev,.-_ZN14nsXPTCStubBase5Stub"#n"Ev \n\t" \ >+ \ >+ ".elseif "#n" < 100 \n\t" \ >+ ".globl _ZN14nsXPTCStubBase6Stub"#n"Ev \n\t" \ >+ ".type _ZN14nsXPTCStubBase6Stub"#n"Ev,@function \n\n" \ >+"_ZN14nsXPTCStubBase6Stub"#n"Ev: \n\t" \ >+ "0: addis 2,12,.TOC.-0b@ha \n\t" \ >+ "addi 2,2,.TOC.-0b@l \n\t" \ >+ ".localentry _ZN14nsXPTCStubBase6Stub"#n"Ev,.-_ZN14nsXPTCStubBase6Stub"#n"Ev \n\t" \ >+ \ >+ ".elseif "#n" < 1000 \n\t" \ >+ ".globl _ZN14nsXPTCStubBase7Stub"#n"Ev \n\t" \ >+ ".type _ZN14nsXPTCStubBase7Stub"#n"Ev,@function \n\n" \ >+"_ZN14nsXPTCStubBase7Stub"#n"Ev: \n\t" \ >+ "0: addis 2,12,.TOC.-0b@ha \n\t" \ >+ "addi 2,2,.TOC.-0b@l \n\t" \ >+ ".localentry _ZN14nsXPTCStubBase7Stub"#n"Ev,.-_ZN14nsXPTCStubBase7Stub"#n"Ev \n\t" \ >+ \ >+ ".else \n\t" \ >+ ".err \"stub number "#n" >= 1000 not yet supported\"\n" \ >+ ".endif \n\t" \ >+ \ >+ "li 11,"#n" \n\t" \ >+ "b SharedStub \n" \ >+); >+#else > # define STUB_ENTRY(n) \ > __asm__ ( \ > ".section \".toc\",\"aw\" \n\t" \ >@@ -195,6 +234,7 @@ __asm__ ( \ > "li 11,"#n" \n\t" \ > "b SharedStub \n" \ > ); >+#endif > > #define SENTINEL_ENTRY(n) \ > nsresult nsXPTCStubBase::Sentinel##n() \ >-- >1.9.0 >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 1086937
:
885622
|
885623
| 885624 |
885625