1
2/*--------------------------------------------------------------------*/
3/*--- Implementation of POSIX signals.                 m_signals.c ---*/
4/*--------------------------------------------------------------------*/
5
6/*
7   This file is part of Valgrind, a dynamic binary instrumentation
8   framework.
9
10   Copyright (C) 2000-2010 Julian Seward
11      jseward@acm.org
12
13   This program is free software; you can redistribute it and/or
14   modify it under the terms of the GNU General Public License as
15   published by the Free Software Foundation; either version 2 of the
16   License, or (at your option) any later version.
17
18   This program is distributed in the hope that it will be useful, but
19   WITHOUT ANY WARRANTY; without even the implied warranty of
20   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
21   General Public License for more details.
22
23   You should have received a copy of the GNU General Public License
24   along with this program; if not, write to the Free Software
25   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
26   02111-1307, USA.
27
28   The GNU General Public License is contained in the file COPYING.
29*/
30
31/*
32   Signal handling.
33
34   There are 4 distinct classes of signal:
35
36   1. Synchronous, instruction-generated (SIGILL, FPE, BUS, SEGV and
37   TRAP): these are signals as a result of an instruction fault.  If
38   we get one while running client code, then we just do the
39   appropriate thing.  If it happens while running Valgrind code, then
40   it indicates a Valgrind bug.  Note that we "manually" implement
41   automatic stack growth, such that if a fault happens near the
42   client process stack, it is extended in the same way the kernel
43   would, and the fault is never reported to the client program.
44
45   2. Asynchronous variants of the above signals: If the kernel tries
46   to deliver a sync signal while it is blocked, it just kills the
47   process.  Therefore, we can't block those signals if we want to be
48   able to report on bugs in Valgrind.  This means that we're also
49   open to receiving those signals from other processes, sent with
50   kill.  We could get away with just dropping them, since they aren't
51   really signals that processes send to each other.
52
53   3. Synchronous, general signals.  If a thread/process sends itself
54   a signal with kill, its expected to be synchronous: ie, the signal
55   will have been delivered by the time the syscall finishes.
56
57   4. Asynchronous, general signals.  All other signals, sent by
58   another process with kill.  These are generally blocked, except for
59   two special cases: we poll for them each time we're about to run a
60   thread for a time quanta, and while running blocking syscalls.
61
62
63   In addition, we reserve one signal for internal use: SIGVGKILL.
64   SIGVGKILL is used to terminate threads.  When one thread wants
65   another to exit, it will set its exitreason and send it SIGVGKILL
66   if it appears to be blocked in a syscall.
67
68
69   We use a kernel thread for each application thread.  When the
70   thread allows itself to be open to signals, it sets the thread
71   signal mask to what the client application set it to.  This means
72   that we get the kernel to do all signal routing: under Valgrind,
73   signals get delivered in the same way as in the non-Valgrind case
74   (the exception being for the sync signal set, since they're almost
75   always unblocked).
76 */
77
78/*
79   Some more details...
80
81   First off, we take note of the client's requests (via sys_sigaction
82   and sys_sigprocmask) to set the signal state (handlers for each
83   signal, which are process-wide, + a mask for each signal, which is
84   per-thread).  This info is duly recorded in the SCSS (static Client
85   signal state) in m_signals.c, and if the client later queries what
86   the state is, we merely fish the relevant info out of SCSS and give
87   it back.
88
89   However, we set the real signal state in the kernel to something
90   entirely different.  This is recorded in SKSS, the static Kernel
91   signal state.  What's nice (to the extent that anything is nice w.r.t
92   signals) is that there's a pure function to calculate SKSS from SCSS,
93   calculate_SKSS_from_SCSS.  So when the client changes SCSS then we
94   recompute the associated SKSS and apply any changes from the previous
95   SKSS through to the kernel.
96
97   Now, that said, the general scheme we have now is, that regardless of
98   what the client puts into the SCSS (viz, asks for), what we would
99   like to do is as follows:
100
101   (1) run code on the virtual CPU with all signals blocked
102
103   (2) at convenient moments for us (that is, when the VCPU stops, and
104      control is back with the scheduler), ask the kernel "do you have
105      any signals for me?"  and if it does, collect up the info, and
106      deliver them to the client (by building sigframes).
107
108   And that's almost what we do.  The signal polling is done by
109   VG_(poll_signals), which calls through to VG_(sigtimedwait_zero) to
110   do the dirty work.  (of which more later).
111
112   By polling signals, rather than catching them, we get to deal with
113   them only at convenient moments, rather than having to recover from
114   taking a signal while generated code is running.
115
116   Now unfortunately .. the above scheme only works for so-called async
117   signals.  An async signal is one which isn't associated with any
118   particular instruction, eg Control-C (SIGINT).  For those, it doesn't
119   matter if we don't deliver the signal to the client immediately; it
120   only matters that we deliver it eventually.  Hence polling is OK.
121
122   But the other group -- sync signals -- are all related by the fact
123   that they are various ways for the host CPU to fail to execute an
124   instruction: SIGILL, SIGSEGV, SIGFPU.  And they can't be deferred,
125   because obviously if a host instruction can't execute, well then we
126   have to immediately do Plan B, whatever that is.
127
128   So the next approximation of what happens is:
129
130   (1) run code on vcpu with all async signals blocked
131
132   (2) at convenient moments (when NOT running the vcpu), poll for async
133      signals.
134
135   (1) and (2) together imply that if the host does deliver a signal to
136      async_signalhandler while the VCPU is running, something's
137      seriously wrong.
138
139   (3) when running code on vcpu, don't block sync signals.  Instead
140      register sync_signalhandler and catch any such via that.  Of
141      course, that means an ugly recovery path if we do -- the
142      sync_signalhandler has to longjump, exiting out of the generated
143      code, and the assembly-dispatcher thingy that runs it, and gets
144      caught in m_scheduler, which then tells m_signals to deliver the
145      signal.
146
147   Now naturally (ha ha) even that might be tolerable, but there's
148   something worse: dealing with signals delivered to threads in
149   syscalls.
150
151   Obviously from the above, SKSS's signal mask (viz, what we really run
152   with) is way different from SCSS's signal mask (viz, what the client
153   thread thought it asked for).  (eg) It may well be that the client
154   did not block control-C, so that it just expects to drop dead if it
155   receives ^C whilst blocked in a syscall, but by default we are
156   running with all async signals blocked, and so that signal could be
157   arbitrarily delayed, or perhaps even lost (not sure).
158
159   So what we have to do, when doing any syscall which SfMayBlock, is to
160   quickly switch in the SCSS-specified signal mask just before the
161   syscall, and switch it back just afterwards, and hope that we don't
162   get caught up in some wierd race condition.  This is the primary
163   purpose of the ultra-magical pieces of assembly code in
164   coregrind/m_syswrap/syscall-<plat>.S
165
166   -----------
167
168   The ways in which V can come to hear of signals that need to be
169   forwarded to the client as are follows:
170
171    sync signals: can arrive at any time whatsoever.  These are caught
172                  by sync_signalhandler
173
174    async signals:
175
176       if    running generated code
177       then  these are blocked, so we don't expect to catch them in
178             async_signalhandler
179
180       else
181       if    thread is blocked in a syscall marked SfMayBlock
182       then  signals may be delivered to async_sighandler, since we
183             temporarily unblocked them for the duration of the syscall,
184             by using the real (SCSS) mask for this thread
185
186       else  we're doing misc housekeeping activities (eg, making a translation,
187             washing our hair, etc).  As in the normal case, these signals are
188             blocked, but we can  and do poll for them using VG_(poll_signals).
189
190   Now, re VG_(poll_signals), it polls the kernel by doing
191   VG_(sigtimedwait_zero).  This is trivial on Linux, since it's just a
192   syscall.  But on Darwin and AIX, we have to cobble together the
193   functionality in a tedious, longwinded and probably error-prone way.
194 */
195
196#include "pub_core_basics.h"
197#include "pub_core_vki.h"
198#include "pub_core_vkiscnums.h"
199#include "pub_core_debuglog.h"
200#include "pub_core_threadstate.h"
201#include "pub_core_xarray.h"
202#include "pub_core_clientstate.h"
203#include "pub_core_aspacemgr.h"
204#include "pub_core_debugger.h"      // For VG_(start_debugger)
205#include "pub_core_errormgr.h"
206#include "pub_core_libcbase.h"
207#include "pub_core_libcassert.h"
208#include "pub_core_libcprint.h"
209#include "pub_core_libcproc.h"
210#include "pub_core_libcsignal.h"
211#include "pub_core_machine.h"
212#include "pub_core_mallocfree.h"
213#include "pub_core_options.h"
214#include "pub_core_scheduler.h"
215#include "pub_core_signals.h"
216#include "pub_core_sigframe.h"      // For VG_(sigframe_create)()
217#include "pub_core_stacks.h"        // For VG_(change_stack)()
218#include "pub_core_stacktrace.h"    // For VG_(get_and_pp_StackTrace)()
219#include "pub_core_syscall.h"
220#include "pub_core_syswrap.h"
221#include "pub_core_tooliface.h"
222#include "pub_core_coredump.h"
223
224
225/* ---------------------------------------------------------------------
226   Forwards decls.
227   ------------------------------------------------------------------ */
228
229static void sync_signalhandler  ( Int sigNo, vki_siginfo_t *info,
230                                             struct vki_ucontext * );
231static void async_signalhandler ( Int sigNo, vki_siginfo_t *info,
232                                             struct vki_ucontext * );
233static void sigvgkill_handler	( Int sigNo, vki_siginfo_t *info,
234                                             struct vki_ucontext * );
235
236static const Char *signame(Int sigNo);
237
238/* Maximum usable signal. */
239Int VG_(max_signal) = _VKI_NSIG;
240
241#define N_QUEUED_SIGNALS	8
242
243typedef struct SigQueue {
244   Int	next;
245   vki_siginfo_t sigs[N_QUEUED_SIGNALS];
246} SigQueue;
247
248/* ------ Macros for pulling stuff out of ucontexts ------ */
249
250/* Q: what does VG_UCONTEXT_SYSCALL_SYSRES do?  A: let's suppose the
251   machine context (uc) reflects the situation that a syscall had just
252   completed, quite literally -- that is, that the program counter was
253   now at the instruction following the syscall.  (or we're slightly
254   downstream, but we're sure no relevant register has yet changed
255   value.)  Then VG_UCONTEXT_SYSCALL_SYSRES returns a SysRes reflecting
256   the result of the syscall; it does this by fishing relevant bits of
257   the machine state out of the uc.  Of course if the program counter
258   was somewhere else entirely then the result is likely to be
259   meaningless, so the caller of VG_UCONTEXT_SYSCALL_SYSRES has to be
260   very careful to pay attention to the results only when it is sure
261   that the said constraint on the program counter is indeed valid. */
262
263#if defined(VGP_x86_linux)
264#  define VG_UCONTEXT_INSTR_PTR(uc)       ((uc)->uc_mcontext.eip)
265#  define VG_UCONTEXT_STACK_PTR(uc)       ((uc)->uc_mcontext.esp)
266#  define VG_UCONTEXT_SYSCALL_SYSRES(uc)                        \
267      /* Convert the value in uc_mcontext.eax into a SysRes. */ \
268      VG_(mk_SysRes_x86_linux)( (uc)->uc_mcontext.eax )
269#  define VG_UCONTEXT_TO_UnwindStartRegs(srP, uc)        \
270      { (srP)->r_pc = (ULong)((uc)->uc_mcontext.eip);    \
271        (srP)->r_sp = (ULong)((uc)->uc_mcontext.esp);    \
272        (srP)->misc.X86.r_ebp = (uc)->uc_mcontext.ebp;   \
273      }
274
275#elif defined(VGP_amd64_linux)
276#  define VG_UCONTEXT_INSTR_PTR(uc)       ((uc)->uc_mcontext.rip)
277#  define VG_UCONTEXT_STACK_PTR(uc)       ((uc)->uc_mcontext.rsp)
278#  define VG_UCONTEXT_SYSCALL_SYSRES(uc)                        \
279      /* Convert the value in uc_mcontext.rax into a SysRes. */ \
280      VG_(mk_SysRes_amd64_linux)( (uc)->uc_mcontext.rax )
281#  define VG_UCONTEXT_TO_UnwindStartRegs(srP, uc)        \
282      { (srP)->r_pc = (uc)->uc_mcontext.rip;             \
283        (srP)->r_sp = (uc)->uc_mcontext.rsp;             \
284        (srP)->misc.AMD64.r_rbp = (uc)->uc_mcontext.rbp; \
285      }
286
287#elif defined(VGP_ppc32_linux)
288/* Comments from Paul Mackerras 25 Nov 05:
289
290   > I'm tracking down a problem where V's signal handling doesn't
291   > work properly on a ppc440gx running 2.4.20.  The problem is that
292   > the ucontext being presented to V's sighandler seems completely
293   > bogus.
294
295   > V's kernel headers and hence ucontext layout are derived from
296   > 2.6.9.  I compared include/asm-ppc/ucontext.h from 2.4.20 and
297   > 2.6.13.
298
299   > Can I just check my interpretation: the 2.4.20 one contains the
300   > uc_mcontext field in line, whereas the 2.6.13 one has a pointer
301   > to said struct?  And so if V is using the 2.6.13 struct then a
302   > 2.4.20 one will make no sense to it.
303
304   Not quite... what is inline in the 2.4.20 version is a
305   sigcontext_struct, not an mcontext.  The sigcontext looks like
306   this:
307
308     struct sigcontext_struct {
309        unsigned long   _unused[4];
310        int             signal;
311        unsigned long   handler;
312        unsigned long   oldmask;
313        struct pt_regs  *regs;
314     };
315
316   The regs pointer of that struct ends up at the same offset as the
317   uc_regs of the 2.6 struct ucontext, and a struct pt_regs is the
318   same as the mc_gregs field of the mcontext.  In fact the integer
319   regs are followed in memory by the floating point regs on 2.4.20.
320
321   Thus if you are using the 2.6 definitions, it should work on 2.4.20
322   provided that you go via uc->uc_regs rather than looking in
323   uc->uc_mcontext directly.
324
325   There is another subtlety: 2.4.20 doesn't save the vector regs when
326   delivering a signal, and 2.6.x only saves the vector regs if the
327   process has ever used an altivec instructions.  If 2.6.x does save
328   the vector regs, it sets the MSR_VEC bit in
329   uc->uc_regs->mc_gregs[PT_MSR], otherwise it clears it.  That bit
330   will always be clear under 2.4.20.  So you can use that bit to tell
331   whether uc->uc_regs->mc_vregs is valid. */
332#  define VG_UCONTEXT_INSTR_PTR(uc)  ((uc)->uc_regs->mc_gregs[VKI_PT_NIP])
333#  define VG_UCONTEXT_STACK_PTR(uc)  ((uc)->uc_regs->mc_gregs[VKI_PT_R1])
334#  define VG_UCONTEXT_SYSCALL_SYSRES(uc)                            \
335      /* Convert the values in uc_mcontext r3,cr into a SysRes. */  \
336      VG_(mk_SysRes_ppc32_linux)(                                   \
337         (uc)->uc_regs->mc_gregs[VKI_PT_R3],                        \
338         (((uc)->uc_regs->mc_gregs[VKI_PT_CCR] >> 28) & 1)          \
339      )
340#  define VG_UCONTEXT_TO_UnwindStartRegs(srP, uc)                     \
341      { (srP)->r_pc = (ULong)((uc)->uc_regs->mc_gregs[VKI_PT_NIP]);   \
342        (srP)->r_sp = (ULong)((uc)->uc_regs->mc_gregs[VKI_PT_R1]);    \
343        (srP)->misc.PPC32.r_lr = (uc)->uc_regs->mc_gregs[VKI_PT_LNK]; \
344      }
345
346#elif defined(VGP_ppc64_linux)
347#  define VG_UCONTEXT_INSTR_PTR(uc)  ((uc)->uc_mcontext.gp_regs[VKI_PT_NIP])
348#  define VG_UCONTEXT_STACK_PTR(uc)  ((uc)->uc_mcontext.gp_regs[VKI_PT_R1])
349   /* Dubious hack: if there is an error, only consider the lowest 8
350      bits of r3.  memcheck/tests/post-syscall shows a case where an
351      interrupted syscall should have produced a ucontext with 0x4
352      (VKI_EINTR) in r3 but is in fact producing 0x204. */
353   /* Awaiting clarification from PaulM.  Evidently 0x204 is
354      ERESTART_RESTARTBLOCK, which shouldn't have made it into user
355      space. */
356   static inline SysRes VG_UCONTEXT_SYSCALL_SYSRES( struct vki_ucontext* uc )
357   {
358      ULong err = (uc->uc_mcontext.gp_regs[VKI_PT_CCR] >> 28) & 1;
359      ULong r3  = uc->uc_mcontext.gp_regs[VKI_PT_R3];
360      if (err) r3 &= 0xFF;
361      return VG_(mk_SysRes_ppc64_linux)( r3, err );
362   }
363#  define VG_UCONTEXT_TO_UnwindStartRegs(srP, uc)                       \
364      { (srP)->r_pc = (uc)->uc_mcontext.gp_regs[VKI_PT_NIP];            \
365        (srP)->r_sp = (uc)->uc_mcontext.gp_regs[VKI_PT_R1];             \
366        (srP)->misc.PPC64.r_lr = (uc)->uc_mcontext.gp_regs[VKI_PT_LNK]; \
367      }
368
369#elif defined(VGP_arm_linux)
370#  define VG_UCONTEXT_INSTR_PTR(uc)       ((uc)->uc_mcontext.arm_pc)
371#  define VG_UCONTEXT_STACK_PTR(uc)       ((uc)->uc_mcontext.arm_sp)
372#  define VG_UCONTEXT_SYSCALL_SYSRES(uc)                        \
373      /* Convert the value in uc_mcontext.rax into a SysRes. */ \
374      VG_(mk_SysRes_arm_linux)( (uc)->uc_mcontext.arm_r0 )
375#  define VG_UCONTEXT_TO_UnwindStartRegs(srP, uc)       \
376      { (srP)->r_pc = (uc)->uc_mcontext.arm_pc;         \
377        (srP)->r_sp = (uc)->uc_mcontext.arm_sp;         \
378        (srP)->misc.ARM.r14 = (uc)->uc_mcontext.arm_lr; \
379        (srP)->misc.ARM.r12 = (uc)->uc_mcontext.arm_ip; \
380        (srP)->misc.ARM.r11 = (uc)->uc_mcontext.arm_fp; \
381        (srP)->misc.ARM.r7  = (uc)->uc_mcontext.arm_r7; \
382      }
383
384#elif defined(VGP_ppc32_aix5)
385
386   /* --- !!! --- EXTERNAL HEADERS start --- !!! --- */
387#  include <ucontext.h>
388   /* --- !!! --- EXTERNAL HEADERS end --- !!! --- */
389   static inline Addr VG_UCONTEXT_INSTR_PTR( void* ucV ) {
390      ucontext_t* uc = (ucontext_t*)ucV;
391      struct __jmpbuf* mc = &(uc->uc_mcontext);
392      struct mstsave* jc = &mc->jmp_context;
393      return jc->iar;
394   }
395   static inline Addr VG_UCONTEXT_STACK_PTR( void* ucV ) {
396      ucontext_t* uc = (ucontext_t*)ucV;
397      struct __jmpbuf* mc = &(uc->uc_mcontext);
398      struct mstsave* jc = &mc->jmp_context;
399      return jc->gpr[1];
400   }
401   static inline SysRes VG_UCONTEXT_SYSCALL_SYSRES( void* ucV ) {
402      ucontext_t* uc = (ucontext_t*)ucV;
403      struct __jmpbuf* mc = &(uc->uc_mcontext);
404      struct mstsave* jc = &mc->jmp_context;
405      return VG_(mk_SysRes_ppc32_aix5)( jc->gpr[3], jc->gpr[4] );
406   }
407   static inline Addr VG_UCONTEXT_LINK_REG( void* ucV ) {
408      ucontext_t* uc = (ucontext_t*)ucV;
409      struct __jmpbuf* mc = &(uc->uc_mcontext);
410      struct mstsave* jc = &mc->jmp_context;
411      return jc->lr;
412   }
413   static inline Addr VG_UCONTEXT_FRAME_PTR( void* ucV ) {
414      return VG_UCONTEXT_STACK_PTR(ucV);
415   }
416
417#elif defined(VGP_ppc64_aix5)
418
419   /* --- !!! --- EXTERNAL HEADERS start --- !!! --- */
420#  include <ucontext.h>
421   /* --- !!! --- EXTERNAL HEADERS end --- !!! --- */
422   static inline Addr VG_UCONTEXT_INSTR_PTR( void* ucV ) {
423      ucontext_t* uc = (ucontext_t*)ucV;
424      struct __jmpbuf* mc = &(uc->uc_mcontext);
425      struct __context64* jc = &mc->jmp_context;
426      return jc->iar;
427   }
428   static inline Addr VG_UCONTEXT_STACK_PTR( void* ucV ) {
429      ucontext_t* uc = (ucontext_t*)ucV;
430      struct __jmpbuf* mc = &(uc->uc_mcontext);
431      struct __context64* jc = &mc->jmp_context;
432      return jc->gpr[1];
433   }
434   static inline SysRes VG_UCONTEXT_SYSCALL_SYSRES( void* ucV ) {
435      ucontext_t* uc = (ucontext_t*)ucV;
436      struct __jmpbuf* mc = &(uc->uc_mcontext);
437      struct __context64* jc = &mc->jmp_context;
438      return VG_(mk_SysRes_ppc32_aix5)( jc->gpr[3], jc->gpr[4] );
439   }
440   static inline Addr VG_UCONTEXT_LINK_REG( void* ucV ) {
441      ucontext_t* uc = (ucontext_t*)ucV;
442      struct __jmpbuf* mc = &(uc->uc_mcontext);
443      struct __context64* jc = &mc->jmp_context;
444      return jc->lr;
445   }
446   static inline Addr VG_UCONTEXT_FRAME_PTR( void* ucV ) {
447      return VG_UCONTEXT_STACK_PTR(ucV);
448   }
449
450#elif defined(VGP_x86_darwin)
451
452   static inline Addr VG_UCONTEXT_INSTR_PTR( void* ucV ) {
453      ucontext_t* uc = (ucontext_t*)ucV;
454      struct __darwin_mcontext32* mc = uc->uc_mcontext;
455      struct __darwin_i386_thread_state* ss = &mc->__ss;
456      return ss->__eip;
457   }
458   static inline Addr VG_UCONTEXT_STACK_PTR( void* ucV ) {
459      ucontext_t* uc = (ucontext_t*)ucV;
460      struct __darwin_mcontext32* mc = uc->uc_mcontext;
461      struct __darwin_i386_thread_state* ss = &mc->__ss;
462      return ss->__esp;
463   }
464   static inline SysRes VG_UCONTEXT_SYSCALL_SYSRES( void* ucV,
465                                                    UWord scclass ) {
466      /* this is complicated by the problem that there are 3 different
467         kinds of syscalls, each with its own return convention.
468         NB: scclass is a host word, hence UWord is good for both
469         amd64-darwin and x86-darwin */
470      ucontext_t* uc = (ucontext_t*)ucV;
471      struct __darwin_mcontext32* mc = uc->uc_mcontext;
472      struct __darwin_i386_thread_state* ss = &mc->__ss;
473      /* duplicates logic in m_syswrap.getSyscallStatusFromGuestState */
474      UInt carry = 1 & ss->__eflags;
475      UInt err = 0;
476      UInt wLO = 0;
477      UInt wHI = 0;
478      switch (scclass) {
479         case VG_DARWIN_SYSCALL_CLASS_UNIX:
480            err = carry;
481            wLO = ss->__eax;
482            wHI = ss->__edx;
483            break;
484         case VG_DARWIN_SYSCALL_CLASS_MACH:
485            wLO = ss->__eax;
486            break;
487         case VG_DARWIN_SYSCALL_CLASS_MDEP:
488            wLO = ss->__eax;
489            break;
490         default:
491            vg_assert(0);
492            break;
493      }
494      return VG_(mk_SysRes_x86_darwin)( scclass, err ? True : False,
495                                        wHI, wLO );
496   }
497   static inline
498   void VG_UCONTEXT_TO_UnwindStartRegs( UnwindStartRegs* srP,
499                                        void* ucV ) {
500      ucontext_t* uc = (ucontext_t*)(ucV);
501      struct __darwin_mcontext32* mc = uc->uc_mcontext;
502      struct __darwin_i386_thread_state* ss = &mc->__ss;
503      srP->r_pc = (ULong)(ss->__eip);
504      srP->r_sp = (ULong)(ss->__esp);
505      srP->misc.X86.r_ebp = (UInt)(ss->__ebp);
506   }
507
508#elif defined(VGP_amd64_darwin)
509
510   static inline Addr VG_UCONTEXT_INSTR_PTR( void* ucV ) {
511      I_die_here;
512   }
513   static inline Addr VG_UCONTEXT_STACK_PTR( void* ucV ) {
514      I_die_here;
515   }
516   static inline SysRes VG_UCONTEXT_SYSCALL_SYSRES( void* ucV,
517                                                    UWord scclass ) {
518      I_die_here;
519   }
520   static inline
521   void VG_UCONTEXT_TO_UnwindStartRegs( UnwindStartRegs* srP,
522                                        void* ucV ) {
523      I_die_here;
524   }
525
526#else
527#  error Unknown platform
528#endif
529
530
531/* ------ Macros for pulling stuff out of siginfos ------ */
532
533/* These macros allow use of uniform names when working with
534   both the Linux and AIX vki definitions. */
535#if defined(VGO_linux)
536#  define VKI_SIGINFO_si_addr  _sifields._sigfault._addr
537#  define VKI_SIGINFO_si_pid   _sifields._kill._pid
538#elif defined(VGO_aix5)
539#  define VKI_SIGINFO_si_addr  si_addr
540#  define VKI_SIGINFO_si_pid   si_pid
541#elif defined(VGO_darwin)
542#  define VKI_SIGINFO_si_addr  si_addr
543#  define VKI_SIGINFO_si_pid   si_pid
544#else
545#  error Unknown OS
546#endif
547
548
549/* ---------------------------------------------------------------------
550   HIGH LEVEL STUFF TO DO WITH SIGNALS: POLICY (MOSTLY)
551   ------------------------------------------------------------------ */
552
553/* ---------------------------------------------------------------------
554   Signal state for this process.
555   ------------------------------------------------------------------ */
556
557
558/* Base-ment of these arrays[_VKI_NSIG].
559
560   Valid signal numbers are 1 .. _VKI_NSIG inclusive.
561   Rather than subtracting 1 for indexing these arrays, which
562   is tedious and error-prone, they are simply dimensioned 1 larger,
563   and entry [0] is not used.
564 */
565
566
567/* -----------------------------------------------------
568   Static client signal state (SCSS).  This is the state
569   that the client thinks it has the kernel in.
570   SCSS records verbatim the client's settings.  These
571   are mashed around only when SKSS is calculated from it.
572   -------------------------------------------------- */
573
574typedef
575   struct {
576      void* scss_handler;  /* VKI_SIG_DFL or VKI_SIG_IGN or ptr to
577                              client's handler */
578      UInt  scss_flags;
579      vki_sigset_t scss_mask;
580      void* scss_restorer; /* where sigreturn goes */
581      void* scss_sa_tramp; /* sa_tramp setting, Darwin only */
582      /* re _restorer and _sa_tramp, we merely record the values
583         supplied when the client does 'sigaction' and give them back
584         when requested.  Otherwise they are simply ignored. */
585   }
586   SCSS_Per_Signal;
587
588typedef
589   struct {
590      /* per-signal info */
591      SCSS_Per_Signal scss_per_sig[1+_VKI_NSIG];
592
593      /* Additional elements to SCSS not stored here:
594         - for each thread, the thread's blocking mask
595         - for each thread in WaitSIG, the set of waited-on sigs
596      */
597      }
598      SCSS;
599
600static SCSS scss;
601
602
603/* -----------------------------------------------------
604   Static kernel signal state (SKSS).  This is the state
605   that we have the kernel in.  It is computed from SCSS.
606   -------------------------------------------------- */
607
608/* Let's do:
609     sigprocmask assigns to all thread masks
610     so that at least everything is always consistent
611   Flags:
612     SA_SIGINFO -- we always set it, and honour it for the client
613     SA_NOCLDSTOP -- passed to kernel
614     SA_ONESHOT or SA_RESETHAND -- pass through
615     SA_RESTART -- we observe this but set our handlers to always restart
616     SA_NOMASK or SA_NODEFER -- we observe this, but our handlers block everything
617     SA_ONSTACK -- pass through
618     SA_NOCLDWAIT -- pass through
619*/
620
621
622typedef
623   struct {
624      void* skss_handler;  /* VKI_SIG_DFL or VKI_SIG_IGN
625                              or ptr to our handler */
626      UInt skss_flags;
627      /* There is no skss_mask, since we know that we will always ask
628         for all signals to be blocked in our sighandlers. */
629      /* Also there is no skss_restorer. */
630   }
631   SKSS_Per_Signal;
632
633typedef
634   struct {
635      SKSS_Per_Signal skss_per_sig[1+_VKI_NSIG];
636   }
637   SKSS;
638
639static SKSS skss;
640
641static Bool is_sig_ign(Int sigNo)
642{
643   vg_assert(sigNo >= 1 && sigNo <= _VKI_NSIG);
644
645   return scss.scss_per_sig[sigNo].scss_handler == VKI_SIG_IGN;
646}
647
648/* ---------------------------------------------------------------------
649   Compute the SKSS required by the current SCSS.
650   ------------------------------------------------------------------ */
651
652static
653void pp_SKSS ( void )
654{
655   Int sig;
656   VG_(printf)("\n\nSKSS:\n");
657   for (sig = 1; sig <= _VKI_NSIG; sig++) {
658      VG_(printf)("sig %d:  handler %p,  flags 0x%x\n", sig,
659                  skss.skss_per_sig[sig].skss_handler,
660                  skss.skss_per_sig[sig].skss_flags );
661
662   }
663}
664
665/* This is the core, clever bit.  Computation is as follows:
666
667   For each signal
668      handler = if client has a handler, then our handler
669                else if client is DFL, then our handler as well
670                else (client must be IGN)
671			then hander is IGN
672*/
673static
674void calculate_SKSS_from_SCSS ( SKSS* dst )
675{
676   Int   sig;
677   UInt  scss_flags;
678   UInt  skss_flags;
679
680   for (sig = 1; sig <= _VKI_NSIG; sig++) {
681      void *skss_handler;
682      void *scss_handler;
683
684      scss_handler = scss.scss_per_sig[sig].scss_handler;
685      scss_flags   = scss.scss_per_sig[sig].scss_flags;
686
687      switch(sig) {
688      case VKI_SIGSEGV:
689      case VKI_SIGBUS:
690      case VKI_SIGFPE:
691      case VKI_SIGILL:
692      case VKI_SIGTRAP:
693	 /* For these, we always want to catch them and report, even
694	    if the client code doesn't. */
695	 skss_handler = sync_signalhandler;
696	 break;
697
698      case VKI_SIGCONT:
699	 /* Let the kernel handle SIGCONT unless the client is actually
700	    catching it. */
701      case VKI_SIGCHLD:
702      case VKI_SIGWINCH:
703      case VKI_SIGURG:
704         /* For signals which are have a default action of Ignore,
705            only set a handler if the client has set a signal handler.
706            Otherwise the kernel will interrupt a syscall which
707            wouldn't have otherwise been interrupted. */
708	 if (scss.scss_per_sig[sig].scss_handler == VKI_SIG_DFL)
709	    skss_handler = VKI_SIG_DFL;
710	 else if (scss.scss_per_sig[sig].scss_handler == VKI_SIG_IGN)
711	    skss_handler = VKI_SIG_IGN;
712	 else
713	    skss_handler = async_signalhandler;
714	 break;
715
716      default:
717         // VKI_SIGVG* are runtime variables, so we can't make them
718         // cases in the switch, so we handle them in the 'default' case.
719	 if (sig == VG_SIGVGKILL)
720	    skss_handler = sigvgkill_handler;
721	 else {
722	    if (scss_handler == VKI_SIG_IGN)
723	       skss_handler = VKI_SIG_IGN;
724	    else
725	       skss_handler = async_signalhandler;
726	 }
727	 break;
728      }
729
730      /* Flags */
731
732      skss_flags = 0;
733
734      /* SA_NOCLDSTOP, SA_NOCLDWAIT: pass to kernel */
735      skss_flags |= scss_flags & (VKI_SA_NOCLDSTOP | VKI_SA_NOCLDWAIT);
736
737      /* SA_ONESHOT: ignore client setting */
738
739      /* SA_RESTART: ignore client setting and always set it for us.
740	 Though we never rely on the kernel to restart a
741	 syscall, we observe whether it wanted to restart the syscall
742	 or not, which is needed by
743         VG_(fixup_guest_state_after_syscall_interrupted) */
744      skss_flags |= VKI_SA_RESTART;
745
746      /* SA_NOMASK: ignore it */
747
748      /* SA_ONSTACK: client setting is irrelevant here */
749      /* We don't set a signal stack, so ignore */
750
751      /* always ask for SA_SIGINFO */
752      skss_flags |= VKI_SA_SIGINFO;
753
754      /* use our own restorer */
755      skss_flags |= VKI_SA_RESTORER;
756
757      /* Create SKSS entry for this signal. */
758      if (sig != VKI_SIGKILL && sig != VKI_SIGSTOP)
759         dst->skss_per_sig[sig].skss_handler = skss_handler;
760      else
761         dst->skss_per_sig[sig].skss_handler = VKI_SIG_DFL;
762
763      dst->skss_per_sig[sig].skss_flags   = skss_flags;
764   }
765
766   /* Sanity checks. */
767   vg_assert(dst->skss_per_sig[VKI_SIGKILL].skss_handler == VKI_SIG_DFL);
768   vg_assert(dst->skss_per_sig[VKI_SIGSTOP].skss_handler == VKI_SIG_DFL);
769
770   if (0)
771      pp_SKSS();
772}
773
774
775/* ---------------------------------------------------------------------
776   After a possible SCSS change, update SKSS and the kernel itself.
777   ------------------------------------------------------------------ */
778
779// We need two levels of macro-expansion here to convert __NR_rt_sigreturn
780// to a number before converting it to a string... sigh.
781extern void my_sigreturn(void);
782
783#if defined(VGP_x86_linux)
784#  define _MY_SIGRETURN(name) \
785   ".text\n" \
786   "my_sigreturn:\n" \
787   "	movl	$" #name ", %eax\n" \
788   "	int	$0x80\n" \
789   ".previous\n"
790
791#elif defined(VGP_amd64_linux)
792#  define _MY_SIGRETURN(name) \
793   ".text\n" \
794   "my_sigreturn:\n" \
795   "	movq	$" #name ", %rax\n" \
796   "	syscall\n" \
797   ".previous\n"
798
799#elif defined(VGP_ppc32_linux)
800#  define _MY_SIGRETURN(name) \
801   ".text\n" \
802   "my_sigreturn:\n" \
803   "	li	0, " #name "\n" \
804   "	sc\n" \
805   ".previous\n"
806
807#elif defined(VGP_ppc64_linux)
808#  define _MY_SIGRETURN(name) \
809   ".align   2\n" \
810   ".globl   my_sigreturn\n" \
811   ".section \".opd\",\"aw\"\n" \
812   ".align   3\n" \
813   "my_sigreturn:\n" \
814   ".quad    .my_sigreturn,.TOC.@tocbase,0\n" \
815   ".previous\n" \
816   ".type    .my_sigreturn,@function\n" \
817   ".globl   .my_sigreturn\n" \
818   ".my_sigreturn:\n" \
819   "	li	0, " #name "\n" \
820   "	sc\n"
821
822#elif defined(VGP_arm_linux)
823#  define _MY_SIGRETURN(name) \
824   ".text\n" \
825   "my_sigreturn:\n\t" \
826   "    mov  r7, #" #name "\n\t" \
827   "    svc  0x00000000\n" \
828   ".previous\n"
829
830#elif defined(VGP_ppc32_aix5)
831#  define _MY_SIGRETURN(name) \
832   ".globl my_sigreturn\n" \
833   "my_sigreturn:\n" \
834   ".long 0\n"
835#elif defined(VGP_ppc64_aix5)
836#  define _MY_SIGRETURN(name) \
837   ".globl my_sigreturn\n" \
838   "my_sigreturn:\n" \
839   ".long 0\n"
840
841#elif defined(VGP_x86_darwin)
842#  define _MY_SIGRETURN(name) \
843   ".text\n" \
844   "my_sigreturn:\n" \
845   "movl $" VG_STRINGIFY(__NR_DARWIN_FAKE_SIGRETURN) ",%eax\n" \
846   "int $0x80"
847
848#elif defined(VGP_amd64_darwin)
849   // DDD: todo
850#  define _MY_SIGRETURN(name) \
851   ".text\n" \
852   "my_sigreturn:\n" \
853   "ud2\n"
854
855#else
856#  error Unknown platform
857#endif
858
859#define MY_SIGRETURN(name)  _MY_SIGRETURN(name)
860asm(
861   MY_SIGRETURN(__NR_rt_sigreturn)
862);
863
864
865static void handle_SCSS_change ( Bool force_update )
866{
867   Int  res, sig;
868   SKSS skss_old;
869   vki_sigaction_toK_t   ksa;
870   vki_sigaction_fromK_t ksa_old;
871
872   /* Remember old SKSS and calculate new one. */
873   skss_old = skss;
874   calculate_SKSS_from_SCSS ( &skss );
875
876   /* Compare the new SKSS entries vs the old ones, and update kernel
877      where they differ. */
878   for (sig = 1; sig <= VG_(max_signal); sig++) {
879
880      /* Trying to do anything with SIGKILL is pointless; just ignore
881         it. */
882      if (sig == VKI_SIGKILL || sig == VKI_SIGSTOP)
883         continue;
884
885      if (!force_update) {
886         if ((skss_old.skss_per_sig[sig].skss_handler
887              == skss.skss_per_sig[sig].skss_handler)
888             && (skss_old.skss_per_sig[sig].skss_flags
889                 == skss.skss_per_sig[sig].skss_flags))
890            /* no difference */
891            continue;
892      }
893
894      ksa.ksa_handler = skss.skss_per_sig[sig].skss_handler;
895      ksa.sa_flags    = skss.skss_per_sig[sig].skss_flags;
896#     if !defined(VGP_ppc32_linux) && \
897         !defined(VGP_ppc32_aix5) && !defined(VGP_ppc64_aix5) && \
898         !defined(VGP_x86_darwin) && !defined(VGP_amd64_darwin)
899      ksa.sa_restorer = my_sigreturn;
900#     endif
901      /* Re above ifdef (also the assertion below), PaulM says:
902         The sa_restorer field is not used at all on ppc.  Glibc
903         converts the sigaction you give it into a kernel sigaction,
904         but it doesn't put anything in the sa_restorer field.
905      */
906
907      /* block all signals in handler */
908      VG_(sigfillset)( &ksa.sa_mask );
909      VG_(sigdelset)( &ksa.sa_mask, VKI_SIGKILL );
910      VG_(sigdelset)( &ksa.sa_mask, VKI_SIGSTOP );
911
912      if (VG_(clo_trace_signals) && VG_(clo_verbosity) > 2)
913         VG_(dmsg)("setting ksig %d to: hdlr %p, flags 0x%lx, "
914                   "mask(msb..lsb) 0x%llx 0x%llx\n",
915                   sig, ksa.ksa_handler,
916                   (UWord)ksa.sa_flags,
917                   _VKI_NSIG_WORDS > 1 ? (ULong)ksa.sa_mask.sig[1] : 0,
918                   (ULong)ksa.sa_mask.sig[0]);
919
920      res = VG_(sigaction)( sig, &ksa, &ksa_old );
921      vg_assert(res == 0);
922
923      /* Since we got the old sigaction more or less for free, might
924         as well extract the maximum sanity-check value from it. */
925      if (!force_update) {
926         vg_assert(ksa_old.ksa_handler
927                   == skss_old.skss_per_sig[sig].skss_handler);
928         vg_assert(ksa_old.sa_flags
929                   == skss_old.skss_per_sig[sig].skss_flags);
930#        if !defined(VGP_ppc32_linux) && \
931            !defined(VGP_ppc32_aix5) && !defined(VGP_ppc64_aix5) && \
932            !defined(VGP_x86_darwin) && !defined(VGP_amd64_darwin)
933         vg_assert(ksa_old.sa_restorer
934                   == my_sigreturn);
935#        endif
936         VG_(sigaddset)( &ksa_old.sa_mask, VKI_SIGKILL );
937         VG_(sigaddset)( &ksa_old.sa_mask, VKI_SIGSTOP );
938         vg_assert(VG_(isfullsigset)( &ksa_old.sa_mask ));
939      }
940   }
941}
942
943
944/* ---------------------------------------------------------------------
945   Update/query SCSS in accordance with client requests.
946   ------------------------------------------------------------------ */
947
948/* Logic for this alt-stack stuff copied directly from do_sigaltstack
949   in kernel/signal.[ch] */
950
951/* True if we are on the alternate signal stack.  */
952static Bool on_sig_stack ( ThreadId tid, Addr m_SP )
953{
954   ThreadState *tst = VG_(get_ThreadState)(tid);
955
956   return (m_SP - (Addr)tst->altstack.ss_sp < (Addr)tst->altstack.ss_size);
957}
958
959static Int sas_ss_flags ( ThreadId tid, Addr m_SP )
960{
961   ThreadState *tst = VG_(get_ThreadState)(tid);
962
963   return (tst->altstack.ss_size == 0
964              ? VKI_SS_DISABLE
965              : on_sig_stack(tid, m_SP) ? VKI_SS_ONSTACK : 0);
966}
967
968
969SysRes VG_(do_sys_sigaltstack) ( ThreadId tid, vki_stack_t* ss, vki_stack_t* oss )
970{
971   Addr m_SP;
972
973   vg_assert(VG_(is_valid_tid)(tid));
974   m_SP  = VG_(get_SP)(tid);
975
976   if (VG_(clo_trace_signals))
977      VG_(dmsg)("sys_sigaltstack: tid %d, "
978                "ss %p{%p,sz=%llu,flags=0x%llx}, oss %p (current SP %p)\n",
979                tid, (void*)ss,
980                ss ? ss->ss_sp : 0,
981                (ULong)(ss ? ss->ss_size : 0),
982                (ULong)(ss ? ss->ss_flags : 0),
983                (void*)oss, (void*)m_SP);
984
985   if (oss != NULL) {
986      oss->ss_sp    = VG_(threads)[tid].altstack.ss_sp;
987      oss->ss_size  = VG_(threads)[tid].altstack.ss_size;
988      oss->ss_flags = VG_(threads)[tid].altstack.ss_flags
989                      | sas_ss_flags(tid, m_SP);
990   }
991
992   if (ss != NULL) {
993      if (on_sig_stack(tid, VG_(get_SP)(tid))) {
994         return VG_(mk_SysRes_Error)( VKI_EPERM );
995      }
996      if (ss->ss_flags != VKI_SS_DISABLE
997          && ss->ss_flags != VKI_SS_ONSTACK
998          && ss->ss_flags != 0) {
999         return VG_(mk_SysRes_Error)( VKI_EINVAL );
1000      }
1001      if (ss->ss_flags == VKI_SS_DISABLE) {
1002         VG_(threads)[tid].altstack.ss_flags = VKI_SS_DISABLE;
1003      } else {
1004         if (ss->ss_size < VKI_MINSIGSTKSZ) {
1005            return VG_(mk_SysRes_Error)( VKI_ENOMEM );
1006         }
1007
1008	 VG_(threads)[tid].altstack.ss_sp    = ss->ss_sp;
1009	 VG_(threads)[tid].altstack.ss_size  = ss->ss_size;
1010	 VG_(threads)[tid].altstack.ss_flags = 0;
1011      }
1012   }
1013   return VG_(mk_SysRes_Success)( 0 );
1014}
1015
1016
1017SysRes VG_(do_sys_sigaction) ( Int signo,
1018                               const vki_sigaction_toK_t* new_act,
1019                               vki_sigaction_fromK_t* old_act )
1020{
1021   if (VG_(clo_trace_signals))
1022      VG_(dmsg)("sys_sigaction: sigNo %d, "
1023                "new %#lx, old %#lx, new flags 0x%llx\n",
1024                signo, (UWord)new_act, (UWord)old_act,
1025                (ULong)(new_act ? new_act->sa_flags : 0));
1026
1027   /* Rule out various error conditions.  The aim is to ensure that if
1028      when the call is passed to the kernel it will definitely
1029      succeed. */
1030
1031   /* Reject out-of-range signal numbers. */
1032   if (signo < 1 || signo > VG_(max_signal)) goto bad_signo;
1033
1034   /* don't let them use our signals */
1035   if ( (signo > VG_SIGVGRTUSERMAX)
1036	&& new_act
1037	&& !(new_act->ksa_handler == VKI_SIG_DFL
1038             || new_act->ksa_handler == VKI_SIG_IGN) )
1039      goto bad_signo_reserved;
1040
1041   /* Reject attempts to set a handler (or set ignore) for SIGKILL. */
1042   if ( (signo == VKI_SIGKILL || signo == VKI_SIGSTOP)
1043       && new_act
1044       && new_act->ksa_handler != VKI_SIG_DFL)
1045      goto bad_sigkill_or_sigstop;
1046
1047   /* If the client supplied non-NULL old_act, copy the relevant SCSS
1048      entry into it. */
1049   if (old_act) {
1050      old_act->ksa_handler = scss.scss_per_sig[signo].scss_handler;
1051      old_act->sa_flags    = scss.scss_per_sig[signo].scss_flags;
1052      old_act->sa_mask     = scss.scss_per_sig[signo].scss_mask;
1053#     if !defined(VGP_ppc32_aix5) && !defined(VGP_ppc64_aix5) && \
1054         !defined(VGP_x86_darwin) && !defined(VGP_amd64_darwin)
1055      old_act->sa_restorer = scss.scss_per_sig[signo].scss_restorer;
1056#     endif
1057   }
1058
1059   /* And now copy new SCSS entry from new_act. */
1060   if (new_act) {
1061      scss.scss_per_sig[signo].scss_handler  = new_act->ksa_handler;
1062      scss.scss_per_sig[signo].scss_flags    = new_act->sa_flags;
1063      scss.scss_per_sig[signo].scss_mask     = new_act->sa_mask;
1064
1065      scss.scss_per_sig[signo].scss_restorer = NULL;
1066#     if !defined(VGP_ppc32_aix5) && !defined(VGP_ppc64_aix5) && \
1067         !defined(VGP_x86_darwin) && !defined(VGP_amd64_darwin)
1068      scss.scss_per_sig[signo].scss_restorer = new_act->sa_restorer;
1069#     endif
1070
1071      scss.scss_per_sig[signo].scss_sa_tramp = NULL;
1072#     if defined(VGP_x86_darwin) || defined(VGP_amd64_darwin)
1073      scss.scss_per_sig[signo].scss_sa_tramp = new_act->sa_tramp;
1074#     endif
1075
1076      VG_(sigdelset)(&scss.scss_per_sig[signo].scss_mask, VKI_SIGKILL);
1077      VG_(sigdelset)(&scss.scss_per_sig[signo].scss_mask, VKI_SIGSTOP);
1078   }
1079
1080   /* All happy bunnies ... */
1081   if (new_act) {
1082      handle_SCSS_change( False /* lazy update */ );
1083   }
1084   return VG_(mk_SysRes_Success)( 0 );
1085
1086  bad_signo:
1087   if (VG_(showing_core_errors)() && !VG_(clo_xml)) {
1088      VG_(umsg)("Warning: bad signal number %d in sigaction()\n", signo);
1089   }
1090   return VG_(mk_SysRes_Error)( VKI_EINVAL );
1091
1092  bad_signo_reserved:
1093   if (VG_(showing_core_errors)() && !VG_(clo_xml)) {
1094      VG_(umsg)("Warning: ignored attempt to set %s handler in sigaction();\n",
1095                signame(signo));
1096      VG_(umsg)("         the %s signal is used internally by Valgrind\n",
1097                signame(signo));
1098   }
1099   return VG_(mk_SysRes_Error)( VKI_EINVAL );
1100
1101  bad_sigkill_or_sigstop:
1102   if (VG_(showing_core_errors)() && !VG_(clo_xml)) {
1103      VG_(umsg)("Warning: ignored attempt to set %s handler in sigaction();\n",
1104                signame(signo));
1105      VG_(umsg)("         the %s signal is uncatchable\n",
1106                signame(signo));
1107   }
1108   return VG_(mk_SysRes_Error)( VKI_EINVAL );
1109}
1110
1111
1112static
1113void do_sigprocmask_bitops ( Int vki_how,
1114			     vki_sigset_t* orig_set,
1115			     vki_sigset_t* modifier )
1116{
1117   switch (vki_how) {
1118      case VKI_SIG_BLOCK:
1119         VG_(sigaddset_from_set)( orig_set, modifier );
1120         break;
1121      case VKI_SIG_UNBLOCK:
1122         VG_(sigdelset_from_set)( orig_set, modifier );
1123         break;
1124      case VKI_SIG_SETMASK:
1125         *orig_set = *modifier;
1126         break;
1127      default:
1128         VG_(core_panic)("do_sigprocmask_bitops");
1129	 break;
1130   }
1131}
1132
1133static
1134HChar* format_sigset ( const vki_sigset_t* set )
1135{
1136   static HChar buf[128];
1137   int w;
1138
1139   VG_(strcpy)(buf, "");
1140
1141   for (w = _VKI_NSIG_WORDS - 1; w >= 0; w--)
1142   {
1143#     if _VKI_NSIG_BPW == 32
1144      VG_(sprintf)(buf + VG_(strlen)(buf), "%08llx",
1145                   set ? (ULong)set->sig[w] : 0);
1146#     elif _VKI_NSIG_BPW == 64
1147      VG_(sprintf)(buf + VG_(strlen)(buf), "%16llx",
1148                   set ? (ULong)set->sig[w] : 0);
1149#     else
1150#       error "Unsupported value for _VKI_NSIG_BPW"
1151#     endif
1152   }
1153
1154   return buf;
1155}
1156
1157/*
1158   This updates the thread's signal mask.  There's no such thing as a
1159   process-wide signal mask.
1160
1161   Note that the thread signal masks are an implicit part of SCSS,
1162   which is why this routine is allowed to mess with them.
1163*/
1164static
1165void do_setmask ( ThreadId tid,
1166                  Int how,
1167                  vki_sigset_t* newset,
1168		  vki_sigset_t* oldset )
1169{
1170   if (VG_(clo_trace_signals))
1171      VG_(dmsg)("do_setmask: tid = %d how = %d (%s), newset = %p (%s)\n",
1172                tid, how,
1173                how==VKI_SIG_BLOCK ? "SIG_BLOCK" : (
1174                   how==VKI_SIG_UNBLOCK ? "SIG_UNBLOCK" : (
1175                      how==VKI_SIG_SETMASK ? "SIG_SETMASK" : "???")),
1176                newset, newset ? format_sigset(newset) : "NULL" );
1177
1178   /* Just do this thread. */
1179   vg_assert(VG_(is_valid_tid)(tid));
1180   if (oldset) {
1181      *oldset = VG_(threads)[tid].sig_mask;
1182      if (VG_(clo_trace_signals))
1183         VG_(dmsg)("\toldset=%p %s\n", oldset, format_sigset(oldset));
1184   }
1185   if (newset) {
1186      do_sigprocmask_bitops (how, &VG_(threads)[tid].sig_mask, newset );
1187      VG_(sigdelset)(&VG_(threads)[tid].sig_mask, VKI_SIGKILL);
1188      VG_(sigdelset)(&VG_(threads)[tid].sig_mask, VKI_SIGSTOP);
1189      VG_(threads)[tid].tmp_sig_mask = VG_(threads)[tid].sig_mask;
1190   }
1191}
1192
1193
1194SysRes VG_(do_sys_sigprocmask) ( ThreadId tid,
1195                                 Int how,
1196                                 vki_sigset_t* set,
1197                                 vki_sigset_t* oldset )
1198{
1199   switch(how) {
1200      case VKI_SIG_BLOCK:
1201      case VKI_SIG_UNBLOCK:
1202      case VKI_SIG_SETMASK:
1203         vg_assert(VG_(is_valid_tid)(tid));
1204         do_setmask ( tid, how, set, oldset );
1205         return VG_(mk_SysRes_Success)( 0 );
1206
1207      default:
1208         VG_(dmsg)("sigprocmask: unknown 'how' field %d\n", how);
1209         return VG_(mk_SysRes_Error)( VKI_EINVAL );
1210   }
1211}
1212
1213
1214/* ---------------------------------------------------------------------
1215   LOW LEVEL STUFF TO DO WITH SIGNALS: IMPLEMENTATION
1216   ------------------------------------------------------------------ */
1217
1218/* ---------------------------------------------------------------------
1219   Handy utilities to block/restore all host signals.
1220   ------------------------------------------------------------------ */
1221
1222/* Block all host signals, dumping the old mask in *saved_mask. */
1223static void block_all_host_signals ( /* OUT */ vki_sigset_t* saved_mask )
1224{
1225   Int           ret;
1226   vki_sigset_t block_procmask;
1227   VG_(sigfillset)(&block_procmask);
1228   ret = VG_(sigprocmask)
1229            (VKI_SIG_SETMASK, &block_procmask, saved_mask);
1230   vg_assert(ret == 0);
1231}
1232
1233/* Restore the blocking mask using the supplied saved one. */
1234static void restore_all_host_signals ( /* IN */ vki_sigset_t* saved_mask )
1235{
1236   Int ret;
1237   ret = VG_(sigprocmask)(VKI_SIG_SETMASK, saved_mask, NULL);
1238   vg_assert(ret == 0);
1239}
1240
1241void VG_(clear_out_queued_signals)( ThreadId tid, vki_sigset_t* saved_mask )
1242{
1243   block_all_host_signals(saved_mask);
1244   if (VG_(threads)[tid].sig_queue != NULL) {
1245      VG_(arena_free)(VG_AR_CORE, VG_(threads)[tid].sig_queue);
1246      VG_(threads)[tid].sig_queue = NULL;
1247   }
1248   restore_all_host_signals(saved_mask);
1249}
1250
1251/* ---------------------------------------------------------------------
1252   The signal simulation proper.  A simplified version of what the
1253   Linux kernel does.
1254   ------------------------------------------------------------------ */
1255
1256/* Set up a stack frame (VgSigContext) for the client's signal
1257   handler. */
1258static
1259void push_signal_frame ( ThreadId tid, const vki_siginfo_t *siginfo,
1260                                       const struct vki_ucontext *uc )
1261{
1262   Addr         esp_top_of_frame;
1263   ThreadState* tst;
1264   Int		sigNo = siginfo->si_signo;
1265
1266   vg_assert(sigNo >= 1 && sigNo <= VG_(max_signal));
1267   vg_assert(VG_(is_valid_tid)(tid));
1268   tst = & VG_(threads)[tid];
1269
1270   if (VG_(clo_trace_signals)) {
1271      VG_(dmsg)("push_signal_frame (thread %d): signal %d\n", tid, sigNo);
1272      VG_(get_and_pp_StackTrace)(tid, 10);
1273   }
1274
1275   if (/* this signal asked to run on an alt stack */
1276       (scss.scss_per_sig[sigNo].scss_flags & VKI_SA_ONSTACK )
1277       && /* there is a defined and enabled alt stack, which we're not
1278             already using.  Logic from get_sigframe in
1279             arch/i386/kernel/signal.c. */
1280          sas_ss_flags(tid, VG_(get_SP)(tid)) == 0
1281      ) {
1282      esp_top_of_frame
1283         = (Addr)(tst->altstack.ss_sp) + tst->altstack.ss_size;
1284      if (VG_(clo_trace_signals))
1285         VG_(dmsg)("delivering signal %d (%s) to thread %d: "
1286                   "on ALT STACK (%p-%p; %ld bytes)\n",
1287                   sigNo, signame(sigNo), tid, tst->altstack.ss_sp,
1288                   (UChar *)tst->altstack.ss_sp + tst->altstack.ss_size,
1289                   (Word)tst->altstack.ss_size );
1290
1291      /* Signal delivery to tools */
1292      VG_TRACK( pre_deliver_signal, tid, sigNo, /*alt_stack*/True );
1293
1294   } else {
1295      esp_top_of_frame = VG_(get_SP)(tid) - VG_STACK_REDZONE_SZB;
1296
1297      /* Signal delivery to tools */
1298      VG_TRACK( pre_deliver_signal, tid, sigNo, /*alt_stack*/False );
1299   }
1300
1301   vg_assert(scss.scss_per_sig[sigNo].scss_handler != VKI_SIG_IGN);
1302   vg_assert(scss.scss_per_sig[sigNo].scss_handler != VKI_SIG_DFL);
1303
1304   /* This may fail if the client stack is busted; if that happens,
1305      the whole process will exit rather than simply calling the
1306      signal handler. */
1307   VG_(sigframe_create) (tid, esp_top_of_frame, siginfo, uc,
1308                         scss.scss_per_sig[sigNo].scss_handler,
1309                         scss.scss_per_sig[sigNo].scss_flags,
1310                         &tst->sig_mask,
1311                         scss.scss_per_sig[sigNo].scss_restorer);
1312}
1313
1314
1315static const Char *signame(Int sigNo)
1316{
1317   static Char buf[20];
1318
1319   switch(sigNo) {
1320      case VKI_SIGHUP:    return "SIGHUP";
1321      case VKI_SIGINT:    return "SIGINT";
1322      case VKI_SIGQUIT:   return "SIGQUIT";
1323      case VKI_SIGILL:    return "SIGILL";
1324      case VKI_SIGTRAP:   return "SIGTRAP";
1325      case VKI_SIGABRT:   return "SIGABRT";
1326      case VKI_SIGBUS:    return "SIGBUS";
1327      case VKI_SIGFPE:    return "SIGFPE";
1328      case VKI_SIGKILL:   return "SIGKILL";
1329      case VKI_SIGUSR1:   return "SIGUSR1";
1330      case VKI_SIGUSR2:   return "SIGUSR2";
1331      case VKI_SIGSEGV:   return "SIGSEGV";
1332      case VKI_SIGPIPE:   return "SIGPIPE";
1333      case VKI_SIGALRM:   return "SIGALRM";
1334      case VKI_SIGTERM:   return "SIGTERM";
1335#     if defined(VKI_SIGSTKFLT)
1336      case VKI_SIGSTKFLT: return "SIGSTKFLT";
1337#     endif
1338      case VKI_SIGCHLD:   return "SIGCHLD";
1339      case VKI_SIGCONT:   return "SIGCONT";
1340      case VKI_SIGSTOP:   return "SIGSTOP";
1341      case VKI_SIGTSTP:   return "SIGTSTP";
1342      case VKI_SIGTTIN:   return "SIGTTIN";
1343      case VKI_SIGTTOU:   return "SIGTTOU";
1344      case VKI_SIGURG:    return "SIGURG";
1345      case VKI_SIGXCPU:   return "SIGXCPU";
1346      case VKI_SIGXFSZ:   return "SIGXFSZ";
1347      case VKI_SIGVTALRM: return "SIGVTALRM";
1348      case VKI_SIGPROF:   return "SIGPROF";
1349      case VKI_SIGWINCH:  return "SIGWINCH";
1350      case VKI_SIGIO:     return "SIGIO";
1351#     if defined(VKI_SIGPWR)
1352      case VKI_SIGPWR:    return "SIGPWR";
1353#     endif
1354#     if defined(VKI_SIGUNUSED)
1355      case VKI_SIGUNUSED: return "SIGUNUSED";
1356#     endif
1357
1358#  if defined(VKI_SIGRTMIN) && defined(VKI_SIGRTMAX)
1359   case VKI_SIGRTMIN ... VKI_SIGRTMAX:
1360      VG_(sprintf)(buf, "SIGRT%d", sigNo-VKI_SIGRTMIN);
1361      return buf;
1362#  endif
1363
1364   default:
1365      VG_(sprintf)(buf, "SIG%d", sigNo);
1366      return buf;
1367   }
1368}
1369
1370/* Hit ourselves with a signal using the default handler */
1371void VG_(kill_self)(Int sigNo)
1372{
1373   Int r;
1374   vki_sigset_t	         mask, origmask;
1375   vki_sigaction_toK_t   sa, origsa2;
1376   vki_sigaction_fromK_t origsa;
1377
1378   sa.ksa_handler = VKI_SIG_DFL;
1379   sa.sa_flags = 0;
1380#  if !defined(VGP_ppc32_aix5) && !defined(VGP_ppc64_aix5) && \
1381      !defined(VGP_x86_darwin) && !defined(VGP_amd64_darwin)
1382   sa.sa_restorer = 0;
1383#  endif
1384   VG_(sigemptyset)(&sa.sa_mask);
1385
1386   VG_(sigaction)(sigNo, &sa, &origsa);
1387
1388   VG_(sigemptyset)(&mask);
1389   VG_(sigaddset)(&mask, sigNo);
1390   VG_(sigprocmask)(VKI_SIG_UNBLOCK, &mask, &origmask);
1391
1392   r = VG_(kill)(VG_(getpid)(), sigNo);
1393   /* This sometimes fails with EPERM on Darwin.  I don't know why. */
1394   /* vg_assert(r == 0); */
1395
1396   VG_(convert_sigaction_fromK_to_toK)( &origsa, &origsa2 );
1397   VG_(sigaction)(sigNo, &origsa2, NULL);
1398   VG_(sigprocmask)(VKI_SIG_SETMASK, &origmask, NULL);
1399}
1400
1401// The si_code describes where the signal came from.  Some come from the
1402// kernel, eg.: seg faults, illegal opcodes.  Some come from the user, eg.:
1403// from kill() (SI_USER), or timer_settime() (SI_TIMER), or an async I/O
1404// request (SI_ASYNCIO).  There's lots of implementation-defined leeway in
1405// POSIX, but the user vs. kernal distinction is what we want here.  We also
1406// pass in some other details that can help when si_code is unreliable.
1407static Bool is_signal_from_kernel(ThreadId tid, int signum, int si_code)
1408{
1409#if defined(VGO_linux) || defined(VGO_aix5)
1410   // On Linux, SI_USER is zero, negative values are from the user, positive
1411   // values are from the kernel.  There are SI_FROMUSER and SI_FROMKERNEL
1412   // macros but we don't use them here because other platforms don't have
1413   // them.
1414   return ( si_code > VKI_SI_USER ? True : False );
1415#elif defined(VGO_darwin)
1416   // On Darwin 9.6.0, the si_code is completely unreliable.  It should be the
1417   // case that 0 means "user", and >0 means "kernel".  But:
1418   // - For SIGSEGV, it seems quite reliable.
1419   // - For SIGBUS, it's always 2.
1420   // - For SIGFPE, it's often 0, even for kernel ones (eg.
1421   //   div-by-integer-zero always gives zero).
1422   // - For SIGILL, it's unclear.
1423   // - For SIGTRAP, it's always 1.
1424   // You can see the "NOTIMP" (not implemented) status of a number of the
1425   // sub-cases in sys/signal.h.  Hopefully future versions of Darwin will
1426   // get this right.
1427
1428   // If we're blocked waiting on a syscall, it must be a user signal, because
1429   // the kernel won't generate sync signals within syscalls.
1430   if (VG_(threads)[tid].status == VgTs_WaitSys) {
1431      return False;
1432
1433   // If it's a SIGSEGV, use the proper condition, since it's fairly reliable.
1434   } else if (SIGSEGV == signum) {
1435      return ( si_code > 0 ? True : False );
1436
1437   // If it's anything else, assume it's kernel-generated.  Reason being that
1438   // kernel-generated sync signals are more common, and it's probable that
1439   // misdiagnosing a user signal as a kernel signal is better than the
1440   // opposite.
1441   } else {
1442      return True;
1443   }
1444#else
1445#  error Unknown OS
1446#endif
1447}
1448
1449// This is an arbitrary si_code that we only use internally.  It corresponds
1450// to the value SI_KERNEL on Linux, but that's not really of any significance
1451// as far as I can determine.
1452#define VKI_SEGV_MADE_UP_GPF    0x80
1453
1454/*
1455   Perform the default action of a signal.  If the signal is fatal, it
1456   marks all threads as needing to exit, but it doesn't actually kill
1457   the process or thread.
1458
1459   If we're not being quiet, then print out some more detail about
1460   fatal signals (esp. core dumping signals).
1461 */
1462static void default_action(const vki_siginfo_t *info, ThreadId tid)
1463{
1464   Int  sigNo     = info->si_signo;
1465   Bool terminate = False;	/* kills process         */
1466   Bool core      = False;	/* kills process w/ core */
1467   struct vki_rlimit corelim;
1468   Bool could_core;
1469
1470   vg_assert(VG_(is_running_thread)(tid));
1471
1472   switch(sigNo) {
1473      case VKI_SIGQUIT:	/* core */
1474      case VKI_SIGILL:	/* core */
1475      case VKI_SIGABRT:	/* core */
1476      case VKI_SIGFPE:	/* core */
1477      case VKI_SIGSEGV:	/* core */
1478      case VKI_SIGBUS:	/* core */
1479      case VKI_SIGTRAP:	/* core */
1480      case VKI_SIGXCPU:	/* core */
1481      case VKI_SIGXFSZ:	/* core */
1482         terminate = True;
1483         core = True;
1484         break;
1485
1486      case VKI_SIGHUP:	/* term */
1487      case VKI_SIGINT:	/* term */
1488      case VKI_SIGKILL:	/* term - we won't see this */
1489      case VKI_SIGPIPE:	/* term */
1490      case VKI_SIGALRM:	/* term */
1491      case VKI_SIGTERM:	/* term */
1492      case VKI_SIGUSR1:	/* term */
1493      case VKI_SIGUSR2:	/* term */
1494      case VKI_SIGIO:	/* term */
1495#     if defined(VKI_SIGPWR)
1496      case VKI_SIGPWR:	/* term */
1497#     endif
1498      case VKI_SIGSYS:	/* term */
1499      case VKI_SIGPROF:	/* term */
1500      case VKI_SIGVTALRM:	/* term */
1501#     if defined(VKI_SIGRTMIN) && defined(VKI_SIGRTMAX)
1502      case VKI_SIGRTMIN ... VKI_SIGRTMAX: /* term */
1503#     endif
1504         terminate = True;
1505         break;
1506   }
1507
1508   vg_assert(!core || (core && terminate));
1509
1510   if (VG_(clo_trace_signals))
1511      VG_(dmsg)("delivering %d (code %d) to default handler; action: %s%s\n",
1512                sigNo, info->si_code, terminate ? "terminate" : "ignore",
1513                core ? "+core" : "");
1514
1515   if (!terminate)
1516      return;			/* nothing to do */
1517
1518   could_core = core;
1519
1520   if (core) {
1521      /* If they set the core-size limit to zero, don't generate a
1522	 core file */
1523
1524      VG_(getrlimit)(VKI_RLIMIT_CORE, &corelim);
1525
1526      if (corelim.rlim_cur == 0)
1527	 core = False;
1528   }
1529
1530   if ( (VG_(clo_verbosity) > 1 ||
1531         (could_core && is_signal_from_kernel(tid, sigNo, info->si_code))
1532        ) &&
1533        !VG_(clo_xml) ) {
1534      VG_(umsg)(
1535         "\n"
1536         "Process terminating with default action of signal %d (%s)%s\n",
1537         sigNo, signame(sigNo), core ? ": dumping core" : "");
1538
1539      /* Be helpful - decode some more details about this fault */
1540      if (is_signal_from_kernel(tid, sigNo, info->si_code)) {
1541	 const Char *event = NULL;
1542	 Bool haveaddr = True;
1543
1544	 switch(sigNo) {
1545	 case VKI_SIGSEGV:
1546	    switch(info->si_code) {
1547	    case VKI_SEGV_MAPERR: event = "Access not within mapped region";
1548                                  break;
1549	    case VKI_SEGV_ACCERR: event = "Bad permissions for mapped region";
1550                                  break;
1551	    case VKI_SEGV_MADE_UP_GPF:
1552	       /* General Protection Fault: The CPU/kernel
1553		  isn't telling us anything useful, but this
1554		  is commonly the result of exceeding a
1555		  segment limit. */
1556	       event = "General Protection Fault";
1557	       haveaddr = False;
1558	       break;
1559	    }
1560#if 0
1561            {
1562              HChar buf[110];
1563              VG_(am_show_nsegments)(0,"post segfault");
1564              VG_(sprintf)(buf, "/bin/cat /proc/%d/maps", VG_(getpid)());
1565              VG_(system)(buf);
1566            }
1567#endif
1568	    break;
1569
1570	 case VKI_SIGILL:
1571	    switch(info->si_code) {
1572	    case VKI_ILL_ILLOPC: event = "Illegal opcode"; break;
1573	    case VKI_ILL_ILLOPN: event = "Illegal operand"; break;
1574	    case VKI_ILL_ILLADR: event = "Illegal addressing mode"; break;
1575	    case VKI_ILL_ILLTRP: event = "Illegal trap"; break;
1576	    case VKI_ILL_PRVOPC: event = "Privileged opcode"; break;
1577	    case VKI_ILL_PRVREG: event = "Privileged register"; break;
1578	    case VKI_ILL_COPROC: event = "Coprocessor error"; break;
1579	    case VKI_ILL_BADSTK: event = "Internal stack error"; break;
1580	    }
1581	    break;
1582
1583	 case VKI_SIGFPE:
1584	    switch (info->si_code) {
1585	    case VKI_FPE_INTDIV: event = "Integer divide by zero"; break;
1586	    case VKI_FPE_INTOVF: event = "Integer overflow"; break;
1587	    case VKI_FPE_FLTDIV: event = "FP divide by zero"; break;
1588	    case VKI_FPE_FLTOVF: event = "FP overflow"; break;
1589	    case VKI_FPE_FLTUND: event = "FP underflow"; break;
1590	    case VKI_FPE_FLTRES: event = "FP inexact"; break;
1591	    case VKI_FPE_FLTINV: event = "FP invalid operation"; break;
1592	    case VKI_FPE_FLTSUB: event = "FP subscript out of range"; break;
1593	    }
1594	    break;
1595
1596	 case VKI_SIGBUS:
1597	    switch (info->si_code) {
1598	    case VKI_BUS_ADRALN: event = "Invalid address alignment"; break;
1599	    case VKI_BUS_ADRERR: event = "Non-existent physical address"; break;
1600	    case VKI_BUS_OBJERR: event = "Hardware error"; break;
1601	    }
1602	    break;
1603	 } /* switch (sigNo) */
1604
1605	 if (event != NULL) {
1606	    if (haveaddr)
1607               VG_(umsg)(" %s at address %p\n",
1608                         event, info->VKI_SIGINFO_si_addr);
1609	    else
1610               VG_(umsg)(" %s\n", event);
1611	 }
1612      }
1613      /* Print a stack trace.  Be cautious if the thread's SP is in an
1614         obviously stupid place (not mapped readable) that would
1615         likely cause a segfault. */
1616      if (VG_(is_valid_tid)(tid)) {
1617         ExeContext* ec = VG_(am_is_valid_for_client)
1618                             (VG_(get_SP)(tid), sizeof(Addr), VKI_PROT_READ)
1619                        ? VG_(record_ExeContext)( tid, 0/*first_ip_delta*/ )
1620                      : VG_(record_depth_1_ExeContext)( tid );
1621         vg_assert(ec);
1622         VG_(pp_ExeContext)( ec );
1623      }
1624      if (sigNo == VKI_SIGSEGV
1625          && info && is_signal_from_kernel(tid, sigNo, info->si_code)
1626          && info->si_code == VKI_SEGV_MAPERR) {
1627         VG_(umsg)(" If you believe this happened as a result of a stack\n" );
1628         VG_(umsg)(" overflow in your program's main thread (unlikely but\n");
1629         VG_(umsg)(" possible), you can try to increase the size of the\n"  );
1630         VG_(umsg)(" main thread stack using the --main-stacksize= flag.\n" );
1631         // FIXME: assumes main ThreadId == 1
1632         if (VG_(is_valid_tid)(1)) {
1633            VG_(umsg)(
1634               " The main thread stack size used in this run was %d.\n",
1635               (Int)VG_(threads)[1].client_stack_szB);
1636         }
1637      }
1638   }
1639
1640   if (VG_(is_action_requested)( "Attach to debugger", & VG_(clo_db_attach) )) {
1641      VG_(start_debugger)( tid );
1642   }
1643
1644   if (core) {
1645      const static struct vki_rlimit zero = { 0, 0 };
1646
1647      VG_(make_coredump)(tid, info, corelim.rlim_cur);
1648
1649      /* Make sure we don't get a confusing kernel-generated
1650	 coredump when we finally exit */
1651      VG_(setrlimit)(VKI_RLIMIT_CORE, &zero);
1652   }
1653
1654   /* stash fatal signal in main thread */
1655   // what's this for?
1656   //VG_(threads)[VG_(master_tid)].os_state.fatalsig = sigNo;
1657
1658   /* everyone dies */
1659   VG_(nuke_all_threads_except)(tid, VgSrc_FatalSig);
1660   VG_(threads)[tid].exitreason = VgSrc_FatalSig;
1661   VG_(threads)[tid].os_state.fatalsig = sigNo;
1662}
1663
1664/*
1665   This does the business of delivering a signal to a thread.  It may
1666   be called from either a real signal handler, or from normal code to
1667   cause the thread to enter the signal handler.
1668
1669   This updates the thread state, but it does not set it to be
1670   Runnable.
1671*/
1672static void deliver_signal ( ThreadId tid, const vki_siginfo_t *info,
1673                                           const struct vki_ucontext *uc )
1674{
1675   Int			sigNo = info->si_signo;
1676   SCSS_Per_Signal	*handler = &scss.scss_per_sig[sigNo];
1677   void			*handler_fn;
1678   ThreadState		*tst = VG_(get_ThreadState)(tid);
1679
1680   if (VG_(clo_trace_signals))
1681      VG_(dmsg)("delivering signal %d (%s):%d to thread %d\n",
1682                sigNo, signame(sigNo), info->si_code, tid );
1683
1684   if (sigNo == VG_SIGVGKILL) {
1685      /* If this is a SIGVGKILL, we're expecting it to interrupt any
1686	 blocked syscall.  It doesn't matter whether the VCPU state is
1687	 set to restart or not, because we don't expect it will
1688	 execute any more client instructions. */
1689      vg_assert(VG_(is_exiting)(tid));
1690      return;
1691   }
1692
1693   /* If the client specifies SIG_IGN, treat it as SIG_DFL.
1694
1695      If deliver_signal() is being called on a thread, we want
1696      the signal to get through no matter what; if they're ignoring
1697      it, then we do this override (this is so we can send it SIGSEGV,
1698      etc). */
1699   handler_fn = handler->scss_handler;
1700   if (handler_fn == VKI_SIG_IGN)
1701      handler_fn = VKI_SIG_DFL;
1702
1703   vg_assert(handler_fn != VKI_SIG_IGN);
1704
1705   if (handler_fn == VKI_SIG_DFL) {
1706      default_action(info, tid);
1707   } else {
1708      /* Create a signal delivery frame, and set the client's %ESP and
1709	 %EIP so that when execution continues, we will enter the
1710	 signal handler with the frame on top of the client's stack,
1711	 as it expects.
1712
1713	 Signal delivery can fail if the client stack is too small or
1714	 missing, and we can't push the frame.  If that happens,
1715	 push_signal_frame will cause the whole process to exit when
1716	 we next hit the scheduler.
1717      */
1718      vg_assert(VG_(is_valid_tid)(tid));
1719
1720      push_signal_frame ( tid, info, uc );
1721
1722      if (handler->scss_flags & VKI_SA_ONESHOT) {
1723	 /* Do the ONESHOT thing. */
1724	 handler->scss_handler = VKI_SIG_DFL;
1725
1726	 handle_SCSS_change( False /* lazy update */ );
1727      }
1728
1729      /* At this point:
1730	 tst->sig_mask is the current signal mask
1731	 tst->tmp_sig_mask is the same as sig_mask, unless we're in sigsuspend
1732	 handler->scss_mask is the mask set by the handler
1733
1734	 Handler gets a mask of tmp_sig_mask|handler_mask|signo
1735       */
1736      tst->sig_mask = tst->tmp_sig_mask;
1737      if (!(handler->scss_flags & VKI_SA_NOMASK)) {
1738	 VG_(sigaddset_from_set)(&tst->sig_mask, &handler->scss_mask);
1739	 VG_(sigaddset)(&tst->sig_mask, sigNo);
1740	 tst->tmp_sig_mask = tst->sig_mask;
1741      }
1742   }
1743
1744   /* Thread state is ready to go - just add Runnable */
1745}
1746
1747static void resume_scheduler(ThreadId tid)
1748{
1749   ThreadState *tst = VG_(get_ThreadState)(tid);
1750
1751   vg_assert(tst->os_state.lwpid == VG_(gettid)());
1752
1753   if (tst->sched_jmpbuf_valid) {
1754      /* Can't continue; must longjmp back to the scheduler and thus
1755         enter the sighandler immediately. */
1756      __builtin_longjmp(tst->sched_jmpbuf, True);
1757   }
1758}
1759
1760static void synth_fault_common(ThreadId tid, Addr addr, Int si_code)
1761{
1762   vki_siginfo_t info;
1763
1764   vg_assert(VG_(threads)[tid].status == VgTs_Runnable);
1765
1766   VG_(memset)(&info, 0, sizeof(info));
1767   info.si_signo = VKI_SIGSEGV;
1768   info.si_code = si_code;
1769   info.VKI_SIGINFO_si_addr = (void*)addr;
1770
1771   /* If they're trying to block the signal, force it to be delivered */
1772   if (VG_(sigismember)(&VG_(threads)[tid].sig_mask, VKI_SIGSEGV))
1773      VG_(set_default_handler)(VKI_SIGSEGV);
1774
1775   deliver_signal(tid, &info, NULL);
1776}
1777
1778// Synthesize a fault where the address is OK, but the page
1779// permissions are bad.
1780void VG_(synth_fault_perms)(ThreadId tid, Addr addr)
1781{
1782   synth_fault_common(tid, addr, VKI_SEGV_ACCERR);
1783}
1784
1785// Synthesize a fault where the address there's nothing mapped at the address.
1786void VG_(synth_fault_mapping)(ThreadId tid, Addr addr)
1787{
1788   synth_fault_common(tid, addr, VKI_SEGV_MAPERR);
1789}
1790
1791// Synthesize a misc memory fault.
1792void VG_(synth_fault)(ThreadId tid)
1793{
1794   synth_fault_common(tid, 0, VKI_SEGV_MADE_UP_GPF);
1795}
1796
1797// Synthesise a SIGILL.
1798void VG_(synth_sigill)(ThreadId tid, Addr addr)
1799{
1800   vki_siginfo_t info;
1801
1802   vg_assert(VG_(threads)[tid].status == VgTs_Runnable);
1803
1804   VG_(memset)(&info, 0, sizeof(info));
1805   info.si_signo = VKI_SIGILL;
1806   info.si_code  = VKI_ILL_ILLOPC; /* jrs: no idea what this should be */
1807   info.VKI_SIGINFO_si_addr = (void*)addr;
1808
1809   resume_scheduler(tid);
1810   deliver_signal(tid, &info, NULL);
1811}
1812
1813// Synthesise a SIGBUS.
1814void VG_(synth_sigbus)(ThreadId tid)
1815{
1816   vki_siginfo_t info;
1817
1818   vg_assert(VG_(threads)[tid].status == VgTs_Runnable);
1819
1820   VG_(memset)(&info, 0, sizeof(info));
1821   info.si_signo = VKI_SIGBUS;
1822   /* There are several meanings to SIGBUS (as per POSIX, presumably),
1823      but the most widely understood is "invalid address alignment",
1824      so let's use that. */
1825   info.si_code  = VKI_BUS_ADRALN;
1826   /* If we knew the invalid address in question, we could put it
1827      in .si_addr.  Oh well. */
1828   /* info.VKI_SIGINFO_si_addr = (void*)addr; */
1829
1830   resume_scheduler(tid);
1831   deliver_signal(tid, &info, NULL);
1832}
1833
1834// Synthesise a SIGTRAP.
1835void VG_(synth_sigtrap)(ThreadId tid)
1836{
1837   vki_siginfo_t info;
1838   struct vki_ucontext uc;
1839#  if defined(VGP_x86_darwin)
1840   struct __darwin_mcontext32 mc;
1841#  elif defined(VGP_amd64_darwin)
1842   struct __darwin_mcontext64 mc;
1843#  endif
1844
1845   vg_assert(VG_(threads)[tid].status == VgTs_Runnable);
1846
1847   VG_(memset)(&info, 0, sizeof(info));
1848   VG_(memset)(&uc,   0, sizeof(uc));
1849   info.si_signo = VKI_SIGTRAP;
1850   info.si_code = VKI_TRAP_BRKPT; /* tjh: only ever called for a brkpt ins */
1851
1852#  if defined(VGP_x86_linux) || defined(VGP_amd64_linux)
1853   uc.uc_mcontext.trapno = 3;     /* tjh: this is the x86 trap number
1854                                          for a breakpoint trap... */
1855   uc.uc_mcontext.err = 0;        /* tjh: no error code for x86
1856                                          breakpoint trap... */
1857#  elif defined(VGP_x86_darwin) || defined(VGP_amd64_darwin)
1858   /* the same thing, but using Darwin field/struct names */
1859   VG_(memset)(&mc, 0, sizeof(mc));
1860   uc.uc_mcontext = &mc;
1861   uc.uc_mcontext->__es.__trapno = 3;
1862   uc.uc_mcontext->__es.__err = 0;
1863#  endif
1864
1865   resume_scheduler(tid);
1866   deliver_signal(tid, &info, &uc);
1867}
1868
1869/* Make a signal pending for a thread, for later delivery.
1870   VG_(poll_signals) will arrange for it to be delivered at the right
1871   time.
1872
1873   tid==0 means add it to the process-wide queue, and not sent it to a
1874   specific thread.
1875*/
1876static
1877void queue_signal(ThreadId tid, const vki_siginfo_t *si)
1878{
1879   ThreadState *tst;
1880   SigQueue *sq;
1881   vki_sigset_t savedmask;
1882
1883   tst = VG_(get_ThreadState)(tid);
1884
1885   /* Protect the signal queue against async deliveries */
1886   block_all_host_signals(&savedmask);
1887
1888   if (tst->sig_queue == NULL) {
1889      tst->sig_queue = VG_(arena_malloc)(VG_AR_CORE, "signals.qs.1",
1890                                         sizeof(*tst->sig_queue));
1891      VG_(memset)(tst->sig_queue, 0, sizeof(*tst->sig_queue));
1892   }
1893   sq = tst->sig_queue;
1894
1895   if (VG_(clo_trace_signals))
1896      VG_(dmsg)("Queueing signal %d (idx %d) to thread %d\n",
1897                si->si_signo, sq->next, tid);
1898
1899   /* Add signal to the queue.  If the queue gets overrun, then old
1900      queued signals may get lost.
1901
1902      XXX We should also keep a sigset of pending signals, so that at
1903      least a non-siginfo signal gets deliviered.
1904   */
1905   if (sq->sigs[sq->next].si_signo != 0)
1906      VG_(umsg)("Signal %d being dropped from thread %d's queue\n",
1907                sq->sigs[sq->next].si_signo, tid);
1908
1909   sq->sigs[sq->next] = *si;
1910   sq->next = (sq->next+1) % N_QUEUED_SIGNALS;
1911
1912   restore_all_host_signals(&savedmask);
1913}
1914
1915/*
1916   Returns the next queued signal for thread tid which is in "set".
1917   tid==0 means process-wide signal.  Set si_signo to 0 when the
1918   signal has been delivered.
1919
1920   Must be called with all signals blocked, to protect against async
1921   deliveries.
1922*/
1923static vki_siginfo_t *next_queued(ThreadId tid, const vki_sigset_t *set)
1924{
1925   ThreadState *tst = VG_(get_ThreadState)(tid);
1926   SigQueue *sq;
1927   Int idx;
1928   vki_siginfo_t *ret = NULL;
1929
1930   sq = tst->sig_queue;
1931   if (sq == NULL)
1932      goto out;
1933
1934   idx = sq->next;
1935   do {
1936      if (0)
1937	 VG_(printf)("idx=%d si_signo=%d inset=%d\n", idx,
1938		     sq->sigs[idx].si_signo,
1939                     VG_(sigismember)(set, sq->sigs[idx].si_signo));
1940
1941      if (sq->sigs[idx].si_signo != 0
1942          && VG_(sigismember)(set, sq->sigs[idx].si_signo)) {
1943	 if (VG_(clo_trace_signals))
1944            VG_(dmsg)("Returning queued signal %d (idx %d) for thread %d\n",
1945                      sq->sigs[idx].si_signo, idx, tid);
1946	 ret = &sq->sigs[idx];
1947	 goto out;
1948      }
1949
1950      idx = (idx + 1) % N_QUEUED_SIGNALS;
1951   } while(idx != sq->next);
1952  out:
1953   return ret;
1954}
1955
1956static int sanitize_si_code(int si_code)
1957{
1958#if defined(VGO_linux)
1959   /* The linux kernel uses the top 16 bits of si_code for it's own
1960      use and only exports the bottom 16 bits to user space - at least
1961      that is the theory, but it turns out that there are some kernels
1962      around that forget to mask out the top 16 bits so we do it here.
1963
1964      The kernel treats the bottom 16 bits as signed and (when it does
1965      mask them off) sign extends them when exporting to user space so
1966      we do the same thing here. */
1967   return (Short)si_code;
1968#elif defined(VGO_aix5) || defined(VGO_darwin)
1969   return si_code;
1970#else
1971#  error Unknown OS
1972#endif
1973}
1974
1975/*
1976   Receive an async signal from the kernel.
1977
1978   This should only happen when the thread is blocked in a syscall,
1979   since that's the only time this set of signals is unblocked.
1980*/
1981static
1982void async_signalhandler ( Int sigNo,
1983                           vki_siginfo_t *info, struct vki_ucontext *uc )
1984{
1985   ThreadId     tid = VG_(lwpid_to_vgtid)(VG_(gettid)());
1986   ThreadState* tst = VG_(get_ThreadState)(tid);
1987   SysRes       sres;
1988
1989   /* The thread isn't currently running, make it so before going on */
1990   vg_assert(tst->status == VgTs_WaitSys);
1991   VG_(acquire_BigLock)(tid, "async_signalhandler");
1992
1993   info->si_code = sanitize_si_code(info->si_code);
1994
1995   if (VG_(clo_trace_signals))
1996      VG_(dmsg)("async signal handler: signal=%d, tid=%d, si_code=%d\n",
1997                sigNo, tid, info->si_code);
1998
1999   /* Update thread state properly.  The signal can only have been
2000      delivered whilst we were in
2001      coregrind/m_syswrap/syscall-<PLAT>.S, and only then in the
2002      window between the two sigprocmask calls, since at all other
2003      times, we run with async signals on the host blocked.  Hence
2004      make enquiries on the basis that we were in or very close to a
2005      syscall, and attempt to fix up the guest state accordingly.
2006
2007      (normal async signals occurring during computation are blocked,
2008      but periodically polled for using VG_(sigtimedwait_zero), and
2009      delivered at a point convenient for us.  Hence this routine only
2010      deals with signals that are delivered to a thread during a
2011      syscall.) */
2012
2013   /* First, extract a SysRes from the ucontext_t* given to this
2014      handler.  If it is subsequently established by
2015      VG_(fixup_guest_state_after_syscall_interrupted) that the
2016      syscall was complete but the results had not been committed yet
2017      to the guest state, then it'll have to commit the results itself
2018      "by hand", and so we need to extract the SysRes.  Of course if
2019      the thread was not in that particular window then the
2020      SysRes will be meaningless, but that's OK too because
2021      VG_(fixup_guest_state_after_syscall_interrupted) will detect
2022      that the thread was not in said window and ignore the SysRes. */
2023
2024   /* To make matters more complex still, on Darwin we need to know
2025      the "class" of the syscall under consideration in order to be
2026      able to extract the a correct SysRes.  The class will have been
2027      saved just before the syscall, by VG_(client_syscall), into this
2028      thread's tst->arch.vex.guest_SC_CLASS.  Hence: */
2029#  if defined(VGO_darwin)
2030   sres = VG_UCONTEXT_SYSCALL_SYSRES(uc, tst->arch.vex.guest_SC_CLASS);
2031#  else
2032   sres = VG_UCONTEXT_SYSCALL_SYSRES(uc);
2033#  endif
2034
2035   /* (1) */
2036   VG_(fixup_guest_state_after_syscall_interrupted)(
2037      tid,
2038      VG_UCONTEXT_INSTR_PTR(uc),
2039      sres,
2040      !!(scss.scss_per_sig[sigNo].scss_flags & VKI_SA_RESTART)
2041   );
2042
2043   /* (2) */
2044   /* Set up the thread's state to deliver a signal */
2045   if (!is_sig_ign(info->si_signo))
2046      deliver_signal(tid, info, uc);
2047
2048   /* It's crucial that (1) and (2) happen in the order (1) then (2)
2049      and not the other way around.  (1) fixes up the guest thread
2050      state to reflect the fact that the syscall was interrupted --
2051      either to restart the syscall or to return EINTR.  (2) then sets
2052      up the thread state to deliver the signal.  Then we resume
2053      execution.  First, the signal handler is run, since that's the
2054      second adjustment we made to the thread state.  If that returns,
2055      then we resume at the guest state created by (1), viz, either
2056      the syscall returns EINTR or is restarted.
2057
2058      If (2) was done before (1) the outcome would be completely
2059      different, and wrong. */
2060
2061   /* longjmp back to the thread's main loop to start executing the
2062      handler. */
2063   resume_scheduler(tid);
2064
2065   VG_(core_panic)("async_signalhandler: got unexpected signal "
2066                   "while outside of scheduler");
2067}
2068
2069/* Extend the stack to cover addr.  maxsize is the limit the stack can grow to.
2070
2071   Returns True on success, False on failure.
2072
2073   Succeeds without doing anything if addr is already within a segment.
2074
2075   Failure could be caused by:
2076   - addr not below a growable segment
2077   - new stack size would exceed maxsize
2078   - mmap failed for some other reason
2079 */
2080Bool VG_(extend_stack)(Addr addr, UInt maxsize)
2081{
2082   SizeT udelta;
2083
2084   /* Find the next Segment above addr */
2085   NSegment const* seg
2086      = VG_(am_find_nsegment)(addr);
2087   NSegment const* seg_next
2088      = seg ? VG_(am_next_nsegment)( (NSegment*)seg, True/*fwds*/ )
2089            : NULL;
2090
2091   if (seg && seg->kind == SkAnonC)
2092      /* addr is already mapped.  Nothing to do. */
2093      return True;
2094
2095   /* Check that the requested new base is in a shrink-down
2096      reservation section which abuts an anonymous mapping that
2097      belongs to the client. */
2098   if ( ! (seg
2099           && seg->kind == SkResvn
2100           && seg->smode == SmUpper
2101           && seg_next
2102           && seg_next->kind == SkAnonC
2103           && seg->end+1 == seg_next->start))
2104      return False;
2105
2106   udelta = VG_PGROUNDUP(seg_next->start - addr);
2107   VG_(debugLog)(1, "signals",
2108                    "extending a stack base 0x%llx down by %lld\n",
2109                    (ULong)seg_next->start, (ULong)udelta);
2110   if (! VG_(am_extend_into_adjacent_reservation_client)
2111            ( (NSegment*)seg_next, -(SSizeT)udelta )) {
2112      VG_(debugLog)(1, "signals", "extending a stack base: FAILED\n");
2113      return False;
2114   }
2115
2116   /* When we change the main stack, we have to let the stack handling
2117      code know about it. */
2118   VG_(change_stack)(VG_(clstk_id), addr, VG_(clstk_end));
2119
2120   if (VG_(clo_sanity_level) > 2)
2121      VG_(sanity_check_general)(False);
2122
2123   return True;
2124}
2125
2126static void (*fault_catcher)(Int sig, Addr addr) = NULL;
2127
2128void VG_(set_fault_catcher)(void (*catcher)(Int, Addr))
2129{
2130   if (0)
2131      VG_(debugLog)(0, "signals", "set fault catcher to %p\n", catcher);
2132   vg_assert2(NULL == catcher || NULL == fault_catcher,
2133              "Fault catcher is already registered");
2134
2135   fault_catcher = catcher;
2136}
2137
2138static
2139void sync_signalhandler_from_user ( ThreadId tid,
2140         Int sigNo, vki_siginfo_t *info, struct vki_ucontext *uc )
2141{
2142   ThreadId qtid;
2143
2144   /* If some user-process sent us a sync signal (ie. it's not the result
2145      of a faulting instruction), then how we treat it depends on when it
2146      arrives... */
2147
2148   if (VG_(threads)[tid].status == VgTs_WaitSys) {
2149      /* Signal arrived while we're blocked in a syscall.  This means that
2150         the client's signal mask was applied.  In other words, so we can't
2151         get here unless the client wants this signal right now.  This means
2152         we can simply use the async_signalhandler. */
2153      if (VG_(clo_trace_signals))
2154         VG_(dmsg)("Delivering user-sent sync signal %d as async signal\n",
2155                   sigNo);
2156
2157      async_signalhandler(sigNo, info, uc);
2158      VG_(core_panic)("async_signalhandler returned!?\n");
2159
2160   } else {
2161      /* Signal arrived while in generated client code, or while running
2162         Valgrind core code.  That means that every thread has these signals
2163         unblocked, so we can't rely on the kernel to route them properly, so
2164         we need to queue them manually. */
2165      if (VG_(clo_trace_signals))
2166         VG_(dmsg)("Routing user-sent sync signal %d via queue\n", sigNo);
2167
2168#     if defined(VGO_linux)
2169      /* On Linux, first we have to do a sanity check of the siginfo. */
2170      if (info->VKI_SIGINFO_si_pid == 0) {
2171         /* There's a per-user limit of pending siginfo signals.  If
2172            you exceed this, by having more than that number of
2173            pending signals with siginfo, then new signals are
2174            delivered without siginfo.  This condition can be caused
2175            by any unrelated program you're running at the same time
2176            as Valgrind, if it has a large number of pending siginfo
2177            signals which it isn't taking delivery of.
2178
2179            Since we depend on siginfo to work out why we were sent a
2180            signal and what we should do about it, we really can't
2181            continue unless we get it. */
2182         VG_(umsg)("Signal %d (%s) appears to have lost its siginfo; "
2183                   "I can't go on.\n", sigNo, signame(sigNo));
2184         VG_(printf)(
2185"  This may be because one of your programs has consumed your ration of\n"
2186"  siginfo structures.  For more information, see:\n"
2187"    http://kerneltrap.org/mailarchive/1/message/25599/thread\n"
2188"  Basically, some program on your system is building up a large queue of\n"
2189"  pending signals, and this causes the siginfo data for other signals to\n"
2190"  be dropped because it's exceeding a system limit.  However, Valgrind\n"
2191"  absolutely needs siginfo for SIGSEGV.  A workaround is to track down the\n"
2192"  offending program and avoid running it while using Valgrind, but there\n"
2193"  is no easy way to do this.  Apparently the problem was fixed in kernel\n"
2194"  2.6.12.\n");
2195
2196         /* It's a fatal signal, so we force the default handler. */
2197         VG_(set_default_handler)(sigNo);
2198         deliver_signal(tid, info, uc);
2199         resume_scheduler(tid);
2200         VG_(exit)(99);       /* If we can't resume, then just exit */
2201      }
2202#     endif
2203
2204      qtid = 0;         /* shared pending by default */
2205#     if defined(VGO_linux)
2206      if (info->si_code == VKI_SI_TKILL)
2207         qtid = tid;    /* directed to us specifically */
2208#     endif
2209      queue_signal(qtid, info);
2210   }
2211}
2212
2213/* Returns True if the sync signal was due to the stack requiring extension
2214   and the extension was successful.
2215*/
2216static Bool extend_stack_if_appropriate(ThreadId tid, vki_siginfo_t* info)
2217{
2218   Addr fault;
2219   Addr esp;
2220   NSegment const* seg;
2221   NSegment const* seg_next;
2222
2223   if (info->si_signo != VKI_SIGSEGV)
2224      return False;
2225
2226   fault    = (Addr)info->VKI_SIGINFO_si_addr;
2227   esp      = VG_(get_SP)(tid);
2228   seg      = VG_(am_find_nsegment)(fault);
2229   seg_next = seg ? VG_(am_next_nsegment)( (NSegment*)seg, True/*fwds*/ )
2230                  : NULL;
2231
2232   if (VG_(clo_trace_signals)) {
2233      if (seg == NULL)
2234         VG_(dmsg)("SIGSEGV: si_code=%d faultaddr=%#lx tid=%d ESP=%#lx "
2235                   "seg=NULL\n",
2236                   info->si_code, fault, tid, esp);
2237      else
2238         VG_(dmsg)("SIGSEGV: si_code=%d faultaddr=%#lx tid=%d ESP=%#lx "
2239                   "seg=%#lx-%#lx\n",
2240                   info->si_code, fault, tid, esp, seg->start, seg->end);
2241   }
2242
2243   if (info->si_code == VKI_SEGV_MAPERR
2244       && seg
2245       && seg->kind == SkResvn
2246       && seg->smode == SmUpper
2247       && seg_next
2248       && seg_next->kind == SkAnonC
2249       && seg->end+1 == seg_next->start
2250       && fault >= (esp - VG_STACK_REDZONE_SZB)) {
2251      /* If the fault address is above esp but below the current known
2252         stack segment base, and it was a fault because there was
2253         nothing mapped there (as opposed to a permissions fault),
2254         then extend the stack segment.
2255       */
2256      Addr base = VG_PGROUNDDN(esp - VG_STACK_REDZONE_SZB);
2257      if (VG_(extend_stack)(base, VG_(threads)[tid].client_stack_szB)) {
2258         if (VG_(clo_trace_signals))
2259            VG_(dmsg)("       -> extended stack base to %#lx\n",
2260                      VG_PGROUNDDN(fault));
2261         return True;
2262      } else {
2263         VG_(umsg)("Stack overflow in thread %d: can't grow stack to %#lx\n",
2264                   tid, fault);
2265         return False;
2266      }
2267   } else {
2268      return False;
2269   }
2270}
2271
2272static
2273void sync_signalhandler_from_kernel ( ThreadId tid,
2274         Int sigNo, vki_siginfo_t *info, struct vki_ucontext *uc )
2275{
2276   /* Check to see if some part of Valgrind itself is interested in faults.
2277      The fault catcher should never be set whilst we're in generated code, so
2278      check for that.  AFAIK the only use of the catcher right now is
2279      memcheck's leak detector. */
2280   if (fault_catcher) {
2281      vg_assert(VG_(in_generated_code) == False);
2282
2283      (*fault_catcher)(sigNo, (Addr)info->VKI_SIGINFO_si_addr);
2284      /* If the catcher returns, then it didn't handle the fault,
2285         so carry on panicking. */
2286   }
2287
2288   if (extend_stack_if_appropriate(tid, info)) {
2289      /* Stack extension occurred, so we don't need to do anything else; upon
2290         returning from this function, we'll restart the host (hence guest)
2291         instruction. */
2292   } else {
2293      /* OK, this is a signal we really have to deal with.  If it came
2294         from the client's code, then we can jump back into the scheduler
2295         and have it delivered.  Otherwise it's a Valgrind bug. */
2296      ThreadState *tst = VG_(get_ThreadState)(tid);
2297
2298      if (VG_(sigismember)(&tst->sig_mask, sigNo)) {
2299         /* signal is blocked, but they're not allowed to block faults */
2300         VG_(set_default_handler)(sigNo);
2301      }
2302
2303      if (VG_(in_generated_code)) {
2304         /* Can't continue; must longjmp back to the scheduler and thus
2305            enter the sighandler immediately. */
2306         deliver_signal(tid, info, uc);
2307         resume_scheduler(tid);
2308      }
2309
2310      /* If resume_scheduler returns or its our fault, it means we
2311         don't have longjmp set up, implying that we weren't running
2312         client code, and therefore it was actually generated by
2313         Valgrind internally.
2314       */
2315      VG_(dmsg)("VALGRIND INTERNAL ERROR: Valgrind received "
2316                "a signal %d (%s) - exiting\n",
2317                sigNo, signame(sigNo));
2318
2319      VG_(dmsg)("si_code=%x;  Faulting address: %p;  sp: %#lx\n",
2320                info->si_code, info->VKI_SIGINFO_si_addr,
2321                VG_UCONTEXT_STACK_PTR(uc));
2322
2323      if (0)
2324         VG_(kill_self)(sigNo);  /* generate a core dump */
2325
2326      //if (tid == 0)            /* could happen after everyone has exited */
2327      //  tid = VG_(master_tid);
2328      vg_assert(tid != 0);
2329
2330      UnwindStartRegs startRegs;
2331      VG_(memset)(&startRegs, 0, sizeof(startRegs));
2332
2333      VG_UCONTEXT_TO_UnwindStartRegs(&startRegs, uc);
2334      VG_(core_panic_at)("Killed by fatal signal", &startRegs);
2335   }
2336}
2337
2338/*
2339   Receive a sync signal from the host.
2340*/
2341static
2342void sync_signalhandler ( Int sigNo,
2343                          vki_siginfo_t *info, struct vki_ucontext *uc )
2344{
2345   ThreadId tid = VG_(lwpid_to_vgtid)(VG_(gettid)());
2346   Bool from_user;
2347
2348   if (0)
2349      VG_(printf)("sync_sighandler(%d, %p, %p)\n", sigNo, info, uc);
2350
2351   vg_assert(info != NULL);
2352   vg_assert(info->si_signo == sigNo);
2353   vg_assert(sigNo == VKI_SIGSEGV ||
2354	     sigNo == VKI_SIGBUS  ||
2355	     sigNo == VKI_SIGFPE  ||
2356	     sigNo == VKI_SIGILL  ||
2357	     sigNo == VKI_SIGTRAP);
2358
2359   info->si_code = sanitize_si_code(info->si_code);
2360
2361   from_user = !is_signal_from_kernel(tid, sigNo, info->si_code);
2362
2363   if (VG_(clo_trace_signals)) {
2364      VG_(dmsg)("sync signal handler: "
2365                "signal=%d, si_code=%d, EIP=%#lx, eip=%#lx, from %s\n",
2366                sigNo, info->si_code, VG_(get_IP)(tid),
2367                VG_UCONTEXT_INSTR_PTR(uc),
2368                ( from_user ? "user" : "kernel" ));
2369   }
2370   vg_assert(sigNo >= 1 && sigNo <= VG_(max_signal));
2371
2372   /* // debug code:
2373   if (0) {
2374      VG_(printf)("info->si_signo  %d\n", info->si_signo);
2375      VG_(printf)("info->si_errno  %d\n", info->si_errno);
2376      VG_(printf)("info->si_code   %d\n", info->si_code);
2377      VG_(printf)("info->si_pid    %d\n", info->si_pid);
2378      VG_(printf)("info->si_uid    %d\n", info->si_uid);
2379      VG_(printf)("info->si_status %d\n", info->si_status);
2380      VG_(printf)("info->si_addr   %p\n", info->si_addr);
2381   }
2382   */
2383
2384   /* Figure out if the signal is being sent from outside the process.
2385      (Why do we care?)  If the signal is from the user rather than the
2386      kernel, then treat it more like an async signal than a sync signal --
2387      that is, merely queue it for later delivery. */
2388   if (from_user) {
2389      sync_signalhandler_from_user(  tid, sigNo, info, uc);
2390   } else {
2391      sync_signalhandler_from_kernel(tid, sigNo, info, uc);
2392   }
2393}
2394
2395
2396/*
2397   Kill this thread.  Makes it leave any syscall it might be currently
2398   blocked in, and return to the scheduler.  This doesn't mark the thread
2399   as exiting; that's the caller's job.
2400 */
2401static void sigvgkill_handler(int signo, vki_siginfo_t *si,
2402                                         struct vki_ucontext *uc)
2403{
2404   ThreadId     tid = VG_(lwpid_to_vgtid)(VG_(gettid)());
2405   ThreadStatus at_signal = VG_(threads)[tid].status;
2406
2407   if (VG_(clo_trace_signals))
2408      VG_(dmsg)("sigvgkill for lwp %d tid %d\n", VG_(gettid)(), tid);
2409
2410   VG_(acquire_BigLock)(tid, "sigvgkill_handler");
2411
2412   vg_assert(signo == VG_SIGVGKILL);
2413   vg_assert(si->si_signo == signo);
2414
2415   /* jrs 2006 August 3: the following assertion seems incorrect to
2416      me, and fails on AIX.  sigvgkill could be sent to a thread which
2417      is runnable - see VG_(nuke_all_threads_except) in the scheduler.
2418      Hence comment these out ..
2419
2420      vg_assert(VG_(threads)[tid].status == VgTs_WaitSys);
2421      VG_(post_syscall)(tid);
2422
2423      and instead do:
2424   */
2425   if (at_signal == VgTs_WaitSys)
2426      VG_(post_syscall)(tid);
2427   /* jrs 2006 August 3 ends */
2428
2429   resume_scheduler(tid);
2430
2431   VG_(core_panic)("sigvgkill_handler couldn't return to the scheduler\n");
2432}
2433
2434static __attribute((unused))
2435void pp_ksigaction ( vki_sigaction_toK_t* sa )
2436{
2437   Int i;
2438   VG_(printf)("pp_ksigaction: handler %p, flags 0x%x, restorer %p\n",
2439               sa->ksa_handler,
2440               (UInt)sa->sa_flags,
2441#              if !defined(VGP_ppc32_aix5) && !defined(VGP_ppc64_aix5) && \
2442                  !defined(VGP_x86_darwin) && !defined(VGP_amd64_darwin)
2443                  sa->sa_restorer
2444#              else
2445                  (void*)0
2446#              endif
2447              );
2448   VG_(printf)("pp_ksigaction: { ");
2449   for (i = 1; i <= VG_(max_signal); i++)
2450      if (VG_(sigismember(&(sa->sa_mask),i)))
2451         VG_(printf)("%d ", i);
2452   VG_(printf)("}\n");
2453}
2454
2455/*
2456   Force signal handler to default
2457 */
2458void VG_(set_default_handler)(Int signo)
2459{
2460   vki_sigaction_toK_t sa;
2461
2462   sa.ksa_handler = VKI_SIG_DFL;
2463   sa.sa_flags = 0;
2464#  if !defined(VGP_ppc32_aix5) && !defined(VGP_ppc64_aix5) && \
2465      !defined(VGP_x86_darwin) && !defined(VGP_amd64_darwin)
2466   sa.sa_restorer = 0;
2467#  endif
2468   VG_(sigemptyset)(&sa.sa_mask);
2469
2470   VG_(do_sys_sigaction)(signo, &sa, NULL);
2471}
2472
2473/*
2474   Poll for pending signals, and set the next one up for delivery.
2475 */
2476void VG_(poll_signals)(ThreadId tid)
2477{
2478   vki_siginfo_t si, *sip;
2479   vki_sigset_t pollset;
2480   ThreadState *tst = VG_(get_ThreadState)(tid);
2481   vki_sigset_t saved_mask;
2482
2483   /* look for all the signals this thread isn't blocking */
2484   /* pollset = ~tst->sig_mask */
2485   VG_(sigcomplementset)( &pollset, &tst->sig_mask );
2486
2487   block_all_host_signals(&saved_mask); // protect signal queue
2488
2489   /* First look for any queued pending signals */
2490   sip = next_queued(tid, &pollset); /* this thread */
2491
2492   if (sip == NULL)
2493      sip = next_queued(0, &pollset); /* process-wide */
2494
2495   /* If there was nothing queued, ask the kernel for a pending signal */
2496   if (sip == NULL && VG_(sigtimedwait_zero)(&pollset, &si) > 0) {
2497      if (VG_(clo_trace_signals))
2498         VG_(dmsg)("poll_signals: got signal %d for thread %d\n",
2499                   si.si_signo, tid);
2500      sip = &si;
2501   }
2502
2503   if (sip != NULL) {
2504      /* OK, something to do; deliver it */
2505      if (VG_(clo_trace_signals))
2506         VG_(dmsg)("Polling found signal %d for tid %d\n", sip->si_signo, tid);
2507      if (!is_sig_ign(sip->si_signo))
2508	 deliver_signal(tid, sip, NULL);
2509      else if (VG_(clo_trace_signals))
2510         VG_(dmsg)("   signal %d ignored\n", sip->si_signo);
2511
2512      sip->si_signo = 0;	/* remove from signal queue, if that's
2513				   where it came from */
2514   }
2515
2516   restore_all_host_signals(&saved_mask);
2517}
2518
2519/* At startup, copy the process' real signal state to the SCSS.
2520   Whilst doing this, block all real signals.  Then calculate SKSS and
2521   set the kernel to that.  Also initialise DCSS.
2522*/
2523void VG_(sigstartup_actions) ( void )
2524{
2525   Int i, ret, vKI_SIGRTMIN;
2526   vki_sigset_t saved_procmask;
2527   vki_sigaction_fromK_t sa;
2528
2529   VG_(memset)(&scss, 0, sizeof(scss));
2530   VG_(memset)(&skss, 0, sizeof(skss));
2531
2532#  if defined(VKI_SIGRTMIN)
2533   vKI_SIGRTMIN = VKI_SIGRTMIN;
2534#  else
2535   vKI_SIGRTMIN = 0; /* eg Darwin */
2536#  endif
2537
2538   /* VG_(printf)("SIGSTARTUP\n"); */
2539   /* Block all signals.  saved_procmask remembers the previous mask,
2540      which the first thread inherits.
2541   */
2542   block_all_host_signals( &saved_procmask );
2543
2544   /* Copy per-signal settings to SCSS. */
2545   for (i = 1; i <= _VKI_NSIG; i++) {
2546      /* Get the old host action */
2547      ret = VG_(sigaction)(i, NULL, &sa);
2548
2549#     if defined(VGP_x86_darwin) || defined(VGP_amd64_darwin)
2550      /* apparently we may not even ask about the disposition of these
2551         signals, let alone change them */
2552      if (ret != 0 && (i == VKI_SIGKILL || i == VKI_SIGSTOP))
2553         continue;
2554#     endif
2555
2556      if (ret != 0)
2557	 break;
2558
2559      /* Try setting it back to see if this signal is really
2560	 available */
2561      if (vKI_SIGRTMIN > 0 /* it actually exists on this platform */
2562          && i >= vKI_SIGRTMIN) {
2563         vki_sigaction_toK_t tsa, sa2;
2564
2565	 tsa.ksa_handler = (void *)sync_signalhandler;
2566	 tsa.sa_flags = VKI_SA_SIGINFO;
2567#        if !defined(VGP_ppc32_aix5) && !defined(VGP_ppc64_aix5) && \
2568            !defined(VGP_x86_darwin) && !defined(VGP_amd64_darwin)
2569	 tsa.sa_restorer = 0;
2570#        endif
2571	 VG_(sigfillset)(&tsa.sa_mask);
2572
2573	 /* try setting it to some arbitrary handler */
2574	 if (VG_(sigaction)(i, &tsa, NULL) != 0) {
2575	    /* failed - not really usable */
2576	    break;
2577	 }
2578
2579         VG_(convert_sigaction_fromK_to_toK)( &sa, &sa2 );
2580	 ret = VG_(sigaction)(i, &sa2, NULL);
2581	 vg_assert(ret == 0);
2582      }
2583
2584      VG_(max_signal) = i;
2585
2586      if (VG_(clo_trace_signals) && VG_(clo_verbosity) > 2)
2587         VG_(printf)("snaffling handler 0x%lx for signal %d\n",
2588                     (Addr)(sa.ksa_handler), i );
2589
2590      scss.scss_per_sig[i].scss_handler  = sa.ksa_handler;
2591      scss.scss_per_sig[i].scss_flags    = sa.sa_flags;
2592      scss.scss_per_sig[i].scss_mask     = sa.sa_mask;
2593
2594      scss.scss_per_sig[i].scss_restorer = NULL;
2595#     if !defined(VGP_ppc32_aix5) && !defined(VGP_ppc64_aix5) && \
2596         !defined(VGP_x86_darwin) && !defined(VGP_amd64_darwin)
2597      scss.scss_per_sig[i].scss_restorer = sa.sa_restorer;
2598#     endif
2599
2600      scss.scss_per_sig[i].scss_sa_tramp = NULL;
2601#     if defined(VGP_x86_darwin) || defined(VGP_amd64_darwin)
2602      scss.scss_per_sig[i].scss_sa_tramp = NULL;
2603      /*sa.sa_tramp;*/
2604      /* We can't know what it was, because Darwin's sys_sigaction
2605         doesn't tell us. */
2606#     endif
2607   }
2608
2609   if (VG_(clo_trace_signals))
2610      VG_(dmsg)("Max kernel-supported signal is %d\n", VG_(max_signal));
2611
2612   /* Our private internal signals are treated as ignored */
2613   scss.scss_per_sig[VG_SIGVGKILL].scss_handler = VKI_SIG_IGN;
2614   scss.scss_per_sig[VG_SIGVGKILL].scss_flags   = VKI_SA_SIGINFO;
2615   VG_(sigfillset)(&scss.scss_per_sig[VG_SIGVGKILL].scss_mask);
2616
2617   /* Copy the process' signal mask into the root thread. */
2618   vg_assert(VG_(threads)[1].status == VgTs_Init);
2619   for (i = 2; i < VG_N_THREADS; i++)
2620      vg_assert(VG_(threads)[i].status == VgTs_Empty);
2621
2622   VG_(threads)[1].sig_mask = saved_procmask;
2623   VG_(threads)[1].tmp_sig_mask = saved_procmask;
2624
2625   /* Calculate SKSS and apply it.  This also sets the initial kernel
2626      mask we need to run with. */
2627   handle_SCSS_change( True /* forced update */ );
2628
2629   /* Leave with all signals still blocked; the thread scheduler loop
2630      will set the appropriate mask at the appropriate time. */
2631}
2632
2633/*--------------------------------------------------------------------*/
2634/*--- end                                                          ---*/
2635/*--------------------------------------------------------------------*/
2636