summaryrefslogtreecommitdiff
path: root/mozilla-1498938.patch
diff options
context:
space:
mode:
authorDan Horák <dan@danny.cz>2018-11-01 23:07:50 +0100
committerDan Horák <dan@danny.cz>2018-11-01 23:08:18 +0100
commit7dca0ec25c2f3c57717247fd4431b8c3b21f0f4a (patch)
tree616282486fdc2cc9fdaca2536392e7c9b6c5bfca /mozilla-1498938.patch
parentFixed typo on man page (rhbz#1643766) (diff)
downloadlibrewolf-fedora-ff-7dca0ec25c2f3c57717247fd4431b8c3b21f0f4a.tar.gz
librewolf-fedora-ff-7dca0ec25c2f3c57717247fd4431b8c3b21f0f4a.tar.bz2
librewolf-fedora-ff-7dca0ec25c2f3c57717247fd4431b8c3b21f0f4a.zip
Fix crash during start on ppc64le (rhbz#1643729)
Diffstat (limited to 'mozilla-1498938.patch')
-rw-r--r--mozilla-1498938.patch93
1 files changed, 93 insertions, 0 deletions
diff --git a/mozilla-1498938.patch b/mozilla-1498938.patch
new file mode 100644
index 0000000..9748670
--- /dev/null
+++ b/mozilla-1498938.patch
@@ -0,0 +1,93 @@
+
+# HG changeset patch
+# User A. Wilcox <AWilcox@Wilcox-Tech.com>
+# Date 1539817971 0
+# Node ID 06e5a5bfd05ef276dce035af837f2ba76e9a55a4
+# Parent 0ef00ee6c5312035280635f06e4790abd8b13729
+Bug 1498938 - Support [implicit_jscontext] XPIDL calls on Linux/PPC64.; r=froydnj
+
+diff --git a/xpcom/reflect/xptcall/md/unix/xptcstubs_ppc64_linux.cpp b/xpcom/reflect/xptcall/md/unix/xptcstubs_ppc64_linux.cpp
+--- a/xpcom/reflect/xptcall/md/unix/xptcstubs_ppc64_linux.cpp
++++ b/xpcom/reflect/xptcall/md/unix/xptcstubs_ppc64_linux.cpp
+@@ -61,43 +61,52 @@ PrepareAndDispatch(nsXPTCStubBase* self,
+
+ NS_ASSERTION(dispatchParams,"no place for params");
+ if (! dispatchParams)
+ return NS_ERROR_OUT_OF_MEMORY;
+
+ const uint8_t indexOfJSContext = info->IndexOfJSContext();
+
+ uint64_t* ap = args;
++ uint32_t iCount = 0;
++ uint32_t fpCount = 0;
+ uint64_t tempu64;
+
+ for(i = 0; i < paramCount; i++) {
+ const nsXPTParamInfo& param = info->GetParam(i);
+ const nsXPTType& type = param.GetType();
+ nsXPTCMiniVariant* dp = &dispatchParams[i];
+
+- MOZ_CRASH("NYI: support implicit JSContext*, bug 1475699");
++ if (i == indexOfJSContext) {
++ if (iCount < GPR_COUNT)
++ iCount++;
++ else
++ ap++;
++ }
+
+ if (!param.IsOut() && type == nsXPTType::T_DOUBLE) {
+- if (i < FPR_COUNT)
+- dp->val.d = fprData[i];
++ if (fpCount < FPR_COUNT) {
++ dp->val.d = fprData[fpCount++];
++ }
+ else
+ dp->val.d = *(double*) ap;
+ } else if (!param.IsOut() && type == nsXPTType::T_FLOAT) {
+- if (i < FPR_COUNT)
+- dp->val.f = (float) fprData[i]; // in registers floats are passed as doubles
++ if (fpCount < FPR_COUNT) {
++ dp->val.f = (float) fprData[fpCount++]; // 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 */
+- if (i < GPR_COUNT)
+- tempu64 = gprData[i];
++ if (iCount < GPR_COUNT)
++ tempu64 = gprData[iCount];
+ else
+ tempu64 = *ap;
+
+ if (param.IsOut() || !type.IsArithmetic())
+ dp->val.p = (void*) tempu64;
+ else if (type == nsXPTType::T_I8)
+ dp->val.i8 = (int8_t) tempu64;
+ else if (type == nsXPTType::T_I16)
+@@ -119,17 +128,19 @@ PrepareAndDispatch(nsXPTCStubBase* self,
+ else if (type == nsXPTType::T_CHAR)
+ dp->val.c = (char) tempu64;
+ else if (type == nsXPTType::T_WCHAR)
+ dp->val.wc = (wchar_t) tempu64;
+ else
+ NS_ERROR("bad type");
+ }
+
+- if (i >= 7)
++ if (iCount < GPR_COUNT)
++ iCount++; // gprs are skipped for fp args, so this always needs inc
++ else
+ ap++;
+ }
+
+ nsresult result = self->mOuter->CallMethod((uint16_t) methodIndex, info,
+ dispatchParams);
+
+ if (dispatchParams != paramBuffer)
+ delete [] dispatchParams;
+
bgstack15