Re: Bug#824449: firefox: FTBFS on sparc64 due to wrong platform definitions
- To: 824449@bugs.debian.org
- Cc: debian-sparc <debian-sparc@lists.debian.org>
- Subject: Re: Bug#824449: firefox: FTBFS on sparc64 due to wrong platform definitions
- From: John Paul Adrian Glaubitz <glaubitz@physik.fu-berlin.de>
- Date: Sun, 18 Jun 2017 10:45:04 +0200
- Message-id: <[🔎] 3851c6c3-0c3d-bd64-aab2-0d0ae13474ed@physik.fu-berlin.de>
- In-reply-to: <32afbcce-4cff-78a4-3a4e-5e2ae5327cab@physik.fu-berlin.de>
- References: <146338650347.7587.3366619502966310096.reportbug@z6.physik.fu-berlin.de> <573BFDEE.7070007@physik.fu-berlin.de> <573F7C3E.3060803@physik.fu-berlin.de> <20160520230633.GA26889@physik.fu-berlin.de> <3deb2330-49da-2b5f-0bb5-e549cec59a64@physik.fu-berlin.de> <28e5ea05-048b-a3dc-592e-5bad8017732a@physik.fu-berlin.de> <895c2dcd-df38-8f14-a10b-6618fa545d5e@physik.fu-berlin.de> <d0fadf44-49b6-d8fe-cbd4-b50085813d26@physik.fu-berlin.de> <09b1b735-8854-930c-5364-2b486c85c13c@physik.fu-berlin.de> <200ef258-08a1-053d-a05a-1825bc973c36@physik.fu-berlin.de> <32afbcce-4cff-78a4-3a4e-5e2ae5327cab@physik.fu-berlin.de>
Control: reassign -1 firefox-esr
Hello!
Since the latest firefox package requires rustc now which isn't available on
sparc64 yet, I have ported the sparc64 support patch to the firefox-esr
package. I am attaching the updated patch.
Could it be applied for the next upload, please? The patch is merely a backport
of all the missing sparc64 fixes that got merged upstream, so they have all
been positively reviewed by Mozilla upstream.
Thank you very much!
Adrian
--
.''`. John Paul Adrian Glaubitz
: :' : Debian Developer - glaubitz@debian.org
`. `' Freie Universitaet Berlin - glaubitz@physik.fu-berlin.de
`- GPG: 62FF 8A75 84E0 2956 9546 0006 7426 3B37 F5B5 F913
Description: Add support for sparc64
Author: John Paul Adrian Glaubitz <glaubitz@physik.fu-berlin.de>
Forwarded: https://bugzilla.mozilla.org/show_bug.cgi?id=1275204
Last-Update: 2017-06-18
Index: firefox-esr-52.2.0esr/ipc/chromium/src/build/build_config.h
===================================================================
--- firefox-esr-52.2.0esr.orig/ipc/chromium/src/build/build_config.h
+++ firefox-esr-52.2.0esr/ipc/chromium/src/build/build_config.h
@@ -83,7 +83,7 @@
#elif defined(__ppc__) || defined(__powerpc__)
#define ARCH_CPU_PPC 1
#define ARCH_CPU_32_BITS 1
-#elif defined(__sparc64__)
+#elif defined(__sparc__) && defined(__arch64__)
#define ARCH_CPU_SPARC 1
#define ARCH_CPU_64_BITS 1
#elif defined(__sparc__)
Index: firefox-esr-52.2.0esr/js/src/gc/Memory.cpp
===================================================================
--- firefox-esr-52.2.0esr.orig/js/src/gc/Memory.cpp
+++ firefox-esr-52.2.0esr/js/src/gc/Memory.cpp
@@ -501,7 +501,7 @@ static inline void*
MapMemoryAt(void* desired, size_t length, int prot = PROT_READ | PROT_WRITE,
int flags = MAP_PRIVATE | MAP_ANON, int fd = -1, off_t offset = 0)
{
-#if defined(__ia64__) || (defined(__sparc64__) && defined(__NetBSD__)) || defined(__aarch64__)
+#if defined(__ia64__) || (defined(__sparc__) && defined(__arch64__) && (defined(__NetBSD__) || defined(__linux__)))
MOZ_ASSERT((0xffff800000000000ULL & (uintptr_t(desired) + length - 1)) == 0);
#endif
void* region = mmap(desired, length, prot, flags, fd, offset);
@@ -524,7 +524,7 @@ static inline void*
MapMemory(size_t length, int prot = PROT_READ | PROT_WRITE,
int flags = MAP_PRIVATE | MAP_ANON, int fd = -1, off_t offset = 0)
{
-#if defined(__ia64__) || (defined(__sparc64__) && defined(__NetBSD__))
+#if defined(__ia64__) || (defined(__sparc__) && defined(__arch64__) && defined(__NetBSD__))
/*
* The JS engine assumes that all allocated pointers have their high 17 bits clear,
* which ia64's mmap doesn't support directly. However, we can emulate it by passing
@@ -551,7 +551,7 @@ MapMemory(size_t length, int prot = PROT
return nullptr;
}
return region;
-#elif defined(__aarch64__)
+#elif defined(__aarch64__) || (defined(__sparc__) && defined(__arch64__) && defined(__linux__))
/*
* There might be similar virtual address issue on arm64 which depends on
* hardware and kernel configurations. But the work around is slightly
Index: firefox-esr-52.2.0esr/js/src/jsapi-tests/testGCAllocator.cpp
===================================================================
--- firefox-esr-52.2.0esr.orig/js/src/jsapi-tests/testGCAllocator.cpp
+++ firefox-esr-52.2.0esr/js/src/jsapi-tests/testGCAllocator.cpp
@@ -312,7 +312,7 @@ void unmapPages(void* p, size_t size) {
void*
mapMemoryAt(void* desired, size_t length)
{
-#if defined(__ia64__) || (defined(__sparc64__) && defined(__NetBSD__)) || defined(__aarch64__)
+#if defined(__ia64__) || (defined(__sparc__) && defined(__arch64__) && (defined(__NetBSD__) || defined(__linux__)))
MOZ_RELEASE_ASSERT(0xffff800000000000ULL & (uintptr_t(desired) + length - 1) == 0);
#endif
void* region = mmap(desired, length, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0);
@@ -334,7 +334,7 @@ mapMemory(size_t length)
int fd = -1;
off_t offset = 0;
// The test code must be aligned with the implementation in gc/Memory.cpp.
-#if defined(__ia64__) || (defined(__sparc64__) && defined(__NetBSD__))
+#if defined(__ia64__) || (defined(__sparc__) && defined(__arch64__) && defined(__NetBSD__))
void* region = mmap((void*)0x0000070000000000, length, prot, flags, fd, offset);
if (region == MAP_FAILED)
return nullptr;
@@ -344,7 +344,7 @@ mapMemory(size_t length)
return nullptr;
}
return region;
-#elif defined(__aarch64__)
+#elif defined(__aarch64__) || (defined(__sparc__) && defined(__arch64__) && defined(__linux__))
const uintptr_t start = UINT64_C(0x0000070000000000);
const uintptr_t end = UINT64_C(0x0000800000000000);
const uintptr_t step = js::gc::ChunkSize;
Index: firefox-esr-52.2.0esr/media/webrtc/trunk/build/build_config.h
===================================================================
--- firefox-esr-52.2.0esr.orig/media/webrtc/trunk/build/build_config.h
+++ firefox-esr-52.2.0esr/media/webrtc/trunk/build/build_config.h
@@ -129,7 +129,7 @@
#define ARCH_CPU_PPC 1
#define ARCH_CPU_32_BITS 1
#define ARCH_CPU_BIG_ENDIAN 1
-#elif defined(__sparc64__)
+#elif defined(__sparc__) && defined(__arch64__)
#define ARCH_CPU_SPARC_FAMILY 1
#define ARCH_CPU_SPARC 1
#define ARCH_CPU_64_BITS 1
Index: firefox-esr-52.2.0esr/media/webrtc/trunk/webrtc/typedefs.h
===================================================================
--- firefox-esr-52.2.0esr.orig/media/webrtc/trunk/webrtc/typedefs.h
+++ firefox-esr-52.2.0esr/media/webrtc/trunk/webrtc/typedefs.h
@@ -61,7 +61,7 @@
#define WEBRTC_ARCH_BIG_ENDIAN
#define WEBRTC_BIG_ENDIAN
#endif
-#elif defined(__sparc64__)
+#elif defined(__sparc__) && defined(__arch64__)
#define WEBRTC_ARCH_SPARC 1
#define WEBRTC_ARCH_64_BITS 1
#define WEBRTC_ARCH_BIG_ENDIAN
Index: firefox-esr-52.2.0esr/memory/jemalloc/src/include/jemalloc/internal/mb.h
===================================================================
--- firefox-esr-52.2.0esr.orig/memory/jemalloc/src/include/jemalloc/internal/mb.h
+++ firefox-esr-52.2.0esr/memory/jemalloc/src/include/jemalloc/internal/mb.h
@@ -76,7 +76,7 @@ mb_write(void)
: "memory" /* Clobbers. */
);
}
-#elif defined(__sparc64__)
+#elif defined(__sparc__) && defined(__arch64__)
JEMALLOC_INLINE void
mb_write(void)
{
Index: firefox-esr-52.2.0esr/memory/mozjemalloc/jemalloc.c
===================================================================
--- firefox-esr-52.2.0esr.orig/memory/mozjemalloc/jemalloc.c
+++ firefox-esr-52.2.0esr/memory/mozjemalloc/jemalloc.c
@@ -491,7 +491,7 @@ static const bool isthreaded = true;
# define SIZEOF_PTR_2POW 3
# define NO_TLS
#endif
-#ifdef __sparc64__
+#if defined(__sparc__) && defined(__arch64__)
# define QUANTUM_2POW_MIN 4
# define SIZEOF_PTR_2POW 3
# define NO_TLS
@@ -2401,7 +2401,7 @@ static void *
pages_map(void *addr, size_t size)
{
void *ret;
-#if defined(__ia64__)
+#if defined(__ia64__) || (defined(__sparc__) && defined(__arch64__))
/*
* The JS engine assumes that all allocated pointers have their high 17 bits clear,
* which ia64's mmap doesn't support directly. However, we can emulate it by passing
@@ -2422,6 +2422,28 @@ pages_map(void *addr, size_t size)
}
#endif
+#if defined(__sparc__) && defined(__arch64__) && defined(__linux__)
+ const uintptr_t start = UINT64_C(0x0000070000000000);
+ const uintptr_t end = UINT64_C(0x0000800000000000);
+ const uintptr_t step = 8 << 20; /* This is supposed to be ChunkSize */
+
+ /* Copied from js/src/Memory.cpp and adapted for this source */
+
+ uintptr_t hint;
+ void* region = MAP_FAILED;
+ for (hint = start; region == MAP_FAILED && hint + size <= end; hint += step) {
+ region = mmap((void*)hint, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0);
+ if (region != MAP_FAILED) {
+ if (((size_t) region + (size - 1)) & 0xffff800000000000) {
+ if (munmap(region, size)) {
+ MOZ_ASSERT(errno == ENOMEM);
+ }
+ region = MAP_FAILED;
+ }
+ }
+ }
+ ret = region;
+#else
/*
* We don't use MAP_FIXED here, because it can cause the *replacement*
* of existing mappings, and we only want to create new mappings.
@@ -2429,11 +2451,11 @@ pages_map(void *addr, size_t size)
ret = mmap(addr, size, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANON, -1, 0);
assert(ret != NULL);
-
+#endif
if (ret == MAP_FAILED) {
ret = NULL;
}
-#if defined(__ia64__)
+#if defined(__ia64__) || (defined(__sparc__) && defined(__arch64__))
/*
* If the allocated memory doesn't have its upper 17 bits clear, consider it
* as out of memory.
@@ -2466,7 +2488,7 @@ pages_map(void *addr, size_t size)
MozTagAnonymousMemory(ret, size, "jemalloc");
}
-#if defined(__ia64__)
+#if defined(__ia64__) || (defined(__sparc__) && defined(__arch64__))
assert(ret == NULL || (!check_placement && ret != NULL)
|| (check_placement && ret == addr));
#else
Index: firefox-esr-52.2.0esr/toolkit/components/protobuf/src/google/protobuf/stubs/platform_macros.h
===================================================================
--- firefox-esr-52.2.0esr.orig/toolkit/components/protobuf/src/google/protobuf/stubs/platform_macros.h
+++ firefox-esr-52.2.0esr/toolkit/components/protobuf/src/google/protobuf/stubs/platform_macros.h
@@ -67,7 +67,7 @@
#define GOOGLE_PROTOBUF_ARCH_32_BIT 1
#elif defined(sparc)
#define GOOGLE_PROTOBUF_ARCH_SPARC 1
-#ifdef SOLARIS_64BIT_ENABLED
+#if defined(__sparc_v9__) || defined(__sparcv9) || defined(__arch64__)
#define GOOGLE_PROTOBUF_ARCH_64_BIT 1
#else
#define GOOGLE_PROTOBUF_ARCH_32_BIT 1
Index: firefox-esr-52.2.0esr/widget/gonk/libui/sha1.c
===================================================================
--- firefox-esr-52.2.0esr.orig/widget/gonk/libui/sha1.c
+++ firefox-esr-52.2.0esr/widget/gonk/libui/sha1.c
@@ -87,7 +87,7 @@ typedef union {
/* old sparc64 gcc could not compile this */
#undef SPARC64_GCC_WORKAROUND
-#if defined(__sparc64__) && defined(__GNUC__) && __GNUC__ < 3
+#if defined(__sparc__) && defined(__arch64__) && defined(__GNUC__) && __GNUC__ < 3
#define SPARC64_GCC_WORKAROUND
#endif
Index: firefox-esr-52.2.0esr/xpcom/reflect/xptcall/md/unix/moz.build
===================================================================
--- firefox-esr-52.2.0esr.orig/xpcom/reflect/xptcall/md/unix/moz.build
+++ firefox-esr-52.2.0esr/xpcom/reflect/xptcall/md/unix/moz.build
@@ -232,7 +232,7 @@ if CONFIG['OS_ARCH'] == 'OpenBSD' and CO
'xptcstubs_ppc_openbsd.cpp',
]
-if CONFIG['OS_ARCH'] == 'Linux' and 'sparc' in CONFIG['OS_TEST']:
+if CONFIG['OS_ARCH'] == 'Linux' and CONFIG['OS_TEST'] == 'sparc':
SOURCES += [
'xptcinvoke_asm_sparc_linux_GCC3.s',
'xptcinvoke_sparc_solaris.cpp',
@@ -256,7 +256,7 @@ if CONFIG['OS_ARCH'] == 'OpenBSD' and CO
'xptcstubs_sparc_openbsd.cpp',
]
-if CONFIG['OS_ARCH'] in ('OpenBSD', 'FreeBSD') and CONFIG['OS_TEST'] == 'sparc64':
+if CONFIG['OS_ARCH'] in ('OpenBSD', 'FreeBSD', 'Linux') and CONFIG['OS_TEST'] == 'sparc64':
SOURCES += [
'xptcinvoke_asm_sparc64_openbsd.s',
'xptcinvoke_sparc64_openbsd.cpp',
Reply to: