arm64: userspace broken with jemalloc 4.0.0

Julien Grall julien.grall at citrix.com
Tue Sep 1 07:25:20 UTC 2015


Hi Andrew,

On 31/08/2015 22:06, Andrew Turner wrote:
> On Sat, 29 Aug 2015 23:05:52 +0100
> Julien Grall <julien.grall at citrix.com> wrote:
>> I've built the latest freebsd master (r287263) for arm64 today. While
>> trying to use the userspace I hit some ASSERT in jemalloc:
>>
>> # ls
>> <jemalloc>: /usr/src/freebsd/lib/libc/../../contrib/jemalloc/include/jemalloc/internal/arena.h:571:
>> Failed assertion: "pageind >= map_bias" pid 21 (ls), uid 0: exited on
>> signal 6 Abort trap
>>
>> It's happening every time with the command "ls".
>>
>> I tried to use the previous version of jemalloc (i.e reverting
>> all the patches up to "Update jemalloc to version 4.0.0" included)
>> and everything is working.
>>
>> Note that I'm using Freebsd as a Xen ARM guest although the only
>> difference is the version of jemalloc (4.0.0 vs 3.6.0).
>>
>> Does anyone using arm64 have seen a similar ASSERT?
>>
>> BTW, is there any way to rebuild only the libc rather than doing
>> make buildworld everytime I modified the jemalloc code?
>>
>> Regards,
>>
> 
> This is a bug in the runtime linkers handling of tls. The attached
> patch allows me to get to multiuser mode without anything hitting the
> above assert.

I ended up to a similar patch during the week-end (see below). Although
I was looking to the amd64/i386 definition of calculate_tls_offset which
is the same as ARM64. I didn't understand why it's working for this architecture
but not for ours.

Is there any possible bug in the amd64/i386 runtime too?

Regards,

commit 3ee52ef6864c2180979d3de92cdf56f18a408beb
Author: Julien Grall <julien.grall at citrix.com>
Date:   Mon Aug 31 01:28:53 2015 +0100

    rtld: fix

diff --git a/libexec/rtld-elf/aarch64/rtld_machdep.h b/libexec/rtld-elf/aarch64/rtld_machdep.h
index 1cb2029..ff4d60a 100644
--- a/libexec/rtld-elf/aarch64/rtld_machdep.h
+++ b/libexec/rtld-elf/aarch64/rtld_machdep.h
@@ -66,7 +66,7 @@ Elf_Addr reloc_jmpslot(Elf_Addr *where, Elf_Addr target,
 #define        calculate_first_tls_offset(size, align) \
        round(size, align)
 #define        calculate_tls_offset(prev_offset, prev_size, size, align) \
-       round((prev_offset) + (size), align)
+       round((prev_offset) + (prev_size), align)
 #define        calculate_tls_end(off, size)    ((off) + (size))

 #define        TLS_TCB_SIZE    8
diff --git a/libexec/rtld-elf/rtld.c b/libexec/rtld-elf/rtld.c
index 1d91460..1a776da 100644
--- a/libexec/rtld-elf/rtld.c
+++ b/libexec/rtld-elf/rtld.c
@@ -4427,7 +4427,7 @@ allocate_tls(Obj_Entry *objs, void *oldtcb, size_t tcbsize, size_t tcbalign)
        dtv[1] = tls_max_index;

        for (obj = objs; obj; obj = obj->next) {
-           if (obj->tlsoffset > 0) {
+           if (obj->tlssize > 0) {
                addr = (Elf_Addr)tls + obj->tlsoffset;
                if (obj->tlsinitsize > 0)
                    memcpy((void*) addr, obj->tlsinit, obj->tlsinitsize);
-- 
Julien Grall


More information about the freebsd-arm mailing list