svn commit: r338930 - head/libexec/rtld-elf/powerpc

Andreas Tobler andreast at FreeBSD.org
Fri Sep 28 18:52:26 UTC 2018


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 <andreast at 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 at bsd5:~ % ./test
>>> ld-elf.so.1: assert failed: /usr/home/tuexen/head/libexec/rtld-elf/rtld.c:4753
>>> Abort (core dumped)
>>>
>>> gdb shows:
>>>
>>> tuexen at 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.
> 
> 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 at 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


More information about the svn-src-all mailing list