X-Recipient: archive-cygwin@delorie.com
DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id
	:list-unsubscribe:list-subscribe:list-archive:list-post
	:list-help:sender:message-id:date:from:mime-version:to:subject
	:references:in-reply-to:content-type:content-transfer-encoding;
	 q=dns; s=default; b=pAZHireTeQGqE9a7gFo3/lz3NYFZb+0+AuyoCctFZJa
	UacueeMvitdDkKdS4pRw6tg8WYTbLC9C7o/Z5+ZckkC2fyhPmo6A0NEFSCNIXQF9
	WDHxtXscrvx/dUm+3muzwAuOiNtxdGjBZvUEK3K7vQHXRw+XEZsGn+t2BT0BvJBg
	=
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id
	:list-unsubscribe:list-subscribe:list-archive:list-post
	:list-help:sender:message-id:date:from:mime-version:to:subject
	:references:in-reply-to:content-type:content-transfer-encoding;
	 s=default; bh=20nvePHMvWfC8juQyneT7YDwYdQ=; b=MdtkCcKaWsH7PHAuh
	RIIn7I4MvQa55MedSEL1T7ACPNWgMKCBs9WxFzRkBYf0tKDoDzuktIQ+xLh4p6+B
	rUz9PgaPyrgsNbifn0tuSz0RwHoo5jHwAKzuEhEuF/WcgcV3OEd3Dv3cYV8iArub
	/zs4PycjuAW0SZXEi/CO3GM1uQ=
Mailing-List: contact cygwin-help@cygwin.com; run by ezmlm
List-Id: <cygwin.cygwin.com>
List-Subscribe: <mailto:cygwin-subscribe@cygwin.com>
List-Archive: <http://sourceware.org/ml/cygwin/>
List-Post: <mailto:cygwin@cygwin.com>
List-Help: <mailto:cygwin-help@cygwin.com>, <http://sourceware.org/ml/#faqs>
Sender: cygwin-owner@cygwin.com
Mail-Followup-To: cygwin@cygwin.com
Delivered-To: mailing list cygwin@cygwin.com
Authentication-Results: sourceware.org; auth=none
X-Virus-Found: No
X-Spam-SWARE-Status: No, score=-1.1 required=5.0 tests=AWL,BAYES_50,RP_MATCHES_RCVD,SPF_HELO_PASS,SPF_PASS autolearn=ham version=3.3.2
X-HELO: limerock04.mail.cornell.edu
X-CornellRouted: This message has been Routed already.
Message-ID: <558D3F4C.6090207@cornell.edu>
Date: Fri, 26 Jun 2015 08:02:20 -0400
From: Ken Brown <kbrown@cornell.edu>
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:31.0) Gecko/20100101 Thunderbird/31.7.0
MIME-Version: 1.0
To: cygwin@cygwin.com
Subject: Re: [ANNOUNCEMENT] TEST RELEASE: Cygwin 2.1.0-0.1
References: <announce.20150620205512.GA28301@calimero.vinschen.de> <558706D5.1020508@cornell.edu> <20150622110835.GE28301@calimero.vinschen.de> <20150626111249.GS31223@calimero.vinschen.de>
In-Reply-To: <20150626111249.GS31223@calimero.vinschen.de>
Content-Type: text/plain; charset=utf-8; format=flowed
Content-Transfer-Encoding: 8bit
X-IsSubscribed: yes

Hi Corinna,

