home *** CD-ROM | disk | FTP | other *** search
/ World of A1200 / World_Of_A1200.iso / programs / monitors / rsys / rsyssrc.lha / RSysSignalTrap.c < prev    next >
C/C++ Source or Header  |  1993-09-23  |  5KB  |  238 lines

  1. /*
  2. ***************************************************************************
  3. *
  4. * Datei:
  5. *      RSysSignalTrap.c
  6. *
  7. * Inhalt:
  8. *
  9. *      --- Globale Routinen ---
  10. *
  11. *    void HandleTrap ( int signal );
  12. *    void InstallTrapHandlers ( void );
  13. *    void RemoveTrapHandlers ( void );
  14. *    void _traphandler ( long sig );
  15. *
  16. *      --- Lokale  Routinen ---
  17. *
  18. *    static void ( *_sigfuncs [_NUMSIG ]);
  19. *    static void convert ( ULONG state , char *str );
  20. *
  21. * Bemerkungen:
  22. *      Verwaltung eines Traphandlers, um RSys wirklich (?) absturzsicher
  23. *      zu machen.
  24. *
  25. * Erstellungsdatum:
  26. *      07-Jul-93     Rolf Böhme
  27. *
  28. * Änderungen:
  29. *      07-Jul-93     Rolf Böhme      Erstellung
  30. *
  31. ***************************************************************************
  32. */
  33.  
  34. #include "RSys.h"
  35.  
  36. /*
  37. #define SIG_BEGINSSP         0
  38. #define SIG_BEGINPC            1
  39. #define SIG_BUSERROR         2
  40. #define SIG_ADDRERROR        3
  41. #define SIG_ILLCOMM            4
  42. #define SIG_DIVZERO            5
  43. #define SIG_CHKERROR         6
  44. #define SIG_TRAPV             7
  45. #define SIG_VIOLPRIV         8
  46. #define SIG_TRACE             9
  47. #define SIG_LINEAEMUL        10
  48. #define SIG_LINEFEMUL        11
  49. #define SIG_NOTDEF            12
  50. #define SIG_COPROPROT        13
  51. #define SIG_FORMATERR        14
  52. #define SIG_INTRFAIL         15
  53.  
  54. #define SIG_MC_ILLCOND        48
  55. #define SIG_MC_ILLRESULT    49
  56. #define SIG_MC_DIVZERO        50
  57. #define SIG_MC_UNDERFLOW    51
  58. #define SIG_MC_OPERROR        52
  59. #define SIG_MC_OVERFLOW     53
  60. #define SIG_MC_NANSIG        54
  61. #define SIG_MC_NOTDEF        55
  62. */
  63.  
  64. static void (*_sigfuncs[_NUMSIG])(int);
  65. int _trapexception(void);
  66. int _initfpu(void);
  67. void *_oldtrap, **_trapaddr;
  68.  
  69. static struct Task *tp;
  70.  
  71. char *TrapCPUMsg[] =
  72. {
  73.     "Begin of SSP (ISP by 680x0)",
  74.     "Begin of PC",
  75.     "Bus error",
  76.     "Address error",
  77.     "Illegal or unknown instruction",
  78.     "Division by zero or arithmetic fault",
  79.     "CHK and CHK2 affected",
  80.     "TRAP or TRAPV reached",
  81.     "Priviledge violation",
  82.     "Trace error",
  83.     "Line A Emulator, illegal Opcode by MC68000",
  84.     "Line F Emulator, illegal Opcode by MC68000",
  85.     "Error is reserved",
  86.     "Coprocessor protocol error",
  87.     "Format error by MC680x0",
  88.     "Uninitialized Interrupt"
  89. };
  90.  
  91.     /*
  92.      * convert() konvertiert eine 32Bit-Zahl in einen
  93.      * "Binärstring", also in einen String, der nur aus '0'
  94.      * und '1' besteht
  95.      */
  96. static void
  97. convert(ULONG state,char *str)
  98. {
  99.     register int bit;
  100.  
  101.     for( bit = 0; bit < 32; bit++ ) str[31-bit] = ((state & (1L<<bit)) ? '1' : '0');
  102.  
  103.     str[32] = STRINGEND;
  104.  
  105.    return;
  106. }
  107.  
  108.     /*
  109.      * HandleTrap() ist die Funktion, die im Falle eines
  110.      * System traps aktiviert wird. Diese Routine ruft
  111.      * entweder den System debugger ROMWack auf, oder
  112.      * verursacht einen Kaltstart des Rechners, falls dies
  113.      * gewünscht wird. Installiert wird diese Routine
  114.      * mit der ANSI-Routine signal() des
  115.      * Aztec-C-Compilers
  116.      */
  117. void
  118. HandleTrap(int signal)
  119. {
  120.     int action;
  121.     char exceptstr[33],signalstr[33],statestr[33];
  122.     UBYTE *fmt = (UBYTE *)"Error signal: %s (%ld)\n"
  123.                                   "Exception   : %s (0x%08lX)\n"
  124.                                   "Task signal : %s (0x%08lX)\n"
  125.                                   "CPU Status  : %s (0x%08lX)\n"
  126.                                  "Trap data   : %08lX\n"
  127.                                  "Except data : %08lX\n";
  128.     ULONG exc,sig,sta;
  129.     APTR UserStack;
  130.  
  131.     UserStack = SuperState();
  132.  
  133.     exc = SetExcept(0L,0L);
  134.     sig = SetSignal(0L,0L);
  135.     sta = SetSR(0L,0L);
  136.  
  137.     UserState(UserStack);
  138.  
  139.     convert(exc,exceptstr);
  140.     convert(sig,signalstr);
  141.     convert(sta,statestr);
  142.  
  143.     if(IntuitionBase != NULL)
  144.          action = MyEasyRequest(NULL,
  145.                             (UBYTE *)NAME " *** Emergency trap failure message ***",
  146.                             (UBYTE *)"Continue|Terminate RSys|Call system debugger|Reboot system",
  147.                             fmt, TrapCPUMsg[signal], signal,
  148.                             exceptstr,exc,signalstr,sig,statestr,sta,
  149.                      tp->tc_TrapData, tp->tc_ExceptData);
  150.     else
  151.     {
  152.         action = -1;
  153.       Printf(fmt,(ULONG)TrapCPUMsg[signal],signal,
  154.                         exceptstr,exc,signalstr,sig,statestr,sta,
  155.                       tp->tc_TrapData, tp->tc_ExceptData);
  156.     }
  157.  
  158.     switch(action)
  159.     {
  160.       case -1:
  161.          exit(0);
  162.          break;
  163.  
  164.         case 0:
  165.             ColdReboot();
  166.             break;
  167.  
  168.         case 1:
  169.             break;
  170.  
  171.         case 2:
  172.             CloseAll();
  173.             break;
  174.  
  175.         case 3:
  176.             Debug(0L);
  177.             CloseAll();
  178.             break;
  179.     }
  180.  
  181.     return;
  182. }
  183.  
  184.     /*
  185.      * InstallTrapHandlers() installiert einen Traphandler,
  186.      * der auf verschiedene Traps reagieren kann
  187.      */
  188. void
  189. InstallTrapHandlers(void)
  190. {
  191.     register int i;
  192.     extern struct ExecBase *SysBase;
  193.  
  194.     tp = FindTask(NULL);
  195.  
  196.    Forbid();
  197.  
  198.     _trapaddr = (void *)&tp->tc_TrapCode;
  199.     _oldtrap= tp->tc_TrapCode;
  200.  
  201.     tp->tc_TrapCode = (APTR)&_trapexception;
  202.  
  203.     if (SysBase->AttnFlags & AFF_68881) _initfpu();
  204.  
  205.     for(i = _FSTSIG; i <= _NUMSIG; i++) _sigfuncs[i] = HandleTrap;
  206.  
  207.    Permit();
  208.  
  209.     return;
  210. }
  211.  
  212. void
  213. RemoveTrapHandlers(void)
  214. {
  215.     register int i;
  216.  
  217.     Forbid();
  218.  
  219.     if (_trapaddr) *_trapaddr = _oldtrap;
  220.  
  221.     for(i = _FSTSIG; i <= _NUMSIG; i++) _sigfuncs[i] = NULL;
  222.  
  223.     Permit();
  224.  
  225.     return;
  226. }
  227.  
  228. void
  229. _traphandler(long sig)
  230. {
  231.     register void (*handler)(int);
  232.  
  233.     if ((handler = _sigfuncs[sig]) != NULL) (*handler)(sig);
  234.  
  235.     return;
  236. }
  237.  
  238.