Date: Mon, 31 Aug 2015 22:06:47 +0100 From: Andrew Turner <andrew@fubar.geek.nz> To: Julien Grall <julien.grall@citrix.com> Cc: <jasone@freebsd.org>, freebsd-arm <freebsd-arm@freebsd.org> Subject: Re: arm64: userspace broken with jemalloc 4.0.0 Message-ID: <20150831220647.67a4646d@bender.Home> In-Reply-To: <55E22CC0.9000306@citrix.com> References: <55E22CC0.9000306@citrix.com>
next in thread | previous in thread | raw e-mail | index | archive | help
[-- Attachment #1 --]
On Sat, 29 Aug 2015 23:05:52 +0100
Julien Grall <julien.grall@citrix.com> wrote:
> Hi,
>
> 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.
Andrew
--
ABT Systems Ltd
Unit 11, Hove Business Centre, Fonthill Road, Hove, BN3 6HA
Registered in England and Wales, No. 9285513
[-- Attachment #2 --]
>From 81e6769f103e0e40347469ae6940ca461295d607 Mon Sep 17 00:00:00 2001
From: Andrew Turner <andrew@fubar.geek.nz>
Date: Mon, 31 Aug 2015 21:59:32 +0100
Subject: [PATCH] WIP fix for AArch64 TLS
---
libexec/rtld-elf/aarch64/rtld_machdep.h | 4 ++--
libexec/rtld-elf/rtld.c | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/libexec/rtld-elf/aarch64/rtld_machdep.h b/libexec/rtld-elf/aarch64/rtld_machdep.h
index 1cb2029..a7b1900 100644
--- a/libexec/rtld-elf/aarch64/rtld_machdep.h
+++ b/libexec/rtld-elf/aarch64/rtld_machdep.h
@@ -64,9 +64,9 @@ Elf_Addr reloc_jmpslot(Elf_Addr *where, Elf_Addr target,
#define round(size, align) \
(((size) + (align) - 1) & ~((align) - 1))
#define calculate_first_tls_offset(size, align) \
- round(size, align)
+ round(16, 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..eecfb0f 100644
--- a/libexec/rtld-elf/rtld.c
+++ b/libexec/rtld-elf/rtld.c
@@ -4611,7 +4611,7 @@ allocate_tls_offset(Obj_Entry *obj)
return true;
}
- if (obj->tlsindex == 1)
+ if (tls_last_offset == 0)
off = calculate_first_tls_offset(obj->tlssize, obj->tlsalign);
else
off = calculate_tls_offset(tls_last_offset, tls_last_size,
--
2.4.6
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20150831220647.67a4646d>
