1#include <signal.h>
2#include <unistd.h>
3#include <stdlib.h>
4
5void foo (void);
6void bar (void);
7
8void subroutine (int);
9void handler (int);
10void have_a_very_merry_interrupt (void);
11
12int
13main ()
14{
15  foo ();   /* Put a breakpoint on foo() and call it to see a dummy frame */
16
17
18  have_a_very_merry_interrupt ();
19  return 0;
20}
21
22void
23foo (void)
24{
25}
26
27void
28bar (void)
29{
30  *(volatile char *)0 = 0;    /* try to cause a segfault */
31
32  /* On MMU-less system, previous memory access to address zero doesn't
33     trigger a SIGSEGV.  Trigger a SIGILL.  Each arch should define its
34     own illegal instruction here.  */
35#if defined(__arm__)
36  asm(".word 0xf8f00000");
37#elif defined(__TMS320C6X__)
38  asm(".word 0x56454313");
39#else
40#endif
41
42}
43
44void
45handler (int sig)
46{
47  subroutine (sig);
48}
49
50/* The first statement in subroutine () is a place for a breakpoint.
51   Without it, the breakpoint is put on the while comparison and will
52   be hit at each iteration. */
53
54void
55subroutine (int in)
56{
57  int count = in;
58  while (count < 100)
59    count++;
60}
61
62void
63have_a_very_merry_interrupt (void)
64{
65  signal (SIGALRM, handler);
66  alarm (1);
67  sleep (2);  /* We'll receive that signal while sleeping */
68}
69
70