From owner-svn-src-head@freebsd.org Fri Sep 28 18:52:26 2018 Return-Path: Delivered-To: svn-src-head@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 71DF610B707B; Fri, 28 Sep 2018 18:52:26 +0000 (UTC) (envelope-from andreast@FreeBSD.org) Received: from smtp.imp.ch (smtp.imp.ch [157.161.13.196]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 059D67E137; Fri, 28 Sep 2018 18:52:25 +0000 (UTC) (envelope-from andreast@FreeBSD.org) Received: from [192.168.225.14] (dhclient-91-190-10-49.flashcable.ch [91.190.10.49]) (using TLSv1 with cipher ECDHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by fgznet.ch (Postfix) with ESMTPSA id AB1CBC4D15; Fri, 28 Sep 2018 20:52:24 +0200 (CEST) Subject: Re: svn commit: r338930 - head/libexec/rtld-elf/powerpc To: Konstantin Belousov Cc: Michael Tuexen , src-committers , svn-src-all@freebsd.org, svn-src-head@freebsd.org References: <201809251929.w8PJTZl9021331@repo.freebsd.org> <828EF35C-7216-4847-A73D-464111006E52@freebsd.org> <20180927231256.GB5335@kib.kiev.ua> From: Andreas Tobler Message-ID: <89d81c9a-9a93-2c82-93a0-12aa3f8e1a8c@FreeBSD.org> Date: Fri, 28 Sep 2018 20:52:24 +0200 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:52.0) Gecko/20100101 Thunderbird/52.9.1 MIME-Version: 1.0 In-Reply-To: <20180927231256.GB5335@kib.kiev.ua> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: de-CH Content-Transfer-Encoding: 7bit X-Scanned-By: Obelix Submit on 127.0.1.1 X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.27 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 28 Sep 2018 18:52:26 -0000 On 28.09.18 01:12, Konstantin Belousov wrote: > On Thu, Sep 27, 2018 at 09:37:31PM +0200, Andreas Tobler wrote: >> On 27.09.18 20:48, Michael Tuexen wrote: >>>> On 25. Sep 2018, at 21:29, Andreas Tobler wrote: >>>> >>>> Author: andreast >>>> Date: Tue Sep 25 19:29:35 2018 >>>> New Revision: 338930 >>>> URL: https://svnweb.freebsd.org/changeset/base/338930 >>>> >>>> Log: >>>> Bring the 32-bit powerpc (PowerMac) back to live. The commit 338486 reworked >>>> some TLS bits. This broke operation on the PowerMac. Namely one could not login. >>>> At login the screen/shell was giving back lots of backslashes and the login >>>> shell dumped core. >>>> >>>> The fix to this issue is to revert the powerpc commit from 338486 and to >>>> increase the TLS_TCB_SIZE to 16. >>>> Reverting only did not help, login was possible but userland applications >>>> aborted with strange messages. >>>> >>>> I tested this patch with world/kernel builds and with port upgrades. >>>> Additionally a full gcc8 bootstrap was successfully completed. >>>> >>>> Reviewed by: jhibbits@ >>>> Approved by: re (Glen) >>>> >>>> Modified: >>>> head/libexec/rtld-elf/powerpc/rtld_machdep.h >>>> >>>> Modified: head/libexec/rtld-elf/powerpc/rtld_machdep.h >>>> ============================================================================== >>>> --- head/libexec/rtld-elf/powerpc/rtld_machdep.h Tue Sep 25 18:54:18 2018 (r338929) >>>> +++ head/libexec/rtld-elf/powerpc/rtld_machdep.h Tue Sep 25 19:29:35 2018 (r338930) >>>> @@ -69,12 +69,12 @@ void _rtld_powerpc_pltcall(void); >>>> >>>> #define TLS_TP_OFFSET 0x7000 >>>> #define TLS_DTV_OFFSET 0x8000 >>>> -#define TLS_TCB_SIZE 8 >>>> +#define TLS_TCB_SIZE 16 >>>> >>>> #define round(size, align) \ >>>> (((size) + (align) - 1) & ~((align) - 1)) >>>> #define calculate_first_tls_offset(size, align) \ >>>> - TLS_TCB_SIZE >>>> + round(8, align) >>>> #define calculate_tls_offset(prev_offset, prev_size, size, align) \ >>>> round(prev_offset + prev_size, align) >>>> #define calculate_tls_end(off, size) ((off) + (size)) >>>> >>> After performing a buildworld/buildkernel and running r338956 on a 32-bit powerpc machine (G4 Mac Mini), >>> the following program: >>> >>> #include >>> #include >>> #include >>> >>> void * >>> f(void * arg) >>> { >>> return (arg); >>> } >>> >>> int >>> main(void) >>> { >>> void *res; >>> pthread_t tid; >>> int err; >>> >>> if ((err = pthread_create(&tid, NULL, f, NULL)) != 0) { >>> fprintf(stderr, "pthread_create: %s\n", strerror(err)); >>> } >>> if ((err = pthread_join(tid, &res)) != 0) { >>> fprintf(stderr, "pthread_join: %s\n", strerror(err)); >>> } >>> return (0); >>> } >>> >>> is killed: >>> >>> tuexen@bsd5:~ % ./test >>> ld-elf.so.1: assert failed: /usr/home/tuexen/head/libexec/rtld-elf/rtld.c:4753 >>> Abort (core dumped) >>> >>> gdb shows: >>> >>> tuexen@bsd5:~ % gdb -c test.core test >>> GNU gdb (GDB) 8.1 [GDB v8.1 for FreeBSD] >>> Copyright (C) 2018 Free Software Foundation, Inc. >>> License GPLv3+: GNU GPL version 3 or later >>> This is free software: you are free to change and redistribute it. >>> There is NO WARRANTY, to the extent permitted by law. Type "show copying" >>> and "show warranty" for details. >>> This GDB was configured as "powerpc-portbld-freebsd12.0". >>> Type "show configuration" for configuration details. >>> For bug reporting instructions, please see: >>> . >>> Find the GDB manual and other documentation resources online at: >>> . >>> For help, type "help". >>> Type "apropos word" to search for commands related to "word"... >>> Reading symbols from test...done. >>> [New LWP 100112] >>> Core was generated by `./test'. >>> Program terminated with signal SIGABRT, Aborted. >>> #0 0x41829a58 in thr_kill () at thr_kill.S:3 >>> 3 RSYSCALL(thr_kill) >>> (gdb) bt >>> #0 0x41829a58 in thr_kill () at thr_kill.S:3 >>> #1 0x41829378 in __raise (s=6) >>> at /usr/home/tuexen/head/lib/libc/gen/raise.c:52 >>> #2 0x41823b84 in abort () at /usr/home/tuexen/head/lib/libc/stdlib/abort.c:67 >>> #3 0x41813f58 in allocate_tls (objs=0x41843000, oldtcb=, >>> tcbsize=8, tcbalign=) >>> at /usr/home/tuexen/head/libexec/rtld-elf/rtld.c:4753 >>> #4 0x41813fc0 in _rtld_allocate_tls (oldtls=0x0, tcbsize=8, tcbalign=16) >>> at /usr/home/tuexen/head/libexec/rtld-elf/rtld.c:5030 >>> #5 0x41877438 in _tcb_ctor (thread=0x41a8d300, initial=) >>> at /usr/home/tuexen/head/lib/libthr/thread/thr_ctrdtr.c:45 >>> #6 0x41876ebc in _thr_alloc (curthread=0x41a8d000) >>> at /usr/home/tuexen/head/lib/libthr/thread/thr_list.c:172 >>> #7 0x41867118 in _pthread_create (thread=0xffffdc10, attr=0x0, >>> start_routine=0x180073c , arg=0x0) >>> at /usr/home/tuexen/head/lib/libthr/thread/thr_create.c:81 >>> #8 0x01800798 in main () >>> (gdb) quit >>> >>> Any idea what is wrong? >> >> TLS is broken on powerpc ;) >> >> I see the same. >> >> Would you mind reverting my commit and see if it is better/different and >> how different? >> >> For me the commit was an improvement, but I agree this is not enough. >> >> I try to analyze what is going on. Any help is appreciated. > > The cause is quite clear, sizeof(struct tcb) is 8 on power 32bit, see > lib/libthread/arch/powerpc/include/pthread_md.h. I do not think that > you can change this because it is part of the ABI assumed by the > compilers. > Ouch, I think a (big) fail on my side. I'm papering over something else. Michael is happy with TLS_TCB_SIZE == 8. I need to find the cause why portmaster -y --no-confirm -a fails with: --- [andreast@helium] /home/andreast/> portmaster -y --no-confirm -a ===>>> Gathering distinfo list for installed ports a number is expected, got: 0 a number is expected, got: 0 a number is expected, got: 0 a number is expected, got: 0 --- Thanks for making me aware of this fail. Andreas