aboutsummaryrefslogtreecommitdiff
path: root/meta-linaro-integration/recipes-overlayed/firefox/firefox/porting/Add-xptcall-support-for-SH4-processors.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-linaro-integration/recipes-overlayed/firefox/firefox/porting/Add-xptcall-support-for-SH4-processors.patch')
-rw-r--r--meta-linaro-integration/recipes-overlayed/firefox/firefox/porting/Add-xptcall-support-for-SH4-processors.patch522
1 files changed, 0 insertions, 522 deletions
diff --git a/meta-linaro-integration/recipes-overlayed/firefox/firefox/porting/Add-xptcall-support-for-SH4-processors.patch b/meta-linaro-integration/recipes-overlayed/firefox/firefox/porting/Add-xptcall-support-for-SH4-processors.patch
deleted file mode 100644
index 9e2f26c4..00000000
--- a/meta-linaro-integration/recipes-overlayed/firefox/firefox/porting/Add-xptcall-support-for-SH4-processors.patch
+++ /dev/null
@@ -1,522 +0,0 @@
-From: Mike Hommey <glandium@debian.org>
-Date: Fri, 30 Apr 2010 11:03:50 +0200
-Subject: Add xptcall support for SH4 processors
-
-Closes: #553593
-https://bugzilla.mozilla.org/show_bug.cgi?id=382214
----
- xpcom/reflect/xptcall/src/md/unix/Makefile.in | 11 +
- .../xptcall/src/md/unix/xptcinvoke_linux_sh.cpp | 203 +++++++++++++++
- .../xptcall/src/md/unix/xptcstubs_linux_sh.cpp | 271 ++++++++++++++++++++
- 3 files changed, 485 insertions(+)
- create mode 100644 xpcom/reflect/xptcall/src/md/unix/xptcinvoke_linux_sh.cpp
- create mode 100644 xpcom/reflect/xptcall/src/md/unix/xptcstubs_linux_sh.cpp
-
-diff --git a/xpcom/reflect/xptcall/src/md/unix/Makefile.in b/xpcom/reflect/xptcall/src/md/unix/Makefile.in
-index 6c50821..44d6ab1 100644
---- a/xpcom/reflect/xptcall/src/md/unix/Makefile.in
-+++ b/xpcom/reflect/xptcall/src/md/unix/Makefile.in
-@@ -430,6 +430,17 @@ CPPSRCS := xptcinvoke_linux_s390x.cpp xptcstubs_linux_s390x.cpp
- CXXFLAGS += -fno-strict-aliasing -fno-inline -fomit-frame-pointer -mbackchain
- endif
-
-+############
-+# SuperH
-+############
-+#
-+#
-+# Currently, tested on sh4 and sh4a (non sh4al and sh4al-dsp..)
-+ifeq ($(OS_ARCH),Linux)
-+ifneq (,$(filter sh4 sh4a,$(OS_TEST)))
-+CPPSRCS := xptcinvoke_linux_sh.cpp xptcstubs_linux_sh.cpp
-+endif
-+endif
-
- # we don't want the shared lib, but we want to force the creation of a static lib.
- FORCE_STATIC_LIB = 1
-diff --git a/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_linux_sh.cpp b/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_linux_sh.cpp
-new file mode 100644
-index 0000000..ca4807d
---- /dev/null
-+++ b/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_linux_sh.cpp
-@@ -0,0 +1,203 @@
-+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
-+ *
-+ * ***** BEGIN LICENSE BLOCK *****
-+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
-+ *
-+ * The contents of this file are subject to the Mozilla Public License Version
-+ * 1.1 (the "License"); you may not use this file except in compliance with
-+ * the License. You may obtain a copy of the License at
-+ * http://www.mozilla.org/MPL/
-+ *
-+ * Software distributed under the License is distributed on an "AS IS" basis,
-+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
-+ * for the specific language governing rights and limitations under the
-+ * License.
-+ *
-+ * The Original Code is mozilla.org code.
-+ *
-+ * The Initial Developer of the Original Code is
-+ * Netscape Communications Corporation.
-+ * Portions created by the Initial Developer are Copyright (C) 1998
-+ * the Initial Developer. All Rights Reserved.
-+ *
-+ * Contributor(s):
-+ * - Copyright (C) 2008-2009 STMicroelectronics
-+ *
-+ * Alternatively, the contents of this file may be used under the terms of
-+ * either of the GNU General Public License Version 2 or later (the "GPL"),
-+ * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
-+ * in which case the provisions of the GPL or the LGPL are applicable instead
-+ * of those above. If you wish to allow use of your version of this file only
-+ * under the terms of either the GPL or the LGPL, and not to allow others to
-+ * use your version of this file under the terms of the MPL, indicate your
-+ * decision by deleting the provisions above and replace them with the notice
-+ * and other provisions required by the GPL or the LGPL. If you do not delete
-+ * the provisions above, a recipient may use your version of this file under
-+ * the terms of any one of the MPL, the GPL or the LGPL.
-+ *
-+ * Based on the neutroni port, however that assumed that the compiler was pushing params
-+ * onto the stack. Change to take this into account.
-+ *
-+ * ***** END LICENSE BLOCK ***** */
-+
-+#include "xptcprivate.h"
-+
-+extern "C" {
-+
-+const int c_int_register_params = 4;
-+const int c_float_register_params = 8;
-+
-+static PRUint32 __attribute__((__used__))
-+copy_to_stack(PRUint32 **that,PRUint32 methodIndex,PRUint32 paramCount, nsXPTCVariant* s,PRUint32* data)
-+{
-+ int intCount = 1; // Because of that
-+ int floatCount = 0;
-+ PRUint32 *intRegParams=data+1 ;
-+ float *floatRegParams = (float *)(data+4);
-+
-+ /* Push the that register into the right place so it can be restored on exit */
-+ *data= (PRUint32)(that);
-+ data+=12; /* 4 integer registers, and 8 floating point registers */
-+
-+ for ( PRUint32 i = 0; i < paramCount; ++i, ++s )
-+ {
-+ nsXPTType type = s->IsPtrData() ? nsXPTType::T_I32 : s->type;
-+
-+ switch ( type ) {
-+ case nsXPTType::T_I64:
-+ case nsXPTType::T_U64:
-+ // Space to pass in registers?
-+ if ( (c_int_register_params - intCount) >= 2 ) {
-+ *((PRInt64 *) intRegParams) = s->val.i64;
-+ intRegParams += 2;
-+ intCount += 2;
-+ }
-+ else {
-+ *((PRInt64*) data) = s->val.i64;
-+ data += 2;
-+ }
-+ break;
-+ case nsXPTType::T_FLOAT:
-+ // Space to pass in registers?
-+ if ( floatCount < c_float_register_params ) {
-+ *floatRegParams = s->val.f;
-+ ++floatCount;
-+ ++floatRegParams;
-+ }
-+ else {
-+ *((float*) data) = s->val.f;
-+ ++data;
-+ }
-+ break;
-+ case nsXPTType::T_DOUBLE:
-+ // Space to pass in registers?
-+ if ( (c_float_register_params - floatCount) >= 2 ) {
-+ if ( (floatCount & 1) != 0 ) {
-+ ++floatCount;
-+ ++floatRegParams;
-+ }
-+ *(double *)floatRegParams = s->val.d;
-+ floatCount += 2;
-+ floatRegParams += 2;
-+ }
-+ else {
-+ *((double *) data) = s->val.d;
-+ data += 2;
-+ }
-+ break;
-+ default: // 32 (non-float) value
-+ PRInt32 value = (PRInt32) (s->IsPtrData() ? s->ptr : s->val.p);
-+ // Space to pass in registers?
-+ if ( intCount < c_int_register_params ) {
-+ *intRegParams = value;
-+ ++intRegParams;
-+ ++intCount;
-+ }
-+ else {
-+ *data = value;
-+ ++data;
-+ }
-+ break;
-+ }
-+ }
-+
-+ /* Now calculate the return address
-+ * Dereference that to get vtable pointer
-+ */
-+ return *( (*(that))+(methodIndex) );
-+
-+}
-+
-+}
-+
-+ /* This was originally done as a C function, but the original code was
-+ * relying on how the compiler laid out the stack. Later versions of
-+ * gcc do a better job of optimising and never push the parameters on the
-+ * stack. So it is simpler to just write the whole thing in assembler anyway
-+ */
-+
-+ /* Because the SH processor passes the first few parameters in registers
-+ it is a bit tricky setting things up right. To make things easier,
-+ all the hard work will be done by copy_to_stack above. We pass to it
-+ a chunk of memory, the bottom of which will be copied to registers r4 to r7
-+ and fr4 to fr11 before calling the target function.
-+ */
-+
-+/* r4= that, r5=methodIndex,r6=paramCount,r7=params */
-+
-+ __asm__ (
-+
-+
-+ /* Make space for parameters to be passed to the method. Assume worst case
-+ 8 bytes per parameter. Also leave space for 4 longs and 8 floats that
-+ will be put into registers. The worst case is all int64 parameters
-+ and even in this case 8 bytes are passed in registers so we can
-+ deduct this from our allocation.
-+ */
-+ ".section .text\n"
-+ ".balign 4\n"
-+ ".global NS_InvokeByIndex_P\n"
-+ "NS_InvokeByIndex_P:\n"
-+ "mov.l r14, @-r15 \n\t" // Push frame
-+ "sts.l pr, @-r15 \n\t" // Push link
-+ "mov.l r8, @-r15 \n\t" // Save
-+ "mov r15, r14\n\t" // Set frame
-+ "mov #3, r1 \n\t" // Assume worse case, all params are 64bit, hence *8
-+ "mov r6, r2\n\t"
-+ "shld r1, r2 \n\t"
-+ "mov r2, r8 \n\t" // Save stack drop
-+ "add #48, r2 \n\t" // Space for 4 longs, 8 floats
-+ "sub r2, r15 \n\t" // Drop stack
-+ "mov.l 1f, r1 \n\t" // Get address of copy_to_stack_function
-+ "jsr @r1 \n\t"
-+ "mov.l r15, @-r15 \n\t" // Params will be dumped here
-+ "add #4, r15 \n\t" // Pop stack ptr param. r0 contains method address
-+
-+ /* Now everything is laid out nicely in the stack. We just have to
-+ load values at the top end of the memory area into registers and
-+ make the call. We may load more things into registers than needed,
-+ but nobody will care about that.
-+ */
-+
-+ "mov.l @r15+, r4 \n\t" // that
-+ "mov.l @r15+, r5 \n\t"
-+ "mov.l @r15+, r6 \n\t"
-+ "mov.l @r15+, r7 \n\t"
-+ "fmov.s @r15+, fr5 \n\t"
-+ "fmov.s @r15+, fr4 \n\t"
-+ "fmov.s @r15+, fr7 \n\t"
-+ "fmov.s @r15+, fr6 \n\t"
-+ "fmov.s @r15+, fr9 \n\t"
-+ "fmov.s @r15+, fr8 \n\t"
-+ "fmov.s @r15+, fr11 \n\t"
-+ "jsr @r0 \n\t" // Invoke method
-+ "fmov.s @r15+, fr10 \n\t"
-+ "add r8, r15\n\t" // Pop stack back
-+ "mov.l @r15+, r8\n\t" // Restore r8
-+ "lds.l @r15+, pr\n\t"
-+ "rts\n\t"
-+ "mov.l @r15+, r14\n\t"
-+ ".balign 4\n\t"
-+ "1: .long copy_to_stack \n\t"
-+ );
-+
-diff --git a/xpcom/reflect/xptcall/src/md/unix/xptcstubs_linux_sh.cpp b/xpcom/reflect/xptcall/src/md/unix/xptcstubs_linux_sh.cpp
-new file mode 100644
-index 0000000..cf9fcea
---- /dev/null
-+++ b/xpcom/reflect/xptcall/src/md/unix/xptcstubs_linux_sh.cpp
-@@ -0,0 +1,271 @@
-+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-+/* ***** BEGIN LICENSE BLOCK *****
-+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
-+ *
-+ * The contents of this file are subject to the Mozilla Public License Version
-+ * 1.1 (the "License"); you may not use this file except in compliance with
-+ * the License. You may obtain a copy of the License at
-+ * http://www.mozilla.org/MPL/
-+ *
-+ * Software distributed under the License is distributed on an "AS IS" basis,
-+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
-+ * for the specific language governing rights and limitations under the
-+ * License.
-+ *
-+ * The Original Code is mozilla.org code.
-+ *
-+ * The Initial Developer of the Original Code is
-+ * Netscape Communications Corporation.
-+ * Portions created by the Initial Developer are Copyright (C) 1999
-+ * the Initial Developer. All Rights Reserved.
-+ *
-+ * Contributor(s):
-+ * - Copyright (C) 2008-2009 STMicroelectronics
-+ *
-+ * Alternatively, the contents of this file may be used under the terms of
-+ * either of the GNU General Public License Version 2 or later (the "GPL"),
-+ * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
-+ * in which case the provisions of the GPL or the LGPL are applicable instead
-+ * of those above. If you wish to allow use of your version of this file only
-+ * under the terms of either the GPL or the LGPL, and not to allow others to
-+ * use your version of this file under the terms of the MPL, indicate your
-+ * decision by deleting the provisions above and replace them with the notice
-+ * and other provisions required by the GPL or the LGPL. If you do not delete
-+ * the provisions above, a recipient may use your version of this file under
-+ * the terms of any one of the MPL, the GPL or the LGPL.
-+ *
-+ * Based on the neutrino code, with some bug fixes and using the C preprocessor
-+ * like all the other ports rather than the python script.
-+ *
-+ * ***** END LICENSE BLOCK ***** */
-+
-+#include "xptcprivate.h"
-+#include "xptiprivate.h"
-+
-+const int c_int_register_params = 3;
-+const int c_float_register_params = 8;
-+
-+/*
-+ Dispatch function for all stubs.
-+
-+ The parameters to the original function are spread between 'data' which
-+ is value of the stack pointer when the stub was called, intRegParams which
-+ points to an area containing the values of r5, r6 and r7 when the stub was
-+ called and floatRegParams which points to an area containing the values
-+ of float registers fr4 to fr11 when the stub was called.
-+
-+ */
-+extern "C" nsresult
-+PrepareAndDispatch(nsXPTCStubBase* self, int methodIndex, PRUint32* data,
-+ PRUint32 *intRegParams, float *floatRegParams)
-+{
-+#define PARAM_BUFFER_COUNT 16
-+
-+ nsresult result = NS_ERROR_FAILURE;
-+ int intCount = 0;
-+ int floatCount = 0;
-+ nsXPTCMiniVariant paramBuffer[PARAM_BUFFER_COUNT];
-+ nsXPTCMiniVariant* dispatchParams = NULL;
-+ const nsXPTMethodInfo* info;
-+ PRUint8 paramCount;
-+ PRUint8 i;
-+
-+ NS_ASSERTION(self,"no self");
-+
-+ self->mEntry->GetMethodInfo(PRUint16(methodIndex), &info);
-+ NS_ASSERTION(info,"no interface 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");
-+
-+ for ( i = 0; i < paramCount; ++i ) {
-+ const nsXPTParamInfo& param = info->GetParam(i);
-+ nsXPTCMiniVariant* dp = &dispatchParams[i];
-+ nsXPTType type = param.IsOut() ? nsXPTType::T_I32 : param.GetType();
-+
-+ switch ( type ) {
-+ case nsXPTType::T_I64:
-+ case nsXPTType::T_U64:
-+ // Was this passed in a register?
-+ if ( (c_int_register_params - intCount) >= 2 ) {
-+ dp->val.i64 = *((PRInt64 *) intRegParams);
-+ intRegParams += 2;
-+ intCount += 2;
-+ }
-+ else {
-+ dp->val.i64 = *((PRInt64*) data);
-+ data += 2;
-+ }
-+ break;
-+ case nsXPTType::T_FLOAT:
-+ // Was this passed in a register?
-+ if ( floatCount < c_float_register_params ) {
-+ dp->val.f = *floatRegParams;
-+ ++floatCount;
-+ ++floatRegParams;
-+ }
-+ else {
-+ dp->val.f = *((float*) data);
-+ ++data;
-+ }
-+ break;
-+ case nsXPTType::T_DOUBLE:
-+ // Was this passed in a register?
-+ if ( (c_float_register_params - floatCount) >= 2 ) {
-+ if ( floatCount & 1 != 0 ) {
-+ ++floatCount;
-+ ++floatRegParams;
-+ }
-+ dp->val.d = *(double *)floatRegParams;
-+ floatCount += 2;
-+ floatRegParams += 2;
-+ }
-+ else {
-+ dp->val.d = *((double *) data);
-+ data += 2;
-+ }
-+ break;
-+ default: // 32-bit (non-float) value
-+ // Was this passed in a register?
-+ if ( intCount < c_int_register_params ) {
-+ dp->val.i32 = *intRegParams;
-+ ++intRegParams;
-+ ++intCount;
-+ }
-+ else {
-+ dp->val.i32 = *data;
-+ ++data;
-+ }
-+ break;
-+ }
-+ }
-+
-+ result = self->mOuter->CallMethod((PRUint16)methodIndex, info, dispatchParams);
-+
-+ if(dispatchParams != paramBuffer)
-+ delete [] dispatchParams;
-+
-+ return result;
-+}
-+
-+
-+__asm__ (
-+ ".text\n"
-+ ".little\n"
-+ ".section .rodata\n"
-+
-+ ".globl SharedStub\n"
-+ ".type SharedStub, @function\n"
-+ "SharedStub:\n"
-+ "mov r15, r1\n"
-+ "mov.l r14,@-r15\n"
-+ "sts.l pr,@-r15\n"
-+ "mov r15, r14\n"
-+
-+ /* Some parameters might have been passed in registers, so push them
-+ * all onto the stack, PrepareAndDispatch can then work out whats what
-+ * given method type information.
-+ */
-+ "mov.l r7, @-r15\n"
-+ "mov.l r6, @-r15\n"
-+ "mov.l r5, @-r15\n"
-+ "mov r15, r7\n" /* r7 = PrepareAndDispatch intRegParams param */
-+
-+ "fmov.s fr10, @-r15\n"
-+ "fmov.s fr11, @-r15\n"
-+ "fmov.s fr8, @-r15\n"
-+ "fmov.s fr9, @-r15\n"
-+ "fmov.s fr6, @-r15\n"
-+ "fmov.s fr7, @-r15\n"
-+ "fmov.s fr4, @-r15\n"
-+ "fmov.s fr5, @-r15\n"
-+ "mov.l r15, @-r15\n" /* PrepareAndDispatch floatRegParams param */
-+
-+ "mov r1, r6\n" /* r6 = PrepareAndDispatch data param */
-+
-+ "mov.l 1f, r1\n"
-+ "jsr @r1\n" /* Note, following instruction is executed first*/
-+ "mov r2, r5\n" /* r5 = PrepareAndDispatch methodIndex param */
-+
-+ "mov r14,r15\n"
-+ "lds.l @r15+,pr\n"
-+ "mov.l @r15+,r14\n"
-+ "rts\n"
-+ "nop\n"
-+ ".align 2\n"
-+ "1:\n"
-+ ".long PrepareAndDispatch\n"
-+ );
-+
-+#define STUB_ENTRY(n) \
-+__asm__( \
-+ ".text\n" \
-+ ".align 1 \n" \
-+ ".if " #n " < 10\n\t" \
-+ ".globl _ZN14nsXPTCStubBase5Stub" #n "Ev\n\t" \
-+ ".type _ZN14nsXPTCStubBase5Stub" #n "Ev,@function\n"\
-+ "_ZN14nsXPTCStubBase5Stub" #n "Ev:\n\t" \
-+ ".elseif " #n " < 100\n\t" \
-+ ".globl _ZN14nsXPTCStubBase6Stub" #n "Ev\n\t" \
-+ ".type _ZN14nsXPTCStubBase6Stub" #n "Ev,@function\n"\
-+ "_ZN14nsXPTCStubBase6Stub" #n "Ev:\n\t" \
-+ ".elseif " #n " < 1000\n\t" \
-+ ".globl _ZN14nsXPTCStubBase7Stub" #n "Ev\n\t" \
-+ ".type _ZN14nsXPTCStubBase7Stub" #n "Ev,@function\n"\
-+ "_ZN14nsXPTCStubBase7Stub" #n "Ev:\n\t" \
-+ ".else\n\t" \
-+ ".err \"stub number " #n " >= 1000 not yet supported\"\n\t" \
-+ ".endif\n\t" \
-+ "mov.l 1f, r1 \n" \
-+ ".if "#n" < 128 \n" \
-+ "jmp @r1 \n" \
-+ " mov #"#n",r2 \n" \
-+ ".elseif "#n" < 256 \n" \
-+ "mov #"#n", r2 \n" \
-+ "jmp @r1 \n" \
-+ " extu.b r2, r2 \n" \
-+ ".else \n" \
-+ "mov #"#n" & 0xff,r2 \n" \
-+ "extu.b r2, r2 \n" \
-+ "mov #"#n">>8, r3 \n" \
-+ "shll8 r3 \n" \
-+ "jmp @r1 \n" \
-+ " or r3, r2 \n" \
-+ ".endif \n" \
-+ ".if "#n" % 20 == 0\n" \
-+ ".align 2\n" \
-+ "1:\n" \
-+ ".long SharedStub\n" \
-+ ".endif\n" \
-+ );
-+
-+
-+/* Due to the fact that the SH4 can only load forward labels, we have
-+ * to use sentinel_entry to output the last label. A better solution
-+ * would be to introduce a STUB_LAST macro in the defs.in file, but
-+ * this will do for now
-+ */
-+
-+#define SENTINEL_ENTRY(n) \
-+__asm__( \
-+".if "#n" == 0 \n" \
-+ ".text \n" \
-+ ".align 2\n" \
-+ "1:\n" \
-+ ".long SharedStub\n" \
-+".endif\n" \
-+); \
-+ \
-+nsresult nsXPTCStubBase::Sentinel##n() \
-+{ \
-+ NS_ASSERTION(0,"nsXPTCStubBase::Sentinel called"); \
-+ return NS_ERROR_NOT_IMPLEMENTED; \
-+}
-+
-+#include "xptcstubsdef.inc"