- added a bunch of patches mainly for big endian platforms

* mozilla-bmo1504834-part1.patch
  * mozilla-bmo1504834-part2.patch
  * mozilla-bmo1504834-part3.patch
  * mozilla-bmo1511604.patch
  * mozilla-bmo1554971.patch
  * mozilla-bmo1573381.patch
  * mozilla-nestegg-big-endian.patch

OBS-URL: https://build.opensuse.org/package/show/mozilla:Factory/MozillaFirefox?expand=0&rev=763
This commit is contained in:
Wolfgang Rosenauer 2019-09-05 12:57:01 +00:00 committed by Git OBS Bridge
parent 194c61e40b
commit 74d23cbbdc
9 changed files with 402 additions and 2 deletions

View File

@ -1,3 +1,15 @@
-------------------------------------------------------------------
Wed Sep 4 15:38:40 UTC 2019 - Wolfgang Rosenauer <wr@rosenauer.org>
- added a bunch of patches mainly for big endian platforms
* mozilla-bmo1504834-part1.patch
* mozilla-bmo1504834-part2.patch
* mozilla-bmo1504834-part3.patch
* mozilla-bmo1511604.patch
* mozilla-bmo1554971.patch
* mozilla-bmo1573381.patch
* mozilla-nestegg-big-endian.patch
-------------------------------------------------------------------
Fri Aug 30 20:49:11 UTC 2019 - Wolfgang Rosenauer <wr@rosenauer.org>

View File

@ -33,6 +33,8 @@
# PIE, full relro
%define build_hardened 1
%bcond_with only_print_mozconfig
# Firefox only supports i686
%ifarch %ix86
ExclusiveArch: i586 i686
@ -134,6 +136,7 @@ Summary: Mozilla %{appname} Web Browser
License: MPL-2.0
Group: Productivity/Networking/Web/Browsers
Url: http://www.mozilla.org/
%if !%{with only_print_mozconfig}
Source: http://ftp.mozilla.org/pub/firefox/releases/%{version}%{orig_suffix}/source/firefox-%{orig_version}%{orig_suffix}.source.tar.xz
Source1: MozillaFirefox.desktop
Source2: MozillaFirefox-rpmlintrc
@ -157,7 +160,7 @@ Source16: MozillaFirefox.changes
Source18: mozilla-api-key
Source19: google-api-key
Source20: https://ftp.mozilla.org/pub/%{progname}/releases/%{version}%{orig_suffix}/source/%{progname}-%{orig_version}%{orig_suffix}.source.tar.xz.asc
Source21: mozilla.keyring
Source21: https://ftp.mozilla.org/pub/%{progname}/releases/%{version}%{orig_suffix}/KEY#/mozilla.keyring
# Gecko/Toolkit
Patch1: mozilla-nongnome-proxies.patch
Patch2: mozilla-kde.patch
@ -174,10 +177,18 @@ Patch12: mozilla-reduce-rust-debuginfo.patch
Patch13: mozilla-ppc-altivec_static_inline.patch
Patch14: mozilla-bmo1005535.patch
Patch15: mozilla-bmo1568145.patch
Patch16: mozilla-bmo1573381.patch
Patch17: mozilla-bmo1504834-part1.patch
Patch18: mozilla-bmo1504834-part2.patch
Patch19: mozilla-bmo1504834-part3.patch
Patch20: mozilla-bmo1511604.patch
Patch21: mozilla-bmo1554971.patch
Patch22: mozilla-nestegg-big-endian.patch
# Firefox/browser
Patch101: firefox-kde.patch
Patch102: firefox-branded-icons.patch
Patch103: firefox-add-kde.js-in-order-to-survive-PGO-build.patch
%endif # only_print_mozconfig
BuildRoot: %{_tmppath}/%{name}-%{version}-build
Requires(post): coreutils shared-mime-info desktop-file-utils
Requires(postun): shared-mime-info desktop-file-utils
@ -267,6 +278,7 @@ This subpackage contains the Breakpad created and compatible debugging
symbols meant for upload to Mozilla's crash collector database.
%endif
%if !%{with only_print_mozconfig}
%prep
%if %localize
@ -300,12 +312,21 @@ cd $RPM_BUILD_DIR/%{source_prefix}
%patch13 -p1
%patch14 -p1
%patch15 -p1
%patch16 -p1
%patch17 -p1
%patch18 -p1
%patch19 -p1
%patch20 -p1
%patch21 -p1
%patch22 -p1
# Firefox
%patch101 -p1
%patch102 -p1
%patch103 -p1
%endif # only_print_mozconfig
%build
%if !%{with only_print_mozconfig}
# no need to add build time to binaries
modified="$(sed -n '/^----/n;s/ - .*$//;p;q' "%{_sourcedir}/%{name}.changes")"
DATE="\"$(date -d "${modified}" "+%%b %%e %%Y")\""
@ -318,6 +339,8 @@ if test "$kdehelperversion" != %{kde_helper_version}; then
exit 1
fi
source %{SOURCE5}
%endif # only_print_mozconfig
export MOZ_SOURCE_CHANGESET=$REV
export SOURCE_REPO=$REPO
export source_repo=$REPO
@ -348,8 +371,18 @@ export CFLAGS="$CFLAGS -mminimal-toc"
%endif
export CXXFLAGS="$CFLAGS"
export MOZCONFIG=$RPM_BUILD_DIR/mozconfig
%if %{with only_print_mozconfig}
echo "export CC=$CC"
echo "export CXX=$CXX"
echo "export CFLAGS=\"$CFLAGS\""
echo "export LDFLAGS=\"$LDFLAGS\""
echo "export RUSTFLAGS=\"$RUSTFLAGS\""
echo ""
cat << EOF
%else
%limit_build -m 2000
cat << EOF > $MOZCONFIG
%endif
mk_add_options MOZILLA_OFFICIAL=1
mk_add_options BUILD_OFFICIAL=1
mk_add_options MOZ_MAKE_FLAGS=%{?jobs:-j%jobs}
@ -424,7 +457,19 @@ ac_add_options MOZ_PGO=1
%endif
%endif
EOF
%if !%{with only_print_mozconfig}
%ifarch ppc64 s390x s390
# NOTE: Currently, system-icu is too old, so we can't build with that,
# but have to generate the .dat-file freshly. This seems to be a
# less fragile approach anyways.
# ac_add_options --with-system-icu
echo "Generate big endian version of config/external/icu/data/icud58l.dat"
./mach python intl/icu_sources_data.py .
ls -l config/external/icu/data
rm -f config/external/icu/data/icudt*l.dat
%endif
xvfb-run --server-args="-screen 0 1920x1080x24" ./mach build
%endif # only_print_mozconfig
%install
cd $RPM_BUILD_DIR/obj
@ -448,7 +493,7 @@ install -m 644 %{SOURCE13} %{buildroot}%{progdir}/defaults/pref/
# install browser prefs
install -m 644 %{SOURCE6} %{buildroot}%{progdir}/browser/defaults/preferences/kde.js
install -m 644 %{SOURCE9} %{buildroot}%{progdir}/browser/defaults/preferences/firefox.js
# install additional locales
# build additional locales
%if %localize
mkdir -p %{buildroot}%{progdir}/browser/extensions
truncate -s 0 %{_tmppath}/translations.{common,other}

View File

