svn commit: r563863 - in head/www/firefox: . files
Piotr Kubaj
pkubaj at FreeBSD.org
Wed Feb 3 02:28:51 UTC 2021
Author: pkubaj
Date: Wed Feb 3 02:28:50 2021
New Revision: 563863
URL: https://svnweb.freebsd.org/changeset/ports/563863
Log:
www/firefox: fix runtime crashes on powerpc64*
Details in https://bugzilla.mozilla.org/show_bug.cgi?id=1690152
Approved by: tier 2 blanket
Added:
head/www/firefox/files/patch-bug1690152 (contents, props changed)
Modified:
head/www/firefox/Makefile
Modified: head/www/firefox/Makefile
==============================================================================
--- head/www/firefox/Makefile Wed Feb 3 02:26:43 2021 (r563862)
+++ head/www/firefox/Makefile Wed Feb 3 02:28:50 2021 (r563863)
@@ -3,7 +3,7 @@
PORTNAME= firefox
DISTVERSION= 85.0
-PORTREVISION= 1
+PORTREVISION= 2
PORTEPOCH= 2
CATEGORIES= www
MASTER_SITES= MOZILLA/${PORTNAME}/releases/${DISTVERSION}/source \
Added: head/www/firefox/files/patch-bug1690152
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ head/www/firefox/files/patch-bug1690152 Wed Feb 3 02:28:50 2021 (r563863)
@@ -0,0 +1,97 @@
+
+# HG changeset patch
+# User Cameron Kaiser <spectre at floodgap.com>
+# Date 1612231460 0
+# Node ID 579a66fd796690fb752485215b2edaa6167ebf16
+# Parent a00504e040bfd34d01c74d478beb9d308ec085be
+Bug 1690152 - on ppc64 properly skip parameter slots if we overflow GPRs while still having FPRs to burn. r=tcampbell
+
+Differential Revision: https://phabricator.services.mozilla.com/D103724
+
+diff --git a/xpcom/reflect/xptcall/md/unix/xptcinvoke_ppc64_linux.cpp b/xpcom/reflect/xptcall/md/unix/xptcinvoke_ppc64_linux.cpp
+--- xpcom/reflect/xptcall/md/unix/xptcinvoke_ppc64_linux.cpp
++++ xpcom/reflect/xptcall/md/unix/xptcinvoke_ppc64_linux.cpp
+@@ -86,27 +86,37 @@ extern "C" void invoke_copy_to_stack(uin
+ case nsXPTType::T_WCHAR: value = s->val.wc; break;
+ default: value = (uint64_t) s->val.p; break;
+ }
+ }
+
+ if (!s->IsIndirect() && s->type == nsXPTType::T_DOUBLE) {
+ if (nr_fpr < FPR_COUNT) {
+ fpregs[nr_fpr++] = s->val.d;
+- nr_gpr++;
++ // Even if we have enough FPRs, still skip space in
++ // the parameter area if we ran out of placeholder GPRs.
++ if (nr_gpr < GPR_COUNT) {
++ nr_gpr++;
++ } else {
++ d++;
++ }
+ } else {
+ *((double *)d) = s->val.d;
+ d++;
+ }
+ }
+ else if (!s->IsIndirect() && s->type == nsXPTType::T_FLOAT) {
+ if (nr_fpr < FPR_COUNT) {
+ // Single-precision floats are passed in FPRs too.
+ fpregs[nr_fpr++] = s->val.f;
+- nr_gpr++;
++ if (nr_gpr < GPR_COUNT) {
++ nr_gpr++;
++ } else {
++ d++;
++ }
+ } else {
+ #ifdef __LITTLE_ENDIAN__
+ *((float *)d) = s->val.f;
+ #else
+ // Big endian needs adjustment to point to the least
+ // significant word.
+ float* p = (float*)d;
+ p++;
+diff --git a/xpcom/reflect/xptcall/md/unix/xptcstubs_ppc64_linux.cpp b/xpcom/reflect/xptcall/md/unix/xptcstubs_ppc64_linux.cpp
+--- xpcom/reflect/xptcall/md/unix/xptcstubs_ppc64_linux.cpp
++++ xpcom/reflect/xptcall/md/unix/xptcstubs_ppc64_linux.cpp
+@@ -98,27 +98,37 @@ PrepareAndDispatch(nsXPTCStubBase * self
+ nr_gpr++;
+ else
+ ap++;
+ }
+
+ if (!param.IsOut() && type == nsXPTType::T_DOUBLE) {
+ if (nr_fpr < FPR_COUNT) {
+ dp->val.d = fpregs[nr_fpr++];
+- nr_gpr++;
++ // Even if we have enough FPRs, still skip space in
++ // the parameter area if we ran out of placeholder GPRs.
++ if (nr_gpr < GPR_COUNT) {
++ nr_gpr++;
++ } else {
++ ap++;
++ }
+ } else {
+ dp->val.d = *(double*)ap++;
+ }
+ continue;
+ }
+ if (!param.IsOut() && type == nsXPTType::T_FLOAT) {
+ if (nr_fpr < FPR_COUNT) {
+ // Single-precision floats are passed in FPRs too.
+ dp->val.f = (float)fpregs[nr_fpr++];
+- nr_gpr++;
++ if (nr_gpr < GPR_COUNT) {
++ nr_gpr++;
++ } else {
++ ap++;
++ }
+ } else {
+ #ifdef __LITTLE_ENDIAN__
+ dp->val.f = *(float*)ap++;
+ #else
+ // Big endian needs adjustment to point to the least
+ // significant word.
+ float* p = (float*)ap;
+ p++;
+
More information about the svn-ports-head
mailing list