On Tue, Jun 06, 2017 at 10:33:14PM +0200, John Paul Adrian Glaubitz wrote: > Updated patch attached. The sh4 needs another update, too.
Second update. The current patch missed another hunk [1]. Attaching an updated patch which I just verified to work (except that it fails at: Executing /<<PKGBUILDDIR>>/obj-thunderbird/dist/bin/xpcshell -g /<<PKGBUILDDIR>>/obj-thunderbird/dist/bin/ -a /<<PKGBUILDDIR>>/obj-thunderbird/dist/bin/ -f /<<PKGBUILDDIR>> /mozilla/toolkit/mozapps/installer/precompile_cache.js -e precompile_startupcache("resource://gre/"); But that's expected as this happens on many of the other architectures as well and is therefore unrelated to this patch. Adrian > [1] > https://github.com/glaubitz/gecko-dev/commit/e820770f9e5df12e984e1ae533f39d223f825402 -- .''`. John Paul Adrian Glaubitz : :' : Debian Developer - glaub...@debian.org `. `' Freie Universitaet Berlin - glaub...@physik.fu-berlin.de `- GPG: 62FF 8A75 84E0 2956 9546 0006 7426 3B37 F5B5 F913
From: John Paul Adrian Glaubitz <glaub...@physik.fu-berlin.de> Date: Wed, 7 Jun 2017 15:42:19 +0200 Subject: Add m68k support to Thunderbird Origin: not yet exist Bug-Debian: https://bugs.debian.org/859271 Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1325771 Applied-Upstream: TBD All patches have been reviewed by positively by upstream with the exception of the alignment fixes where upstream wants to use a C++11 solution instead of the other suggestions I made. This patch currently uses __attribute__((aligned(4))) to ensure the alignment is at least 4 bytes. This method is safe and works on gcc and clang and unlike the suggested alignas() from C++11 does not break on architectures which require stricter alignment (e.g. alignas(4) would break on x86_64 while __attribute__((aligned(4))) does not as it still allows for 8 bytes alignment. Cherry-picked and adapted patches from Firefox upstream: - 21dd417b4f192e1377ff0f7affdf035f7b5828c1 Bug 1325771 - Add m68k as target architecture to mozbuild - a31a2d92cf9a2f4e9ad2d12cb74f96579f54fa5e Bug 1325771 - layout:style: Make sure nsCSSValue has at least 4 bytes alignment - b65c6cf80f7038f47c7f5d223a6528d4aa4538cf Bug 1325771 - js:src: Make sure shadow::Shape has at least 4 bytes alignment - cbbe025c5034cfa28aa2a8a4e557f9a066ddd013 Bug 1325771 - js:src: Make sure Cell has at least 4 bytes alignment - 6441fad686d30230a6842a6432bc134ca20c4125 Bug 1325771 - js:jit: Use 'Feeling Lucky' atomic operations on m68k - ec66da836071ec0f05a3517947c8e1a68620c399 Bug 1325771 - mfbt:tests: Handle targets with less strict alignment in TestPair - 48f3a6331cad497b933dc6e197f7a006b9189290 Bug 1325771 - ipc:chromium: Add platform defines for m68k - 26cd64f37741d85bc13c19bc55e3c6e26da59052 Bug 1325771 - media:webrtc: Add platform defines for m68k - bd19fe85678f948f60caa864a2af28c3c39059c7 Bug 1325771 - mfbt:tests: Define RETURN_INSTR for m68k in TestPoisonArea - a3e704b48760e3d45d20fc6bb13282d3285ba6bb Bug 1325771 - xpcom: Fix type of result in NS_InvokeByIndex on Linux/m68k - 174cfc890291778d12241c9a4cfc25ea85fdd3a0 Bug 1325771 - xpcom: Fix syntax error in PrepareAndDispatch on Linux/m68k Additional changes: - Add defines for m68k to double-conversion library - Make sure Cell, shadow::Shape and nsCSSValue have least 4 bytes alignment Index: icedove-52.1.1/mozilla/build/moz.configure/init.configure =================================================================== --- icedove-52.1.1.orig/mozilla/build/moz.configure/init.configure +++ icedove-52.1.1/mozilla/build/moz.configure/init.configure @@ -380,6 +380,9 @@ def split_triplet(triplet): elif cpu.startswith('aarch64'): canonical_cpu = 'aarch64' endianness = 'little' + elif cpu in ('m68k'): + canonical_cpu = 'm68k' + endianness = 'big' else: die('Unknown CPU type: %s' % cpu) Index: icedove-52.1.1/mozilla/python/mozbuild/mozbuild/configure/constants.py =================================================================== --- icedove-52.1.1.orig/mozilla/python/mozbuild/mozbuild/configure/constants.py +++ icedove-52.1.1/mozilla/python/mozbuild/mozbuild/configure/constants.py @@ -44,6 +44,7 @@ CPU_bitness = { 'arm': 32, 'hppa': 32, 'ia64': 64, + 'm68k': 32, 'mips32': 32, 'mips64': 64, 'ppc': 32, @@ -85,6 +86,7 @@ CPU_preprocessor_checks = OrderedDict(( ('sparc', '__sparc__'), ('mips64', '__mips64'), ('mips32', '__mips__'), + ('m68k', '__m68k__'), )) assert sorted(CPU_preprocessor_checks.keys()) == sorted(CPU.POSSIBLE_VALUES) Index: icedove-52.1.1/mozilla/python/mozbuild/mozbuild/test/configure/test_toolchain_configure.py =================================================================== --- icedove-52.1.1.orig/mozilla/python/mozbuild/mozbuild/test/configure/test_toolchain_configure.py +++ icedove-52.1.1/mozilla/python/mozbuild/mozbuild/test/configure/test_toolchain_configure.py @@ -1037,6 +1037,9 @@ class LinuxCrossCompileToolchainTest(Bas 'mips-unknown-linux-gnu': big_endian + { '__mips__': 1, }, + 'm68k-unknown-linux-gnu': big_endian + { + '__m68k__': 1, + }, } PLATFORMS['powerpc64le-unknown-linux-gnu'] = \ Index: icedove-52.1.1/mozilla/ipc/chromium/src/build/build_config.h =================================================================== --- icedove-52.1.1.orig/mozilla/ipc/chromium/src/build/build_config.h +++ icedove-52.1.1/mozilla/ipc/chromium/src/build/build_config.h @@ -78,6 +78,9 @@ #define ARCH_CPU_ARMEL 1 #define ARCH_CPU_32_BITS 1 #define WCHAR_T_IS_UNSIGNED 1 +#elif defined(__m68k__) +#define ARCH_CPU_M68K 1 +#define ARCH_CPU_32_BITS 1 #elif defined(__powerpc64__) #define ARCH_CPU_PPC64 1 #define ARCH_CPU_64_BITS 1 Index: icedove-52.1.1/mozilla/js/src/jit/AtomicOperations.h =================================================================== --- icedove-52.1.1.orig/mozilla/js/src/jit/AtomicOperations.h +++ icedove-52.1.1/mozilla/js/src/jit/AtomicOperations.h @@ -326,6 +326,8 @@ AtomicOperations::isLockfree(int32_t siz # include "jit/arm64/AtomicOperations-arm64.h" #elif defined(__hppa__) # include "jit/none/AtomicOperations-ppc.h" +#elif defined(__m68k__) +# include "jit/none/AtomicOperations-ppc.h" #elif defined(JS_CODEGEN_MIPS32) || defined(JS_CODEGEN_MIPS64) # include "jit/mips-shared/AtomicOperations-mips-shared.h" #elif defined(__ppc__) || defined(__PPC__) Index: icedove-52.1.1/mozilla/js/src/jsfriendapi.h =================================================================== --- icedove-52.1.1.orig/mozilla/js/src/jsfriendapi.h +++ icedove-52.1.1/mozilla/js/src/jsfriendapi.h @@ -571,7 +571,7 @@ public: uint32_t slotInfo; static const uint32_t FIXED_SLOTS_SHIFT = 27; -}; +} __attribute__ ((aligned(4))); /** * This layout is shared by all native objects. For non-native objects, the Index: icedove-52.1.1/mozilla/layout/style/nsCSSValue.h =================================================================== --- icedove-52.1.1.orig/mozilla/layout/style/nsCSSValue.h +++ icedove-52.1.1/mozilla/layout/style/nsCSSValue.h @@ -1032,7 +1032,7 @@ protected: mozilla::css::FontFamilyListRefCnt* MOZ_OWNING_REF mFontFamilyList; mozilla::css::ComplexColorValue* MOZ_OWNING_REF mComplexColor; } mValue; -}; +} __attribute__ ((aligned(4))); struct nsCSSValue::Array final { Index: icedove-52.1.1/mozilla/js/src/gc/Heap.h =================================================================== --- icedove-52.1.1.orig/mozilla/js/src/gc/Heap.h +++ icedove-52.1.1/mozilla/js/src/gc/Heap.h @@ -282,7 +282,7 @@ struct Cell protected: inline uintptr_t address() const; inline Chunk* chunk() const; -} JS_HAZ_GC_THING; +} JS_HAZ_GC_THING __attribute__ ((aligned(4))); // A GC TenuredCell gets behaviors that are valid for things in the Tenured // heap, such as access to the arena and mark bits. Index: icedove-52.1.1/mozilla/media/webrtc/trunk/build/build_config.h =================================================================== --- icedove-52.1.1.orig/mozilla/media/webrtc/trunk/build/build_config.h +++ icedove-52.1.1/mozilla/media/webrtc/trunk/build/build_config.h @@ -123,6 +123,11 @@ #define ARCH_CPU_MIPSEL 1 #define ARCH_CPU_32_BITS 1 #define ARCH_CPU_LITTLE_ENDIAN 1 +#elif defined(__m68k__) +#define ARCH_CPU_M68K_FAMILY 1 +#define ARCH_CPU_M68K 1 +#define ARCH_CPU_32_BITS 1 +#define ARCH_CPU_BIG_ENDIAN 1 #elif defined(__powerpc64__) #define ARCH_CPU_PPC_FAMILY 1 #define ARCH_CPU_PPC64 1 Index: icedove-52.1.1/mozilla/mfbt/double-conversion/utils.h =================================================================== --- icedove-52.1.1.orig/mozilla/mfbt/double-conversion/utils.h +++ icedove-52.1.1/mozilla/mfbt/double-conversion/utils.h @@ -62,6 +62,8 @@ defined(_MIPS_ARCH_MIPS32R2) || \ defined(__AARCH64EL__) || defined(__aarch64__) #define DOUBLE_CONVERSION_CORRECT_DOUBLE_OPERATIONS 1 +#elif defined(__mc68000__) +#undef DOUBLE_CONVERSION_CORRECT_DOUBLE_OPERATIONS #elif defined(_M_IX86) || defined(__i386__) || defined(__i386) #if defined(_WIN32) // Windows uses a 64bit wide floating point stack. Index: icedove-52.1.1/mozilla/mfbt/tests/TestPair.cpp =================================================================== --- icedove-52.1.1.orig/mozilla/mfbt/tests/TestPair.cpp +++ icedove-52.1.1/mozilla/mfbt/tests/TestPair.cpp @@ -29,14 +29,19 @@ using mozilla::Pair; static_assert(sizeof(name##_2) == (size), \ "Pair<" #T2 ", " #T1 "> has an unexpected size"); +static constexpr size_t sizemax(size_t a, size_t b) +{ + return (a > b) ? a : b; +} + INSTANTIATE(int, int, prim1, 2 * sizeof(int)); -INSTANTIATE(int, long, prim2, 2 * sizeof(long)); +INSTANTIATE(int, long, prim2, sizeof(long) + sizemax(sizeof(int), alignof(long))); struct EmptyClass { explicit EmptyClass(int) {} }; struct NonEmpty { char mC; explicit NonEmpty(int) {} }; INSTANTIATE(int, EmptyClass, both1, sizeof(int)); -INSTANTIATE(int, NonEmpty, both2, 2 * sizeof(int)); +INSTANTIATE(int, NonEmpty, both2, sizeof(int) + alignof(int)); INSTANTIATE(EmptyClass, NonEmpty, both3, 1); struct A { char dummy; explicit A(int) {} }; Index: icedove-52.1.1/mozilla/mfbt/tests/TestPoisonArea.cpp =================================================================== --- icedove-52.1.1.orig/mozilla/mfbt/tests/TestPoisonArea.cpp +++ icedove-52.1.1/mozilla/mfbt/tests/TestPoisonArea.cpp @@ -133,6 +133,9 @@ #elif defined _ARCH_PPC || defined _ARCH_PWR || defined _ARCH_PWR2 #define RETURN_INSTR 0x4E800020 /* blr */ +#elif defined __m68k__ +#define RETURN_INSTR 0x4E754E75 /* rts; rts */ + #elif defined __sparc || defined __sparcv9 #define RETURN_INSTR 0x81c3e008 /* retl */ Index: icedove-52.1.1/mozilla/xpcom/reflect/xptcall/md/unix/xptcinvoke_linux_m68k.cpp =================================================================== --- icedove-52.1.1.orig/mozilla/xpcom/reflect/xptcall/md/unix/xptcinvoke_linux_m68k.cpp +++ icedove-52.1.1/mozilla/xpcom/reflect/xptcall/md/unix/xptcinvoke_linux_m68k.cpp @@ -100,7 +100,8 @@ EXPORT_XPCOM_API(nsresult) NS_InvokeByIndex(nsISupports* that, uint32_t methodIndex, uint32_t paramCount, nsXPTCVariant* params) { - uint32_t result, n; + nsresult result; + uint32_t n; n = invoke_count_words(paramCount, params) * 4; Index: icedove-52.1.1/mozilla/xpcom/reflect/xptcall/md/unix/xptcstubs_linux_m68k.cpp =================================================================== --- icedove-52.1.1.orig/mozilla/xpcom/reflect/xptcall/md/unix/xptcstubs_linux_m68k.cpp +++ icedove-52.1.1/mozilla/xpcom/reflect/xptcall/md/unix/xptcstubs_linux_m68k.cpp @@ -63,7 +63,7 @@ extern "C" { case nsXPTType::T_U64 : dp->val.u64 = *((uint64_t*)ap); ap++; break; case nsXPTType::T_FLOAT : dp->val.f = *((float*) ap); break; case nsXPTType::T_DOUBLE : dp->val.d = *((double*) ap); ap++; break; - case nsXPTType::T_BOOL : dp->val.b = *((uint32_t* ap); break; + case nsXPTType::T_BOOL : dp->val.b = *((uint32_t*)ap); break; case nsXPTType::T_CHAR : dp->val.c = *(((char*) ap) + 3); break; case nsXPTType::T_WCHAR : dp->val.wc = *((wchar_t*) ap); break; default: