Hello community, here is the log from the commit of package MozillaFirefox for openSUSE:Factory checked in at 2014-04-14 09:25:08 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/MozillaFirefox (Old) and /work/SRC/openSUSE:Factory/.MozillaFirefox.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "MozillaFirefox" Changes: -------- --- /work/SRC/openSUSE:Factory/MozillaFirefox/MozillaFirefox.changes 2014-04-02 17:25:09.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.MozillaFirefox.new/MozillaFirefox.changes 2014-04-14 09:25:09.000000000 +0200 @@ -1,0 +2,14 @@ +Mon Apr 7 15:34:31 UTC 2014 - [email protected] + +- add mozilla-aarch64-599882cfb998.patch, + mozilla-aarch64-bmo-810631.patch, + mozilla-aarch64-bmo-962488.patch, + mozilla-aarch64-bmo-963030.patch, + mozilla-aarch64-bmo-963027.patch, + mozilla-aarch64-bmo-963028.patch, + mozilla-aarch64-bmo-963029.patch, + mozilla-aarch64-bmo-963023.patch, + mozilla-aarch64-bmo-963024.patch, + mozilla-aarch64-bmo-963031.patch: AArch64 porting + +------------------------------------------------------------------- New: ---- mozilla-aarch64-599882cfb998.diff mozilla-aarch64-bmo-810631.patch mozilla-aarch64-bmo-962488.patch mozilla-aarch64-bmo-963023.patch mozilla-aarch64-bmo-963024.patch mozilla-aarch64-bmo-963027.patch mozilla-aarch64-bmo-963028.patch mozilla-aarch64-bmo-963029.patch mozilla-aarch64-bmo-963030.patch mozilla-aarch64-bmo-963031.patch ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ MozillaFirefox.spec ++++++ --- /var/tmp/diff_new_pack.JO42LK/_old 2014-04-14 09:25:13.000000000 +0200 +++ /var/tmp/diff_new_pack.JO42LK/_new 2014-04-14 09:25:13.000000000 +0200 @@ -113,13 +113,25 @@ Patch19: mozilla-ppc64le-webrtc.patch Patch20: mozilla-ppc64le-xpcom.patch Patch21: mozilla-ppc64-xpcom.patch +# Gecko/Toolkit AArch64 Porting +Patch36: mozilla-aarch64-599882cfb998.diff +Patch37: mozilla-aarch64-bmo-810631.patch +Patch38: mozilla-aarch64-bmo-962488.patch +Patch39: mozilla-aarch64-bmo-963030.patch +Patch40: mozilla-aarch64-bmo-963027.patch +Patch41: mozilla-aarch64-bmo-963028.patch +Patch42: mozilla-aarch64-bmo-963029.patch +Patch43: mozilla-aarch64-bmo-963023.patch +Patch44: mozilla-aarch64-bmo-963024.patch +Patch45: mozilla-aarch64-bmo-963031.patch + # Firefox/browser -Patch30: firefox-browser-css.patch -Patch31: firefox-kde.patch -Patch32: firefox-kde-114.patch -Patch33: firefox-no-default-ualocale.patch -Patch34: firefox-multilocale-chrome.patch -Patch35: firefox-branded-icons.patch +Patch100: firefox-browser-css.patch +Patch101: firefox-kde.patch +Patch102: firefox-kde-114.patch +Patch103: firefox-no-default-ualocale.patch +Patch104: firefox-multilocale-chrome.patch +Patch105: firefox-branded-icons.patch BuildRoot: %{_tmppath}/%{name}-%{version}-build Requires(post): coreutils shared-mime-info desktop-file-utils Requires(postun): shared-mime-info desktop-file-utils @@ -152,7 +164,7 @@ %define _google_api_key AIzaSyD1hTe85_a14kr1Ks8T3Ce75rvbR1_Dx7Q %define branding 1 %define localize 1 -%ifarch ppc ppc64 ppc64le s390 s390x ia64 %arm +%ifarch aarch64 ppc ppc64 ppc64le s390 s390x ia64 %arm %define crashreporter 0 %else %define crashreporter 1 @@ -259,15 +271,26 @@ %patch19 -p1 %patch20 -p1 %patch21 -p1 -# -%patch30 -p1 -%patch31 -p1 +%patch36 -p1 +%patch37 -p1 +%patch38 -p1 +%patch39 -p1 +%patch40 -p1 +%patch41 -p1 +%patch42 -p1 +%patch43 -p1 +%patch44 -p1 +%patch45 -p1 + +# Firefox +%patch100 -p1 +%patch101 -p1 %if %suse_version >= 1140 -%patch32 -p1 +%patch102 -p1 %endif -%patch33 -p1 -%patch34 -p1 -%patch35 -p1 +%patch103 -p1 +%patch104 -p1 +%patch105 -p1 %build # no need to add build time to binaries ++++++ mozilla-aarch64-599882cfb998.diff ++++++ diff --git a/js/src/assembler/wtf/Platform.h b/js/src/assembler/wtf/Platform.h --- a/js/src/assembler/wtf/Platform.h +++ b/js/src/assembler/wtf/Platform.h @@ -205,16 +205,23 @@ #endif /* WTF_CPU_S390 - S390 32-bit */ #if defined(__s390__) #define WTF_CPU_S390 1 #define WTF_CPU_BIG_ENDIAN 1 #endif +#if defined(__aarch64__) +#define WTF_CPU_AARCH64 1 +#if defined(__AARCH64EB__) +#define WTF_CPU_BIG_ENDIAN 1 +#endif +#endif + /* WTF_CPU_X86 - i386 / x86 32-bit */ #if defined(__i386__) \ || defined(i386) \ || defined(_M_IX86) \ || defined(_X86_) \ || defined(__THW_INTEL) #define WTF_CPU_X86 1 #endif ++++++ mozilla-aarch64-bmo-810631.patch ++++++ ++++ 100372 lines (skipped) ++++++ mozilla-aarch64-bmo-962488.patch ++++++ # HG changeset patch # User Marcin Juszkiewicz <[email protected]> # Date 1393440196 18000 # Node ID 6a46f53ad944b44385398822d7bcf7621a785d91 # Parent 0aa56e2a5f816a30da48701f73d03060ee9692b2 Bug 962488 - Update double-conversion for proper AArch64 support. r=froydnj Fix imported from upstream repository: https://code.google.com/p/double-conversion/source/detail?r=4e24bb31bcc76d6d218f3056b4c24a109d367561 diff --git a/mfbt/double-conversion/fix-aarch64-macro.patch b/mfbt/double-conversion/fix-aarch64-macro.patch new file mode 100644 --- /dev/null +++ b/mfbt/double-conversion/fix-aarch64-macro.patch @@ -0,0 +1,23 @@ +Backport from upstream. + +https://code.google.com/p/double-conversion/source/detail?r=4e24bb31bcc76d6d218f3056b4c24a109d367561 + +--- + mfbt/double-conversion/utils.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/mfbt/double-conversion/utils.h ++++ b/mfbt/double-conversion/utils.h +@@ -58,11 +58,11 @@ + defined(__mips__) || \ + defined(__powerpc__) || defined(__ppc__) || defined(__ppc64__) || \ + defined(__sparc__) || defined(__sparc) || defined(__s390__) || \ + defined(__SH4__) || defined(__alpha__) || \ + defined(_MIPS_ARCH_MIPS32R2) || \ +- defined(_AARCH64EL_) ++ defined(__AARCH64EL__) + #define DOUBLE_CONVERSION_CORRECT_DOUBLE_OPERATIONS 1 + #elif defined(_M_IX86) || defined(__i386__) || defined(__i386) + #if defined(_WIN32) + // Windows uses a 64bit wide floating point stack. + #define DOUBLE_CONVERSION_CORRECT_DOUBLE_OPERATIONS 1 diff --git a/mfbt/double-conversion/update.sh b/mfbt/double-conversion/update.sh --- a/mfbt/double-conversion/update.sh +++ b/mfbt/double-conversion/update.sh @@ -15,9 +15,12 @@ cp $1/src/*.h ./ # Source cp $1/src/*.cc ./ patch -p3 < add-mfbt-api-markers.patch patch -p3 < use-StandardInteger.patch patch -p3 < use-mozilla-assertions.patch patch -p3 < use-static_assert.patch -patch -p3 < ToPrecision-exponential.patch \ No newline at end of file +patch -p3 < ToPrecision-exponential.patch + +# Merged upstream, part of 2.0.1 version +patch -p3 < fix-aarch64-macro.patch diff --git a/mfbt/double-conversion/utils.h b/mfbt/double-conversion/utils.h --- a/mfbt/double-conversion/utils.h +++ b/mfbt/double-conversion/utils.h @@ -55,17 +55,17 @@ #if defined(_M_X64) || defined(__x86_64__) || \ defined(__ARMEL__) || defined(__avr32__) || \ defined(__hppa__) || defined(__ia64__) || \ defined(__mips__) || \ defined(__powerpc__) || defined(__ppc__) || defined(__ppc64__) || \ defined(__sparc__) || defined(__sparc) || defined(__s390__) || \ defined(__SH4__) || defined(__alpha__) || \ defined(_MIPS_ARCH_MIPS32R2) || \ - defined(_AARCH64EL_) + defined(__AARCH64EL__) #define DOUBLE_CONVERSION_CORRECT_DOUBLE_OPERATIONS 1 #elif defined(_M_IX86) || defined(__i386__) || defined(__i386) #if defined(_WIN32) // Windows uses a 64bit wide floating point stack. #define DOUBLE_CONVERSION_CORRECT_DOUBLE_OPERATIONS 1 #else #undef DOUBLE_CONVERSION_CORRECT_DOUBLE_OPERATIONS #endif // _WIN32 ++++++ mozilla-aarch64-bmo-963023.patch ++++++ # HG changeset patch # User Marcin Juszkiewicz <[email protected]> # Date 1392217668 18000 # Node ID 4e9b713f435ade266a68a8d7ba08aad65c3fa6c5 # Parent 282b6e88f9d4c2367a72836f6f9efeab2aadaa58 Bug 963023 - AArch64 support for libevent. r=froydnj diff --git a/ipc/chromium/src/third_party/libevent-use-non-deprecated-syscalls.patch b/ipc/chromium/src/third_party/libevent-use-non-deprecated-syscalls.patch new file mode 100644 --- /dev/null +++ b/ipc/chromium/src/third_party/libevent-use-non-deprecated-syscalls.patch @@ -0,0 +1,43 @@ +--- + ipc/chromium/src/third_party/libevent/epoll_sub.c | 13 +++++++++++++ + 1 file changed, 13 insertions(+) + +--- mozilla-central.orig/ipc/chromium/src/third_party/libevent/epoll_sub.c ++++ mozilla-central/ipc/chromium/src/third_party/libevent/epoll_sub.c +@@ -29,15 +29,24 @@ + #include <sys/param.h> + #include <sys/types.h> + #include <sys/syscall.h> + #include <sys/epoll.h> + #include <unistd.h> ++#include <errno.h> + + int + epoll_create(int size) + { ++#if !defined(__NR_epoll_create) && defined(__NR_epoll_create1) ++ if (size <= 0) { ++ errno = EINVAL; ++ return -1; ++ } ++ return (syscall(__NR_epoll_create1, 0)); ++#else + return (syscall(__NR_epoll_create, size)); ++#endif + } + + int + epoll_ctl(int epfd, int op, int fd, struct epoll_event *event) + { +@@ -46,7 +55,11 @@ epoll_ctl(int epfd, int op, int fd, stru + } + + int + epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout) + { ++#if !defined(__NR_epoll_wait) && defined(__NR_epoll_pwait) ++ return (syscall(__NR_epoll_pwait, epfd, events, maxevents, timeout, NULL, 0)); ++#else + return (syscall(__NR_epoll_wait, epfd, events, maxevents, timeout)); ++#endif + } diff --git a/ipc/chromium/src/third_party/libevent/README.mozilla b/ipc/chromium/src/third_party/libevent/README.mozilla --- a/ipc/chromium/src/third_party/libevent/README.mozilla +++ b/ipc/chromium/src/third_party/libevent/README.mozilla @@ -8,8 +8,10 @@ android/event2/event-config.h These files are taken from libevent-2.0.21-stable built on the development environment indicated by the first path component. You have to run "./configure" and "make" to get all of the pre-processing done. The file can then be found in "include/event2/". 2. This is ugly, prepare yourself. OS X has a weird problem with how the "TAILQ_END(head)" is used, causing a linking error. Just replace all use of the "TAILQ_END(head)" macro with "NULL". 3. Apply "add mac-arc4random-buf.patch", which removes some bad OS X compatibility code. This will allow libevent to compile on all supported versions of OS X. 4. Apply "openbsd-no-arc4random_addrandom.patch", which fixes the build on OpenBSD (which doesnt provide arc4random_addrandom anymore, see #931354) + +5. Apply "libevent-use-non-deprecated-syscalls.patch", which fixes the build on AArch64 architecture (which does not provide deprecated syscalls) diff --git a/ipc/chromium/src/third_party/libevent/epoll_sub.c b/ipc/chromium/src/third_party/libevent/epoll_sub.c --- a/ipc/chromium/src/third_party/libevent/epoll_sub.c +++ b/ipc/chromium/src/third_party/libevent/epoll_sub.c @@ -26,27 +26,40 @@ */ #include <stdint.h> #include <sys/param.h> #include <sys/types.h> #include <sys/syscall.h> #include <sys/epoll.h> #include <unistd.h> +#include <errno.h> int epoll_create(int size) { +#if !defined(__NR_epoll_create) && defined(__NR_epoll_create1) + if (size <= 0) { + errno = EINVAL; + return -1; + } + return (syscall(__NR_epoll_create1, 0)); +#else return (syscall(__NR_epoll_create, size)); +#endif } int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event) { return (syscall(__NR_epoll_ctl, epfd, op, fd, event)); } int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout) { +#if !defined(__NR_epoll_wait) && defined(__NR_epoll_pwait) + return (syscall(__NR_epoll_pwait, epfd, events, maxevents, timeout, NULL, 0)); +#else return (syscall(__NR_epoll_wait, epfd, events, maxevents, timeout)); +#endif } ++++++ mozilla-aarch64-bmo-963024.patch ++++++ # HG changeset patch # User Marcin Juszkiewicz <[email protected]> # Date 1393440196 18000 # Node ID d56b5c1a557348d4ac14a4d1ea7a5b5d240e3647 # Parent 6a46f53ad944b44385398822d7bcf7621a785d91 Bug 963024 - AArch64 support for XPCOM. r=froydnj diff --git a/xpcom/reflect/xptcall/src/md/unix/moz.build b/xpcom/reflect/xptcall/src/md/unix/moz.build --- a/xpcom/reflect/xptcall/src/md/unix/moz.build +++ b/xpcom/reflect/xptcall/src/md/unix/moz.build @@ -144,16 +144,23 @@ if CONFIG['OS_ARCH'] == 'NetBSD': if CONFIG['OS_TEST'] in ('amiga', 'atari', 'hp300', 'mac68k', 'mvme68k', 'next68k', 'sun3', 'sun3x', 'x68k'): SOURCES += [ 'xptcinvoke_netbsd_m68k.cpp', 'xptcstubs_netbsd_m68k.cpp' ] if CONFIG['OS_ARCH'] == 'Linux': + if CONFIG['OS_TEST'] == 'aarch64': + SOURCES += [ + 'xptcinvoke_aarch64.cpp', + 'xptcinvoke_asm_aarch64.s', + 'xptcstubs_aarch64.cpp', + 'xptcstubs_asm_aarch64.s', + ] if CONFIG['OS_TEST'] == 'm68k': SOURCES += [ 'xptcinvoke_linux_m68k.cpp', 'xptcstubs_linux_m68k.cpp', ] if CONFIG['OS_TEST'].find('mips') != -1: if CONFIG['OS_TEST'].find('mips64') != -1: SOURCES += [ diff --git a/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_aarch64.cpp b/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_aarch64.cpp new file mode 100644 --- /dev/null +++ b/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_aarch64.cpp @@ -0,0 +1,136 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * 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/. */ + +/* Platform specific code to invoke XPCOM methods on native objects */ + +#include "xptcprivate.h" + +#if !defined(__aarch64__) +#error "This code is for Linux AArch64 only." +#endif + + +/* "Procedure Call Standard for the ARM 64-bit Architecture" document, sections + * "5.4 Parameter Passing" and "6.1.2 Procedure Calling" contain all the + * needed information. + * + * http://infocenter.arm.com/help/topic/com.arm.doc.ihi0042d/IHI0042D_aapcs.pdf + */ + +#ifndef __AARCH64EL__ +#error "Only little endian compatibility was tested" +#endif + +/* + * Allocation of integer function arguments initially to registers r1-r7 + * and then to stack. Handling of 'that' argument which goes to register r0 + * is handled separately and does not belong here. + * + * 'ireg_args' - pointer to the current position in the buffer, + * corresponding to the register arguments + * 'stack_args' - pointer to the current position in the buffer, + * corresponding to the arguments on stack + * 'end' - pointer to the end of the registers argument + * buffer. + */ +static inline void alloc_word(uint64_t* &ireg_args, + uint64_t* &stack_args, + uint64_t* end, + uint64_t data) +{ + if (ireg_args < end) { + *ireg_args = data; + ireg_args++; + } else { + *stack_args = data; + stack_args++; + } +} + +static inline void alloc_double(double* &freg_args, + uint64_t* &stack_args, + double* end, + double data) +{ + if (freg_args < end) { + *freg_args = data; + freg_args++; + } else { + memcpy(stack_args, &data, sizeof(data)); + stack_args++; + } +} + +static inline void alloc_float(double* &freg_args, + uint64_t* &stack_args, + double* end, + float data) +{ + if (freg_args < end) { + memcpy(freg_args, &data, sizeof(data)); + freg_args++; + } else { + memcpy(stack_args, &data, sizeof(data)); + stack_args++; + } +} + + +extern "C" void +invoke_copy_to_stack(uint64_t* stk, uint64_t *end, + uint32_t paramCount, nsXPTCVariant* s) +{ + uint64_t *ireg_args = stk; + uint64_t *ireg_end = ireg_args + 8; + double *freg_args = (double *)ireg_end; + double *freg_end = freg_args + 8; + uint64_t *stack_args = (uint64_t *)freg_end; + + // leave room for 'that' argument in x0 + ++ireg_args; + + for (uint32_t i = 0; i < paramCount; i++, s++) { + if (s->IsPtrData()) { + alloc_word(ireg_args, stack_args, ireg_end, (uint64_t)s->ptr); + continue; + } + // According to the ABI, integral types that are smaller than 8 bytes + // are to be passed in 8-byte registers or 8-byte stack slots. + switch (s->type) { + case nsXPTType::T_FLOAT: + alloc_float(freg_args, stack_args, freg_end, s->val.f); + break; + case nsXPTType::T_DOUBLE: + alloc_double(freg_args, stack_args, freg_end, s->val.d); + break; + case nsXPTType::T_I8: alloc_word(ireg_args, stk, end, s->val.i8); break; + case nsXPTType::T_I16: alloc_word(ireg_args, stk, end, s->val.i16); break; + case nsXPTType::T_I32: alloc_word(ireg_args, stk, end, s->val.i32); break; + case nsXPTType::T_I64: alloc_word(ireg_args, stk, end, s->val.i64); break; + case nsXPTType::T_U8: alloc_word(ireg_args, stk, end, s->val.u8); break; + case nsXPTType::T_U16: alloc_word(ireg_args, stk, end, s->val.u16); break; + case nsXPTType::T_U32: alloc_word(ireg_args, stk, end, s->val.u32); break; + case nsXPTType::T_U64: alloc_word(ireg_args, stk, end, s->val.u64); break; + case nsXPTType::T_BOOL: alloc_word(ireg_args, stk, end, s->val.b); break; + case nsXPTType::T_CHAR: alloc_word(ireg_args, stk, end, s->val.c); break; + case nsXPTType::T_WCHAR: alloc_word(ireg_args, stk, end, s->val.wc); break; + default: + // all the others are plain pointer types + alloc_word(ireg_args, stack_args, ireg_end, + reinterpret_cast<uint64_t>(s->val.p)); + break; + } + } +} + +extern "C" nsresult _NS_InvokeByIndex(nsISupports* that, uint32_t methodIndex, + uint32_t paramCount, nsXPTCVariant* params); + +EXPORT_XPCOM_API(nsresult) +NS_InvokeByIndex(nsISupports* that, uint32_t methodIndex, + uint32_t paramCount, nsXPTCVariant* params) +{ + return _NS_InvokeByIndex(that, methodIndex, paramCount, params); +} diff --git a/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_asm_aarch64.s b/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_asm_aarch64.s new file mode 100644 --- /dev/null +++ b/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_asm_aarch64.s @@ -0,0 +1,67 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * 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/. */ + + .section ".text" + .globl _NS_InvokeByIndex + .type _NS_InvokeByIndex,@function + +/* + * _NS_InvokeByIndex(nsISupports* that, uint32_t methodIndex, + * uint32_t paramCount, nsXPTCVariant* params) + */ + +_NS_InvokeByIndex: + # set up frame + stp x29, x30, [sp,#-32]! + mov x29, sp + stp x19, x20, [sp,#16] + + # save methodIndex across function calls + mov w20, w1 + + # end of stack area passed to invoke_copy_to_stack + mov x1, sp + + # assume 8 bytes of stack for each argument with 16-byte alignment + add w19, w2, #1 + and w19, w19, #0xfffffffe + sub sp, sp, w19, uxth #3 + + # temporary place to store args passed in r0-r7,v0-v7 + sub sp, sp, #128 + + # save 'that' on stack + str x0, [sp] + + # start of stack area passed to invoke_copy_to_stack + mov x0, sp + bl invoke_copy_to_stack + + # load arguments passed in r0-r7 + ldp x6, x7, [sp, #48] + ldp x4, x5, [sp, #32] + ldp x2, x3, [sp, #16] + ldp x0, x1, [sp],#64 + + # load arguments passed in v0-v7 + ldp d6, d7, [sp, #48] + ldp d4, d5, [sp, #32] + ldp d2, d3, [sp, #16] + ldp d0, d1, [sp],#64 + + # call the method + ldr x16, [x0] + add x16, x16, w20, uxth #3 + ldr x16, [x16] + blr x16 + + add sp, sp, w19, uxth #3 + ldp x19, x20, [sp,#16] + ldp x29, x30, [sp],#32 + ret + + .size _NS_InvokeByIndex, . - _NS_InvokeByIndex + + diff --git a/xpcom/reflect/xptcall/src/md/unix/xptcstubs_aarch64.cpp b/xpcom/reflect/xptcall/src/md/unix/xptcstubs_aarch64.cpp new file mode 100644 --- /dev/null +++ b/xpcom/reflect/xptcall/src/md/unix/xptcstubs_aarch64.cpp @@ -0,0 +1,219 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * 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 "xptcprivate.h" +#include "xptiprivate.h" + +#ifndef __AARCH64EL__ +#error "Only little endian compatibility was tested" +#endif + +/* + * This is for AArch64 ABI + * + * When we're called, the "gp" registers are stored in gprData and + * the "fp" registers are stored in fprData. Each array has 8 regs + * but first reg in gprData is a placeholder for 'self'. + */ +extern "C" nsresult +PrepareAndDispatch(nsXPTCStubBase* self, uint32_t methodIndex, uint64_t* args, + uint64_t *gprData, double *fprData) +{ +#define PARAM_BUFFER_COUNT 16 +#define PARAM_GPR_COUNT 8 +#define PARAM_FPR_COUNT 8 + + nsXPTCMiniVariant paramBuffer[PARAM_BUFFER_COUNT]; + nsXPTCMiniVariant* dispatchParams = NULL; + const nsXPTMethodInfo* info; + nsresult result = NS_ERROR_FAILURE; + + NS_ASSERTION(self,"no self"); + + self->mEntry->GetMethodInfo(uint16_t(methodIndex), &info); + NS_ASSERTION(info,"no method info"); + + uint32_t paramCount = info->GetParamCount(); + + // setup variant array pointer + if (paramCount > PARAM_BUFFER_COUNT) { + dispatchParams = new nsXPTCMiniVariant[paramCount]; + } else { + dispatchParams = paramBuffer; + } + NS_ASSERTION(dispatchParams,"no place for params"); + + uint64_t* ap = args; + uint32_t next_gpr = 1; // skip first arg which is 'self' + uint32_t next_fpr = 0; + for (uint32_t i = 0; i < paramCount; i++) { + const nsXPTParamInfo& param = info->GetParam(i); + const nsXPTType& type = param.GetType(); + nsXPTCMiniVariant* dp = &dispatchParams[i]; + + if (param.IsOut() || !type.IsArithmetic()) { + if (next_gpr < PARAM_GPR_COUNT) { + dp->val.p = (void*)gprData[next_gpr++]; + } else { + dp->val.p = (void*)*ap++; + } + continue; + } + + switch (type) { + case nsXPTType::T_I8: + if (next_gpr < PARAM_GPR_COUNT) { + dp->val.i8 = (int8_t)gprData[next_gpr++]; + } else { + dp->val.i8 = (int8_t)*ap++; + } + break; + + case nsXPTType::T_I16: + if (next_gpr < PARAM_GPR_COUNT) { + dp->val.i16 = (int16_t)gprData[next_gpr++]; + } else { + dp->val.i16 = (int16_t)*ap++; + } + break; + + case nsXPTType::T_I32: + if (next_gpr < PARAM_GPR_COUNT) { + dp->val.i32 = (int32_t)gprData[next_gpr++]; + } else { + dp->val.i32 = (int32_t)*ap++; + } + break; + + case nsXPTType::T_I64: + if (next_gpr < PARAM_GPR_COUNT) { + dp->val.i64 = (int64_t)gprData[next_gpr++]; + } else { + dp->val.i64 = (int64_t)*ap++; + } + break; + + case nsXPTType::T_U8: + if (next_gpr < PARAM_GPR_COUNT) { + dp->val.u8 = (uint8_t)gprData[next_gpr++]; + } else { + dp->val.u8 = (uint8_t)*ap++; + } + break; + + case nsXPTType::T_U16: + if (next_gpr < PARAM_GPR_COUNT) { + dp->val.u16 = (uint16_t)gprData[next_gpr++]; + } else { + dp->val.u16 = (uint16_t)*ap++; + } + break; + + case nsXPTType::T_U32: + if (next_gpr < PARAM_GPR_COUNT) { + dp->val.u32 = (uint32_t)gprData[next_gpr++]; + } else { + dp->val.u32 = (uint32_t)*ap++; + } + break; + + case nsXPTType::T_U64: + if (next_gpr < PARAM_GPR_COUNT) { + dp->val.u64 = (uint64_t)gprData[next_gpr++]; + } else { + dp->val.u64 = (uint64_t)*ap++; + } + break; + + case nsXPTType::T_FLOAT: + if (next_fpr < PARAM_FPR_COUNT) { + memcpy(&dp->val.f, &fprData[next_fpr++], sizeof(dp->val.f)); + } else { + memcpy(&dp->val.f, ap++, sizeof(dp->val.f)); + } + break; + + case nsXPTType::T_DOUBLE: + if (next_fpr < PARAM_FPR_COUNT) { + memcpy(&dp->val.d, &fprData[next_fpr++], sizeof(dp->val.d)); + } else { + memcpy(&dp->val.d, ap++, sizeof(dp->val.d)); + } + break; + + case nsXPTType::T_BOOL: + if (next_gpr < PARAM_GPR_COUNT) { + dp->val.b = (bool)gprData[next_gpr++]; + } else { + dp->val.b = (bool)*ap++; + } + break; + + case nsXPTType::T_CHAR: + if (next_gpr < PARAM_GPR_COUNT) { + dp->val.c = (char)gprData[next_gpr++]; + } else { + dp->val.c = (char)*ap++; + } + break; + + case nsXPTType::T_WCHAR: + if (next_gpr < PARAM_GPR_COUNT) { + dp->val.wc = (wchar_t)gprData[next_gpr++]; + } else { + dp->val.wc = (wchar_t)*ap++; + } + break; + + default: + NS_ASSERTION(0, "bad type"); + break; + } + } + + result = self->mOuter->CallMethod((uint16_t)methodIndex, info, dispatchParams); + + if (dispatchParams != paramBuffer) { + delete [] dispatchParams; + } + + return result; +} + +// Load w17 with the constant 'n' and branch to SharedStub(). +# define STUB_ENTRY(n) \ + __asm__ ( \ + ".section \".text\" \n\t" \ + ".align 2\n\t" \ + ".if "#n" < 10 \n\t" \ + ".globl _ZN14nsXPTCStubBase5Stub"#n"Ev \n\t" \ + ".hidden _ZN14nsXPTCStubBase5Stub"#n"Ev \n\t" \ + ".type _ZN14nsXPTCStubBase5Stub"#n"Ev,@function \n\n" \ + "_ZN14nsXPTCStubBase5Stub"#n"Ev: \n\t" \ + ".elseif "#n" < 100 \n\t" \ + ".globl _ZN14nsXPTCStubBase6Stub"#n"Ev \n\t" \ + ".hidden _ZN14nsXPTCStubBase6Stub"#n"Ev \n\t" \ + ".type _ZN14nsXPTCStubBase6Stub"#n"Ev,@function \n\n" \ + "_ZN14nsXPTCStubBase6Stub"#n"Ev: \n\t" \ + ".elseif "#n" < 1000 \n\t" \ + ".globl _ZN14nsXPTCStubBase7Stub"#n"Ev \n\t" \ + ".hidden _ZN14nsXPTCStubBase7Stub"#n"Ev \n\t" \ + ".type _ZN14nsXPTCStubBase7Stub"#n"Ev,@function \n\n" \ + "_ZN14nsXPTCStubBase7Stub"#n"Ev: \n\t" \ + ".else \n\t" \ + ".err \"stub number "#n" >= 1000 not yet supported\"\n" \ + ".endif \n\t" \ + "mov w17,#"#n" \n\t" \ + "b SharedStub \n" \ +); + +#define SENTINEL_ENTRY(n) \ + nsresult nsXPTCStubBase::Sentinel##n() \ +{ \ + NS_ASSERTION(0,"nsXPTCStubBase::Sentinel called"); \ + return NS_ERROR_NOT_IMPLEMENTED; \ +} + +#include "xptcstubsdef.inc" diff --git a/xpcom/reflect/xptcall/src/md/unix/xptcstubs_asm_aarch64.s b/xpcom/reflect/xptcall/src/md/unix/xptcstubs_asm_aarch64.s new file mode 100644 --- /dev/null +++ b/xpcom/reflect/xptcall/src/md/unix/xptcstubs_asm_aarch64.s @@ -0,0 +1,39 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# 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/. + + .set NGPREGS,8 + .set NFPREGS,8 + + .section ".text" + .globl SharedStub + .hidden SharedStub + .type SharedStub,@function +SharedStub: + stp x29, x30, [sp,#-16]! + mov x29, sp + + sub sp, sp, #8*(NGPREGS+NFPREGS) + stp x0, x1, [sp, #64+(0*8)] + stp x2, x3, [sp, #64+(2*8)] + stp x4, x5, [sp, #64+(4*8)] + stp x6, x7, [sp, #64+(6*8)] + stp d0, d1, [sp, #(0*8)] + stp d2, d3, [sp, #(2*8)] + stp d4, d5, [sp, #(4*8)] + stp d6, d7, [sp, #(6*8)] + + # methodIndex passed from stub + mov w1, w17 + + add x2, sp, #16+(8*(NGPREGS+NFPREGS)) + add x3, sp, #8*NFPREGS + add x4, sp, #0 + + bl PrepareAndDispatch + + add sp, sp, #8*(NGPREGS+NFPREGS) + ldp x29, x30, [sp],#16 + ret + + .size SharedStub, . - SharedStub ++++++ mozilla-aarch64-bmo-963027.patch ++++++ # HG changeset patch # User Marcin Juszkiewicz <[email protected]> # Date 1392218661 18000 # Node ID 38fca44b6b86e2f12535900e2084f0378217570f # Parent 8858624d813a6200b059590c146cf774fc16ff38 Bug 963027 - AArch64 support for WebRTC. r=derf Index: mozilla/media/webrtc/trunk/webrtc/typedefs.h =================================================================== --- mozilla.orig/media/webrtc/trunk/webrtc/typedefs.h +++ mozilla/media/webrtc/trunk/webrtc/typedefs.h @@ -113,6 +113,16 @@ #define WEBRTC_ARCH_32_BITS 1 #define WEBRTC_ARCH_BIG_ENDIAN #define WEBRTC_BIG_ENDIAN +#elif defined(__aarch64__) +#define WEBRTC_ARCH_AARCH64 1 +#define WEBRTC_ARCH_64_BITS 1 +#if defined(__AARCH64EL__) +#define WEBRTC_ARCH_LITTLE_ENDIAN +#define WEBRTC_LITTLE_ENDIAN +#elif defined(__AARCH64EB__) +#define WEBRTC_ARCH_BIG_ENDIAN +#define WEBRTC_BIG_ENDIAN +#endif #elif defined(__alpha__) #define WEBRTC_ARCH_ALPHA 1 #define WEBRTC_ARCH_64_BITS 1 ++++++ mozilla-aarch64-bmo-963028.patch ++++++ # HG changeset patch # User Marcin Juszkiewicz <[email protected]> # Date 1390512871 18000 # Node ID feaf8bd56a82749f5d0d8869b7c0a1c01e300362 # Parent 2a082f03cd1d64c8bfff9641284f2dc23617f806 Bug 963028 - AArch64 support for jemalloc. r=froydnj diff --git a/memory/jemalloc/src/include/jemalloc/internal/jemalloc_internal.h.in b/memory/jemalloc/src/include/jemalloc/internal/jemalloc_internal.h.in --- a/memory/jemalloc/src/include/jemalloc/internal/jemalloc_internal.h.in +++ b/memory/jemalloc/src/include/jemalloc/internal/jemalloc_internal.h.in @@ -283,16 +283,19 @@ static const bool config_ivsalloc = # define LG_QUANTUM 4 # endif # ifdef __SH4__ # define LG_QUANTUM 4 # endif # ifdef __tile__ # define LG_QUANTUM 4 # endif +# ifdef __aarch64__ +# define LG_QUANTUM 4 +# endif # ifndef LG_QUANTUM # error "No LG_QUANTUM definition for architecture; specify via CPPFLAGS" # endif #endif #define QUANTUM ((size_t)(1U << LG_QUANTUM)) #define QUANTUM_MASK (QUANTUM - 1) diff --git a/memory/mozjemalloc/jemalloc.c b/memory/mozjemalloc/jemalloc.c --- a/memory/mozjemalloc/jemalloc.c +++ b/memory/mozjemalloc/jemalloc.c @@ -1097,17 +1097,17 @@ static unsigned ncpus; /* * VM page size. It must divide the runtime CPU page size or the code * will abort. * Platform specific page size conditions copied from js/public/HeapAPI.h */ #if (defined(SOLARIS) || defined(__FreeBSD__)) && \ (defined(__sparc) || defined(__sparcv9) || defined(__ia64)) #define pagesize_2pow ((size_t) 13) -#elif defined(__powerpc64__) +#elif defined(__powerpc64__) || defined(__aarch64__) #define pagesize_2pow ((size_t) 16) #else #define pagesize_2pow ((size_t) 12) #endif #define pagesize ((size_t) 1 << pagesize_2pow) #define pagesize_mask (pagesize - 1) /* Various quantum-related settings. */ ++++++ mozilla-aarch64-bmo-963029.patch ++++++ # HG changeset patch # User Marcin Juszkiewicz <[email protected]> # Date 1390512871 18000 # Node ID 89e06a821ad5986035de99c8bc1f9d7a99541b2a # Parent feaf8bd56a82749f5d0d8869b7c0a1c01e300362 Bug 963029 - AArch64 support for MFBT. r=froydnj Index: mozilla/mfbt/Endian.h =================================================================== --- mozilla.orig/mfbt/Endian.h +++ mozilla/mfbt/Endian.h @@ -121,14 +121,14 @@ #elif defined(__sparc) || defined(__sparc__) || \ defined(_POWER) || defined(__hppa) || \ defined(_MIPSEB) || defined(__ARMEB__) || \ - defined(__s390__) || \ + defined(__s390__) || defined(__AARCH64EB__) || \ (defined(__sh__) && defined(__LITTLE_ENDIAN__)) || \ (defined(__ia64) && defined(__BIG_ENDIAN__)) # define MOZ_BIG_ENDIAN 1 #elif defined(__i386) || defined(__i386__) || \ defined(__x86_64) || defined(__x86_64__) || \ defined(_MIPSEL) || defined(__ARMEL__) || \ - defined(__alpha__) || \ + defined(__alpha__) || defined(__AARCH64EL__) || \ (defined(__sh__) && defined(__BIG_ENDIAN__)) || \ (defined(__ia64) && !defined(__BIG_ENDIAN__)) # define MOZ_LITTLE_ENDIAN 1 Index: mozilla/mfbt/tests/TestPoisonArea.cpp =================================================================== --- mozilla.orig/mfbt/tests/TestPoisonArea.cpp +++ mozilla/mfbt/tests/TestPoisonArea.cpp @@ -161,6 +161,9 @@ #elif defined __s390__ #define RETURN_INSTR 0x07fe0000 /* br %r14 */ +#elif defined __aarch64__ +#define RETURN_INSTR 0xd65f03c0 /* ret */ + #elif defined __ia64 struct ia64_instr { uint32_t i[4]; }; static const ia64_instr _return_instr = ++++++ mozilla-aarch64-bmo-963030.patch ++++++ # HG changeset patch # User Marcin Juszkiewicz <[email protected]> # Date 1391033256 18000 # Node ID 8a76622ce10d83a9dd070b968367efd8e73dc7cc # Parent d890e603d751c465f2a0e2d2221e033b32afe4a9 Bug 963030 - AArch64 support for IPC. r=bsmedberg diff --git a/ipc/chromium/src/build/build_config.h b/ipc/chromium/src/build/build_config.h --- a/ipc/chromium/src/build/build_config.h +++ b/ipc/chromium/src/build/build_config.h @@ -97,16 +97,19 @@ #define ARCH_CPU_S390X 1 #define ARCH_CPU_64_BITS 1 #elif defined(__s390__) #define ARCH_CPU_S390 1 #define ARCH_CPU_32_BITS 1 #elif defined(__alpha__) #define ARCH_CPU_ALPHA 1 #define ARCH_CPU_64_BITS 1 +#elif defined(__aarch64__) +#define ARCH_CPU_AARCH64 1 +#define ARCH_CPU_64_BITS 1 #else #error Please add support for your architecture in build/build_config.h #endif // Type detection for wchar_t. #if defined(OS_WIN) #define WCHAR_T_IS_UTF16 #else ++++++ mozilla-aarch64-bmo-963031.patch ++++++ # HG changeset patch # User Marcin Juszkiewicz <[email protected]> # Date 1390828707 18000 # Node ID 01c406c513473eef5c98940ba8d3040c456044d8 # Parent b781647898f4a82e6cdeeb907ebbc402545698db Bug 963031 - AArch support for Graphics. r=doublec diff --git a/gfx/ycbcr/chromium_types.h b/gfx/ycbcr/chromium_types.h --- a/gfx/ycbcr/chromium_types.h +++ b/gfx/ycbcr/chromium_types.h @@ -41,13 +41,17 @@ typedef uint32_t uint32; #elif defined(__sparc) #define ARCH_CPU_SPARC_FAMILY 1 #define ARCH_CPU_SPARC 1 #define ARCH_CPU_32_BITS 1 #elif defined(__sparcv9) #define ARCH_CPU_SPARC_FAMILY 1 #define ARCH_CPU_SPARC 1 #define ARCH_CPU_64_BITS 1 +#elif defined(__aarch64__) +#define ARCH_CPU_AARCH64_FAMILY 1 +#define ARCH_CPU_AARCH64 1 +#define ARCH_CPU_64_BITS 1 #else #warning Please add support for your architecture in chromium_types.h #endif #endif // GFX_CHROMIUMTYPES_H -- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
