From owner-svn-src-all@freebsd.org Mon Aug 20 16:00:24 2018 Return-Path: Delivered-To: svn-src-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 84F3210734D7; Mon, 20 Aug 2018 16:00:24 +0000 (UTC) (envelope-from melounmichal@gmail.com) Received: from mail-wm0-x243.google.com (mail-wm0-x243.google.com [IPv6:2a00:1450:400c:c09::243]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (Client CN "smtp.gmail.com", Issuer "Google Internet Authority G3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id ECCFD73D86; Mon, 20 Aug 2018 16:00:23 +0000 (UTC) (envelope-from melounmichal@gmail.com) Received: by mail-wm0-x243.google.com with SMTP id o18-v6so49024wmc.0; Mon, 20 Aug 2018 09:00:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:reply-to:subject:to:references:openpgp:autocrypt:message-id :date:user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=3IAWiMEvPmbBFhA5N/3mKSf3uANnW6WuGH//hNv9uQE=; b=tsd8W7b5u7Jg4WqZFyIySlBFBJqw1xSdQZMWtiOZ+rKmPY3NrnducMV7W0v6cPUF0A yNnM8zubviZUpI3NWf2kH9fV6DONnop6odrQjfuNJifNtikBZahCHKe3CkbMb83KH4Wu WWvgGL+jcqJm3Dt0gFNKXq7xC+vRmFEa5rA6OcaPzPzDQVsg5wSxNChXEu33fpSayFJk dMlRdV6xE/pQpZ2SNjjpQHE7PLWOLYEgV2XbMIOaABPosq1oJJqttiUjh4XlJDAoTbQM nTDDRJv11qGZkye7ao+oK32eJrkER/oMrvXl8spKhCx7KjTUl/1zD/XYUFdG1OdiclIo Ns0g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:reply-to:subject:to:references:openpgp :autocrypt:message-id:date:user-agent:mime-version:in-reply-to :content-language:content-transfer-encoding; bh=3IAWiMEvPmbBFhA5N/3mKSf3uANnW6WuGH//hNv9uQE=; b=RhzU0ngCPmC2MBTF24qSLVtksLrrf5iuc/glWQOR62tsKq/x9jGQX2fF4mwgfZxPq4 zgapAF9TPiCHY85ACq1Bw1pBuYidR7ELWJ7olP+vbVePZsG82baOuGSBAEIwNpiwf+Eg rm2gEC84EfZlUFDGZyc7aWf0597uHiFRajPJQc9b+Css2q8kTLIzmKT02pAyVSsxEFbT MbsBywQuHA6bcz3O7B98gBVFxbIGPqSe4BFFGrBQsU4+qltwhjBGsRlssNV3eI73ue5B CfbABkw4ftQ4dZ1EvzsKcgh1KanaVVecwt5JDFeFm1eBKg7d3ClJxljNfQ1ybc4mCnBF Aepg== X-Gm-Message-State: AOUpUlH2E1HLKYBnGiM2+3xFYE9gJc5JN6QVZEx0Mwwjr2W85yQT6C7A BjYrnh5YIe2gBr1w8ezI1/+f90lqMuI= X-Google-Smtp-Source: AA+uWPyP6lT6Kc15D5z5YUAhON7swO/uUwkv6v+ZLv7GuMkVhUlxLbRCHyj3ENiQGjaAFONmaE8gww== X-Received: by 2002:a1c:c3c6:: with SMTP id t189-v6mr24521743wmf.59.1534780822710; Mon, 20 Aug 2018 09:00:22 -0700 (PDT) Received: from [88.208.79.100] (halouny.humusoft.cz. [88.208.79.100]) by smtp.gmail.com with ESMTPSA id y17-v6sm460527wrm.61.2018.08.20.09.00.21 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 20 Aug 2018 09:00:21 -0700 (PDT) From: Michal Meloun X-Google-Original-From: Michal Meloun Reply-To: mmel@freebsd.org Subject: Re: svn commit: r337978 - in head/libexec/rtld-elf: . aarch64 arm mips powerpc powerpc64 riscv To: Brooks Davis , src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org References: <201808171619.w7HGJlZe015255@repo.freebsd.org> Openpgp: preference=signencrypt Autocrypt: addr=mmel@freebsd.org; prefer-encrypt=mutual; keydata= xsBNBFYuVRkBCADZiwLCCne3wG9b9k+R2Neo5zVo2bLaZRfNNY/v9kg283i0sb1Da4EdEiNT 15El5UyozhphUIbIR/zrVpxF1TvvFdoCyzx6a68bNY2d9dBrDcNDZC+XnyDdHQoobN87DWT1 mRVkmbg9LHZ/SVUOkGYuWyE+8UYeDAcUizuXwSK5zFWmeTyIoWNa68ifrWLfQe0p4x5jC/AI VURCi17p360vU4fhgwoMvEEhrRBWCr4DYHToFjIt2WdBy3GR1qoO0+Xkd6G+OoBULo+XDfgu L2WdPvh0K69F9/LgHkMmG5Il7SCe62QGpG2vaCgRV7BQhLX+kxlvM+WrdRatWRml4Y/3ABEB AAHNIE1pY2hhbCBNZWxvdW4gPG1tZWxAZnJlZWJzZC5vcmc+wsCABBMBCgAqAhsDBQsJCAcD BRUKCQgLBRYDAgEAAh4BAheAAhkBBQJZjBHDBQkHICOqAAoJEGkesmtexaqqIKMIAJ9xTp1w ge86ns2ZYOac5++mAgpFatohSlxYUR3gwud3Y3Ej0eumavpv/C26N6dsLnspwRenKdLbIPKe 0N8lI7CcDBIJGiFyY3c4H79QjIkYpRgbWFyCM85zEyVJpB+U7BhsgXE2uwVjE9RNhEP0KBoj sp357uqq1B1+VUO4GJ+RjdmYSOcNrjR8tTfy02456qovGjJ4JcJBlhyK6GzBKvnZSoA0s+QP OMn3gd8gdomMLEJdS3kTsfhLh2rQPZa9EmzafIyjXrirWq4+4fVFgd8SiMZyyTM+Kz30ZSUe 6SmfaQTQ/WLRIl5jku2uYQWlrRIKT9xaQzRWtZO9UgtXFRHOwE0EVi5VGQEIALqgRkfS21D/ OqWE9mXfh2bIjrp9uC8T0MCuimbsrAdLKNNorGu2nE+rebgX8n5nYM377HOnalPGyOuXvCbQ 8MFVRdWOHxenJjXJialNdBsOf2wLva3vSSVsdoPzibWDIcJqhBOQ3EuhsILyWSPvYYKEiy95 mfhrDtuTTOAYVR9aNQBOENztB2TDJyMx/qZmtGroGV3N0Hqde/znHPtQO8RG5/FQGMfHMI5G FMuycr1ceHnLo/ovrqAl4TYV+UHSHJ+FDE9dt9wXHclWbWbC0yNugchZq6rho5Jjfv4a2v7P pyn3HoDinh1lWP7hYA0ZNExGHekLnXWVqO/lzGS6bMEAEQEAAcLAZQQYAQoADwIbDAUCWYwR wwUJByAjqgAKCRBpHrJrXsWqqrsrB/4g4ESK5TLxUxi8pLWcLPyvwtN4Fmf7VsCVefkhakaG rDPmfvfnG+OFwN60Xqoni7GBeakl01xwT4RINfvVfShDy6cHpLS7QL/M8pzfulVX38MkVkOD yGZhwjE+jyT/kZNA1Olaw3N3IefHq3brskQ7G4d9oPep2DDbw7C4Q76uOBjxy34JVB0WOsB6 NyMQB9h6LGljQtdEddyUqwnRZzzHiGvp0hPtdYQHQZlqbj4FV9lTRK7a8Ega+y7MgmeMiztG zeXyjNP02r3PRHCPagwa57bPxH2aAh4Q7UzBBZ0GTMm7DLKNtCP58WDxblrrhZ+7kHqGK8Fs bdeUpDdEYLVd Message-ID: <29d939de-108e-c7c4-b4b6-4a7772dca2eb@freebsd.org> Date: Mon, 20 Aug 2018 18:00:21 +0200 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Thunderbird/52.9.1 MIME-Version: 1.0 In-Reply-To: <201808171619.w7HGJlZe015255@repo.freebsd.org> Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 7bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.27 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 20 Aug 2018 16:00:24 -0000 On 17.08.2018 18:19, Brooks Davis wrote: > Author: brooks > Date: Fri Aug 17 16:19:47 2018 > New Revision: 337978 > URL: https://svnweb.freebsd.org/changeset/base/337978 > > Log: > Rework rtld's TLS Variant I implementation to match r326794 > > The above commit fixed handling overaligned TLS segments in libc's > TLS Variant I implementation, but rtld provides its own implementation > for dynamically-linked executables which lacks these fixes. Thus, > port these changes to rtld. > > Submitted by: James Clarke > Reviewed by: kbowling > Testing byL kbowling (powerpc64), br (riscv), kevans (armv7) > Obtained from: CheriBSD > Sponsored by: DARPA, AFRL > Differential Revision: https://reviews.freebsd.org/D16510 > > Modified: > head/libexec/rtld-elf/aarch64/rtld_machdep.h > head/libexec/rtld-elf/arm/rtld_machdep.h > head/libexec/rtld-elf/mips/rtld_machdep.h > head/libexec/rtld-elf/powerpc/rtld_machdep.h > head/libexec/rtld-elf/powerpc64/rtld_machdep.h > head/libexec/rtld-elf/riscv/rtld_machdep.h > head/libexec/rtld-elf/rtld.c > This commit breaks TLS handling for (at least) armv7. Can you please revert it until I will be able to identify where is problem? In my case, the libc _ThreadRuneLocale symbol is not zero on program start. Thanks, Michal > Modified: head/libexec/rtld-elf/aarch64/rtld_machdep.h > ============================================================================== > --- head/libexec/rtld-elf/aarch64/rtld_machdep.h Fri Aug 17 16:07:06 2018 (r337977) > +++ head/libexec/rtld-elf/aarch64/rtld_machdep.h Fri Aug 17 16:19:47 2018 (r337978) > @@ -69,6 +69,8 @@ Elf_Addr reloc_jmpslot(Elf_Addr *where, Elf_Addr targe > #define calculate_tls_offset(prev_offset, prev_size, size, align) \ > round(prev_offset + prev_size, align) > #define calculate_tls_end(off, size) ((off) + (size)) > +#define calculate_tls_post_size(align) \ > + round(TLS_TCB_SIZE, align) - TLS_TCB_SIZE > > #define TLS_TCB_SIZE 16 > typedef struct { > > Modified: head/libexec/rtld-elf/arm/rtld_machdep.h > ============================================================================== > --- head/libexec/rtld-elf/arm/rtld_machdep.h Fri Aug 17 16:07:06 2018 (r337977) > +++ head/libexec/rtld-elf/arm/rtld_machdep.h Fri Aug 17 16:19:47 2018 (r337978) > @@ -69,6 +69,8 @@ typedef struct { > #define calculate_tls_offset(prev_offset, prev_size, size, align) \ > round(prev_offset + prev_size, align) > #define calculate_tls_end(off, size) ((off) + (size)) > +#define calculate_tls_post_size(align) \ > + round(TLS_TCB_SIZE, align) - TLS_TCB_SIZE > > extern void *__tls_get_addr(tls_index *ti); > > > Modified: head/libexec/rtld-elf/mips/rtld_machdep.h > ============================================================================== > --- head/libexec/rtld-elf/mips/rtld_machdep.h Fri Aug 17 16:07:06 2018 (r337977) > +++ head/libexec/rtld-elf/mips/rtld_machdep.h Fri Aug 17 16:19:47 2018 (r337978) > @@ -64,10 +64,11 @@ typedef struct { > #define round(size, align) \ > (((size) + (align) - 1) & ~((align) - 1)) > #define calculate_first_tls_offset(size, align) \ > - round(TLS_TCB_SIZE, align) > + TLS_TCB_SIZE > #define calculate_tls_offset(prev_offset, prev_size, size, align) \ > round(prev_offset + prev_size, align) > #define calculate_tls_end(off, size) ((off) + (size)) > +#define calculate_tls_post_size(align) 0 > > extern void *__tls_get_addr(tls_index *ti); > > > Modified: head/libexec/rtld-elf/powerpc/rtld_machdep.h > ============================================================================== > --- head/libexec/rtld-elf/powerpc/rtld_machdep.h Fri Aug 17 16:07:06 2018 (r337977) > +++ head/libexec/rtld-elf/powerpc/rtld_machdep.h Fri Aug 17 16:19:47 2018 (r337978) > @@ -74,10 +74,11 @@ void _rtld_powerpc_pltcall(void); > #define round(size, align) \ > (((size) + (align) - 1) & ~((align) - 1)) > #define calculate_first_tls_offset(size, align) \ > - round(8, align) > + TLS_TCB_SIZE > #define calculate_tls_offset(prev_offset, prev_size, size, align) \ > round(prev_offset + prev_size, align) > #define calculate_tls_end(off, size) ((off) + (size)) > +#define calculate_tls_post_size(align) 0 > > typedef struct { > unsigned long ti_module; > > Modified: head/libexec/rtld-elf/powerpc64/rtld_machdep.h > ============================================================================== > --- head/libexec/rtld-elf/powerpc64/rtld_machdep.h Fri Aug 17 16:07:06 2018 (r337977) > +++ head/libexec/rtld-elf/powerpc64/rtld_machdep.h Fri Aug 17 16:19:47 2018 (r337978) > @@ -66,10 +66,11 @@ Elf_Addr reloc_jmpslot(Elf_Addr *where, Elf_Addr targe > #define round(size, align) \ > (((size) + (align) - 1) & ~((align) - 1)) > #define calculate_first_tls_offset(size, align) \ > - round(16, align) > + TLS_TCB_SIZE > #define calculate_tls_offset(prev_offset, prev_size, size, align) \ > round(prev_offset + prev_size, align) > #define calculate_tls_end(off, size) ((off) + (size)) > +#define calculate_tls_post_size(align) 0 > > typedef struct { > unsigned long ti_module; > > Modified: head/libexec/rtld-elf/riscv/rtld_machdep.h > ============================================================================== > --- head/libexec/rtld-elf/riscv/rtld_machdep.h Fri Aug 17 16:07:06 2018 (r337977) > +++ head/libexec/rtld-elf/riscv/rtld_machdep.h Fri Aug 17 16:19:47 2018 (r337978) > @@ -89,10 +89,11 @@ Elf_Addr reloc_jmpslot(Elf_Addr *where, Elf_Addr targe > #define round(size, align) \ > (((size) + (align) - 1) & ~((align) - 1)) > #define calculate_first_tls_offset(size, align) \ > - round(16, align) > + TLS_TCB_SIZE > #define calculate_tls_offset(prev_offset, prev_size, size, align) \ > round(prev_offset + prev_size, align) > #define calculate_tls_end(off, size) ((off) + (size)) > +#define calculate_tls_post_size(align) 0 > > typedef struct { > unsigned long ti_module; > > Modified: head/libexec/rtld-elf/rtld.c > ============================================================================== > --- head/libexec/rtld-elf/rtld.c Fri Aug 17 16:07:06 2018 (r337977) > +++ head/libexec/rtld-elf/rtld.c Fri Aug 17 16:19:47 2018 (r337978) > @@ -4693,47 +4693,87 @@ tls_get_addr_common(Elf_Addr **dtvp, int index, size_t > defined(__powerpc__) || defined(__riscv) > > /* > + * Return pointer to allocated TLS block > + */ > +static void * > +get_tls_block_ptr(void *tcb, size_t tcbsize) > +{ > + size_t extra_size, post_size, pre_size, tls_block_size; > + size_t tls_init_align; > + > + tls_init_align = MAX(obj_main->tlsalign, 1); > + > + /* Compute fragments sizes. */ > + extra_size = tcbsize - TLS_TCB_SIZE; > + post_size = calculate_tls_post_size(tls_init_align); > + tls_block_size = tcbsize + post_size; > + pre_size = roundup2(tls_block_size, tls_init_align) - tls_block_size; > + > + return ((char *)tcb - pre_size - extra_size); > +} > + > +/* > * Allocate Static TLS using the Variant I method. > + * > + * For details on the layout, see lib/libc/gen/tls.c. > + * > + * NB: rtld's tls_static_space variable includes TLS_TCB_SIZE and post_size as > + * it is based on tls_last_offset, and TLS offsets here are really TCB > + * offsets, whereas libc's tls_static_space is just the executable's static > + * TLS segment. > */ > void * > allocate_tls(Obj_Entry *objs, void *oldtcb, size_t tcbsize, size_t tcbalign) > { > Obj_Entry *obj; > - char *tcb; > - Elf_Addr **tls; > - Elf_Addr *dtv; > + char *tls_block; > + Elf_Addr *dtv, **tcb; > Elf_Addr addr; > int i; > + size_t extra_size, maxalign, post_size, pre_size, tls_block_size; > + size_t tls_init_align; > > if (oldtcb != NULL && tcbsize == TLS_TCB_SIZE) > return (oldtcb); > > assert(tcbsize >= TLS_TCB_SIZE); > - tcb = xcalloc(1, tls_static_space - TLS_TCB_SIZE + tcbsize); > - tls = (Elf_Addr **)(tcb + tcbsize - TLS_TCB_SIZE); > + maxalign = MAX(tcbalign, tls_static_max_align); > + tls_init_align = MAX(obj_main->tlsalign, 1); > > + /* Compute fragmets sizes. */ > + extra_size = tcbsize - TLS_TCB_SIZE; > + post_size = calculate_tls_post_size(tls_init_align); > + tls_block_size = tcbsize + post_size; > + pre_size = roundup2(tls_block_size, tls_init_align) - tls_block_size; > + tls_block_size += pre_size + tls_static_space - TLS_TCB_SIZE - post_size; > + > + /* Allocate whole TLS block */ > + tls_block = malloc_aligned(tls_block_size, maxalign); > + tcb = (Elf_Addr **)(tls_block + pre_size + extra_size); > + > if (oldtcb != NULL) { > - memcpy(tls, oldtcb, tls_static_space); > - free(oldtcb); > + memcpy(tls_block, get_tls_block_ptr(oldtcb, tcbsize), > + tls_static_space); > + free_aligned(get_tls_block_ptr(oldtcb, tcbsize)); > > /* Adjust the DTV. */ > - dtv = tls[0]; > + dtv = tcb[0]; > for (i = 0; i < dtv[1]; i++) { > if (dtv[i+2] >= (Elf_Addr)oldtcb && > dtv[i+2] < (Elf_Addr)oldtcb + tls_static_space) { > - dtv[i+2] = dtv[i+2] - (Elf_Addr)oldtcb + (Elf_Addr)tls; > + dtv[i+2] = dtv[i+2] - (Elf_Addr)oldtcb + (Elf_Addr)tcb; > } > } > } else { > dtv = xcalloc(tls_max_index + 2, sizeof(Elf_Addr)); > - tls[0] = dtv; > + tcb[0] = dtv; > dtv[0] = tls_dtv_generation; > dtv[1] = tls_max_index; > > for (obj = globallist_curr(objs); obj != NULL; > obj = globallist_next(obj)) { > if (obj->tlsoffset > 0) { > - addr = (Elf_Addr)tls + obj->tlsoffset; > + addr = (Elf_Addr)tcb + obj->tlsoffset; > if (obj->tlsinitsize > 0) > memcpy((void*) addr, obj->tlsinit, obj->tlsinitsize); > if (obj->tlssize > obj->tlsinitsize) > @@ -4752,14 +4792,19 @@ free_tls(void *tcb, size_t tcbsize, size_t tcbalign) > { > Elf_Addr *dtv; > Elf_Addr tlsstart, tlsend; > - int dtvsize, i; > + size_t post_size; > + size_t dtvsize, i, tls_init_align; > > assert(tcbsize >= TLS_TCB_SIZE); > + tls_init_align = MAX(obj_main->tlsalign, 1); > > - tlsstart = (Elf_Addr)tcb + tcbsize - TLS_TCB_SIZE; > - tlsend = tlsstart + tls_static_space; > + /* Compute fragments sizes. */ > + post_size = calculate_tls_post_size(tls_init_align); > > - dtv = *(Elf_Addr **)tlsstart; > + tlsstart = (Elf_Addr)tcb + TLS_TCB_SIZE + post_size; > + tlsend = (Elf_Addr)tcb + tls_static_space; > + > + dtv = *(Elf_Addr **)tcb; > dtvsize = dtv[1]; > for (i = 0; i < dtvsize; i++) { > if (dtv[i+2] && (dtv[i+2] < tlsstart || dtv[i+2] >= tlsend)) { > @@ -4767,7 +4812,7 @@ free_tls(void *tcb, size_t tcbsize, size_t tcbalign) > } > } > free(dtv); > - free(tcb); > + free_aligned(get_tls_block_ptr(tcb, tcbsize)); > } > > #endif >