Subject: Re: Bypassing cygwin's signal handling
From: Allen Leung <[email-masked]>
To: [email-masked]
Cc: Allen Leung <[email-masked]>
Date: Fri, 4 Oct 2002 12:58:19 -0400

On Thu, Oct 03, 2002 at 06:27:14PM -0400, Igor Pechtchanski wrote:
> On Thu, 3 Oct 2002, Igor Pechtchanski wrote:
> 
> Allen,
> 
> Actually, the first thing to try should probably be
> 
> #include <exceptions.h>
> #include <sys/cygwin.h>
> 
> ...
> 	exception_list el;
> 	cygwin_internal(CW_INIT_EXCEPTIONS, &el);
> 	el.handler = your_handler;
> ...
> 
> I'm not sure how to clean this up afterwards, but theoretically this
> should work...  Chris Faylor will hopefully correct me if I'm wrong.
> 	Igor

Thanks, Igor, but I couldn't get this working using cygwin_internal().  
This looks like a bug to me:

winsup/cygwin/external.cc:

extern "C" DWORD cygwin_internal(cygwin_getinfo_types t, ...)
{
   va_list arg;
   ...

     case CW_INIT_EXCEPTIONS:
        init_exceptions ((exception_list *) arg);
        return 0;
}

I would've written it as:

     case CW_INIT_EXCEPTIONS:
        init_exceptions (va_arg(arg, exception_list *));
        return 0;

Nevertheless, I've managed to setup my own page fault handler by 
writing directly to %fs, using essentially the same code as in init_exceptions:
        
asm (".equ __win32_except_list,0");
extern exception_list *_win32_except_list asm ("%fs:__win32_except_list");

{
   exception_list el;
   el.handler   = page_fault_handler;
   el.prev      = _win32_except_list;
   _win32_except_list = &el;
   /* run my own code under this handler here */
      ...
}

--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Bug reporting:         http://cygwin.com/bugs.html
Documentation:         http://cygwin.com/docs.html
FAQ:                   http://cygwin.com/faq/