home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 4 / DATAFILE_PDCD4.iso / unix / unixlib36d / src / sys / c / signal < prev    next >
Text File  |  1994-03-08  |  5KB  |  250 lines

  1. static char sccs_id[] = "@(#) signal.c 3.3 " __DATE__ " HJR";
  2.  
  3. /* signal.c (c) Copyright 1990 H.Rogers */
  4.  
  5. #include <signal.h>
  6. #include <stdio.h>
  7.  
  8. #include "sys/syslib.h"
  9. #include "sys/unix.h"
  10. #include "sys/os.h"
  11.  
  12. #include "errno.h"
  13.  
  14. void (*__sigvec[NSIG]) (int);
  15. void (*__sigdfl[NSIG]) (int) =
  16. {
  17.   SIG_IGN,            /*  0 SIG0 */
  18.     SIG_IGN,            /*  1 SIGHUP */
  19.     SIG_EXIT,            /*  2 SIGINT */
  20.     SIG_CORE,            /*  3 SIGQUIT */
  21.     SIG_CORE,            /*  4 SIGILL */
  22.     SIG_CORE,            /*  5 SIGTRAP */
  23.     SIG_EXIT,            /*  6 SIGABRT */
  24.     SIG_CORE,            /*  7 SIGEMT */
  25.     SIG_CORE,            /*  8 SIGFPE */
  26.     SIG_EXIT,            /*  9 SIGKILL */
  27.     SIG_CORE,            /* 10 SIGBUS */
  28.     SIG_CORE,            /* 11 SIGSEGV */
  29.     SIG_CORE,            /* 12 SIGSYS */
  30.     SIG_IGN,            /* 13 SIGPIPE */
  31.     SIG_IGN,            /* 14 SIGALRM */
  32.     SIG_EXIT,            /* 15 SIGTERM */
  33.     SIG_IGN,            /* 16 SIGUSR1 */
  34.     SIG_IGN,            /* 17 SIGUSR2 */
  35.     SIG_IGN,            /* 18 SIGCLD */
  36.     SIG_EXIT,            /* 19 SIGPWR */
  37.     SIG_IGN            /* 20 SIGERR */
  38. };
  39.  
  40. static void __sigign (int);    /* null handler */
  41. static void __sigerr (int);    /* error handler */
  42. static void __sigcore (int);    /* core dump handler */
  43. static void __sigexit (int);    /* exit handler */
  44.  
  45. static void (*__sigjmp[4]) (int) =
  46. {
  47.   __sigign,
  48.     __sigerr,
  49.     __sigexit,
  50.     __sigcore
  51. };
  52.  
  53. void (*signal (register int sig, register void (*f) (int))) (int)
  54. {
  55.   register void (*o) (int);
  56.  
  57.   if (sig < 0 || sig >= NSIG)
  58.     return (SIG_ERR);
  59.  
  60.   if ((int) f < 0)
  61.     f = __sigdfl[sig];
  62.  
  63.   o = __sigvec[sig];
  64.   if ((int) o < 4)
  65.     o = __sigjmp[(int) o];
  66.   __sigvec[sig] = f;
  67.  
  68.   return (o);
  69. }
  70.  
  71. /* If we get called due to a lack of stack,
  72.    stack checking could cause problems !!!
  73.    so disable it.
  74.  */
  75.  
  76. #pragma no_check_stack
  77.  
  78. int
  79. __raise (register int sig)
  80. {
  81.   register void (*f) (int);
  82.  
  83.   if (sig < 0 || sig >= NSIG)
  84.     return (-1);
  85.  
  86. #ifdef GCC_DEBUG
  87.   os_print ("\r\n");
  88.   os_print (sys_siglist[sig]);
  89.   os_print ("\r\n\n");
  90.   __core (0);
  91. #endif
  92.  
  93.   f = __sigvec[sig];
  94.   if ((int) f < 4)
  95.     f = __sigjmp[(int) f];
  96.   else
  97.     __sigvec[sig] = __sigdfl[sig];
  98.   (*f) (sig);
  99.  
  100.   return (0);
  101. }
  102.  
  103. int sys_nsig = NSIG;
  104.  
  105. char *sys_siglist[NSIG] =
  106. {
  107.   "SIGSTAK - Stack overflow",
  108.   "SIGHUP - Terminal hangup",
  109.   "SIGINT - Terminal interrupt",
  110.   "SIGQUIT - Terminal quit",
  111.   "SIGILL - Illegal instruction (FPE ?)",
  112.   "SIGTRAP - Trace trap",
  113.   "SIGABRT - Abort",
  114.   "SIGEMT - EMT trap",
  115.   "SIGFPE - Floating point exception",
  116.   "SIGKILL - Kill",
  117.   "SIGBUS - Bus error",
  118.   "SIGSEGV - Segmentation violation",
  119.   "SIGSYS - System call error (bad SWI)",
  120.   "SIGPIPE - Broken pipe",
  121.   "SIGALRM - Alarm",
  122.   "SIGTERM - Termination signal",
  123.   "SIGUSR1 - User signal 1",
  124.   "SIGUSR2 - User signal 2",
  125.   "SIGCLD - Child process dead",
  126.   "SIGPWR - Power failure",
  127.   "SIGERR - RiscOS Error"
  128. };
  129.  
  130. volatile int __sigrec;
  131.  
  132. static void
  133. __sigign (register int sig)
  134. {
  135.   sig = sig;
  136. }
  137. static void
  138. __sigerr (register int sig)
  139. {
  140.   sig = sig;
  141.   errno = ESIG;
  142. }
  143. static void
  144. __sigexit (register int sig)
  145. {
  146.   os_print ("\r\n");
  147.   os_print (sys_siglist[sig]);
  148.   os_print ("\r\n\n");
  149.  
  150.   if (__sigrec & (1 << sig))
  151.     {
  152.       __u = 0;
  153.       _exit (0);
  154.     }
  155.   __sigrec |= (1 << sig);
  156.  
  157.   _exit (0);
  158. }
  159. static void
  160. __sigcore (register int sig)
  161. {
  162.  
  163.   os_print ("\r\n");
  164.   os_print (sys_siglist[sig]);
  165.   os_print ("\r\n\n");
  166.  
  167.   if (__sigrec & (1 << sig))
  168.     {
  169.       __u = 0;
  170.       _exit (0);
  171.     }
  172.   __sigrec |= (1 << sig);
  173.  
  174.   __core (sig);
  175.   _exit (0);
  176. }
  177.  
  178. static char *__rname[16] =
  179. {
  180.   "a1", "a2", "a3", "a4",
  181.   "v1", "v2", "v3", "v4", "v5", "v6",
  182.   "sl", "fp", "ip", "sp", "lr", "pc"
  183. };
  184.  
  185. void
  186. __backtrace (register unsigned int *fp)
  187. {
  188.   register struct trace *f;
  189.   register unsigned int *pc;
  190.   register int i;
  191.   register char *n;
  192.  
  193.   os_print ("\rbacktrace:\r\n\n");
  194.  
  195.   while (fp)
  196.     {
  197.       f = (struct trace *) (fp - 3);
  198.       pc = (unsigned int *) ((unsigned int) f->pc & 0x03fffffcU);
  199.       if ((unsigned int) (f->fp) & 0x80000000U)
  200.     {
  201.       os_print ("\r\n\n pc: ");
  202.       os_prhex ((int) pc);
  203.       os_print (" sp: ");
  204.       os_prhex ((int) f->sp);
  205.       n = "?";        /* SJC */
  206.       for (i = -3; i > -7; i--)
  207.         if ((pc[i] & 0xffffff00U) == 0xff000000U)
  208.           {
  209.         n = (char *) (pc + i) - (pc[i] & 0xffU);
  210.         break;
  211.           }
  212.       os_print (" ");
  213.       os_print (n);        /* SJC */
  214.       os_print ("()\r\n");
  215.       fp++;
  216.       for (i = 0; i < 16; i++)
  217.         {
  218.           if (!(i & 3))
  219.         os_print ("\r\n ");
  220.           os_print (__rname[i]);
  221.           os_print (": ");
  222.           os_prhex (fp[i]);
  223.           os_print (" ");
  224.         }
  225.       os_print ("\r\n\n\n");
  226.       fp = (unsigned int *) ((unsigned int) (f->fp) & ~0x80000000U);
  227.     }
  228.       else
  229.     {
  230.       n = "?";
  231.       for (i = -3; i > -7; i--)
  232.         if ((pc[i] & 0xffffff00U) == 0xff000000U)
  233.           {
  234.         n = (char *) (pc + i) - (pc[i] & 0xffU);
  235.         break;
  236.           }
  237.       os_print (" pc: ");
  238.       os_prhex ((int) pc);
  239.       os_print (" sp: ");
  240.       os_prhex ((int) f->sp);
  241.       os_print (" ");
  242.       os_print (n);
  243.       os_print ("()\r\n");
  244.       fp = f->fp;
  245.     }
  246.     }
  247.   os_print ("\r\n");
  248. }
  249. #pragma check_stack
  250.