Date: Thu, 27 Sep 2018 21:37:31 +0200 From: Andreas Tobler <andreast@FreeBSD.org> To: Michael Tuexen <tuexen@freebsd.org> Cc: src-committers <src-committers@freebsd.org>, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: Re: svn commit: r338930 - head/libexec/rtld-elf/powerpc Message-ID: <d1442750-1969-d41c-24d8-4bc335426207@FreeBSD.org> In-Reply-To: <828EF35C-7216-4847-A73D-464111006E52@freebsd.org> References: <201809251929.w8PJTZl9021331@repo.freebsd.org> <828EF35C-7216-4847-A73D-464111006E52@freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
On 27.09.18 20:48, Michael Tuexen wrote: >> On 25. Sep 2018, at 21:29, Andreas Tobler <andreast@FreeBSD.org> 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 <pthread.h> > #include <stdio.h> > #include <string.h> > > 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 <http://gnu.org/licenses/gpl.html> > 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: > <http://www.gnu.org/software/gdb/bugs/>. > Find the GDB manual and other documentation resources online at: > <http://www.gnu.org/software/gdb/documentation/>. > 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=<optimized out>, > tcbsize=8, tcbalign=<optimized out>) > 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=<optimized out>) > 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 <f>, 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. Thanks for the report. Andreas
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?d1442750-1969-d41c-24d8-4bc335426207>