@ -0,0 +1,81 @@
# HG changeset patch
# Parent 051b75a600dfbf7503c3485cebfd34d4eb29be96
Taken from https://bugzilla.mozilla.org/show_bug.cgi?id=1504834
diff -r 051b75a600df gfx/2d/DrawTargetSkia.cpp
--- a/gfx/2d/DrawTargetSkia.cpp Fri Jul 05 12:42:44 2019 +0200
+++ b/gfx/2d/DrawTargetSkia.cpp Mon Jul 08 10:59:30 2019 +0200
@@ -138,8 +138,7 @@
return surfaceBounds.Intersect(bounds);
}
-static const int kARGBAlphaOffset =
- SurfaceFormat::A8R8G8B8_UINT32 == SurfaceFormat::B8G8R8A8 ? 3 : 0;
+static const int kARGBAlphaOffset = 0; // Skia is always BGRA SurfaceFormat::A8R8G8B8_UINT32 == SurfaceFormat::B8G8R8A8 ? 3 : 0;
static bool VerifyRGBXFormat(uint8_t* aData, const IntSize& aSize,
const int32_t aStride, SurfaceFormat aFormat) {
diff -r 051b75a600df gfx/2d/Types.h
--- a/gfx/2d/Types.h Fri Jul 05 12:42:44 2019 +0200
+++ b/gfx/2d/Types.h Mon Jul 08 10:59:30 2019 +0200
@@ -85,15 +85,8 @@
// The following values are endian-independent synonyms. The _UINT32 suffix
// indicates that the name reflects the layout when viewed as a uint32_t
// value.
-#if MOZ_LITTLE_ENDIAN
A8R8G8B8_UINT32 = B8G8R8A8, // 0xAARRGGBB
X8R8G8B8_UINT32 = B8G8R8X8 // 0x00RRGGBB
-#elif MOZ_BIG_ENDIAN
- A8R8G8B8_UINT32 = A8R8G8B8, // 0xAARRGGBB
- X8R8G8B8_UINT32 = X8R8G8B8 // 0x00RRGGBB
-#else
-# error "bad endianness"
-#endif
};
static inline int BytesPerPixel(SurfaceFormat aFormat) {
diff -r 051b75a600df gfx/skia/skia/third_party/skcms/skcms.cc
--- a/gfx/skia/skia/third_party/skcms/skcms.cc Fri Jul 05 12:42:44 2019 +0200
+++ b/gfx/skia/skia/third_party/skcms/skcms.cc Mon Jul 08 10:59:30 2019 +0200
@@ -17,6 +17,8 @@
#include <arm_neon.h>
#elif defined(__SSE__)
#include <immintrin.h>
+#else
+ #define SKCMS_PORTABLE
#endif
// sizeof(x) will return size_t, which is 32-bit on some machines and 64-bit on others.
@@ -124,20 +126,28 @@
static uint16_t read_big_u16(const uint8_t* ptr) {
uint16_t be;
memcpy(&be, ptr, sizeof(be));
-#if defined(_MSC_VER)
+#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
+ return be;
+#else
+ #if defined(_MSC_VER)
return _byteswap_ushort(be);
-#else
+ #else
return __builtin_bswap16(be);
+ #endif
#endif
}
static uint32_t read_big_u32(const uint8_t* ptr) {
uint32_t be;
memcpy(&be, ptr, sizeof(be));
-#if defined(_MSC_VER)
+#if __BYTE_ORDER == __ORDER_BIG_ENDIAN__
+ return be;
+#else
+ #if defined(_MSC_VER)
return _byteswap_ulong(be);
-#else
+ #else
return __builtin_bswap32(be);
+ #endif
#endif
}

View File

@ -0,0 +1,88 @@
# HG changeset patch
# Parent 548d0a2f3a22bfac32ec0c3921c6c969c8bf32a9
Skia does not support big endian. The places to fix are too numerous and upstream (skia, not Mozilla)
has no interest in maintaining big endian.
So here we try to swizzle the input for skia, so that skia always works on LE, and when it comes
out again, we transform back to BE.
diff -r 548d0a2f3a22 gfx/2d/ConvolutionFilter.cpp
--- a/gfx/2d/ConvolutionFilter.cpp Mon Jul 22 16:57:54 2019 +0200
+++ b/gfx/2d/ConvolutionFilter.cpp Thu Jul 25 14:27:59 2019 +0200
@@ -35,9 +35,38 @@
return true;
}
+static void ByteSwapArray(uint8_t *u8Array, int32_t size) {
+ uint32_t *array = reinterpret_cast<uint32_t*>(u8Array);
+ for (int pxl = 0; pxl < size; ++pxl) {
+ // Use an endian swap to move the bytes, i.e. BGRA -> ARGB.
+ uint32_t rgba = array[pxl];
+ array[pxl] = NativeEndian::swapToLittleEndian(rgba);
+ }
+}
+
void ConvolutionFilter::ConvolveHorizontally(const uint8_t* aSrc, uint8_t* aDst,
bool aHasAlpha) {
+#ifdef MOZ_BIG_ENDIAN
+ int outputSize = mFilter->numValues();
+
+ // Input size isn't handed in, so we have to calculate it quickly
+ int inputSize = 0;
+ for (int xx = 0; xx < outputSize; ++xx) {
+ // Get the filter that determines the current output pixel.
+ int filterOffset, filterLength;
+ mFilter->FilterForValue(xx, &filterOffset, &filterLength);
+ inputSize = std::max(inputSize, filterOffset + filterLength);
+ }
+
+ ByteSwapArray((uint8_t*)aSrc, inputSize);
+#endif
+
SkOpts::convolve_horizontally(aSrc, *mFilter, aDst, aHasAlpha);
+
+#ifdef MOZ_BIG_ENDIAN
+ ByteSwapArray((uint8_t*)aSrc, inputSize);
+ ByteSwapArray(aDst, outputSize);
+#endif
}
void ConvolutionFilter::ConvolveVertically(uint8_t* const* aSrc, uint8_t* aDst,
@@ -49,8 +78,26 @@
int32_t filterLength;
auto filterValues =
mFilter->FilterForValue(aRowIndex, &filterOffset, &filterLength);
+
+#ifdef MOZ_BIG_ENDIAN
+ for (int filterY = 0; filterY < filterLength; filterY++) {
+ // Skia only knows LE, so we have to swizzle the input
+ ByteSwapArray(aSrc[filterY], aRowSize);
+ }
+#endif
+
SkOpts::convolve_vertically(filterValues, filterLength, aSrc, aRowSize, aDst,
aHasAlpha);
+
+#ifdef MOZ_BIG_ENDIAN
+ // After skia is finished, we swizzle back to BE, in case
+ // the input is used again somewhere else
+ for (int filterY = 0; filterY < filterLength; filterY++) {
+ ByteSwapArray(aSrc[filterY], aRowSize);
+ }
+ // The destination array as well
+ ByteSwapArray(aDst, aRowSize);
+#endif
}
/* ConvolutionFilter::ComputeResizeFactor is derived from Skia's
diff -r 548d0a2f3a22 gfx/skia/skia/include/core/SkPreConfig.h
--- a/gfx/skia/skia/include/core/SkPreConfig.h Mon Jul 22 16:57:54 2019 +0200
+++ b/gfx/skia/skia/include/core/SkPreConfig.h Thu Jul 25 14:27:59 2019 +0200
@@ -73,7 +73,7 @@
defined(__ppc__) || defined(__hppa) || \
defined(__PPC__) || defined(__PPC64__) || \
defined(_MIPSEB) || defined(__ARMEB__) || \
- defined(__s390__) || \
+ defined(__s390__) || defined(__s390x__) || \
(defined(__sh__) && defined(__BIG_ENDIAN__)) || \
(defined(__ia64) && defined(__BIG_ENDIAN__))
#define SK_CPU_BENDIAN

View File

@ -0,0 +1,38 @@
# HG changeset patch
# Parent aecb4600e5da17443b224c79eee178c1d8e155e3
For FF68, AntiAliasing of XULTexts seem to be broken on big endian (s390x). Text and icons of the sandwich-menu to the
right of the address bar, as well as plugin-windows appears transparant, which usually means unreadable (white on white).
diff -r aecb4600e5da -r 49f25e4c2fd1 gfx/skia/skia/include/private/SkNx.h
--- a/gfx/skia/skia/include/private/SkNx.h Tue Aug 20 09:46:55 2019 +0200
+++ b/gfx/skia/skia/include/private/SkNx.h Fri Aug 23 15:00:43 2019 +0200
@@ -238,7 +238,14 @@
AI SkNx operator*(const SkNx& y) const { return fVal * y.fVal; }
AI SkNx operator/(const SkNx& y) const { return fVal / y.fVal; }
- AI SkNx operator&(const SkNx& y) const { return FromBits(ToBits(fVal) & ToBits(y.fVal)); }
+ // On Big endian the commented out variant doesn't work,
+ // and honestly, I have no idea why it exists in the first place.
+ // The reason its broken is, I think, that it defaults to the double-variant of ToBits()
+ // which gets a 64-bit integer, and FromBits returns 32-bit,
+ // cutting off the wrong half again.
+ // Overall, I see no reason to have ToBits and FromBits at all (even for floats/doubles).
+ // AI SkNx operator&(const SkNx& y) const { return FromBits(ToBits(fVal) & ToBits(y.fVal)); }
+ AI SkNx operator&(const SkNx& y) const { return fVal & y.fVal; }
AI SkNx operator|(const SkNx& y) const { return FromBits(ToBits(fVal) | ToBits(y.fVal)); }
AI SkNx operator^(const SkNx& y) const { return FromBits(ToBits(fVal) ^ ToBits(y.fVal)); }
diff -r aecb4600e5da -r 49f25e4c2fd1 gfx/skia/skia/src/opts/SkBlitMask_opts.h
--- a/gfx/skia/skia/src/opts/SkBlitMask_opts.h Tue Aug 20 09:46:55 2019 +0200
+++ b/gfx/skia/skia/src/opts/SkBlitMask_opts.h Fri Aug 23 15:00:43 2019 +0200
@@ -203,7 +203,9 @@
// ~~~>
// a = 1*aa + d(1-1*aa) = aa + d(1-aa)
// c = 0*aa + d(1-1*aa) = d(1-aa)
- return Sk4px(Sk16b(aa) & Sk16b(0,0,0,255, 0,0,0,255, 0,0,0,255, 0,0,0,255))
+
+ // For big endian we have to swap the alpha-mask from 0,0,0,255 to 255,0,0,0
+ return Sk4px(Sk16b(aa) & Sk16b(255,0,0,0, 255,0,0,0, 255,0,0,0, 255,0,0,0))
+ d.approxMulDiv255(aa.inv());
};
while (h --> 0) {

54
mozilla-bmo1511604.patch Normal file
View File

@ -0,0 +1,54 @@
# HG changeset patch
# User A. Wilcox <AWilcox@Wilcox-Tech.com>
# Date 1543674229 0
# Sat Dec 01 14:23:49 2018 +0000
# Node ID 0309ff19e46b126c527e633518d7de8570442114
# Parent 53107afbc21ec78e7ac46d37af212505f2032d5d
Bug 1511604 - Swizzle YCbCr->RGB data on big-endian machines
Taken from https://bugzilla.mozilla.org/show_bug.cgi?id=1511604
This is very closely related to mozilla-bmo1504834
Again, input for skia is swizzled to LE, as skia only understands LE.
diff -r 53107afbc21e -r 0309ff19e46b gfx/ycbcr/YCbCrUtils.cpp
--- a/gfx/ycbcr/YCbCrUtils.cpp Wed Nov 07 04:50:21 2018 +0000
+++ b/gfx/ycbcr/YCbCrUtils.cpp Sat Dec 01 14:23:49 2018 +0000
@@ -3,7 +3,9 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+#include "mozilla/EndianUtils.h"
#include "gfx2DGlue.h"
+#include "mozilla/gfx/Swizzle.h"
#include "YCbCrUtils.h"
#include "yuv_convert.h"
@@ -236,6 +238,13 @@
yuvtype,
srcData.mYUVColorSpace);
}
+#ifdef MOZ_BIG_ENDIAN
+ // libyuv makes endian-correct result, which needs to be swapped to BGRX
+ if (aDestFormat != SurfaceFormat::R5G6B5_UINT16)
+ gfx::SwizzleData(aDestBuffer, aStride, gfx::SurfaceFormat::X8R8G8B8,
+ aDestBuffer, aStride, gfx::SurfaceFormat::B8G8R8X8,
+ srcData.mPicSize);
+#endif
}
void
@@ -257,6 +266,12 @@
aSrcStrideYA,
aSrcStrideUV,
aDstStrideARGB);
+#ifdef MOZ_BIG_ENDIAN
+ // libyuv makes endian-correct result, which needs to be swapped to BGRA
+ gfx::SwizzleData(aDstARGB, aDstStrideARGB, gfx::SurfaceFormat::A8R8G8B8,
+ aDstARGB, aDstStrideARGB, gfx::SurfaceFormat::B8G8R8A8,
+ IntSize(aWidth, aHeight));
+#endif
}
} // namespace gfx

22
mozilla-bmo1554971.patch Normal file
View File

@ -0,0 +1,22 @@
# HG changeset patch
# Parent a25cebecb02d5460b8ad757fe9cb4a9c8d1d7658
Eliminate startup error message:
JavaScript error: , line 0: Error: Type error for platformInfo value (Error processing arch: Invalid enumeration value "s390x") for runtime.getPlatformInfo.
Reported here: https://bugzilla.mozilla.org/show_bug.cgi?id=1554971
Uncertain if this is causing real problems or not. Also uncertain if the fix actually fixes anything.
No response from upstream yet.
diff -r a25cebecb02d -r 378b81b00e73 toolkit/components/extensions/schemas/runtime.json
--- a/toolkit/components/extensions/schemas/runtime.json Fri Jul 05 12:42:44 2019 +0200
+++ b/toolkit/components/extensions/schemas/runtime.json Fri Jul 19 13:19:30 2019 +0200
@@ -64,7 +64,7 @@
{
"id": "PlatformArch",
"type": "string",
- "enum": ["arm", "x86-32", "x86-64"],
+ "enum": ["arm", "x86-32", "x86-64", "s390x", "aarch64", "ppc64le"],
"allowedContexts": ["content", "devtools"],
"description": "The machine's processor architecture."
},

22
mozilla-bmo1573381.patch Normal file
View File

@ -0,0 +1,22 @@
# HG changeset patch
# Parent 45680ce4ca06795cbca1ea5a9ae8a7a11ab95cf1
The code tries to find a codec in a list of codecs. For this it searches for a given prefix.
But the prefix is of type char16_t, which means 2 bytes per character instead of 1, as was compared here.
On big endian this created some false positives, as the order of bytes is different and some characters only
occupy "the first" byte, having the second null'ed out.
Noticed because of gtest: MediaMIMETypes.MediaCodecs
Upstream bugreport: https://bugzilla.mozilla.org/show_bug.cgi?id=1573381
diff -r 45680ce4ca06 -r 381102061fcc dom/media/MediaMIMETypes.cpp
--- a/dom/media/MediaMIMETypes.cpp Mon Aug 05 09:28:53 2019 +0200
+++ b/dom/media/MediaMIMETypes.cpp Tue Aug 13 07:51:27 2019 +0200
@@ -87,7 +87,7 @@
const size_t prefixLength = aCodecPrefix.Length();
for (const auto& myCodec : Range()) {
if (myCodec.Length() >= prefixLength &&
- memcmp(myCodec.Data(), aCodecPrefix.Data(), prefixLength) == 0) {
+ memcmp(myCodec.Data(), aCodecPrefix.Data(), prefixLength * sizeof(char16_t)) == 0) {
return true;
}
}

View File

@ -0,0 +1,38 @@
# HG changeset patch
# Parent 381102061fccdec40efda75c7423a766f68201ba
Bug-behavior: Youtube-videos using VP9 and opus as audio-codec started loading but did not play
Reason: While parsing the audio-stream, the sampling frequency (short rate) was wrongly parsed by
nestegg, returning 0 all the time. This led to the audio-track reporting that it neither had
valid video nor audio. Which led to an endless-loop in the video state machine.
Solution: Correct parsing of rate in nestegg, which is a float and cuts of bytes.
Link: https://github.com/kinetiknz/nestegg/issues/64
diff -r 381102061fcc -r 8da4be020b1e media/libnestegg/src/nestegg.c
--- a/media/libnestegg/src/nestegg.c Tue Aug 13 07:51:27 2019 +0200
+++ b/media/libnestegg/src/nestegg.c Tue Aug 20 07:59:54 2019 +0200
@@ -768,7 +768,15 @@
{
union {
uint64_t u;
- float f;
+ struct {
+#if __FLOAT_WORD_ORDER__ == __ORDER_BIG_ENDIAN__
+ uint32_t _pad;
+ float f;
+#else
+ float f;
+ uint32_t _pad;
+#endif
+ } f;
double d;
} value;
int r;
@@ -780,7 +788,7 @@
if (r != 1)
return r;
if (length == 4)
- *val = value.f;
+ *val = value.f.f;
else
*val = value.d;
return 1;