From owner-freebsd-current@freebsd.org Sat Aug 26 18:40:39 2017 Return-Path: Delivered-To: freebsd-current@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id B3FC8DD84C7 for ; Sat, 26 Aug 2017 18:40:39 +0000 (UTC) (envelope-from kostikbel@gmail.com) Received: from kib.kiev.ua (kib.kiev.ua [IPv6:2001:470:d5e7:1::1]) (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 47F597562B; Sat, 26 Aug 2017 18:40:39 +0000 (UTC) (envelope-from kostikbel@gmail.com) Received: from tom.home (kib@localhost [127.0.0.1]) by kib.kiev.ua (8.15.2/8.15.2) with ESMTPS id v7QIeYAW072513 (version=TLSv1.2 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Sat, 26 Aug 2017 21:40:34 +0300 (EEST) (envelope-from kostikbel@gmail.com) DKIM-Filter: OpenDKIM Filter v2.10.3 kib.kiev.ua v7QIeYAW072513 Received: (from kostik@localhost) by tom.home (8.15.2/8.15.2/Submit) id v7QIeYZH072512; Sat, 26 Aug 2017 21:40:34 +0300 (EEST) (envelope-from kostikbel@gmail.com) X-Authentication-Warning: tom.home: kostik set sender to kostikbel@gmail.com using -f Date: Sat, 26 Aug 2017 21:40:34 +0300 From: Konstantin Belousov To: Tijl Coosemans Cc: freebsd-current@FreeBSD.org, gerald@FreeBSD.org Subject: Re: Segfault in _Unwind_* code called from pthread_exit Message-ID: <20170826184034.GR1700@kib.kiev.ua> References: <20170823163707.096f93ab@kalimero.tijl.coosemans.org> <20170824154235.GD1700@kib.kiev.ua> <20170824180830.199885b0@kalimero.tijl.coosemans.org> <20170825173851.09116ddc@kalimero.tijl.coosemans.org> <20170825234442.GO1700@kib.kiev.ua> <20170826202813.1240a1ef@kalimero.tijl.coosemans.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20170826202813.1240a1ef@kalimero.tijl.coosemans.org> User-Agent: Mutt/1.8.3 (2017-05-23) X-Spam-Status: No, score=-2.0 required=5.0 tests=ALL_TRUSTED,BAYES_00, DKIM_ADSP_CUSTOM_MED,FREEMAIL_FROM,NML_ADSP_CUSTOM_MED autolearn=no autolearn_force=no version=3.4.1 X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on tom.home X-BeenThere: freebsd-current@freebsd.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Discussions about the use of FreeBSD-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 26 Aug 2017 18:40:39 -0000 On Sat, Aug 26, 2017 at 08:28:13PM +0200, Tijl Coosemans wrote: > On Sat, 26 Aug 2017 02:44:42 +0300 Konstantin Belousov wrote: > > How does llvm unwinder detects that the return address is a garbage ? > > It just stops unwinding when it can't find frame information (stored in > .eh_frame sections). GCC unwinder doesn't give up yet and checks if the > return address points to the signal trampoline (which means the current > frame is that of a signal handler). It has built-in knowledge of how to > unwind to the signal trampoline frame. So llvm just gives up on signal frames ? > A noreturn attribute isn't enough. You can still unwind such functions. > They are allowed to throw exceptions for example. Ok. > I did consider using > a CFI directive (see patch below) and it works, but it's architecture > specific and it's inserted after the function prologue so there's still > a window of a few instructions where a stack unwinder will try to use > the return address. > > Index: lib/libthr/thread/thr_create.c > =================================================================== > --- lib/libthr/thread/thr_create.c (revision 322802) > +++ lib/libthr/thread/thr_create.c (working copy) > @@ -251,6 +251,7 @@ create_stack(struct pthread_attr *pattr) > static void > thread_start(struct pthread *curthread) > { > + __asm(".cfi_undefined %rip"); > sigset_t set; > > if (curthread->attr.suspend == THR_CREATE_SUSPENDED) I like this approach much more than the previous patch. What can be done is to provide asm trampoline which calls thread_start(). There you can add the .cfi_undefined right at the entry. It is somewhat more work than just setting the return address on the kernel-constructed pseudo stack frame, but I believe this is ultimately correct way. You still can do it only on some arches, if you do not have incentive to code asm for all of them. Also crt1 probably should get the same treatment, despite we already set %rbp to zero AFAIR.