On 6/26/2015 7:12 AM, Corinna Vinschen wrote:
> Hi Ken,
>
> On Jun 22 13:08, Corinna Vinschen wrote:
>> On Jun 21 14:47, Ken Brown wrote:
>>> On 6/20/2015 4:55 PM, Corinna Vinschen wrote:
>>>> - First cut of an implementation to allow signal handlers running on an
>>>>    alternate signal stack.
>>>>
>>>> - New API sigaltstack, plus definitions for SA_ONSTACK, SS_ONSTACK, SS_DISABLE,
>>>>    MINSIGSTKSZ, SIGSTKSZ.
>>>
>>> I must be doing something wrong.  Shouldn't including signal.h make the new
>>> API available?
>>>
>>> $ uname -a
>>> CYGWIN_NT-6.1-WOW fiona 2.1.0(0.287/5/3) 2015-06-20 21:44 i686 Cygwin
>>>
>>> $ cygcheck -cd cygwin-devel
>>> Cygwin Package Information
>>> Package              Version
>>> cygwin-devel         2.1.0-0.1
>>>
>>> $ cat test.c
>>> #include <signal.h>
>>> int
>>> main()
>>> {
>>>    int foo = SIGSTKSZ;
>>>    return 0;
>>> }
>>>
>>> $ gcc test.c
>>> test.c: In function ‘main’:
>>> test.c:6:13: error: ‘SIGSTKSZ’ undeclared (first use in this function)
>>>     int foo = SIGSTKSZ;
>>>               ^
>>
>> You're not doing anything wrong.  The relevant definitions in
>> sys/signal.h were originally only available for RTEMS.  I just
>> made them availbale for all platforms.  The problem was that the
>> orignal code missed to include sys/cdefs.h, which is required to
>> get the macros guarding the definitions.  I fixed that in the git
>> repo.
>>
>> I also made a bigger change to code setting up the alternate stack when
>> calling the signal handler function.  It turned out that my code moving
>> to the new stack missed to safe all potentially clobbered volatile
>> registers on both platforms.
>>
>> I'll upload new snapshots and 2.1.0-0.2 test releases shortly.
>
> did you have a chance to test this a bit, in the meantime?

Yes, but I don't have anything definitive to report yet.  I tried to test a 
facility in emacs that uses the alternate stack to recover from stack overflow 
(of the main stack) under some circumstances.  The configure script did detect 
the alternate stack.

I then made the stack overflow by defining an elisp function that did an 
infinite recursion.  emacs still crashed, but the "segmentation fault" message 
was printed twice instead of once.  I haven't had a chance yet to investigate 
further and try to see what's going on.  What I hope is that the alternate stack 
functioned correctly but the code was still not able to recover for some reason. 
  I've appended below the signal handler in case you want to see if you think it 
ought to work on Cygwin.

Ken

The signal handler:

/* Attempt to recover from SIGSEGV caused by C stack overflow.  */
static void
handle_sigsegv (int sig, siginfo_t *siginfo, void *arg)
{
   /* Hard GC error may lead to stack overflow caused by
      too nested calls to mark_object.  No way to survive.  */
   if (!gc_in_progress)
     {
       struct rlimit rlim;

       if (!getrlimit (RLIMIT_STACK, &rlim))
	{
	  enum { STACK_DANGER_ZONE = 16 * 1024 };
	  char *beg, *end, *addr;

	  beg = stack_bottom;
	  end = stack_bottom + stack_direction * rlim.rlim_cur;
	  if (beg > end)
	    addr = beg, beg = end, end = addr;
	  addr = (char *) siginfo->si_addr;
	  /* If we're somewhere on stack and too close to
	     one of its boundaries, most likely this is it.  */
	  if (beg < addr && addr < end
	      && (addr - beg < STACK_DANGER_ZONE
		  || end - addr < STACK_DANGER_ZONE))
	    siglongjmp (return_to_command_loop, 1);
	}
     }

   /* Otherwise we can't do anything with this.  */
   deliver_fatal_thread_signal (sig);
}

The code to set up the signal handler on the alternate stack:

static bool
init_sigsegv (void)
{
   struct sigaction sa;
   stack_t ss;

   stack_direction = ((char *) &ss < stack_bottom) ? -1 : 1;

   ss.ss_sp = sigsegv_stack;
   ss.ss_size = sizeof (sigsegv_stack);
   ss.ss_flags = 0;
   if (sigaltstack (&ss, NULL) < 0)
     return 0;

   sigfillset (&sa.sa_mask);
   sa.sa_sigaction = handle_sigsegv;
   sa.sa_flags = SA_SIGINFO | SA_ONSTACK | emacs_sigaction_flags ();
   return sigaction (SIGSEGV, &sa, NULL) < 0 ? 0 : 1;
}

--
Problem reports:       http://cygwin.com/problems.html
FAQ:                   http://cygwin.com/faq/
Documentation:         http://cygwin.com/docs.html
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple

