3 Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
4 2005, 2006, 2007, 2008, 2009, 2010, 2011 Red Hat, Inc.
6 This file is part of Cygwin.
8 This software is a copyrighted work licensed under the terms of the
9 Cygwin license. Please consult the file "CYGWIN_LICENSE" for
14 #include "miscfuncs.h"
25 #include "shared_info.h"
26 #include "perprocess.h"
31 #include "child_info.h"
33 #include "exception.h"
35 #define CALL_HANDLER_RETRY_OUTER 10
36 #define CALL_HANDLER_RETRY_INNER 10
38 char debugger_command[2 * NT_MAX_PATH + 20];
41 extern void sigdelayed ();
44 static BOOL WINAPI ctrl_c_handler (DWORD);
46 /* This is set to indicate that we have already exited. */
48 static NO_COPY int exit_already = 0;
49 static muto NO_COPY mask_sync;
58 { X (STATUS_ABANDONED_WAIT_0) },
59 { X (STATUS_ACCESS_VIOLATION) },
60 { X (STATUS_ARRAY_BOUNDS_EXCEEDED) },
61 { X (STATUS_BREAKPOINT) },
62 { X (STATUS_CONTROL_C_EXIT) },
63 { X (STATUS_DATATYPE_MISALIGNMENT) },
64 { X (STATUS_FLOAT_DENORMAL_OPERAND) },
65 { X (STATUS_FLOAT_DIVIDE_BY_ZERO) },
66 { X (STATUS_FLOAT_INEXACT_RESULT) },
67 { X (STATUS_FLOAT_INVALID_OPERATION) },
68 { X (STATUS_FLOAT_OVERFLOW) },
69 { X (STATUS_FLOAT_STACK_CHECK) },
70 { X (STATUS_FLOAT_UNDERFLOW) },
71 { X (STATUS_GUARD_PAGE_VIOLATION) },
72 { X (STATUS_ILLEGAL_INSTRUCTION) },
73 { X (STATUS_INTEGER_DIVIDE_BY_ZERO) },
74 { X (STATUS_INTEGER_OVERFLOW) },
75 { X (STATUS_INVALID_DISPOSITION) },
76 { X (STATUS_IN_PAGE_ERROR) },
77 { X (STATUS_NONCONTINUABLE_EXCEPTION) },
78 { X (STATUS_NO_MEMORY) },
79 { X (STATUS_PENDING) },
80 { X (STATUS_PRIVILEGED_INSTRUCTION) },
81 { X (STATUS_SINGLE_STEP) },
82 { X (STATUS_STACK_OVERFLOW) },
83 { X (STATUS_TIMEOUT) },
84 { X (STATUS_USER_APC) },
85 { X (STATUS_WAIT_0) },
90 /* Initialization code. */
93 init_console_handler (bool install_handler)
97 SetConsoleCtrlHandler (ctrl_c_handler, FALSE);
98 SetConsoleCtrlHandler (NULL, FALSE);
100 res = SetConsoleCtrlHandler (ctrl_c_handler, TRUE);
102 res = SetConsoleCtrlHandler (NULL, TRUE);
104 system_printf ("SetConsoleCtrlHandler failed, %E");
108 error_start_init (const char *buf)
112 debugger_command[0] = '\0';
116 char pgm[NT_MAX_PATH];
117 if (!GetModuleFileName (NULL, pgm, NT_MAX_PATH))
118 strcpy (pgm, "cygwin1.dll");
119 for (char *p = strchr (pgm, '\\'); p; p = strchr (p, '\\'))
122 __small_sprintf (debugger_command, "%s \"%s\"", buf, pgm);
126 open_stackdumpfile ()
128 /* If we have no executable name, or if the CWD handle is NULL,
129 which means, the CWD is a virtual path, don't even try to open
131 if (myself->progname[0] && cygheap->cwd.get_handle ())
134 /* write to progname.stackdump if possible */
135 if (!myself->progname[0])
137 else if ((p = wcsrchr (myself->progname, L'\\')))
140 p = myself->progname;
142 WCHAR corefile[wcslen (p) + sizeof (".stackdump")];
143 wcpcpy (wcpcpy(corefile, p), L".stackdump");
144 UNICODE_STRING ucore;
145 OBJECT_ATTRIBUTES attr;
146 /* Create the UNICODE variation of <progname>.stackdump. */
147 RtlInitUnicodeString (&ucore, corefile);
148 /* Create an object attribute which refers to <progname>.stackdump
149 in Cygwin's cwd. Stick to caseinsensitivity. */
150 InitializeObjectAttributes (&attr, &ucore, OBJ_CASE_INSENSITIVE,
151 cygheap->cwd.get_handle (), NULL);
155 /* Try to open it to dump the stack in it. */
156 status = NtCreateFile (&h, GENERIC_WRITE | SYNCHRONIZE, &attr, &io,
157 NULL, FILE_ATTRIBUTE_NORMAL, 0, FILE_OVERWRITE_IF,
158 FILE_SYNCHRONOUS_IO_NONALERT
159 | FILE_OPEN_FOR_BACKUP_INTENT, NULL, 0);
160 if (NT_SUCCESS (status))
162 if (!myself->cygstarted)
163 system_printf ("Dumping stack trace to %S", &ucore);
165 debug_printf ("Dumping stack trace to %S", &ucore);
166 SetStdHandle (STD_ERROR_HANDLE, h);
171 /* Utilities for dumping the stack, etc. */
174 dump_exception (EXCEPTION_RECORD *e, CONTEXT *in)
176 const char *exception_name = NULL;
180 for (int i = 0; status_info[i].name; i++)
182 if (status_info[i].code == e->ExceptionCode)
184 exception_name = status_info[i].name;
191 small_printf ("Exception: %s at eip=%08x\r\n", exception_name, in->Eip);
193 small_printf ("Signal %d at eip=%08x\r\n", e->ExceptionCode, in->Eip);
194 small_printf ("eax=%08x ebx=%08x ecx=%08x edx=%08x esi=%08x edi=%08x\r\n",
195 in->Eax, in->Ebx, in->Ecx, in->Edx, in->Esi, in->Edi);
196 small_printf ("ebp=%08x esp=%08x program=%W, pid %u, thread %s\r\n",
197 in->Ebp, in->Esp, myself->progname, myself->pid, cygthread::name ());
198 small_printf ("cs=%04x ds=%04x es=%04x fs=%04x gs=%04x ss=%04x\r\n",
199 in->SegCs, in->SegDs, in->SegEs, in->SegFs, in->SegGs, in->SegSs);
202 /* A class for manipulating the stack. */
205 int walk (); /* Uses the "old" method */
206 char *next_offset () {return *((char **) sf.AddrFrame.Offset);}
210 STACKFRAME sf; /* For storing the stack information */
211 void init (DWORD, bool, bool); /* Called the first time that stack info is needed */
213 /* Postfix ++ iterates over the stack, returning zero when nothing is left. */
214 int operator ++(int) { return walk (); }
217 /* The number of parameters used in STACKFRAME */
218 #define NPARAMS (sizeof (thestack.sf.Params) / sizeof (thestack.sf.Params[0]))
220 /* This is the main stack frame info for this process. */
221 static NO_COPY stack_info thestack;
223 /* Initialize everything needed to start iterating. */
225 stack_info::init (DWORD ebp, bool wantargs, bool goodframe)
227 # define debp ((DWORD *) ebp)
228 memset (&sf, 0, sizeof (sf));
230 sf.AddrFrame.Offset = ebp;
234 sf.AddrFrame.Offset = (DWORD) &dummy_frame;
236 sf.AddrReturn.Offset = debp[1];
237 sf.AddrFrame.Mode = AddrModeFlat;
242 extern "C" void _cygwin_exit_return ();
244 /* Walk the stack by looking at successive stored 'bp' frames.
245 This is not foolproof. */
251 if ((void (*) ()) sf.AddrPC.Offset == _cygwin_exit_return)
252 return 0; /* stack frames are exhausted */
254 if (((ebp = (char **) next_offset ()) == NULL) || (ebp >= (char **) cygwin_hmodule))
257 sf.AddrFrame.Offset = (DWORD) ebp;
258 sf.AddrPC.Offset = sf.AddrReturn.Offset;
260 /* The return address always follows the stack pointer */
261 sf.AddrReturn.Offset = (DWORD) *++ebp;
265 unsigned nparams = NPARAMS;
267 /* The arguments follow the return address */
268 sf.Params[0] = (DWORD) *++ebp;
269 /* Hack for XP/2K3 WOW64. If the first stack param points to the
270 application entry point, we can only fetch one additional
271 parameter. Accessing anything beyond this address results in
272 a SEGV. This is fixed in Vista/2K8 WOW64. */
273 if (wincap.has_restricted_stack_args () && sf.Params[0] == 0x401000)
275 for (unsigned i = 1; i < nparams; i++)
276 sf.Params[i] = (DWORD) *++ebp;
283 stackdump (DWORD ebp, int open_file, bool isexception)
285 static bool already_dumped;
287 if (cygheap->rlim_core == 0UL || (open_file && already_dumped))
291 open_stackdumpfile ();
293 already_dumped = true;
297 thestack.init (ebp, 1, !isexception); /* Initialize from the input CONTEXT */
298 small_printf ("Stack trace:\r\nFrame Function Args\r\n");
299 for (i = 0; i < 16 && thestack++; i++)
301 small_printf ("%08x %08x ", thestack.sf.AddrFrame.Offset,
302 thestack.sf.AddrPC.Offset);
303 for (unsigned j = 0; j < NPARAMS; j++)
304 small_printf ("%s%08x", j == 0 ? " (" : ", ", thestack.sf.Params[j]);
305 small_printf (")\r\n");
307 small_printf ("End of stack trace%s\n",
308 i == 16 ? " (more stack frames may be present)" : "");
312 _cygtls::inside_kernel (CONTEXT *cx)
315 MEMORY_BASIC_INFORMATION m;
317 if (!isinitialized ())
320 memset (&m, 0, sizeof m);
321 if (!VirtualQuery ((LPCVOID) cx->Eip, &m, sizeof m))
322 sigproc_printf ("couldn't get memory info, pc %p, %E", cx->Eip);
324 size_t size = (windows_system_directory_length + 6) * sizeof (WCHAR);
325 PWCHAR checkdir = (PWCHAR) alloca (size);
326 memset (checkdir, 0, size);
328 # define h ((HMODULE) m.AllocationBase)
329 if (!h || m.State != MEM_COMMIT) /* Be defensive */
331 else if (h == user_data->hmodule)
333 else if (!GetModuleFileNameW (h, checkdir, windows_system_directory_length + 6))
337 /* Skip potential long path prefix. */
338 if (!wcsncmp (checkdir, L"\\\\?\\", 4))
340 res = wcsncasecmp (windows_system_directory, checkdir,
341 windows_system_directory_length) == 0;
342 if (!res && system_wow64_directory_length)
343 res = wcsncasecmp (system_wow64_directory, checkdir,
344 system_wow64_directory_length) == 0;
347 sigproc_printf ("pc %p, h %p, inside_kernel %d", cx->Eip, h, res);
352 /* Temporary (?) function for external callers to get a stack dump */
357 c.ContextFlags = CONTEXT_FULL;
358 GetThreadContext (GetCurrentThread (), &c);
359 stackdump (c.Ebp, 0, 0);
362 #define TIME_TO_WAIT_FOR_DEBUGGER 10000
365 try_to_debug (bool waitloop)
367 debug_printf ("debugger_command '%s'", debugger_command);
368 if (*debugger_command == '\0')
370 if (being_debugged ())
372 extern void break_here ();
377 __small_sprintf (strchr (debugger_command, '\0'), " %u", GetCurrentProcessId ());
379 LONG prio = GetThreadPriority (GetCurrentThread ());
380 SetThreadPriority (GetCurrentThread (), THREAD_PRIORITY_HIGHEST);
381 PROCESS_INFORMATION pi = {NULL, 0, 0, 0};
383 STARTUPINFOW si = {0, NULL, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL};
384 si.lpReserved = NULL;
389 /* FIXME: need to know handles of all running threads to
390 suspend_all_threads_except (current_thread_id);
393 /* If the tty mutex is owned, we will fail to start any cygwin app
394 until the trapped app exits. However, this will only release any
395 the mutex if it is owned by this thread so that may be problematic. */
397 lock_ttys::release ();
399 /* prevent recursive exception handling */
400 PWCHAR rawenv = GetEnvironmentStringsW () ;
401 for (PWCHAR p = rawenv; *p != L'\0'; p = wcschr (p, L'\0') + 1)
403 if (wcsncmp (p, L"CYGWIN=", wcslen (L"CYGWIN=")) == 0)
405 PWCHAR q = wcsstr (p, L"error_start") ;
406 /* replace 'error_start=...' with '_rror_start=...' */
410 SetEnvironmentVariableW (L"CYGWIN", p + wcslen (L"CYGWIN=")) ;
416 console_printf ("*** starting debugger for pid %u, tid %u\n",
417 cygwin_pid (GetCurrentProcessId ()), GetCurrentThreadId ());
419 WCHAR dbg_cmd[strlen(debugger_command)];
420 sys_mbstowcs (dbg_cmd, strlen(debugger_command) + 1, debugger_command);
421 dbg = CreateProcessW (NULL,
426 CREATE_NEW_CONSOLE | CREATE_NEW_PROCESS_GROUP,
433 system_printf ("Failed to start debugger, %E");
438 SetThreadPriority (GetCurrentThread (), THREAD_PRIORITY_IDLE);
439 while (!being_debugged ())
444 console_printf ("*** continuing pid %u from debugger call (%d)\n",
445 cygwin_pid (GetCurrentProcessId ()), dbg);
447 SetThreadPriority (GetCurrentThread (), prio);
451 extern "C" DWORD __stdcall RtlUnwind (void *, void *, void *, DWORD);
452 static void __stdcall rtl_unwind (exception_list *, PEXCEPTION_RECORD) __attribute__ ((noinline, regparm (3)));
454 rtl_unwind (exception_list *frame, PEXCEPTION_RECORD e)
464 call _RtlUnwind@16 \n\
469 ": : "r" (frame), "r" (e));
472 /* Main exception handler. */
474 extern exception_list *_except_list asm ("%fs:0");
477 exception::handle (EXCEPTION_RECORD *e, exception_list *frame, CONTEXT *in, void *)
479 static bool NO_COPY debugging;
480 static int NO_COPY recursed;
481 _cygtls& me = _my_tls;
483 if (debugging && ++debugging < 500000)
485 SetThreadPriority (hMainThread, THREAD_PRIORITY_NORMAL);
489 /* If we've already exited, don't do anything here. Returning 1
490 tells Windows to keep looking for an exception handler. */
491 if (exit_already || e->ExceptionFlags)
495 si.si_code = SI_KERNEL;
496 /* Coerce win32 value to posix value. */
497 switch (e->ExceptionCode)
499 case STATUS_FLOAT_DENORMAL_OPERAND:
500 case STATUS_FLOAT_DIVIDE_BY_ZERO:
501 case STATUS_FLOAT_INVALID_OPERATION:
502 case STATUS_FLOAT_STACK_CHECK:
503 si.si_signo = SIGFPE;
504 si.si_code = FPE_FLTSUB;
506 case STATUS_FLOAT_INEXACT_RESULT:
507 si.si_signo = SIGFPE;
508 si.si_code = FPE_FLTRES;
510 case STATUS_FLOAT_OVERFLOW:
511 si.si_signo = SIGFPE;
512 si.si_code = FPE_FLTOVF;
514 case STATUS_FLOAT_UNDERFLOW:
515 si.si_signo = SIGFPE;
516 si.si_code = FPE_FLTUND;
518 case STATUS_INTEGER_DIVIDE_BY_ZERO:
519 si.si_signo = SIGFPE;
520 si.si_code = FPE_INTDIV;
522 case STATUS_INTEGER_OVERFLOW:
523 si.si_signo = SIGFPE;
524 si.si_code = FPE_INTOVF;
527 case STATUS_ILLEGAL_INSTRUCTION:
528 si.si_signo = SIGILL;
529 si.si_code = ILL_ILLOPC;
532 case STATUS_PRIVILEGED_INSTRUCTION:
533 si.si_signo = SIGILL;
534 si.si_code = ILL_PRVOPC;
537 case STATUS_NONCONTINUABLE_EXCEPTION:
538 si.si_signo = SIGILL;
539 si.si_code = ILL_ILLADR;
543 si.si_signo = SIGALRM;
546 case STATUS_GUARD_PAGE_VIOLATION:
547 si.si_signo = SIGBUS;
548 si.si_code = BUS_OBJERR;
551 case STATUS_DATATYPE_MISALIGNMENT:
552 si.si_signo = SIGBUS;
553 si.si_code = BUS_ADRALN;
556 case STATUS_ACCESS_VIOLATION:
557 switch (mmap_is_attached_or_noreserve ((void *)e->ExceptionInformation[1],
560 case MMAP_NORESERVE_COMMITED:
562 case MMAP_RAISE_SIGBUS: /* MAP_NORESERVE page, commit failed, or
563 access to mmap page beyond EOF. */
564 si.si_signo = SIGBUS;
565 si.si_code = BUS_OBJERR;
568 MEMORY_BASIC_INFORMATION m;
569 VirtualQuery ((PVOID) e->ExceptionInformation[1], &m, sizeof m);
570 si.si_signo = SIGSEGV;
571 si.si_code = m.State == MEM_FREE ? SEGV_MAPERR : SEGV_ACCERR;
576 case STATUS_ARRAY_BOUNDS_EXCEEDED:
577 case STATUS_IN_PAGE_ERROR:
578 case STATUS_NO_MEMORY:
579 case STATUS_INVALID_DISPOSITION:
580 case STATUS_STACK_OVERFLOW:
581 si.si_signo = SIGSEGV;
582 si.si_code = SEGV_MAPERR;
585 case STATUS_CONTROL_C_EXIT:
586 si.si_signo = SIGINT;
589 case STATUS_INVALID_HANDLE:
590 /* CloseHandle will throw this exception if it is given an
591 invalid handle. We don't care about the exception; we just
592 want CloseHandle to return an error. This can be revisited
593 if gcc ever supports Windows style structured exception
598 /* If we don't recognize the exception, we have to assume that
599 we are doing structured exception handling, and we let
600 something else handle it. */
604 debug_printf ("In cygwin_except_handler exception %p at %p sp %p", e->ExceptionCode, in->Eip, in->Esp);
605 debug_printf ("In cygwin_except_handler signal %d at %p", si.si_signo, in->Eip);
607 bool masked = !!(me.sigmask & SIGTOMASK (si.si_signo));
609 syscall_printf ("signal %d, masked %p", si.si_signo,
610 global_sigs[si.si_signo].sa_mask);
612 debug_printf ("In cygwin_except_handler calling %p",
613 global_sigs[si.si_signo].sa_handler);
615 DWORD *ebp = (DWORD *) in->Esp;
616 for (DWORD *bpend = (DWORD *) __builtin_frame_address (0); ebp > bpend; ebp--)
617 if (*ebp == in->SegCs && ebp[-1] == in->Eip)
624 me.andreas->leave (); /* Return from a "san" caught fault */
626 me.copy_context (in);
628 /* Temporarily replace windows top level SEH with our own handler.
629 We don't want any Windows magic kicking in. This top level frame
630 will be removed automatically after our exception handler returns. */
631 _except_list->handler = handle;
635 || !cygwin_finished_initializing
636 || (void *) global_sigs[si.si_signo].sa_handler == (void *) SIG_DFL
637 || (void *) global_sigs[si.si_signo].sa_handler == (void *) SIG_IGN
638 || (void *) global_sigs[si.si_signo].sa_handler == (void *) SIG_ERR)
640 /* Print the exception to the console */
641 if (!myself->cygstarted)
642 for (int i = 0; status_info[i].name; i++)
643 if (status_info[i].code == e->ExceptionCode)
645 system_printf ("Exception: %s", status_info[i].name);
649 /* Another exception could happen while tracing or while exiting.
650 Only do this once. */
652 system_printf ("Error while dumping state (probably corrupted stack)");
655 if (try_to_debug (0))
661 rtl_unwind (frame, e);
662 if (cygheap->rlim_core > 0UL)
664 open_stackdumpfile ();
665 dump_exception (e, in);
666 stackdump ((DWORD) ebp, 0, 1);
670 if (e->ExceptionCode == STATUS_ACCESS_VIOLATION)
673 if (si.si_code == SEGV_ACCERR) /* Address present */
675 if (e->ExceptionInformation[0]) /* Write access */
677 if (!me.inside_kernel (in)) /* User space */
679 klog (LOG_INFO, "%s[%d]: segfault at %08x rip %08x rsp %08x error %d",
680 __progname, myself->pid,
681 e->ExceptionInformation[1], in->Eip, in->Esp,
682 ((in->Eip >= 0x61000000 && in->Eip < 0x61200000)
683 ? 0 : 4) | (e->ExceptionInformation[0] << 1));
686 /* Flag signal + core dump */
687 me.signal_exit ((cygheap->rlim_core > 0UL ? 0x80 : 0) | si.si_signo);
690 si.si_addr = (si.si_signo == SIGSEGV || si.si_signo == SIGBUS
691 ? (void *) e->ExceptionInformation[1]
693 si.si_errno = si.si_pid = si.si_uid = 0;
695 sig_send (NULL, si, &me); // Signal myself
697 e->ExceptionFlags = 0;
701 /* Utilities to call a user supplied exception handler. */
703 #define SIG_NONMASKABLE (SIGTOMASK (SIGKILL) | SIGTOMASK (SIGSTOP))
705 /* Non-raceable sigsuspend
706 * Note: This implementation is based on the Single UNIX Specification
707 * man page. This indicates that sigsuspend always returns -1 and that
708 * attempts to block unblockable signals will be silently ignored.
709 * This is counter to what appears to be documented in some UNIX
710 * man pages, e.g. Linux.
713 handle_sigsuspend (sigset_t tempmask)
715 sigset_t oldmask = _my_tls.sigmask; // Remember for restoration
717 set_signal_mask (tempmask, _my_tls.sigmask);
718 sigproc_printf ("oldmask %p, newmask %p", oldmask, tempmask);
720 pthread_testcancel ();
721 cancelable_wait (signal_arrived);
723 set_sig_errno (EINTR); // Per POSIX
725 /* A signal dispatch function will have been added to our stack and will
726 be hit eventually. Set the old mask to be restored when the signal
727 handler returns and indicate its presence by modifying deltamask. */
729 _my_tls.deltamask |= SIG_NONMASKABLE;
730 _my_tls.oldmask = oldmask; // Will be restored by signal handler
734 extern DWORD exec_exit; // Possible exit value for exec
738 sig_handle_tty_stop (int sig)
741 /* Silently ignore attempts to suspend if there is no accommodating
742 cygwin parent to deal with this behavior. */
743 if (!myself->cygstarted)
745 myself->process_state &= ~PID_STOPPED;
749 myself->stopsig = sig;
750 myself->alert_parent (sig);
751 sigproc_printf ("process %d stopped by signal %d", myself->pid, sig);
754 w4[1] = signal_arrived;
755 switch (WaitForMultipleObjects (2, w4, TRUE, INFINITE))
758 case WAIT_OBJECT_0 + 1:
759 myself->stopsig = SIGCONT;
760 myself->alert_parent (SIGCONT);
763 api_fatal ("WaitSingleObject failed, %E");
771 _cygtls::interrupt_now (CONTEXT *cx, int sig, void *handler,
772 struct sigaction& siga)
776 /* Delay the interrupt if we are
777 1) somehow inside the DLL
778 2) in _sigfe (spinning is true) and about to enter cygwin DLL
779 3) in a Windows DLL. */
780 if (incyg || spinning || inside_kernel (cx))
784 push ((__stack_t) cx->Eip);
785 interrupt_setup (sig, handler, siga);
787 SetThreadContext (*this, cx); /* Restart the thread in a new location */
794 _cygtls::interrupt_setup (int sig, void *handler, struct sigaction& siga)
796 push ((__stack_t) sigdelayed);
797 deltamask = siga.sa_mask & ~SIG_NONMASKABLE;
798 sa_flags = siga.sa_flags;
799 func = (void (*) (int)) handler;
800 if (siga.sa_flags & SA_RESETHAND)
801 siga.sa_handler = SIG_DFL;
802 saved_errno = -1; // Flag: no errno to save
803 if (handler == sig_handle_tty_stop)
806 myself->process_state |= PID_STOPPED;
809 this->sig = sig; // Should always be last thing set to avoid a race
820 /* Clear any waiting threads prior to dispatching to handler function */
821 int res = SetEvent (signal_arrived); // For an EINTR case
822 proc_subproc (PROC_CLEARWAIT, 1);
823 sigproc_printf ("armed signal_arrived %p, signal %d, res %d", signal_arrived,
827 extern "C" void __stdcall
828 set_sig_errno (int e)
830 *_my_tls.errno_addr = e;
831 _my_tls.saved_errno = e;
834 static int setup_handler (int, void *, struct sigaction&, _cygtls *tls)
835 __attribute__((regparm(3)));
837 setup_handler (int sig, void *handler, struct sigaction& siga, _cygtls *tls)
840 bool interrupted = false;
844 sigproc_printf ("trying to send signal %d but signal %d already armed",
849 for (int n = 0; n < CALL_HANDLER_RETRY_OUTER; n++)
851 for (int i = 0; i < CALL_HANDLER_RETRY_INNER; i++)
856 sigproc_printf ("controlled interrupt. stackptr %p, stack %p, stackptr[-1] %p",
857 tls->stackptr, tls->stack, tls->stackptr[-1]);
858 tls->interrupt_setup (sig, handler, siga);
865 HANDLE hth = (HANDLE) *tls;
867 /* Suspend the thread which will receive the signal.
868 If one of these conditions is not true we loop.
869 If the thread is already suspended (which can occur when a program
870 has called SuspendThread on itself) then just queue the signal. */
872 sigproc_printf ("suspending thread");
873 res = SuspendThread (hth);
874 /* Just set pending if thread is already suspended */
880 cx.ContextFlags = CONTEXT_CONTROL | CONTEXT_INTEGER;
881 if (!GetThreadContext (hth, &cx))
882 system_printf ("couldn't get context of thread, %E");
884 interrupted = tls->interrupt_now (&cx, sig, handler, siga);
887 res = ResumeThread (hth);
891 sigproc_printf ("couldn't interrupt. trying again.");
894 /* Hit here if we couldn't deliver the signal. Take a more drastic
895 action before trying again. */
900 sigproc_printf ("signal %d %sdelivered", sig, interrupted ? "" : "not ");
905 has_visible_window_station ()
911 /* Check if the process is associated with a visible window station.
912 These are processes running on the local desktop as well as processes
913 running in terminal server sessions.
914 Processes running in a service session not explicitely associated
915 with the desktop (using the "Allow service to interact with desktop"
916 property) are running in an invisible window station. */
917 if ((station_hdl = GetProcessWindowStation ())
918 && GetUserObjectInformationW (station_hdl, UOI_FLAGS, &uof,
920 && (uof.dwFlags & WSF_VISIBLE))
925 /* Keyboard interrupt handler. */
927 ctrl_c_handler (DWORD type)
929 static bool saw_close;
931 if (!cygwin_finished_initializing)
933 if (myself->cygstarted) /* Was this process created by a cygwin process? */
934 return TRUE; /* Yes. Let the parent eventually handle CTRL-C issues. */
935 debug_printf ("exiting with status %p", STATUS_CONTROL_C_EXIT);
936 ExitProcess (STATUS_CONTROL_C_EXIT);
939 /* Remove early or we could overthrow the threadlist in cygheap.
940 Deleting this line causes ash to SEGV if CTRL-C is hit repeatedly.
941 I am not exactly sure why that is. Maybe it's just because this
942 adds some early serialization to ctrl_c_handler which prevents
943 multiple simultaneous calls? */
944 _my_tls.remove (INFINITE);
947 if (type == CTRL_C_EVENT || type == CTRL_BREAK_EVENT)
948 proc_subproc (PROC_KILLFORKED, 0);
951 /* Return FALSE to prevent an "End task" dialog box from appearing
952 for each Cygwin process window that's open when the computer
953 is shut down or console window is closed. */
955 if (type == CTRL_SHUTDOWN_EVENT)
958 /* Don't send a signal. Only NT service applications and their child
959 processes will receive this event and the services typically already
960 handle the shutdown action when getting the SERVICE_CONTROL_SHUTDOWN
962 sig_send (NULL, SIGTERM);
967 if (myself->ctty != -1)
969 if (type == CTRL_CLOSE_EVENT)
971 sig_send (NULL, SIGHUP);
975 if (!saw_close && type == CTRL_LOGOFF_EVENT)
977 /* The CTRL_LOGOFF_EVENT is sent when *any* user logs off.
978 The below code sends a SIGHUP only if it is not performing the
979 default activity for SIGHUP. Note that it is possible for two
980 SIGHUP signals to arrive if a process group leader is exiting
981 too. Getting this 100% right is saved for a future cygwin mailing
983 if (global_sigs[SIGHUP].sa_handler != SIG_DFL)
985 sig_send (myself_nowait, SIGHUP);
992 if (ch_spawn.set_saw_ctrl_c ())
995 /* We're only the process group leader when we have a valid pinfo structure.
996 If we don't have one, then the parent "stub" will handle the signal. */
997 if (!pinfo (cygwin_pid (GetCurrentProcessId ())))
1000 tty_min *t = cygwin_shared->tty.get_cttyp ();
1001 /* Ignore this if we're not the process group leader since it should be handled
1002 *by* the process group leader. */
1003 if (t && t->getpgid () == myself->pid &&
1004 (GetTickCount () - t->last_ctrl_c) >= MIN_CTRL_C_SLOP)
1005 /* Otherwise we just send a SIGINT to the process group and return TRUE (to indicate
1006 that we have handled the signal). At this point, type should be
1007 a CTRL_C_EVENT or CTRL_BREAK_EVENT. */
1010 /* If intr and quit are both mapped to ^C, send SIGQUIT on ^BREAK */
1011 if (type == CTRL_BREAK_EVENT
1012 && t->ti.c_cc[VINTR] == 3 && t->ti.c_cc[VQUIT] == 3)
1014 t->last_ctrl_c = GetTickCount ();
1015 killsys (-myself->pid, sig);
1016 t->last_ctrl_c = GetTickCount ();
1023 /* Function used by low level sig wrappers. */
1024 extern "C" void __stdcall
1025 set_process_mask (sigset_t newmask)
1027 set_signal_mask (newmask, _my_tls.sigmask);
1033 /* check that sig is in right range */
1034 if (sig < 0 || sig >= NSIG)
1037 syscall_printf ("signal %d out of range", sig);
1040 mask_sync.acquire (INFINITE);
1041 sigset_t mask = _my_tls.sigmask;
1042 sigaddset (&mask, sig);
1043 set_signal_mask (mask, _my_tls.sigmask);
1044 mask_sync.release ();
1051 /* check that sig is in right range */
1052 if (sig < 0 || sig >= NSIG)
1055 syscall_printf ("signal %d out of range", sig);
1058 mask_sync.acquire (INFINITE);
1059 sigset_t mask = _my_tls.sigmask;
1060 sigdelset (&mask, sig);
1061 set_signal_mask (mask, _my_tls.sigmask);
1062 mask_sync.release ();
1066 extern "C" _sig_func_ptr
1067 sigset (int sig, _sig_func_ptr func)
1069 sig_dispatch_pending ();
1072 /* check that sig is in right range */
1073 if (sig < 0 || sig >= NSIG || sig == SIGKILL || sig == SIGSTOP)
1076 syscall_printf ("SIG_ERR = sigset (%d, %p)", sig, func);
1077 return (_sig_func_ptr) SIG_ERR;
1080 mask_sync.acquire (INFINITE);
1081 sigset_t mask = _my_tls.sigmask;
1082 /* If sig was in the signal mask return SIG_HOLD, otherwise return the
1083 previous disposition. */
1084 if (sigismember (&mask, sig))
1087 prev = global_sigs[sig].sa_handler;
1088 /* If func is SIG_HOLD, add sig to the signal mask, otherwise set the
1089 disposition to func and remove sig from the signal mask. */
1090 if (func == SIG_HOLD)
1091 sigaddset (&mask, sig);
1094 /* No error checking. The test which could return SIG_ERR has already
1097 sigdelset (&mask, sig);
1099 set_signal_mask (mask, _my_tls.sigmask);
1100 mask_sync.release ();
1107 return sigset (sig, SIG_IGN) == SIG_ERR ? -1 : 0;
1110 /* Update the signal mask for this process and return the old mask.
1111 Called from sigdelayed */
1113 set_process_mask_delta ()
1115 mask_sync.acquire (INFINITE);
1116 sigset_t newmask, oldmask;
1118 if (_my_tls.deltamask & SIG_NONMASKABLE)
1119 oldmask = _my_tls.oldmask; /* from handle_sigsuspend */
1121 oldmask = _my_tls.sigmask;
1122 newmask = (oldmask | _my_tls.deltamask) & ~SIG_NONMASKABLE;
1123 sigproc_printf ("oldmask %p, newmask %p, deltamask %p", oldmask, newmask,
1125 _my_tls.sigmask = newmask;
1126 mask_sync.release ();
1130 /* Set the signal mask for this process.
1131 Note that some signals are unmaskable, as in UNIX. */
1132 extern "C" void __stdcall
1133 set_signal_mask (sigset_t newmask, sigset_t& oldmask)
1136 if (&_my_tls == _sig_tls)
1137 small_printf ("********* waiting in signal thread\n");
1139 mask_sync.acquire (INFINITE);
1140 newmask &= ~SIG_NONMASKABLE;
1141 sigset_t mask_bits = oldmask & ~newmask;
1142 sigproc_printf ("oldmask %p, newmask %p, mask_bits %p", oldmask, newmask,
1146 sig_dispatch_pending (true);
1148 sigproc_printf ("not calling sig_dispatch_pending");
1149 mask_sync.release ();
1153 sigpacket::process ()
1156 struct sigaction dummy = global_sigs[SIGSTOP];
1158 if (si.si_signo != SIGCONT)
1159 continue_now = false;
1162 continue_now = myself->process_state & PID_STOPPED;
1163 myself->stopsig = 0;
1164 myself->process_state &= ~PID_STOPPED;
1165 /* Clear pending stop signals */
1166 sig_clear (SIGSTOP);
1167 sig_clear (SIGTSTP);
1168 sig_clear (SIGTTIN);
1169 sig_clear (SIGTTOU);
1172 switch (si.si_signo)
1179 cygheap->ctty->sigflush ();
1187 sigproc_printf ("signal %d processing", si.si_signo);
1188 struct sigaction& thissig = global_sigs[si.si_signo];
1190 myself->rusage_self.ru_nsignals++;
1194 if (!have_execed || (void *) thissig.sa_handler == (void *) SIG_IGN)
1195 handler = (void *) thissig.sa_handler;
1201 _cygtls *use_tls = tls ?: _main_tls;
1203 if (si.si_signo == SIGKILL)
1205 if (si.si_signo == SIGSTOP)
1207 sig_clear (SIGCONT);
1211 bool insigwait_mask;
1212 if ((masked = ISSTATE (myself, PID_STOPPED)))
1213 insigwait_mask = false;
1215 insigwait_mask = sigismember (&tls->sigwait_mask, si.si_signo);
1216 else if (!(tls = _cygtls::find_tls (si.si_signo)))
1217 insigwait_mask = false;
1221 insigwait_mask = true;
1225 goto thread_specific;
1228 /* nothing to do */;
1229 else if (sigismember (mask, si.si_signo))
1232 masked = sigismember (&tls->sigmask, si.si_signo);
1236 sigproc_printf ("signal %d blocked", si.si_signo);
1241 /* Clear pending SIGCONT on stop signals */
1242 if (si.si_signo == SIGTSTP || si.si_signo == SIGTTIN || si.si_signo == SIGTTOU)
1243 sig_clear (SIGCONT);
1245 if (handler == (void *) SIG_DFL)
1248 goto thread_specific;
1249 if (si.si_signo == SIGCHLD || si.si_signo == SIGIO || si.si_signo == SIGCONT || si.si_signo == SIGWINCH
1250 || si.si_signo == SIGURG)
1252 sigproc_printf ("default signal %d ignored", si.si_signo);
1254 SetEvent (signal_arrived);
1258 if (si.si_signo == SIGTSTP || si.si_signo == SIGTTIN || si.si_signo == SIGTTOU)
1264 if (handler == (void *) SIG_IGN)
1266 sigproc_printf ("signal %d ignored", si.si_signo);
1270 if (handler == (void *) SIG_ERR)
1273 use_tls->set_siginfo (this);
1277 /* Eat multiple attempts to STOP */
1278 if (ISSTATE (myself, PID_STOPPED))
1280 handler = (void *) sig_handle_tty_stop;
1284 /* Dispatch to the appropriate function. */
1285 sigproc_printf ("signal %d, about to call %p", si.si_signo, handler);
1286 rc = setup_handler (si.si_signo, handler, thissig, use_tls);
1292 sigproc_printf ("returning %d", rc);
1296 use_tls->sig = si.si_signo;
1297 use_tls->set_siginfo (this);
1298 use_tls->func = NULL;
1299 sigproc_printf ("releasing sigwait for thread");
1300 SetEvent (use_tls->event);
1304 use_tls->signal_exit (si.si_signo); /* never returns */
1310 mask_sync.init ("mask_sync");
1320 _cygtls::call_signal_handler ()
1322 int this_sa_flags = SA_RESTART;
1328 else if (this != _main_tls)
1331 if (_main_tls->sig && _main_tls->incyg)
1333 paranoid_printf ("Redirecting to main_tls signal %d", _main_tls->sig);
1334 sig = _main_tls->sig;
1335 sa_flags = _main_tls->sa_flags;
1336 func = _main_tls->func;
1337 infodata = _main_tls->infodata;
1342 _main_tls->unlock ();
1347 debug_only_printf ("dealing with signal %d", sig);
1348 this_sa_flags = sa_flags;
1350 void (*thisfunc) (int) = func;
1352 sigset_t this_oldmask = set_process_mask_delta ();
1353 int this_errno = saved_errno;
1355 unlock (); // make sure synchronized
1356 if (!(this_sa_flags & SA_SIGINFO))
1358 void (*sigfunc) (int) = thisfunc;
1364 siginfo_t thissi = infodata;
1365 void (*sigact) (int, siginfo_t *, void *) = (void (*) (int, siginfo_t *, void *)) thisfunc;
1366 /* no ucontext_t information provided yet */
1368 sigact (thissig, &thissi, NULL);
1371 set_signal_mask (this_oldmask, _my_tls.sigmask);
1372 if (this_errno >= 0)
1373 set_errno (this_errno);
1377 return this_sa_flags & SA_RESTART || (this != _main_tls);
1381 _cygtls::copy_context (CONTEXT *c)
1383 memcpy (&thread_context, c, (&thread_context._internal - (unsigned char *) &thread_context));
1387 _cygtls::signal_debugger (int sig)
1389 if (isinitialized () && being_debugged ())
1391 char sigmsg[2 * sizeof (_CYGWIN_SIGNAL_STRING " ffffffff ffffffff")];
1392 __small_sprintf (sigmsg, _CYGWIN_SIGNAL_STRING " %d %p %p", sig, thread_id, &thread_context);
1393 OutputDebugString (sigmsg);