svn commit: r563867 - in head/mail/thunderbird: . files

Piotr Kubaj pkubaj at FreeBSD.org
Wed Feb 3 04:07:03 UTC 2021


Author: pkubaj
Date: Wed Feb  3 04:07:02 2021
New Revision: 563867
URL: https://svnweb.freebsd.org/changeset/ports/563867

Log:
  mail/thunderbird: fix runtime crashes on powerpc64*
  
  Details in https://bugzilla.mozilla.org/show_bug.cgi?id=1690152
  
  Approved by:	tier 2 blanket

Added:
  head/mail/thunderbird/files/patch-bug1690152
     - copied unchanged from r563863, head/www/firefox/files/patch-bug1690152
Modified:
  head/mail/thunderbird/Makefile

Modified: head/mail/thunderbird/Makefile
==============================================================================
--- head/mail/thunderbird/Makefile	Wed Feb  3 03:11:01 2021	(r563866)
+++ head/mail/thunderbird/Makefile	Wed Feb  3 04:07:02 2021	(r563867)
@@ -3,7 +3,7 @@
 
 PORTNAME=	thunderbird
 DISTVERSION=	78.7.0
-PORTREVISION=	1
+PORTREVISION=	2
 CATEGORIES=	mail news net-im
 MASTER_SITES=	MOZILLA/${PORTNAME}/releases/${DISTVERSION}/source \
 		MOZILLA/${PORTNAME}/candidates/${DISTVERSION}-candidates/build2/source

Copied: head/mail/thunderbird/files/patch-bug1690152 (from r563863, head/www/firefox/files/patch-bug1690152)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/mail/thunderbird/files/patch-bug1690152	Wed Feb  3 04:07:02 2021	(r563867, copy of r563863, head/www/firefox/files/patch-bug1690152)
@@ -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-all mailing list