home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / mitsch75.zip / scheme-7_5_17-src.zip / scheme-7.5.17 / src / microcode / uxtrap.h < prev    next >
C/C++ Source or Header  |  2000-12-05  |  21KB  |  654 lines

  1. /* -*-C-*-
  2.  
  3. $Id: uxtrap.h,v 1.29 2000/12/05 21:23:49 cph Exp $
  4.  
  5. Copyright (c) 1990-2000 Massachusetts Institute of Technology
  6.  
  7. This program is free software; you can redistribute it and/or modify
  8. it under the terms of the GNU General Public License as published by
  9. the Free Software Foundation; either version 2 of the License, or (at
  10. your option) any later version.
  11.  
  12. This program is distributed in the hope that it will be useful, but
  13. WITHOUT ANY WARRANTY; without even the implied warranty of
  14. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  15. General Public License for more details.
  16.  
  17. You should have received a copy of the GNU General Public License
  18. along with this program; if not, write to the Free Software
  19. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  20. */
  21.  
  22. #ifndef SCM_UXTRAP_H
  23. #define SCM_UXTRAP_H
  24.  
  25. #include "os.h"
  26.  
  27. /* Machine/OS-dependent section (long) */
  28.  
  29. #if defined(hp9000s300) || defined(__hp9000s300)
  30.  
  31. #include <sys/sysmacros.h>
  32. #include <machine/sendsig.h>
  33. #include <machine/reg.h>
  34.  
  35. #define HAVE_FULL_SIGCONTEXT
  36. #define PROCESSOR_NREGS            16
  37. #define FULL_SIGCONTEXT_NREGS        GPR_REGS /* Missing sp */
  38.  
  39. #define RFREE                AR5
  40. #define SIGCONTEXT            full_sigcontext
  41. #define SIGCONTEXT_SP(scp)        ((scp)->fs_context.sc_sp)
  42. #define SIGCONTEXT_PC(scp)        ((scp)->fs_context.sc_pc)
  43. #define FULL_SIGCONTEXT_RFREE(scp)    ((scp)->fs_regs[RFREE])
  44. #define FULL_SIGCONTEXT_FIRST_REG(scp)    (&((scp)->fs_regs[GPR_START]))
  45.  
  46. #define INITIALIZE_UX_SIGNAL_CODES()                    \
  47. {                                    \
  48.   DECLARE_UX_SIGNAL_CODE                        \
  49.     (SIGFPE, (~ 0L), 0, "software floating point exception");        \
  50.   DECLARE_UX_SIGNAL_CODE                        \
  51.     (SIGFPE, (~ 0L), 5, "integer divide by zero");            \
  52.   DECLARE_UX_SIGNAL_CODE                        \
  53.     (SIGFPE, (1L << 15), (1L << 15), "branch/set on unordered");    \
  54.   DECLARE_UX_SIGNAL_CODE                        \
  55.     (SIGFPE, (1L << 14), (1L << 14), "signalling NAN");            \
  56.   DECLARE_UX_SIGNAL_CODE                        \
  57.     (SIGFPE, (1L << 13), (1L << 13), "operand error");            \
  58.   DECLARE_UX_SIGNAL_CODE                        \
  59.     (SIGFPE, (1L << 12), (1L << 12), "overflow");            \
  60.   DECLARE_UX_SIGNAL_CODE                        \
  61.     (SIGFPE, (1L << 11), (1L << 11), "underflow");            \
  62.   DECLARE_UX_SIGNAL_CODE                        \
  63.     (SIGFPE, (1L << 10), (1L << 10), "divide by zero");            \
  64.   DECLARE_UX_SIGNAL_CODE                        \
  65.     (SIGFPE, (1L << 9), (1L << 9), "inexact operation");        \
  66.   DECLARE_UX_SIGNAL_CODE                        \
  67.     (SIGFPE, (1L << 8), (1L << 8), "inexact decimal input");        \
  68.   DECLARE_UX_SIGNAL_CODE                        \
  69.     (SIGILL, (~ 0L), 0, "illegal instruction");                \
  70.   DECLARE_UX_SIGNAL_CODE                        \
  71.     (SIGILL, (~ 0L), 6, "check instruction");                \
  72.   DECLARE_UX_SIGNAL_CODE                        \
  73.     (SIGILL, (~ 0L), 7, "TRAPV instruction");                \
  74.   DECLARE_UX_SIGNAL_CODE                        \
  75.     (SIGILL, (~ 0L), 8, "privileged instruction");            \
  76. }
  77.  
  78. #endif /* hp9000s300 */
  79.  
  80. #if defined(hp9000s800) || defined(__hp9000s800)
  81.  
  82. /* The bottom 2 bits of the PC are protection bits.
  83.    They should be masked away before looking at the PC.
  84.  */
  85.  
  86. #define PC_VALUE_MASK            ((~0) << 2)
  87.  
  88. /* pcoq is the offset (32 bit in 64 bit virtual address space)
  89.    in the space included in the corresponding sc_pcsq.
  90.    head is the current instruction, tail is the next instruction
  91.    which is not necessarily the following instruction because
  92.    of delayed branching, etc.
  93.    Both queues need to be collected for some screw cases of
  94.    debugging and if there is ever a hope to restart the code.
  95.  */
  96.  
  97. #ifdef __HPUX__
  98.  
  99. /* HPUX 09.x does not have siginfo, but HPUX 10.x does.  This can be
  100. tested by the definition of SA_SIGINFO.  Since we want to support
  101. both, we use the no-siginfo way */
  102.  
  103. #ifdef SA_SIGINFO
  104. #undef SA_SIGINFO
  105. #endif
  106.  
  107. # include <sys/sysmacros.h>
  108.  
  109. /* See <machine/save_state.h> included by <signal.h> */
  110.  
  111. # define HAVE_FULL_SIGCONTEXT
  112.  
  113. # ifndef sc_pc
  114. #  define sc_pc                sc_pcoq_head
  115. # endif /* sc_pc */
  116.  
  117. # define ss_gr0                ss_flags    /* not really true */
  118. # define ss_rfree            ss_gr21        /* or some such */
  119. # define ss_schsp            ss_gr22
  120.  
  121. # define FULL_SIGCONTEXT_RFREE(scp)    ((scp)->sc_sl.sl_ss.ss_rfree)
  122. # define FULL_SIGCONTEXT_SCHSP(scp)    ((scp)->sc_sl.sl_ss.ss_schsp)
  123. # define FULL_SIGCONTEXT_FIRST_REG(scp)    (&((scp)->sc_sl.sl_ss.ss_gr0))
  124. # define FULL_SIGCONTEXT_NREGS        32
  125. # define PROCESSOR_NREGS        32
  126.  
  127. # define INITIALIZE_UX_SIGNAL_CODES()                    \
  128. {                                    \
  129.   DECLARE_UX_SIGNAL_CODE                        \
  130.     (SIGILL, (~ 0L), 8, "illegal instruction trap");            \
  131.   DECLARE_UX_SIGNAL_CODE                        \
  132.     (SIGILL, (~ 0L), 9, "break instruction trap");            \
  133.   DECLARE_UX_SIGNAL_CODE                        \
  134.     (SIGILL, (~ 0L), 10, "privileged operation trap");            \
  135.   DECLARE_UX_SIGNAL_CODE                        \
  136.     (SIGILL, (~ 0L), 11, "privileged register trap");            \
  137.   DECLARE_UX_SIGNAL_CODE                        \
  138.     (SIGFPE, (~ 0L), 12, "overflow trap");                \
  139.   DECLARE_UX_SIGNAL_CODE                        \
  140.     (SIGFPE, (~ 0L), 13, "conditional trap");                \
  141.   DECLARE_UX_SIGNAL_CODE                        \
  142.     (SIGFPE, (~ 0L), 14, "assist exception trap");            \
  143.   DECLARE_UX_SIGNAL_CODE                        \
  144.     (SIGFPE, (~ 0L), 22, "assist emulation trap");            \
  145. }
  146.  
  147. # define SPECIAL_SIGNAL_CODE_NAMES()                    \
  148. {                                    \
  149.   if ((signo == SIGFPE) && (code == 14))                \
  150.     switch ((((*scp) . sc_sl . sl_ss . ss_frexcp1) >> 26) & 0x3f)    \
  151.       {                                    \
  152.       case 0x20:                            \
  153.     name = "invalid operation";                    \
  154.     break;                                \
  155.       case 0x10:                            \
  156.     name = "divide by zero";                    \
  157.     break;                                \
  158.       case 0x08:                            \
  159.     name = "overflow";                        \
  160.     break;                                \
  161.       case 0x04:                            \
  162.       case 0x14:                            \
  163.       case 0x24:                            \
  164.       case 0x34:                            \
  165.     name = "underflow";                        \
  166.     break;                                \
  167.       case 0x02:                            \
  168.     name = "inexact";                        \
  169.     break;                                \
  170.       case 0x0a:                            \
  171.     name = "inexact and overflow";                    \
  172.     break;                                \
  173.       case 0x06:                            \
  174.       case 0x16:                            \
  175.       case 0x26:                            \
  176.       case 0x36:                            \
  177.     name = "inexact and underflow";                    \
  178.     break;                                \
  179.       }                                    \
  180. }
  181.  
  182. #else /* not __HPUX__, BSD ? */
  183.  
  184. # ifndef sc_pc
  185. #  define sc_pc                sc_pcoqh
  186. # endif /* sc_pc */
  187.  
  188. #endif /* __HPUX__ */
  189.  
  190. #endif /* hp9000s800 */
  191.  
  192. #ifdef sun3
  193.  
  194. #define HAVE_FULL_SIGCONTEXT
  195. #define PROCESSOR_NREGS            16
  196. #define FULL_SIGCONTEXT_NREGS        15        /* missing sp */
  197.  
  198. struct full_sigcontext
  199. {
  200.   struct sigcontext * fs_original;
  201.   int fs_regs[FULL_SIGCONTEXT_NREGS];
  202. };
  203.  
  204. #define RFREE                (8 + 5)        /* A5 */
  205. #define FULL_SIGCONTEXT            full_sigcontext
  206. #define FULL_SIGCONTEXT_SP(scp)        (scp->fs_original->sc_sp)
  207. #define FULL_SIGCONTEXT_PC(scp)        (scp->fs_original->sc_pc)
  208. #define FULL_SIGCONTEXT_RFREE(scp)    (scp->fs_regs[RFREE])
  209. #define FULL_SIGCONTEXT_FIRST_REG(scp)    (&((scp)->fs_regs[0]))
  210.  
  211. #define DECLARE_FULL_SIGCONTEXT(name)                    \
  212.   struct FULL_SIGCONTEXT name [1]
  213.  
  214. #define INITIALIZE_FULL_SIGCONTEXT(partial, full)            \
  215. {                                    \
  216.   static void EXFUN (sun3_save_regs, (int * regs));            \
  217.   sun3_save_regs (& ((((full) [0]) . fs_regs) [0]));            \
  218.   (((full) [0]) . fs_original) = (partial);                \
  219. }
  220.  
  221. #endif /* sun3 */
  222.  
  223. #ifdef vax
  224.  
  225. #define HAVE_FULL_SIGCONTEXT
  226. #define PROCESSOR_NREGS            16
  227. #define FULL_SIGCONTEXT_NREGS        16
  228.  
  229. struct full_sigcontext
  230. {
  231.   struct sigcontext * fs_original;
  232.   int fs_regs [FULL_SIGCONTEXT_NREGS];
  233. };
  234.  
  235. #define RFREE                12        /* fp */
  236. #define FULL_SIGCONTEXT            full_sigcontext
  237. #define FULL_SIGCONTEXT_SP(scp)        ((scp)->fs_original->sc_sp)
  238. #define FULL_SIGCONTEXT_PC(scp)        ((scp)->fs_original->sc_pc)
  239. #define FULL_SIGCONTEXT_RFREE(scp)    ((scp)->fs_regs[RFREE])
  240. #define FULL_SIGCONTEXT_FIRST_REG(scp)    (&((scp)->fs_regs[0]))
  241.  
  242. #define DECLARE_FULL_SIGCONTEXT(name)                    \
  243.   struct FULL_SIGCONTEXT name [1]
  244.  
  245. /* r0 has to be kludged. */
  246.  
  247. #define INITIALIZE_FULL_SIGCONTEXT(partial, full)            \
  248. {                                    \
  249.   static int EXFUN (vax_get_r0, (void));                \
  250.   static int * EXFUN (vax_save_start, (int * regs, int r0));        \
  251.   static void EXFUN                            \
  252.     (vax_save_finish, (int * fp,                    \
  253.                struct sigcontext * pscp,            \
  254.                struct full_sigcontext * scp));            \
  255.   vax_save_finish ((vax_save_start ((& ((((full) [0]) . fs_regs) [0])),    \
  256.                     (vax_get_r0 ()))),            \
  257.            (partial),                        \
  258.            (&(full)[0]));                    \
  259. }
  260.  
  261. #endif /* vax */
  262.  
  263. #ifdef mips
  264. #ifdef __IRIX__
  265.  
  266. /* Information on sigcontext structure in signal.h */
  267.  
  268. #ifndef sc_sp
  269. #define sc_sp                sc_regs[29]
  270. #endif
  271.  
  272. #define sc_rfree            sc_regs[9]
  273. #define sc_schsp            sc_regs[3]
  274.  
  275. #define HAVE_FULL_SIGCONTEXT
  276. #define FULL_SIGCONTEXT_RFREE(scp)    ((scp)->sc_rfree)
  277. #define FULL_SIGCONTEXT_SCHSP(scp)    ((scp)->sc_schsp)
  278. #define FULL_SIGCONTEXT_FIRST_REG(scp)    (&((scp)->sc_regs[0]))
  279. #define FULL_SIGCONTEXT_NREGS        32
  280. #define PROCESSOR_NREGS            32
  281.  
  282. #define INITIALIZE_UX_SIGNAL_CODES()                    \
  283. {                                    \
  284.   DECLARE_UX_SIGNAL_CODE                        \
  285.     (SIGTRAP, (~ 0L), BRK_OVERFLOW, "integer overflow trap");        \
  286.   DECLARE_UX_SIGNAL_CODE                        \
  287.     (SIGTRAP, (~ 0L), BRK_DIVZERO, "integer divide by 0 trap");        \
  288.   DECLARE_UX_SIGNAL_CODE                        \
  289.     (SIGTRAP, (~ 0L), BRK_MULOVF, "integer multiply overflow");        \
  290.   DECLARE_UX_SIGNAL_CODE                        \
  291.     (SIGFPE,  (  0L),       0,      "floating-point exception");    \
  292.   DECLARE_UX_SIGNAL_CODE                        \
  293.     (SIGSEGV, (~ 0L),       EFAULT,   "Invalid virtual address");    \
  294.   DECLARE_UX_SIGNAL_CODE                        \
  295.     (SIGSEGV, (~ 0L),       EACCES,   "Read-only address");        \
  296.   DECLARE_UX_SIGNAL_CODE                        \
  297.     (SIGSEGV, (~ 0L),       ENXIO,   "Read beyond mapped object");    \
  298. }
  299.  
  300. #else /* not __IRIX__ */
  301. #ifndef _SYSV4
  302.  
  303. /* Information on sigcontext structure in signal.h */
  304.  
  305. #ifndef sc_sp
  306. #define sc_sp                sc_regs[29]
  307. #endif
  308.  
  309. #define sc_rfree            sc_regs[9]
  310. #define sc_schsp            sc_regs[3]
  311.  
  312. #define HAVE_FULL_SIGCONTEXT
  313. #define FULL_SIGCONTEXT_RFREE(scp)    ((scp)->sc_rfree)
  314. #define FULL_SIGCONTEXT_SCHSP(scp)    ((scp)->sc_schsp)
  315. #define FULL_SIGCONTEXT_FIRST_REG(scp)    (&((scp)->sc_regs[0]))
  316. #define FULL_SIGCONTEXT_NREGS        32
  317. #define PROCESSOR_NREGS            32
  318.  
  319. #define INITIALIZE_UX_SIGNAL_CODES()                    \
  320. {                                    \
  321.   DECLARE_UX_SIGNAL_CODE                        \
  322.     (SIGFPE, (~ 0L), FPE_INTOVF_TRAP, "integer overflow trap");        \
  323.   DECLARE_UX_SIGNAL_CODE                        \
  324.     (SIGFPE, (~ 0L), FPE_INTDIV_TRAP, "integer divide by 0 trap");    \
  325.   DECLARE_UX_SIGNAL_CODE                        \
  326.     (SIGFPE, (~ 0L), FPE_FLTOVF_TRAP, "floating-point overflow trap");    \
  327.   DECLARE_UX_SIGNAL_CODE                        \
  328.     (SIGFPE, (~ 0L), FPE_FLTDIV_TRAP, "floating-point divide by 0 trap"); \
  329.   DECLARE_UX_SIGNAL_CODE                        \
  330.     (SIGFPE, (~ 0L), FPE_FLTUND_TRAP, "floating-point underflow trap");    \
  331.   DECLARE_UX_SIGNAL_CODE                        \
  332.     (SIGFPE, (~ 0L), FPE_DECOVF_TRAP, "decimal overflow trap");        \
  333.   DECLARE_UX_SIGNAL_CODE                        \
  334.     (SIGFPE, (~ 0L), FPE_SUBRNG_TRAP, "subscript-range trap");        \
  335.   DECLARE_UX_SIGNAL_CODE                        \
  336.     (SIGFPE, (~ 0L), FPE_FLTOVF_FAULT, "floating-point overflow fault"); \
  337.   DECLARE_UX_SIGNAL_CODE                        \
  338.     (SIGFPE, (~ 0L), FPE_FLTDIV_FAULT, "floating-point divide by 0 fault"); \
  339.   DECLARE_UX_SIGNAL_CODE                        \
  340.     (SIGFPE, (~ 0L), FPE_FLTUND_FAULT, "floating-point underflow fault"); \
  341.   DECLARE_UX_SIGNAL_CODE                        \
  342.     (SIGILL, (~ 0L), ILL_PRIVIN_FAULT, "reserved instruction trap");    \
  343.   DECLARE_UX_SIGNAL_CODE                        \
  344.     (SIGILL, (~ 0L), ILL_RESOP_FAULT, "reserved operand trap");        \
  345.   DECLARE_UX_SIGNAL_CODE                        \
  346.     (SIGILL, (~ 0L), ILL_RESAD_FAULT, "reserved addressing trap");    \
  347. }
  348.  
  349. #else /* _SYSV4 */
  350.  
  351. /* Many of these definitions are not specific to the MIPS processor. */
  352.  
  353. #include <sys/siginfo.h>
  354. #include <sys/ucontext.h>
  355.  
  356. /* For Sony NEWS-OS 5.0.1 and earlier: */
  357. #if defined(sonyrisc) && !defined(_CFE)
  358. #define gregs gpregs
  359. #endif
  360.  
  361. #define SIGINFO_T siginfo_t *
  362. #define SIGINFO_VALID_P(info) ((info) != 0)
  363. #define SIGINFO_CODE(info) ((info) -> si_code)
  364.  
  365. #define SIGCONTEXT ucontext
  366. #define SIGCONTEXT_SP(scp) ((((scp) -> uc_mcontext) . gregs) [CXT_SP])
  367. #define SIGCONTEXT_PC(scp) ((((scp) -> uc_mcontext) . gregs) [CXT_EPC])
  368.  
  369. #define HAVE_FULL_SIGCONTEXT
  370. #define FULL_SIGCONTEXT_RFREE(scp) ((((scp) -> uc_mcontext) . gregs) [CXT_T1])
  371. #define FULL_SIGCONTEXT_SCHSP(scp) ((((scp) -> uc_mcontext) . gregs) [CXT_V1])
  372. #define FULL_SIGCONTEXT_FIRST_REG(scp)    (((scp) -> uc_mcontext) . gregs)
  373. #define FULL_SIGCONTEXT_NREGS        NGREG
  374. #define PROCESSOR_NREGS            NGREG
  375.  
  376. #define INITIALIZE_UX_SIGNAL_CODES()                    \
  377. {                                    \
  378.   DECLARE_UX_SIGNAL_CODE                        \
  379.     (SIGFPE, (~ 0L), FPE_INTDIV, "integer divide by 0 trap");        \
  380.   DECLARE_UX_SIGNAL_CODE                        \
  381.     (SIGFPE, (~ 0L), FPE_INTOVF, "integer overflow trap");        \
  382.   DECLARE_UX_SIGNAL_CODE                        \
  383.     (SIGFPE, (~ 0L), FPE_FLTDIV, "floating-point divide by 0 trap");    \
  384.   DECLARE_UX_SIGNAL_CODE                        \
  385.     (SIGFPE, (~ 0L), FPE_FLTOVF, "floating-point overflow trap");    \
  386.   DECLARE_UX_SIGNAL_CODE                        \
  387.     (SIGFPE, (~ 0L), FPE_FLTUND, "floating-point underflow trap");    \
  388.   DECLARE_UX_SIGNAL_CODE                        \
  389.     (SIGFPE, (~ 0L), FPE_FLTRES, "floating-point inexact result");    \
  390.   DECLARE_UX_SIGNAL_CODE                        \
  391.     (SIGFPE, (~ 0L), FPE_FLTSUB, "subscript-range trap");        \
  392.   DECLARE_UX_SIGNAL_CODE                        \
  393.     (SIGFPE, (~ 0L), FPE_FLTINV, "invalid floating-point operation");    \
  394.   DECLARE_UX_SIGNAL_CODE                        \
  395.     (SIGILL, (~ 0L), ILL_ILLOPC, "illegal opcode trap");        \
  396.   DECLARE_UX_SIGNAL_CODE                        \
  397.     (SIGILL, (~ 0L), ILL_ILLOPN, "illegal operand trap");        \
  398.   DECLARE_UX_SIGNAL_CODE                        \
  399.     (SIGILL, (~ 0L), ILL_ILLADR, "illegal addressing mode trap");    \
  400.   DECLARE_UX_SIGNAL_CODE                        \
  401.     (SIGILL, (~ 0L), ILL_ILLTRP, "illegal trap");            \
  402.   DECLARE_UX_SIGNAL_CODE                        \
  403.     (SIGILL, (~ 0L), ILL_PRVOPC, "privileged opcode trap");        \
  404.   DECLARE_UX_SIGNAL_CODE                        \
  405.     (SIGILL, (~ 0L), ILL_PRVREG, "privileged register trap");        \
  406.   DECLARE_UX_SIGNAL_CODE                        \
  407.     (SIGILL, (~ 0L), ILL_COPROC, "co-processor trap");            \
  408.   DECLARE_UX_SIGNAL_CODE                        \
  409.     (SIGILL, (~ 0L), ILL_BADSTK, "bad stack trap");            \
  410. }
  411.  
  412. #endif /* _SYSV4 */
  413. #endif /* __IRIX__ */
  414. #endif /* mips */
  415.  
  416. #ifdef __IA32__
  417.  
  418. #ifdef __linux__
  419. /* Linux signal handlers are called with one argument -- the `signo'.
  420.    There's an alleged "iBCS signal stack" register dump just above it.
  421.    Thus, the fictitious `info' argument to the handler is actually the
  422.    first member of this register dump (described by struct
  423.    linux_sigcontext, below).  Unfortunately, kludging SIGINFO_CODE to
  424.    access the sc_trapno will fail later on when looking at the
  425.    saved_info. */
  426. #define SIGINFO_T long
  427. #define SIGINFO_VALID_P(info) (0)
  428. #define SIGINFO_CODE(info) (0)
  429.  
  430. /* Here's the "iBCS signal stack", whatever that means. */
  431. struct linux_sigcontext {
  432.   long sc_gs, sc_fs, sc_es, sc_ds, sc_edi, sc_esi, sc_ebp, sc_esp, sc_ebx;
  433.   long sc_edx, sc_ecx, sc_eax, sc_trapno, sc_err, sc_eip, sc_cs, sc_eflags;
  434.   long sc_esp_again, sc_ss;
  435. };
  436.  
  437. /* INITIALIZE_FULL_SIGCONTEXT gives us a chance to generate a pointer to
  438.    the register dump, since it is used at the beginning of STD_HANDLER's.
  439.    In terms of the expected arguments to the STD_ signal HANDLER's, the
  440.    register dump is right above `signo', at `info', one long below `pscp',
  441.    which is what INITIALIZE_FULL_SIGCONTEXT is getting for `partial'.
  442.    Thus, our pointer to a `full'_SIGCONTEXT is initialized to the address
  443.    of `partial' minus 1 long. */
  444. #define HAVE_FULL_SIGCONTEXT
  445. #define DECLARE_FULL_SIGCONTEXT(name)                    \
  446.   struct FULL_SIGCONTEXT * name
  447. #define INITIALIZE_FULL_SIGCONTEXT(partial, full)            \
  448.   ((full) = ((struct FULL_SIGCONTEXT *) (((long *)&(partial))-1)))
  449.  
  450. /* Grab them all.  Nobody looks at them, but grab them anyway. */
  451. #define PROCESSOR_NREGS            19
  452. #define FULL_SIGCONTEXT_NREGS        19
  453. #define FULL_SIGCONTEXT_FIRST_REG(scp)    (scp)
  454.  
  455. #define SIGCONTEXT            linux_sigcontext
  456. #define SIGCONTEXT_SP(scp)        ((scp)->sc_esp)
  457. #define SIGCONTEXT_PC(scp)        ((scp)->sc_eip)
  458.  
  459. #define FULL_SIGCONTEXT SIGCONTEXT
  460. #define FULL_SIGCONTEXT_SP SIGCONTEXT_SP
  461. #define FULL_SIGCONTEXT_PC SIGCONTEXT_PC
  462. #define FULL_SIGCONTEXT_RFREE(scp)    ((scp)->sc_edi)
  463.  
  464. #endif /* __linux__ */
  465.  
  466. #ifdef _MACH_UNIX
  467. /* The following are true for Mach (BSD 4.3 compatible).
  468.    I don't know about SCO or other versions.  */
  469.  
  470. #define HAVE_FULL_SIGCONTEXT
  471. #define PROCESSOR_NREGS            8
  472. #define FULL_SIGCONTEXT_NREGS        8
  473.  
  474. #define SIGCONTEXT            sigcontext
  475. #define SIGCONTEXT_SP(scp)        ((scp)->sc_esp)
  476. #define SIGCONTEXT_PC(scp)        ((scp)->sc_eip)
  477. #define FULL_SIGCONTEXT_RFREE(scp)    ((scp)->sc_edi)
  478. #define FULL_SIGCONTEXT_FIRST_REG(scp)    (&((scp)->sc_edi))
  479.  
  480. /* INITIALIZE_UX_SIGNAL_CODES should be defined. */
  481.  
  482. #endif /* _MACH_UNIX */
  483.  
  484. #endif /* __IA32__ */
  485.  
  486. #ifdef __alpha
  487.  
  488. #define sc_sp                sc_regs[30]
  489. #define sc_rfree            sc_regs[4]
  490. #define sc_schsp            sc_regs[2]
  491.  
  492. #define HAVE_FULL_SIGCONTEXT
  493. #define FULL_SIGCONTEXT_RFREE(scp)    ((scp)->sc_rfree)
  494. #define FULL_SIGCONTEXT_SCHSP(scp)    ((scp)->sc_schsp)
  495. #define FULL_SIGCONTEXT_FIRST_REG(scp)    (&((scp)->sc_regs[0]))
  496. #define FULL_SIGCONTEXT_NREGS        32
  497.  
  498. #define PROCESSOR_NREGS            32
  499.  
  500. #ifdef FPE_COMPLETE_FAULT
  501. #define STUPID_FIRST_SIGNAL()                        \
  502.   DECLARE_UX_SIGNAL_CODE                        \
  503.     (SIGFPE, (~ 0L), FPE_COMPLETE_FAULT, "software completion fault")
  504. #endif
  505.  
  506. #ifdef FPE_UNIMP_FAULT
  507. #define STUPID_FIRST_SIGNAL()                        \
  508.   DECLARE_UX_SIGNAL_CODE                        \
  509.     (SIGFPE, (~ 0L), FPE_UNIMP_FAULT, "unimplemented fp instruction fault")
  510. #endif
  511.  
  512. #ifndef STUPID_FIRST_SIGNAL
  513. #define STUPID_FIRST_SIGNAL()    { }
  514. #endif
  515.  
  516. #define INITIALIZE_UX_SIGNAL_CODES()                    \
  517. {                                                                       \
  518.   STUPID_FIRST_SIGNAL();                        \
  519.   DECLARE_UX_SIGNAL_CODE                        \
  520.     (SIGFPE, (~ 0L), FPE_INVALID_FAULT, "invalid operation fault");    \
  521.   DECLARE_UX_SIGNAL_CODE                        \
  522.     (SIGFPE, (~ 0L), FPE_INEXACT_FAULT, "floating-point inexact result");\
  523.   DECLARE_UX_SIGNAL_CODE                        \
  524.     (SIGFPE, (~ 0L), FPE_INTOVF_FAULT, "integer overflow fault");    \
  525. }
  526.  
  527. #endif /* __alpha */
  528.  
  529. #ifdef _AIX
  530. /* For now */
  531. #  define SIGCONTEXT        sigcontext
  532. #  define SIGCONTEXT_SP(scp)    0
  533. #  define SIGCONTEXT_PC(scp)    0
  534. #endif /* _AIX */
  535.  
  536. #ifndef SIGINFO_T
  537. #  define SIGINFO_T int
  538. #  define SIGINFO_VALID_P(info) (1)
  539. #  define SIGINFO_CODE(info) (info)
  540. #endif
  541.  
  542. #ifndef HAVE_STRUCT_SIGCONTEXT
  543.    struct sigcontext { long sc_sp; long sc_pc; };
  544. #endif
  545.  
  546. #ifndef SIGCONTEXT
  547. #  define SIGCONTEXT        sigcontext
  548. #  define SIGCONTEXT_SP(scp)    ((scp) -> sc_sp)
  549. #  define SIGCONTEXT_PC(scp)    ((scp) -> sc_pc)
  550. #endif
  551.  
  552. #ifndef FULL_SIGCONTEXT
  553. #  define FULL_SIGCONTEXT SIGCONTEXT
  554. #  define FULL_SIGCONTEXT_SP SIGCONTEXT_SP
  555. #  define FULL_SIGCONTEXT_PC SIGCONTEXT_PC
  556. #  define DECLARE_FULL_SIGCONTEXT(name) struct FULL_SIGCONTEXT * name
  557. #  define INITIALIZE_FULL_SIGCONTEXT(partial, full)            \
  558.      ((full) = ((struct FULL_SIGCONTEXT *) (partial)))
  559. #endif
  560.  
  561. #ifndef FULL_SIGCONTEXT_NREGS
  562. #  define FULL_SIGCONTEXT_NREGS 0
  563. #  define FULL_SIGCONTEXT_FIRST_REG(scp) ((int *) 0)
  564. #endif
  565.  
  566. #ifndef PROCESSOR_NREGS
  567. #  define PROCESSOR_NREGS 0
  568. #endif
  569.  
  570. #ifndef FULL_SIGCONTEXT_SCHSP
  571. #  define FULL_SIGCONTEXT_SCHSP FULL_SIGCONTEXT_SP
  572. #endif
  573.  
  574. #ifndef INITIALIZE_UX_SIGNAL_CODES
  575. #  define INITIALIZE_UX_SIGNAL_CODES()
  576. #endif
  577.  
  578. /* PCs must be aligned according to this. */
  579.  
  580. #define PC_ALIGNMENT_MASK        ((1 << PC_ZERO_BITS) - 1)
  581.  
  582. /* But they may have bits that can be masked by this. */
  583.  
  584. #ifndef PC_VALUE_MASK
  585. #define PC_VALUE_MASK            (~0)
  586. #endif
  587.  
  588. #ifdef HAS_COMPILER_SUPPORT
  589. # define ALLOW_ONLY_C 0
  590. #else
  591. # define ALLOW_ONLY_C 1
  592. # define PLAUSIBLE_CC_BLOCK_P(block) 0
  593. #endif
  594.  
  595. #ifndef _NEXTOS
  596. #ifdef _AIX
  597. extern int _etext;
  598. #define get_etext() (&_etext)
  599. #else /* not _AIX */
  600. #ifdef __linux__
  601. extern unsigned int etext;
  602. #else
  603. extern int etext;
  604. #endif
  605. #endif /* _AIX */
  606. #ifndef get_etext
  607. #  define get_etext() (&etext)
  608. #endif /* get_etext */
  609. #endif /* _NEXTOS */
  610.  
  611. /* Machine/OS-independent section */
  612.  
  613. enum trap_state
  614. {
  615.   trap_state_trapped,
  616.   trap_state_exit,
  617.   trap_state_suspend,
  618.   trap_state_query,
  619.   trap_state_recover,
  620.   trap_state_exitting_soft,
  621.   trap_state_exitting_hard
  622. };
  623.  
  624. extern void EXFUN (initialize_trap_recovery, (char * C_sp));
  625. extern enum trap_state EXFUN (OS_set_trap_state, (enum trap_state state));
  626. extern void EXFUN
  627.   (trap_handler,
  628.    (CONST char * message,
  629.     int signo,
  630.     SIGINFO_T info,
  631.     struct FULL_SIGCONTEXT * scp));
  632. extern void EXFUN (hard_reset, (struct FULL_SIGCONTEXT * scp));
  633. extern void EXFUN (soft_reset, (void));
  634.  
  635. #define STATE_UNKNOWN        (LONG_TO_UNSIGNED_FIXNUM (0))
  636. #define STATE_PRIMITIVE        (LONG_TO_UNSIGNED_FIXNUM (1))
  637. #define STATE_COMPILED_CODE    (LONG_TO_UNSIGNED_FIXNUM (2))
  638. #define STATE_PROBABLY_COMPILED    (LONG_TO_UNSIGNED_FIXNUM (3))
  639. #define STATE_BUILTIN        (LONG_TO_UNSIGNED_FIXNUM (4))
  640. #define STATE_UTILITY        (LONG_TO_UNSIGNED_FIXNUM (5))  /* CommGas? */
  641.  
  642. struct trap_recovery_info
  643. {
  644.   SCHEME_OBJECT state;
  645.   SCHEME_OBJECT pc_info_1;
  646.   SCHEME_OBJECT pc_info_2;
  647.   SCHEME_OBJECT extra_trap_info;
  648. };
  649.  
  650. extern SCHEME_OBJECT * EXFUN
  651.   (find_block_address, (char * pc_value, SCHEME_OBJECT * area_start));
  652.  
  653. #endif /* SCM_UXTRAP_H */
  654.