Changes for sony news laptop running news os 5.01.
authorChris Hanson <org/chris-hanson/cph>
Sat, 15 Jun 1991 00:41:05 +0000 (00:41 +0000)
committerChris Hanson <org/chris-hanson/cph>
Sat, 15 Jun 1991 00:41:05 +0000 (00:41 +0000)
14 files changed:
v7/src/microcode/cmpintmd/mips.h
v7/src/microcode/gccode.h
v7/src/microcode/oscond.h
v7/src/microcode/unxutl/config
v7/src/microcode/unxutl/ymkfile
v7/src/microcode/ux.h
v7/src/microcode/uxctty.c
v7/src/microcode/uxfile.c
v7/src/microcode/uxproc.c
v7/src/microcode/uxsig.c
v7/src/microcode/uxsock.c
v7/src/microcode/uxterm.c
v7/src/microcode/uxtrap.c
v7/src/microcode/uxtrap.h

index 090d987dad4e9c032e0eabcad1666cc552cd3afe..5e869dd21fdb4c61bcc768a3f3afc55b24d01ba9 100644 (file)
@@ -1,8 +1,8 @@
 /* -*-C-*-
 
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/microcode/cmpintmd/mips.h,v 1.7 1990/09/08 00:10:10 cph Rel $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/microcode/cmpintmd/mips.h,v 1.8 1991/06/15 00:40:07 cph Exp $
 
-Copyright (c) 1989, 1990 Massachusetts Institute of Technology
+Copyright (c) 1989-91 Massachusetts Institute of Technology
 
 This material was developed by the Scheme project at the Massachusetts
 Institute of Technology, Department of Electrical Engineering and
@@ -44,22 +44,40 @@ MIT in each case. */
 #ifndef CMPINT2_H_INCLUDED
 #define CMPINT2_H_INCLUDED
 
+#ifdef sonyrisc
+
 #include <sys/syscall.h>
 #include <sys/sysmips.h>
-#include <mips/cachectl.h>
+#include <sys/cachectl.h>
+
+extern void syscall ();
+
+#define ICACHEFLUSH(addr, nbytes)                                      \
+  syscall (SYS_sysmips, FLUSH_CACHE, (addr), (nbytes), ICACHE)
+
+#else /* not sonyrisc */
+
 #if 0
 
 /* advertised, but not provided */
 extern void cacheflush();
 
-#else
+#else /* not 0 */
+
+#include <sys/syscall.h>
+#include <sys/sysmips.h>
+#include <mips/cachectl.h>
 
 extern void syscall();
 
 #define cacheflush(addr,nbytes,cache)                                  \
-  syscall(SYS_sysmips, MIPS_CACHEFLUSH, (addr), (nbytes), (cache))
+  syscall (SYS_sysmips, MIPS_CACHEFLUSH, (addr), (nbytes), (cache))
 
-#endif
+#endif /* not 0 */
+
+#define ICACHEFLUSH(addr, nbytes) cacheflush ((addr), (nbytes), ICACHE)
+
+#endif /* not sonyrisc */
 
 #define COMPILER_NONE_TYPE                     0
 #define COMPILER_MC68020_TYPE                  1
@@ -103,12 +121,13 @@ typedef unsigned short format_word;
  */
 
 #define EXTRACT_ABSOLUTE_ADDRESS(target, address)                      \
-{ unsigned long jal_instr, *addr;                                      \
-                                                                       \
-  addr = (unsigned long *) (address);                                  \
-  jal_instr = *addr;                                                   \
-  (target) = (SCHEME_OBJECT) ((((long) address) & 0xF0000000) |                \
-                              ((jal_instr & 0x03FFFFFF) <<2));         \
+{                                                                      \
+  unsigned long * addr = ((unsigned long *) (address));                        \
+  unsigned long jal_instr = (*addr);                                   \
+  (target) =                                                           \
+    ((SCHEME_OBJECT)                                                   \
+     ((((long) (address)) & 0xF0000000) |                              \
+      ((jal_instr & 0x03FFFFFF) << 2)));                               \
 }
 
 #define JAL_OP         (003 << 26)
@@ -116,10 +135,8 @@ typedef unsigned short format_word;
 
 #define STORE_ABSOLUTE_ADDRESS(entry_point, address)                   \
 {                                                                      \
-  unsigned long *addr, ep;                                             \
-                                                                       \
-  ep = ((unsigned long) (entry_point));                                        \
-  addr = ((unsigned long *) (address));                                        \
+  unsigned long ep = ((unsigned long) (entry_point));                  \
+  unsigned long * addr = ((unsigned long *) (address));                        \
   if (((((long) addr) & 0xF0000000)                                    \
        != (((long) entry_point) & 0xF0000000))                         \
       || ((((long) addr) & 0x3) != 0))                                 \
@@ -128,7 +145,7 @@ typedef unsigned short format_word;
             "\nSTORE_ABSOLUTE_ADDRESS: Bad addr in JAL 0x%x, 0x%x\n",  \
             addr, ep);                                                 \
   }                                                                    \
-  *addr = JAL_INSTR (ep & 0x0FFFFFFF);                                 \
+  (*addr) = JAL_INSTR (ep & 0x0FFFFFFF);                               \
 }
 \f
 /* Compiled Code Register Conventions */
@@ -223,7 +240,7 @@ do {                                                                        \
 
 #define EXTRACT_CLOSURE_ENTRY_ADDRESS(real_entry_point, entry_point)   \
 {                                                                      \
-  EXTRACT_ABSOLUTE_ADDRESS(real_entry_point, entry_point);             \
+  EXTRACT_ABSOLUTE_ADDRESS (real_entry_point, entry_point);            \
 }
 
 /* This is the inverse of EXTRACT_CLOSURE_ENTRY_ADDRESS.
@@ -233,7 +250,7 @@ do {                                                                        \
 
 #define STORE_CLOSURE_ENTRY_ADDRESS(real_entry_point, entry_point)     \
 {                                                                      \
-  STORE_ABSOLUTE_ADDRESS(real_entry_point, entry_point);               \
+  STORE_ABSOLUTE_ADDRESS (real_entry_point, entry_point);              \
 }
 \f
 /* Trampolines
@@ -340,10 +357,38 @@ do {                                                                      \
      +0: JAL   destination
      +4: (unchanged)
      +6: ADDI 0, arg count
+
+   (big endian):
+
+   Before linking
+     +0: TC_SYMBOL || symbol address
+     +4: TC_FIXNUM || 0
+     +6: number of supplied arguments, +1
+
+   After linking
+     +0: JAL   destination
+     +4: ADDI 0, arg count
+     +6: (unchanged)
+
 */
 
+#ifdef MIPSEL
+
+#define MIPS_CACHE_ARITY_OFFSET 2
+#define MIPS_CACHE_CODE_OFFSET 7
+
+#else /* not MIPSEL */
+
+#define MIPS_CACHE_ARITY_OFFSET 3
+#define MIPS_CACHE_CODE_OFFSET 4
+
+#endif /* not MIPSEL */
+
 #define EXTRACT_EXECUTE_CACHE_ARITY(target, address)                   \
-{ (target) = (long) (((unsigned short *) (address))[2]);               \
+{                                                                      \
+  (target) =                                                           \
+    ((long)                                                            \
+     (((unsigned short *) (address)) [MIPS_CACHE_ARITY_OFFSET]));      \
 }
 
 #define EXTRACT_EXECUTE_CACHE_SYMBOL(target, address)                  \
@@ -357,7 +402,7 @@ do {                                                                        \
 
 #define EXTRACT_EXECUTE_CACHE_ADDRESS(target, address)                 \
 {                                                                      \
-  EXTRACT_ABSOLUTE_ADDRESS(target, address);                           \
+  EXTRACT_ABSOLUTE_ADDRESS (target, address);                          \
 }
 
 /* This is the inverse of EXTRACT_EXECUTE_CACHE_ADDRESS.
@@ -381,10 +426,8 @@ do {                                                                       \
 
 #define STORE_EXECUTE_CACHE_CODE(address)                              \
 {                                                                      \
-  char *opcode_addr;                                                   \
-                                                                       \
-  opcode_addr = (((char *) (address)) + 7);                            \
-  *opcode_addr = (ADDI_OPCODE << 2);                                   \
+  char * opcode_addr = (((char *) (address)) + MIPS_CACHE_CODE_OFFSET);        \
+  (*opcode_addr) = (ADDI_OPCODE << 2);                                 \
 }
 
 /* This flushes the Scheme portion of the I-cache.
@@ -394,21 +437,17 @@ do {                                                                      \
    processor might have old copies of.
  */
 
-#define FLUSH_I_CACHE()                                                        \
-do                                                                     \
+#define FLUSH_I_CACHE() do                                             \
 {                                                                      \
-  cacheflush (Heap_Bottom,                                             \
-             ((sizeof(SCHEME_OBJECT)) *                                \
-              (Heap_Top - Heap_Bottom)),                               \
-             ICACHE);                                                  \
-  cacheflush (Constant_Space,                                          \
-             ((sizeof(SCHEME_OBJECT)) *                                \
-              (Constant_Top - Constant_Space)),                        \
-             ICACHE);                                                  \
-  cacheflush (Stack_Pointer,                                           \
-             ((sizeof(SCHEME_OBJECT)) *                                \
-              (Stack_Top - Stack_Pointer)),                            \
-             ICACHE);                                                  \
+  ICACHEFLUSH (Heap_Bottom,                                            \
+              ((sizeof(SCHEME_OBJECT)) *                               \
+               (Heap_Top - Heap_Bottom)));                             \
+  ICACHEFLUSH (Constant_Space,                                         \
+              ((sizeof(SCHEME_OBJECT)) *                               \
+               (Constant_Top - Constant_Space)));                      \
+  ICACHEFLUSH (Stack_Pointer,                                          \
+              ((sizeof(SCHEME_OBJECT)) *                               \
+               (Stack_Top - Stack_Pointer)));                          \
 } while (0)
 
 
@@ -417,11 +456,9 @@ do                                                                 \
    Not needed during GC because FLUSH_I_CACHE will be used.
  */   
 
-#define FLUSH_I_CACHE_REGION(address, nwords)                          \
-do {                                                                   \
-  cacheflush ((address),                                               \
-             ((sizeof (long)) * (nwords)),                             \
-             ICACHE);                                                  \
+#define FLUSH_I_CACHE_REGION(address, nwords) do                       \
+{                                                                      \
+  ICACHEFLUSH ((address), ((sizeof (long)) * (nwords)));               \
 } while (0)
 \f
 /* Derived parameters and macros.
@@ -430,10 +467,8 @@ do {                                                                       \
    If they are not, the macros below may have to be changed as well.
  */
 
-#define COMPILED_ENTRY_OFFSET_WORD(entry)                               \
-  (((format_word *) (entry))[-1])
-#define COMPILED_ENTRY_FORMAT_WORD(entry)                               \
-  (((format_word *) (entry))[-2])
+#define COMPILED_ENTRY_OFFSET_WORD(entry) (((format_word *) (entry)) [-1])
+#define COMPILED_ENTRY_FORMAT_WORD(entry) (((format_word *) (entry)) [-2])
 
 /* The next one assumes 2's complement integers....*/
 #define CLEAR_LOW_BIT(word)                     ((word) & ((unsigned long) -2))
@@ -522,17 +557,18 @@ do {                                                                      \
     ((-1) << (size))))
 
 #define FORMAT_WORD_LOW_BYTE(word)                                      \
-  (SIGN_EXTEND_FIELD((((unsigned long) (word)) & 0xff), 8))
+  (SIGN_EXTEND_FIELD ((((unsigned long) (word)) & 0xff), 8))
 
 #define FORMAT_WORD_HIGH_BYTE(word)                                    \
-  (SIGN_EXTEND_FIELD((((unsigned long) (word)) >> 8),                  \
-                    (((sizeof (format_word)) * CHAR_BIT) - 8)))
+  (SIGN_EXTEND_FIELD                                                   \
+   ((((unsigned long) (word)) >> 8),                                   \
+    (((sizeof (format_word)) * CHAR_BIT) - 8)))
 
 #define COMPILED_ENTRY_FORMAT_HIGH(addr)                                \
-  (FORMAT_WORD_HIGH_BYTE(COMPILED_ENTRY_FORMAT_WORD(addr)))
+  (FORMAT_WORD_HIGH_BYTE (COMPILED_ENTRY_FORMAT_WORD (addr)))
 
 #define COMPILED_ENTRY_FORMAT_LOW(addr)                                 \
-  (FORMAT_WORD_LOW_BYTE(COMPILED_ENTRY_FORMAT_WORD(addr)))
+  (FORMAT_WORD_LOW_BYTE (COMPILED_ENTRY_FORMAT_WORD (addr)))
 
 #define FORMAT_BYTE_FRAMEMAX            0x7f
 
index 58f6b4e85aba0314b74508391744349afc345b1a..258694c22a4f194f0291b56f8d0c65f42e1e2994 100644 (file)
@@ -1,8 +1,8 @@
 /* -*-C-*-
 
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/microcode/gccode.h,v 9.42 1989/10/28 15:38:29 jinx Rel $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/microcode/gccode.h,v 9.43 1991/06/15 00:40:15 cph Exp $
 
-Copyright (c) 1987, 1988, 1989 Massachusetts Institute of Technology
+Copyright (c) 1987-91 Massachusetts Institute of Technology
 
 This material was developed by the Scheme project at the Massachusetts
 Institute of Technology, Department of Electrical Engineering and
@@ -35,6 +35,12 @@ MIT in each case. */
 /* This file contains the macros for use in code which does GC-like
    loops over memory.  It is only included in a few files, unlike
    gc.h which contains general purpose macros and constants. */
+
+#ifdef ENABLE_DEBUGGING_TOOLS
+#ifndef ENABLE_GC_DEBUGGING_TOOLS
+#define ENABLE_GC_DEBUGGING_TOOLS
+#endif
+#endif
 \f
 /* A SWITCH on GC types, duplicates information in GC_Type_Map[], but
    exists for efficiency reasons. Macros must be used by convention:
@@ -279,6 +285,36 @@ do                                                                 \
    Currently only compiled entry points point to the
    "middle" of vectors. */
 
+#ifdef ENABLE_GC_DEBUGGING_TOOLS
+
+#define CHECK_TRANSPORT_VECTOR_TERMINATION()                           \
+{                                                                      \
+  if (! ((To <= Scan)                                                  \
+        && (((Constant_Space <= To) && (To < Constant_Top))            \
+            ? ((Constant_Space <= Scan) && (Scan < Constant_Top))      \
+            : ((Heap_Bottom <= Scan) && (Scan < Heap_Top)))))          \
+    {                                                                  \
+      fprintf (stderr, "\nBad transport_vector limit:\n");             \
+      fprintf (stderr, "  limit = 0x%x\n", Scan);                      \
+      fprintf (stderr, "  Scan = 0x%x\n", Saved_Scan);                 \
+      fprintf (stderr, "  To = 0x%x\n", To);                           \
+      fflush (stderr);                                                 \
+      abort ();                                                                \
+    }                                                                  \
+  if ((OBJECT_DATUM (*Old)) > 65536)                                   \
+    {                                                                  \
+      fprintf (stderr, "\nWarning: copying large vector: %d\n",                \
+              (OBJECT_DATUM (*Old)));                                  \
+      fflush (stderr);                                                 \
+    }                                                                  \
+}
+
+#else /* not ENABLE_GC_DEBUGGING_TOOLS */
+
+#define CHECK_TRANSPORT_VECTOR_TERMINATION()
+
+#endif /* not ENABLE_GC_DEBUGGING_TOOLS */
+
 #define Real_Transport_Vector()                                                \
 {                                                                      \
   SCHEME_OBJECT *Saved_Scan;                                           \
@@ -295,6 +331,7 @@ do                                                                  \
         (OBJECT_DATUM (*Old)));                                        \
       gc_death (TERM_EXIT, gc_death_message_buffer, Saved_Scan, To);   \
     }                                                                  \
+  CHECK_TRANSPORT_VECTOR_TERMINATION ();                               \
   while (To != Scan)                                                   \
     (*To++) = (*Old++);                                                        \
   Scan = Saved_Scan;                                                   \
index 594075397e66f6a218b31a67414c59c86ec1c431..152724dacd2f7a85327d5c094024ada4370c7409 100644 (file)
@@ -1,8 +1,8 @@
 /* -*-C-*-
 
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/microcode/Attic/oscond.h,v 1.4 1991/01/16 00:34:45 cph Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/microcode/Attic/oscond.h,v 1.5 1991/06/15 00:40:20 cph Exp $
 
-Copyright (c) 1990, 1991 Massachusetts Institute of Technology
+Copyright (c) 1990-91 Massachusetts Institute of Technology
 
 This material was developed by the Scheme project at the Massachusetts
 Institute of Technology, Department of Electrical Engineering and
@@ -79,6 +79,11 @@ MIT in each case. */
 
 #endif /* __hpux */
 #endif /* _HPUX */
+  
+#ifdef _SYSV4
+#define _POSIX
+#define _SYSV3
+#endif
 
 #ifdef _SYSV3
 #define _SYSV
index 46bfc62b0dd8da339425cba98c46a624fafaec18..d80172a791ed99f8920be1b02578ee2653fec7ec 100755 (executable)
@@ -1,6 +1,6 @@
 #!/bin/sh
 # Configuration script for MIT Scheme
-# $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/microcode/unxutl/Attic/config,v 1.10 1990/12/29 21:06:46 cph Rel $
+# $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/microcode/unxutl/Attic/config,v 1.11 1991/06/15 00:40:12 cph Exp $
 # Modelled on the configuration script for GNU CC
 #   Copyright (C) 1988 Free Software Foundation, Inc.
 
@@ -67,6 +67,11 @@ case $# in
                machine_file=mips
                cmpint_file=cmpint-mips.h
                ;;
+       newslaptop)                     # sony news laptop
+               system_file=sysv4
+               machine_file=mips
+               cmpint_file=cmpint-mips.h
+               ;;
        hp9k300 | bobcat)               # HP9000 series 300
                system_file=hpux
                machine_file=hp9k300
index e9746b76eee45cdd88b2cd2b2acaa284f89c657f..0228a2905dfc0122acae4968330969ab1d1ba038 100644 (file)
@@ -1,6 +1,6 @@
 /* -*-C-*-
 
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/microcode/unxutl/Attic/ymkfile,v 1.43 1991/03/14 23:03:12 cph Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/microcode/unxutl/Attic/ymkfile,v 1.44 1991/06/15 00:41:05 cph Exp $
 
 Copyright (c) 1989-91 Massachusetts Institute of Technology
 
@@ -253,7 +253,7 @@ AS = as
 #define LIB_DEBUG
 #endif
 
-LDFLAGS = LD_SWITCH_SYSTEM LD_SWITCH_MACHINE
+LDFLAGS = LD_SWITCH_SYSTEM LD_SWITCH_MACHINE C_DEBUG_SWITCH
 
 CFLAGS = -DMIT_SCHEME C_OPTIMIZE_SWITCH C_DEBUG_SWITCH C_SWITCH_MACHINE C_SWITCH_SYSTEM C_SWITCH_FEATURES $(MACHINE_SWITCHES)
 
index 0afacf24dad651a3e74e5068652e16243e55af5a..0fee63576235ee41ecb029fffac324b6e4e58ba6 100644 (file)
@@ -1,6 +1,6 @@
 /* -*-C-*-
 
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/microcode/ux.h,v 1.22 1991/03/10 01:19:16 cph Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/microcode/ux.h,v 1.23 1991/06/15 00:40:24 cph Exp $
 
 Copyright (c) 1988-91 Massachusetts Institute of Technology
 
@@ -162,6 +162,14 @@ extern void EXFUN (error_system_call, (int code, enum syscall_names name));
 
 #ifdef _POSIX
 
+#ifdef sonyrisc
+/* <limits.h> will redefine these. */
+#undef DBL_MAX
+#undef DBL_MIN
+#undef FLT_MAX
+#undef FLT_MIN
+#endif
+
 #include <limits.h>
 #include <unistd.h>
 #include <time.h>
@@ -383,6 +391,61 @@ extern void EXFUN (error_system_call, (int code, enum syscall_names name));
 #define HAVE_VFORK
 
 #else /* not _AIX */
+#ifdef _SYSV4
+
+#define SYSTEM_VARIANT "ATT (Vr4)"
+
+#define HAVE_FIONREAD
+#define HAVE_GETTIMEOFDAY
+#define HAVE_ITIMER
+#define HAVE_NICE
+#define HAVE_PTYS
+#define HAVE_SELECT
+#define HAVE_SIGCONTEXT
+#define HAVE_SOCKETS
+#define HAVE_SYMBOLIC_LINKS
+#define HAVE_TRUNCATE
+#define HAVE_UNIX_SOCKETS
+#define HAVE_VFORK
+
+#include <stropts.h>
+
+#define PTY_DECLARATIONS                                               \
+  extern int EXFUN (grantpt, (int));                                   \
+  extern int EXFUN (unlockpt, (int));                                  \
+  extern char * EXFUN (ptsname, (int))
+
+#undef PTY_ITERATION
+
+#define PTY_MASTER_NAME_SPRINTF(master_name)                           \
+  sprintf ((master_name), "/dev/ptmx")
+
+#define PTY_SLAVE_NAME_SPRINTF(slave_name, fd)                         \
+{                                                                      \
+  grantpt (fd);                                                                \
+  unlockpt (fd);                                                       \
+  sprintf ((slave_name), "%s", (ptsname (fd)));                                \
+}
+
+/* Would be nice if HPUX and SYSV4 agreed on the name of this. */
+#define TIOCSIGSEND TIOCSIGNAL
+
+/* Must push various STREAMS modules onto the slave side of a PTY when
+   it is opened. */
+
+#define SLAVE_PTY_P(filename) ((strncmp ((filename), "/dev/pts/", 9)) == 0)
+
+#define SETUP_SLAVE_PTY(fd)                                            \
+  (((ioctl ((fd), I_PUSH, "ptem")) >= 0)                               \
+   && ((ioctl ((fd), I_PUSH, "ldterm")) >= 0)                          \
+   && ((ioctl ((fd), I_PUSH, "ttcompat")) >= 0))
+
+#else /* not _SYSV4 */
+#ifdef _SYSV3
+
+#define SYSTEM_VARIANT "ATT (Vr3)"
+
+#else /* not _SYSV3 */
 #ifdef _SYSV
 
 #define SYSTEM_VARIANT "ATT (V)"
@@ -399,11 +462,13 @@ extern void EXFUN (error_system_call, (int code, enum syscall_names name));
 
 #define SYSTEM_VARIANT "unknown"
 
-#endif /* _PIXEL */
-#endif /* _SYSV */
-#endif /* _AIX */
-#endif /* _HPUX */
-#endif /* _BSD */
+#endif /* not _PIXEL */
+#endif /* not _SYSV */
+#endif /* not _SYSV3 */
+#endif /* not _SYSV4 */
+#endif /* not _AIX */
+#endif /* not _HPUX */
+#endif /* not _BSD */
 \f
 #ifdef VOID_SIGNAL_HANDLERS
 typedef void Tsignal_handler_result;
index a586df50d7a2a17191e4aec1aca641c2d21882aa..005f7a5ff365db826a6902e92539ed7df3b5f188 100644 (file)
@@ -1,6 +1,6 @@
 /* -*-C-*-
 
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/microcode/uxctty.c,v 1.7 1991/03/01 00:56:02 cph Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/microcode/uxctty.c,v 1.8 1991/06/15 00:40:28 cph Exp $
 
 Copyright (c) 1990-91 Massachusetts Institute of Technology
 
@@ -263,13 +263,13 @@ DEFUN (ctty_get_interrupt_chars, (ic), Tinterrupt_chars * ic)
       (ic -> intrpt) = ((s . tio . c_cc) [VINTR]);
       (ic -> tstp) = ((s . tio . c_cc) [VSUSP]);
 
+#ifdef VDSUSP
+      (ic -> dtstp) = ((s . tio . c_cc) [VDSUSP]);
+#else /* not VDSUSP */
 #ifdef _HPUX
       (ic -> dtstp) = (s . ltc . t_dsuspc);
-#else /* not _HPUX */
-#ifdef _ULTRIX
-      (ic -> dtstp) = ((s . tio . c_cc) [VDSUSP]);
-#endif /* _ULTRIX */
-#endif /* not _HPUX */
+#endif /* _HPUX */
+#endif /* not VDSUSP */
 
 #else /* not HAVE_TERMIOS */
 #ifdef HAVE_TERMIO
@@ -328,14 +328,14 @@ DEFUN (ctty_set_interrupt_chars, (ic), Tinterrupt_chars * ic)
       ((s . tio . c_cc) [VQUIT]) = (ic -> quit);
       ((s . tio . c_cc) [VINTR]) = (ic -> intrpt);
       ((s . tio . c_cc) [VSUSP]) = (ic -> tstp);
+#ifdef VDSUSP
+      ((s . tio . c_cc) [VDSUSP]) = (ic -> dtstp);
+#else /* not VDSUSP */
 #ifdef _HPUX
       (s . ltc . t_suspc) = (ic -> tstp);
       (s . ltc . t_dsuspc) = (ic -> dtstp);
-#else /* not _HPUX */
-#ifdef _ULTRIX
-      ((s . tio . c_cc) [VDSUSP]) = (ic -> dtstp);
-#endif /* _ULTRIX */
-#endif /* not _HPUX */
+#endif /* _HPUX */
+#endif /* not VDSUSP */
 
 #else /* not HAVE_TERMIOS */
 #ifdef HAVE_TERMIO
index c12aa01be142814a25779c00838e897a6d6eb0fd..34dce435c85077a7ad96db7ce9d76ce8635e2751 100644 (file)
@@ -1,6 +1,6 @@
 /* -*-C-*-
 
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/microcode/uxfile.c,v 1.5 1991/05/10 00:07:27 cph Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/microcode/uxfile.c,v 1.6 1991/06/15 00:40:32 cph Exp $
 
 Copyright (c) 1990-91 Massachusetts Institute of Technology
 
@@ -80,6 +80,14 @@ DEFUN (open_file, (filename, oflag), CONST char * filename AND int oflag)
   int fd;
   STD_UINT_SYSTEM_CALL
     (syscall_open, fd, (UX_open (filename, oflag, MODE_REG)));
+#ifdef SLAVE_PTY_P
+  if ((SLAVE_PTY_P (filename)) && (! (SETUP_SLAVE_PTY (fd))))
+    {
+      int xerrno = errno;
+      UX_close (fd);
+      error_system_call (xerrno, syscall_open);
+    }
+#endif
   return (OS_open_fd (fd));
 }
 
index 92fea1d84d15c4510efe54b718fe0e3f5578efdd..a5166fe77525043c70cbb2dcf774f16b3765a09f 100644 (file)
@@ -1,6 +1,6 @@
 /* -*-C-*-
 
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/microcode/uxproc.c,v 1.10 1991/03/14 04:23:03 cph Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/microcode/uxproc.c,v 1.11 1991/06/15 00:40:36 cph Exp $
 
 Copyright (c) 1990-91 Massachusetts Institute of Technology
 
@@ -347,6 +347,9 @@ DEFUN (OS_make_subprocess,
          {
            int fd = (UX_open (ctty_name, O_RDWR, 0));
            if ((fd < 0)
+#ifdef SLAVE_PTY_P
+               || ((SLAVE_PTY_P (ctty_name)) && (! (SETUP_SLAVE_PTY (fd))))
+#endif
                || (! (isatty (fd)))
                || ((child_setup_tty (fd)) < 0))
              goto kill_child;
index ac22468b4446fe7dac172302a22602b01aff2dfc..55d848bb2a1d18862fd7a8339741519ce8c22adf 100644 (file)
@@ -1,6 +1,6 @@
 /* -*-C-*-
 
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/microcode/uxsig.c,v 1.8 1991/03/28 05:22:07 jinx Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/microcode/uxsig.c,v 1.9 1991/06/15 00:40:41 cph Exp $
 
 Copyright (c) 1990-91 Massachusetts Institute of Technology
 
@@ -52,6 +52,10 @@ DEFUN (current_handler, (signo), int signo)
   return (act . sa_handler);
 }
 
+#ifndef SA_SIGINFO
+#define SA_SIGINFO 0
+#endif
+
 static void
 DEFUN (INSTALL_HANDLER, (signo, handler),
        int signo AND
@@ -61,7 +65,7 @@ DEFUN (INSTALL_HANDLER, (signo, handler),
   (act . sa_handler) = handler;
   UX_sigemptyset (& (act . sa_mask));
   UX_sigaddset ((& (act . sa_mask)), signo);
-  (act . sa_flags) = 0;
+  (act . sa_flags) = SA_SIGINFO;
   UX_sigaction (signo, (&act), 0);
 }
 
@@ -262,9 +266,9 @@ DEFUN_VOID (initialize_signal_descriptors)
 
 #define DEFUN_STD_HANDLER(name, statement)                             \
 static Tsignal_handler_result                                          \
-DEFUN (name, (signo, code, pscp),                                      \
+DEFUN (name, (signo, info, pscp),                                      \
        int signo AND                                                   \
-       int code AND                                                    \
+       SIGINFO_T info AND                                              \
        struct SIGCONTEXT * pscp)                                       \
 {                                                                      \
   int STD_HANDLER_abortp;                                              \
@@ -287,9 +291,9 @@ struct handler_record
 
 #define DEFUN_STD_HANDLER(name, statement)                             \
 static Tsignal_handler_result                                          \
-DEFUN (name, (signo, code, pscp),                                      \
+DEFUN (name, (signo, info, pscp),                                      \
        int signo AND                                                   \
-       int code AND                                                    \
+       SIGINFO_T info AND                                              \
        struct SIGCONTEXT * pscp)                                       \
 {                                                                      \
   int STD_HANDLER_abortp;                                              \
@@ -470,14 +474,14 @@ DEFUN_STD_HANDLER (sighnd_fpe,
   {
     if (executing_scheme_primitive_p ())
       error_floating_point_exception ();
-    trap_handler ("floating-point exception", signo, code, scp);
+    trap_handler ("floating-point exception", signo, info, scp);
   })
 
 DEFUN_STD_HANDLER (sighnd_hardware_trap,
-  (trap_handler ("hardware fault", signo, code, scp)))
+  (trap_handler ("hardware fault", signo, info, scp)))
 
 DEFUN_STD_HANDLER (sighnd_software_trap,
-  (trap_handler ("system software fault", signo, code, scp)))
+  (trap_handler ("system software fault", signo, info, scp)))
 
 #ifdef HAVE_NICE
 
index acc1e76afd955570b2e3afee074f3dcb2c444b85..1d009c9c3853b6ed5b4e4777c88941fb88aa44b8 100644 (file)
@@ -1,8 +1,8 @@
 /* -*-C-*-
 
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/microcode/uxsock.c,v 1.3 1991/01/24 11:26:04 cph Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/microcode/uxsock.c,v 1.4 1991/06/15 00:40:46 cph Exp $
 
-Copyright (c) 1990-1 Massachusetts Institute of Technology
+Copyright (c) 1990-91 Massachusetts Institute of Technology
 
 This material was developed by the Scheme project at the Massachusetts
 Institute of Technology, Department of Electrical Engineering and
@@ -100,11 +100,10 @@ DEFUN (OS_get_host_by_name, (host_name), CONST char * host_name)
 #endif
 }
 
-#ifdef HAVE_UNIX_SOCKETS
-
 Tchannel
 DEFUN (OS_open_unix_stream_socket, (filename), CONST char * filename)
 {
+#ifdef HAVE_UNIX_SOCKETS
   int s;
   STD_UINT_SYSTEM_CALL
     (syscall_socket, s, (UX_socket (AF_UNIX, SOCK_STREAM, 0)));
@@ -116,9 +115,11 @@ DEFUN (OS_open_unix_stream_socket, (filename), CONST char * filename)
       (syscall_connect, (UX_connect (s, (&address), (sizeof (address)))));
   }
   MAKE_CHANNEL (s, channel_type_unix_stream_socket, return);
+#else /* not HAVE_UNIX_SOCKETS */
+  error_unimplemented_primitive ();
+  return (NO_CHANNEL);
+#endif /* not HAVE_UNIX_SOCKETS */
 }
-
-#endif /* HAVE_UNIX_SOCKETS */
 \f
 #ifndef SOCKET_LISTEN_BACKLOG
 #define SOCKET_LISTEN_BACKLOG 5
@@ -177,5 +178,61 @@ DEFUN (OS_server_connection_accept, (channel, peer_host, peer_port),
     (*peer_port) = (address . sin_port);
   MAKE_CHANNEL (s, channel_type_tcp_stream_socket, return);
 }
+\f
+#else /* not HAVE_SOCKETS */
+
+Tchannel
+DEFUN (OS_open_tcp_stream_socket, (host, port), char * host AND int port)
+{
+  error_unimplemented_primitive ();
+  return (NO_CHANNEL);
+}
+
+int
+DEFUN (OS_get_service_by_name, (service_name, protocol_name),
+       CONST char * service_name AND
+       CONST char * protocol_name)
+{
+  error_unimplemented_primitive ();
+  return (-1);
+}
+
+unsigned int
+DEFUN_VOID (OS_host_address_length)
+{
+  error_unimplemented_primitive ();
+  return (0);
+}
+
+char **
+DEFUN (OS_get_host_by_name, (host_name), CONST char * host_name)
+{
+  error_unimplemented_primitive ();
+  return (0);
+}
+
+Tchannel
+DEFUN (OS_open_unix_stream_socket, (filename), CONST char * filename)
+{
+  error_unimplemented_primitive ();
+  return (NO_CHANNEL);
+}
+
+Tchannel
+DEFUN (OS_open_server_socket, (port), int port)
+{
+  error_unimplemented_primitive ();
+  return (NO_CHANNEL);
+}
+
+Tchannel
+DEFUN (OS_server_connection_accept, (channel, peer_host, peer_port),
+       Tchannel channel AND
+       char * peer_host AND
+       int * peer_port)
+{
+  error_unimplemented_primitive ();
+  return (NO_CHANNEL);
+}
 
-#endif /* HAVE_SOCKETS */
+#endif /* not HAVE_SOCKETS */
index 8addbe1490d2d4e4a7c79e4fd24d2120cd32fdfb..cc514eadc4dd2fb283c5f4e74f628260af8f58a7 100644 (file)
@@ -1,6 +1,6 @@
 /* -*-C-*-
 
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/microcode/uxterm.c,v 1.14 1991/04/24 23:44:28 cph Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/microcode/uxterm.c,v 1.15 1991/06/15 00:40:50 cph Exp $
 
 Copyright (c) 1990-91 Massachusetts Institute of Technology
 
@@ -492,6 +492,31 @@ DEFUN_VOID (OS_have_ptys_p)
   return (1);
 }
 
+#ifdef FIRST_PTY_LETTER
+
+#define PTY_DECLARATIONS                                               \
+  int c;                                                               \
+  int i
+
+#define PTY_ITERATION                                                  \
+  for (c = FIRST_PTY_LETTER; (c <= 'z'); c += 1)                       \
+    for (i = 0; (i < 16); i += 1)
+
+#define PTY_MASTER_NAME_SPRINTF(master_name)                           \
+  sprintf ((master_name), "/dev/pty%c%x", c, i)
+
+#define PTY_SLAVE_NAME_SPRINTF(slave_name, fd)                         \
+{                                                                      \
+  sprintf ((slave_name), "/dev/tty%c%x", c, i)                         \
+  if ((UX_access ((slave_name), (R_OK | W_OK))) < 0)                   \
+    {                                                                  \
+      UX_close (fd);                                                   \
+      continue;                                                                \
+    }                                                                  \
+}
+
+#endif /* FIRST_PTY_LETTER */
+
 /* Open an available pty, putting channel in (*ptyv),
    and return the file name of the pty.
    Signal error if none available.  */
@@ -501,51 +526,36 @@ DEFUN (OS_open_pty_master, (master_fd, master_fname),
        Tchannel * master_fd AND
        CONST char ** master_fname)
 {
-  struct stat stb;
-  register int c;
-  register int i;
   static char master_name [24];
   static char slave_name [24];
   int fd;
+  PTY_DECLARATIONS;
+
 #ifdef PTY_ITERATION
   PTY_ITERATION
-#else
-  for (c = FIRST_PTY_LETTER; (c <= 'z'); c += 1)
-    for (i = 0; (i < 16); i += 1)
-#endif
-      {
-#ifdef PTY_NAME_SPRINTF
-       PTY_NAME_SPRINTF
-#else
-       sprintf (master_name, "/dev/pty%c%x", c, i);
 #endif
-      retry_open:
-       fd = (UX_open (master_name, O_RDWR, 0));
-       if (fd < 0)
-         {
-           if (errno == EACCES)
-             goto loser;
-           if (errno != EINTR)
-             continue;
-           deliver_pending_interrupts ();
-           goto retry_open;
-         }
-       /* check to make certain that both sides are available
-          this avoids a nasty yet stupid bug in rlogins */
-#ifdef PTY_TTY_NAME_SPRINTF
-       PTY_TTY_NAME_SPRINTF
-#else
-       sprintf (slave_name, "/dev/tty%c%x", c, i);
+    {
+      PTY_MASTER_NAME_SPRINTF (master_name);
+    retry_open:
+      fd = (UX_open (master_name, O_RDWR, 0));
+      if (fd < 0)
+       {
+         if (errno != EINTR)
+           {
+#ifdef PTY_ITERATION
+             if (errno != EACCES)
+               continue;
 #endif
-       if ((UX_access (slave_name, (R_OK | W_OK))) < 0)
-         {
-           UX_close (fd);
-           continue;
-         }
-       MAKE_CHANNEL (fd, channel_type_pty_master, (*master_fd) =);
-       (*master_fname) = master_name;
-       return (slave_name);
-      }
+             error_system_call (errno, syscall_open);
+           }
+         deliver_pending_interrupts ();
+         goto retry_open;
+       }
+      PTY_SLAVE_NAME_SPRINTF (slave_name, fd);
+      MAKE_CHANNEL (fd, channel_type_pty_master, (*master_fd) =);
+      (*master_fname) = master_name;
+      return (slave_name);
+    }
  loser:
   error_external_return ();
   return (0);
index 68f3d1a484323a7c86fca1f8aeea51800d1cda9e..9355ca21599858792465cf7ca3ed6aa92002f4ac 100644 (file)
@@ -1,8 +1,8 @@
 /* -*-C-*-
 
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/microcode/uxtrap.c,v 1.10 1991/05/07 17:33:39 jinx Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/microcode/uxtrap.c,v 1.11 1991/06/15 00:40:54 cph Exp $
 
-Copyright (c) 1990-1991 Massachusetts Institute of Technology
+Copyright (c) 1990-91 Massachusetts Institute of Technology
 
 This material was developed by the Scheme project at the Massachusetts
 Institute of Technology, Department of Electrical Engineering and
@@ -47,17 +47,20 @@ static enum trap_state user_trap_state;
 
 static enum trap_state saved_trap_state;
 static int saved_signo;
-static int saved_code;
+static SIGINFO_T saved_info;
 static struct FULL_SIGCONTEXT * saved_scp;
 
+static void EXFUN (initialize_ux_signal_codes, (void));
 static void EXFUN
-  (continue_from_trap, (int signo, int code, struct FULL_SIGCONTEXT * scp));
+  (continue_from_trap,
+   (int signo, SIGINFO_T info, struct FULL_SIGCONTEXT * scp));
 
 void
 DEFUN_VOID (UX_initialize_trap_recovery)
 {
   trap_state = trap_state_recover;
   user_trap_state = trap_state_recover;
+  initialize_ux_signal_codes ();
 }
 
 enum trap_state
@@ -98,16 +101,17 @@ DEFUN_VOID (trap_recover)
       EXIT_CRITICAL_SECTION ({});
     }
   reset_interruptable_extent ();
-  continue_from_trap (saved_signo, saved_code, saved_scp);
+  continue_from_trap (saved_signo, saved_info, saved_scp);
 }
 \f
 void
-DEFUN (trap_handler, (message, signo, code, scp),
+DEFUN (trap_handler, (message, signo, info, scp),
        CONST char * message AND
        int signo AND
-       int code AND
+       SIGINFO_T info AND
        struct FULL_SIGCONTEXT * scp)
 {
+  int code = (SIGINFO_CODE (info));
   Boolean constant_space_broken = (!(CONSTANT_SPACE_SEALED ()));
   enum trap_state old_trap_state = trap_state;
   trap_state = trap_state_trapped;
@@ -144,7 +148,7 @@ DEFUN (trap_handler, (message, signo, code, scp),
                   ">> [The earlier trap raised signal %d (%s), code %d.]\n",
                   saved_signo,
                   (find_signal_name (saved_signo)),
-                  saved_code);
+                  (SIGINFO_CODE (saved_info)));
          fputs (((WITHIN_CRITICAL_SECTION_P ())
                  ? ">> Successful recovery is extremely unlikely.\n"
                  : ">> Successful recovery is unlikely.\n"),
@@ -163,7 +167,7 @@ DEFUN (trap_handler, (message, signo, code, scp),
       {
        saved_trap_state = old_trap_state;
        saved_signo = signo;
-       saved_code = code;
+       saved_info = info;
        saved_scp = scp;
        trap_recover ();
       }
@@ -173,7 +177,7 @@ DEFUN (trap_handler, (message, signo, code, scp),
   fflush (stdout);
   saved_trap_state = old_trap_state;
   saved_signo = signo;
-  saved_code = code;
+  saved_info = info;
   saved_scp = scp;
   while (1)
     {
@@ -233,27 +237,42 @@ struct ux_sig_code_desc
   char *name;
 };
 
-DECLARE_UX_SIGNAL_CODES;
+static struct ux_sig_code_desc ux_signal_codes [64];
+
+#define DECLARE_UX_SIGNAL_CODE(s, m, v, n)                             \
+{                                                                      \
+  ((ux_signal_codes [i]) . signo) = (s);                               \
+  ((ux_signal_codes [i]) . code_mask) = (m);                           \
+  ((ux_signal_codes [i]) . code_value) = (v);                          \
+  ((ux_signal_codes [i]) . name) = (n);                                        \
+  i += 1;                                                              \
+}
+
+static void
+DEFUN_VOID (initialize_ux_signal_codes)
+{
+  unsigned int i = 0;
+  INITIALIZE_UX_SIGNAL_CODES ();
+  DECLARE_UX_SIGNAL_CODE (0, 0, 0, ((char *) 0));
+}
 
 static SCHEME_OBJECT
-DEFUN (find_signal_code_name, (signo, code),
+DEFUN (find_signal_code_name, (signo, info),
        int signo AND
-       int code)
+       SIGINFO_T info)
 {
   SCHEME_OBJECT codenam, codenum, result;
   struct ux_sig_code_desc *entry;
+  unsigned long code = (SIGINFO_CODE (info));
 
   for (entry = &ux_signal_codes[0];
        entry->signo != 0;
        entry += 1)
-  {
-    if ((entry->signo == signo) &&
-       (((entry->code_mask) & ((unsigned long) code)) ==
-        (entry->code_value)))
     {
-      break;
+      if ((entry->signo == signo)
+         && (((entry->code_mask) & code) == (entry->code_value)))
+       break;
     }
-  }
 
   codenam = ((entry->signo == 0)
             ? SHARP_F
@@ -268,10 +287,10 @@ DEFUN (find_signal_code_name, (signo, code),
 }
 \f
 static void
-DEFUN (setup_trap_frame, (signo, code, info, new_stack_pointer),
+DEFUN (setup_trap_frame, (signo, info, trinfo, new_stack_pointer),
        int signo AND
-       int code AND
-       struct trap_recovery_info * info AND
+       SIGINFO_T info AND
+       struct trap_recovery_info * trinfo AND
        SCHEME_OBJECT * new_stack_pointer)
 {
   SCHEME_OBJECT handler;
@@ -294,7 +313,7 @@ DEFUN (setup_trap_frame, (signo, code, info, new_stack_pointer),
     ((signo == 0)
      ? SHARP_F
      : (char_pointer_to_string (find_signal_name (signo))));
-  signal_code = (find_signal_code_name (signo, code));
+  signal_code = (find_signal_code_name (signo, info));
   History = (Make_Dummy_History ());
   if (!stack_recovered_p)
     {
@@ -308,10 +327,10 @@ DEFUN (setup_trap_frame, (signo, code, info, new_stack_pointer),
   else
     Stack_Pointer = new_stack_pointer;
  Will_Push ((6 + CONTINUATION_SIZE) + (STACK_ENV_EXTRA_SLOTS + 2));
-  STACK_PUSH (info -> extra_trap_info);
-  STACK_PUSH (info -> pc_info_2);
-  STACK_PUSH (info -> pc_info_1);
-  STACK_PUSH (info -> state);
+  STACK_PUSH (trinfo -> extra_trap_info);
+  STACK_PUSH (trinfo -> pc_info_2);
+  STACK_PUSH (trinfo -> pc_info_1);
+  STACK_PUSH (trinfo -> state);
   STACK_PUSH (BOOLEAN_TO_OBJECT (stack_recovered_p));
   STACK_PUSH (signal_code);
   STACK_PUSH (signal_name);
@@ -339,45 +358,45 @@ DEFUN (hard_reset, (scp), struct FULL_SIGCONTEXT * scp)
 void
 DEFUN_VOID (soft_reset)
 {
-  struct trap_recovery_info info;
+  struct trap_recovery_info trinfo;
   SCHEME_OBJECT * new_stack_pointer =
     (((Stack_Pointer <= Stack_Top) && (Stack_Pointer > Stack_Guard))
      ? Stack_Pointer
      : 0);
   if ((Regs[REGBLOCK_PRIMITIVE]) != SHARP_F)
     {
-      (info . state) = STATE_PRIMITIVE;
-      (info . pc_info_1) = (Regs[REGBLOCK_PRIMITIVE]);
-      (info . pc_info_2) =
+      (trinfo . state) = STATE_PRIMITIVE;
+      (trinfo . pc_info_1) = (Regs[REGBLOCK_PRIMITIVE]);
+      (trinfo . pc_info_2) =
        (LONG_TO_UNSIGNED_FIXNUM (Regs[REGBLOCK_LEXPR_ACTUALS]));
-      (info . extra_trap_info) = SHARP_F;
+      (trinfo . extra_trap_info) = SHARP_F;
     }
   else
     {
-      (info . state) = STATE_UNKNOWN;
-      (info . pc_info_1) = SHARP_F;
-      (info . pc_info_2) = SHARP_F;
-      (info . extra_trap_info) = SHARP_F;
+      (trinfo . state) = STATE_UNKNOWN;
+      (trinfo . pc_info_1) = SHARP_F;
+      (trinfo . pc_info_2) = SHARP_F;
+      (trinfo . extra_trap_info) = SHARP_F;
     }
   if ((Free >= Heap_Top) || (Free < Heap_Bottom))
     /* Let's hope this works. */
     Free = MemTop;
-  setup_trap_frame (0, 0, (&info), new_stack_pointer);
+  setup_trap_frame (0, 0, (&trinfo), new_stack_pointer);
 }
 
 #if !defined(HAVE_SIGCONTEXT) || !defined(HAS_COMPILER_SUPPORT) || defined(USE_STACKLETS)
 
 static void
-DEFUN (continue_from_trap, (signo, code, scp),
+DEFUN (continue_from_trap, (signo, info, scp),
        int signo AND
-       int code AND
+       SIGINFO_T info AND
        struct FULL_SIGCONTEXT * scp)
 {
   if (Free < MemTop)
   {
     Free = MemTop;
   }
-  setup_trap_frame (signo, code, (&dummy_recovery_info), 0);
+  setup_trap_frame (signo, info, (&dummy_recovery_info), 0);
 }
 
 #else /* HAVE_SIGCONTEXT and HAS_COMPILER_SUPPORT and not USE_STACKLETS */
@@ -427,9 +446,9 @@ extern long etext;
 #endif
 
 static void
-DEFUN (continue_from_trap, (signo, code, scp),
+DEFUN (continue_from_trap, (signo, info, scp),
        int signo AND
-       int code AND
+       SIGINFO_T info AND
        struct FULL_SIGCONTEXT * scp)
 {
   int pc_in_C;
@@ -443,7 +462,7 @@ DEFUN (continue_from_trap, (signo, code, scp),
   long the_pc = ((FULL_SIGCONTEXT_PC (scp)) & PC_VALUE_MASK);
   SCHEME_OBJECT * new_stack_pointer;
   SCHEME_OBJECT * xtra_info;
-  struct trap_recovery_info info;
+  struct trap_recovery_info trinfo;
 
 #if 0
   fprintf (stderr, "\ncontinue_from_trap:");
@@ -490,9 +509,9 @@ DEFUN (continue_from_trap, (signo, code, scp),
   if (pc_in_hyper_space || (pc_in_scheme && ALLOW_ONLY_C))
   {
     /* In hyper space. */
-    (info . state) = STATE_UNKNOWN;
-    (info . pc_info_1) = SHARP_F;
-    (info . pc_info_2) = SHARP_F;
+    (trinfo . state) = STATE_UNKNOWN;
+    (trinfo . pc_info_1) = SHARP_F;
+    (trinfo . pc_info_2) = SHARP_F;
     new_stack_pointer = 0;
     if ((Free < MemTop) ||
        (Free >= Heap_Top) ||
@@ -511,9 +530,9 @@ DEFUN (continue_from_trap, (signo, code, scp),
                           (pc_in_heap ? Heap_Bottom : Constant_Space)));
     if (block_addr == 0)
     {
-      (info . state) = STATE_PROBABLY_COMPILED;
-      (info . pc_info_1) = (LONG_TO_UNSIGNED_FIXNUM (the_pc));
-      (info . pc_info_2) = SHARP_F;
+      (trinfo . state) = STATE_PROBABLY_COMPILED;
+      (trinfo . pc_info_1) = (LONG_TO_UNSIGNED_FIXNUM (the_pc));
+      (trinfo . pc_info_2) = SHARP_F;
       if ((Free < MemTop) ||
          (Free >= Heap_Top) ||
          ((((unsigned long) Free) & SCHEME_ALIGNMENT_MASK) != 0))
@@ -521,10 +540,10 @@ DEFUN (continue_from_trap, (signo, code, scp),
     }
     else
     {
-      (info . state) = STATE_COMPILED_CODE;
-      (info . pc_info_1) =
+      (trinfo . state) = STATE_COMPILED_CODE;
+      (trinfo . pc_info_1) =
        (MAKE_POINTER_OBJECT (TC_COMPILED_CODE_BLOCK, block_addr));
-      (info . pc_info_2) =
+      (trinfo . pc_info_2) =
        (LONG_TO_UNSIGNED_FIXNUM (the_pc - ((long) block_addr)));
 #ifdef HAVE_FULL_SIGCONTEXT
       maybe_free = ((SCHEME_OBJECT *) (FULL_SIGCONTEXT_RFREE (scp)));
@@ -552,18 +571,18 @@ DEFUN (continue_from_trap, (signo, code, scp),
 
     if ((OBJECT_TYPE (primitive)) != TC_PRIMITIVE)
     {
-      (info . state) = STATE_UNKNOWN;
-      (info . pc_info_1) = SHARP_F;
-      (info . pc_info_2) = SHARP_F;
+      (trinfo . state) = STATE_UNKNOWN;
+      (trinfo . pc_info_1) = SHARP_F;
+      (trinfo . pc_info_2) = SHARP_F;
       new_stack_pointer = 0;
     }
     else
     {
       long primitive_address =
        ((long) (Primitive_Procedure_Table[OBJECT_DATUM (primitive)]));
-      (info . state) = STATE_PRIMITIVE;
-      (info . pc_info_1) = primitive;
-      (info . pc_info_2) =
+      (trinfo . state) = STATE_PRIMITIVE;
+      (trinfo . pc_info_1) = primitive;
+      (trinfo . pc_info_2) =
        (LONG_TO_UNSIGNED_FIXNUM (Regs[REGBLOCK_LEXPR_ACTUALS]));
     }
     if ((new_stack_pointer == 0)
@@ -580,7 +599,7 @@ DEFUN (continue_from_trap, (signo, code, scp),
   }
   xtra_info = Free;
   Free += (1 + 2 + PROCESSOR_NREGS);
-  (info . extra_trap_info) =
+  (trinfo . extra_trap_info) =
     (MAKE_POINTER_OBJECT (TC_NON_MARKED_VECTOR, xtra_info));
   (*xtra_info++) =
     (MAKE_OBJECT (TC_MANIFEST_NM_VECTOR, (2 + PROCESSOR_NREGS)));
@@ -604,7 +623,7 @@ DEFUN (continue_from_trap, (signo, code, scp),
   {
     (*xtra_info++) = ((SCHEME_OBJECT) the_pc);
   }
-  setup_trap_frame (signo, code, (&info), new_stack_pointer);
+  setup_trap_frame (signo, info, (&trinfo), new_stack_pointer);
 }
 \f
 /* Find the compiled code block in area which contains `pc_value'.
index c69426fdd5b64ae58f3dfffa16aadbad692e372d..4c2ed5ba00dcf15958751be2abb98250f502c2a1 100644 (file)
@@ -1,8 +1,8 @@
 /* -*-C-*-
 
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/microcode/uxtrap.h,v 1.6 1990/08/16 05:09:31 jinx Rel $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/microcode/uxtrap.h,v 1.7 1991/06/15 00:41:01 cph Exp $
 
-Copyright (c) 1990 Massachusetts Institute of Technology
+Copyright (c) 1990-91 Massachusetts Institute of Technology
 
 This material was developed by the Scheme project at the Massachusetts
 Institute of Technology, Department of Electrical Engineering and
@@ -54,24 +54,36 @@ MIT in each case. */
 #define FULL_SIGCONTEXT_RFREE(scp)     ((scp)->fs_regs[RFREE])
 #define FULL_SIGCONTEXT_FIRST_REG(scp) (&((scp)->fs_regs[GPR_START]))
 
-#define DECLARE_UX_SIGNAL_CODES                                                \
-static struct ux_sig_code_desc ux_signal_codes[] =                     \
+#define INITIALIZE_UX_SIGNAL_CODES()                                   \
 {                                                                      \
-  { SIGFPE, (~ 0L), 0, "software floating point exception" },          \
-  { SIGFPE, (~ 0L), 5, "integer divide by zero" },                     \
-  { SIGFPE, (1L << 15), (1L << 15), "branch/set on unordered" },       \
-  { SIGFPE, (1L << 14), (1L << 14), "signalling NAN" },                        \
-  { SIGFPE, (1L << 13), (1L << 13), "operand error" },                 \
-  { SIGFPE, (1L << 12), (1L << 12), "overflow" },                      \
-  { SIGFPE, (1L << 11), (1L << 11), "underflow" },                     \
-  { SIGFPE, (1L << 10), (1L << 10), "divide by zero" },                        \
-  { SIGFPE, (1L << 9), (1L << 9), "inexact operation" },               \
-  { SIGFPE, (1L << 8), (1L << 8), "inexact decimal input" },           \
-  { SIGILL, (~ 0L), 0, "illegal instruction" },                                \
-  { SIGILL, (~ 0L), 6, "check instruction" },                          \
-  { SIGILL, (~ 0L), 7, "TRAPV instruction" },                          \
-  { SIGILL, (~ 0L), 8, "priviledged instruction" },                    \
-  { 0, 0, 0, ((char *) NULL) }                                         \
+  DECLARE_UX_SIGNAL_CODE                                               \
+    (SIGFPE, (~ 0L), 0, "software floating point exception");          \
+  DECLARE_UX_SIGNAL_CODE                                               \
+    (SIGFPE, (~ 0L), 5, "integer divide by zero");                     \
+  DECLARE_UX_SIGNAL_CODE                                               \
+    (SIGFPE, (1L << 15), (1L << 15), "branch/set on unordered");       \
+  DECLARE_UX_SIGNAL_CODE                                               \
+    (SIGFPE, (1L << 14), (1L << 14), "signalling NAN");                        \
+  DECLARE_UX_SIGNAL_CODE                                               \
+    (SIGFPE, (1L << 13), (1L << 13), "operand error");                 \
+  DECLARE_UX_SIGNAL_CODE                                               \
+    (SIGFPE, (1L << 12), (1L << 12), "overflow");                      \
+  DECLARE_UX_SIGNAL_CODE                                               \
+    (SIGFPE, (1L << 11), (1L << 11), "underflow");                     \
+  DECLARE_UX_SIGNAL_CODE                                               \
+    (SIGFPE, (1L << 10), (1L << 10), "divide by zero");                        \
+  DECLARE_UX_SIGNAL_CODE                                               \
+    (SIGFPE, (1L << 9), (1L << 9), "inexact operation");               \
+  DECLARE_UX_SIGNAL_CODE                                               \
+    (SIGFPE, (1L << 8), (1L << 8), "inexact decimal input");           \
+  DECLARE_UX_SIGNAL_CODE                                               \
+    (SIGILL, (~ 0L), 0, "illegal instruction");                                \
+  DECLARE_UX_SIGNAL_CODE                                               \
+    (SIGILL, (~ 0L), 6, "check instruction");                          \
+  DECLARE_UX_SIGNAL_CODE                                               \
+    (SIGILL, (~ 0L), 7, "TRAPV instruction");                          \
+  DECLARE_UX_SIGNAL_CODE                                               \
+    (SIGILL, (~ 0L), 8, "privileged instruction");                     \
 }
 
 #endif /* hp9000s300 */
@@ -111,18 +123,24 @@ static struct ux_sig_code_desc ux_signal_codes[] =                        \
 
 #define PC_VALUE_MASK                  ((~0) << 2)
 
-#define DECLARE_UX_SIGNAL_CODES                                                \
-static struct ux_sig_code_desc ux_signal_codes[] =                     \
+#define INITIALIZE_UX_SIGNAL_CODES()                                   \
 {                                                                      \
-  { SIGFPE, (~ 0L), 12, "overflow trap" },                             \
-  { SIGFPE, (~ 0L), 13, "conditional trap" },                          \
-  { SIGFPE, (~ 0L), 22, "floating-point assist exception trap" },      \
-  { SIGFPE, (~ 0L), 22, "floating-point assist emulation trap" },      \
-  { SIGILL, (~ 0L), 8, "illegal instruction trap" },                   \
-  { SIGILL, (~ 0L), 9, "break instruction trap" },                     \
-  { SIGILL, (~ 0L), 10, "priviledged operation trap" },                        \
-  { SIGILL, (~ 0L), 11, "priviledged register trap" },                 \
-  { 0, 0, 0, ((char *) NULL) }                                         \
+  DECLARE_UX_SIGNAL_CODE                                               \
+    (SIGFPE, (~ 0L), 12, "overflow trap");                             \
+  DECLARE_UX_SIGNAL_CODE                                               \
+    (SIGFPE, (~ 0L), 13, "conditional trap");                          \
+  DECLARE_UX_SIGNAL_CODE                                               \
+    (SIGFPE, (~ 0L), 22, "floating-point assist exception trap");      \
+  DECLARE_UX_SIGNAL_CODE                                               \
+    (SIGFPE, (~ 0L), 22, "floating-point assist emulation trap");      \
+  DECLARE_UX_SIGNAL_CODE                                               \
+    (SIGILL, (~ 0L), 8, "illegal instruction trap");                   \
+  DECLARE_UX_SIGNAL_CODE                                               \
+    (SIGILL, (~ 0L), 9, "break instruction trap");                     \
+  DECLARE_UX_SIGNAL_CODE                                               \
+    (SIGILL, (~ 0L), 10, "privileged operation trap");                 \
+  DECLARE_UX_SIGNAL_CODE                                               \
+    (SIGILL, (~ 0L), 11, "privileged register trap");                  \
 }
 
 #endif /* hp9000s800 */
@@ -199,6 +217,7 @@ struct full_sigcontext
 #endif /* vax */
 
 #ifdef mips
+#ifndef _SYSV4
 
 /* Information on sigcontext structure in signal.h */
 
@@ -216,27 +235,101 @@ struct full_sigcontext
 #define FULL_SIGCONTEXT_NREGS          32
 #define PROCESSOR_NREGS                        32
 
-#define DECLARE_UX_SIGNAL_CODES                                           \
-static struct ux_sig_code_desc ux_signal_codes[14] =                      \
-{                                                                         \
-  { SIGFPE, (~ 0L), FPE_INTOVF_TRAP, "integer overflow trap" },           \
-  { SIGFPE, (~ 0L), FPE_INTDIV_TRAP, "integer divide by 0 trap" },        \
-  { SIGFPE, (~ 0L), FPE_FLTOVF_TRAP, "floating-point overflow trap"},     \
-  { SIGFPE, (~ 0L), FPE_FLTDIV_TRAP, "floating-point divide by 0 trap"},  \
-  { SIGFPE, (~ 0L), FPE_FLTUND_TRAP, "floating-point underflow trap"},    \
-  { SIGFPE, (~ 0L), FPE_DECOVF_TRAP, "decimal overflow trap"},            \
-  { SIGFPE, (~ 0L), FPE_SUBRNG_TRAP, "subscript-range trap"},             \
-  { SIGFPE, (~ 0L), FPE_FLTOVF_FAULT, "floating-point overflow fault"},   \
-  { SIGFPE, (~ 0L), FPE_FLTDIV_FAULT, "floating-point divide by 0 fault"},\
-  { SIGFPE, (~ 0L), FPE_FLTUND_FAULT, "floating-point underflow fault"},  \
-  { SIGILL, (~ 0L), ILL_PRIVIN_FAULT, "reserved instruction trap" },      \
-  { SIGILL, (~ 0L), ILL_RESOP_FAULT, "reserved operand trap" },           \
-  { SIGILL, (~ 0L), ILL_RESAD_FAULT, "reserved addressing trap" },        \
-  { 0, 0, 0, ((char *) NULL) }                                            \
+#define INITIALIZE_UX_SIGNAL_CODES()                                   \
+{                                                                      \
+  DECLARE_UX_SIGNAL_CODE                                               \
+    (SIGFPE, (~ 0L), FPE_INTOVF_TRAP, "integer overflow trap");                \
+  DECLARE_UX_SIGNAL_CODE                                               \
+    (SIGFPE, (~ 0L), FPE_INTDIV_TRAP, "integer divide by 0 trap");     \
+  DECLARE_UX_SIGNAL_CODE                                               \
+    (SIGFPE, (~ 0L), FPE_FLTOVF_TRAP, "floating-point overflow trap"); \
+  DECLARE_UX_SIGNAL_CODE                                               \
+    (SIGFPE, (~ 0L), FPE_FLTDIV_TRAP, "floating-point divide by 0 trap"); \
+  DECLARE_UX_SIGNAL_CODE                                               \
+    (SIGFPE, (~ 0L), FPE_FLTUND_TRAP, "floating-point underflow trap");        \
+  DECLARE_UX_SIGNAL_CODE                                               \
+    (SIGFPE, (~ 0L), FPE_DECOVF_TRAP, "decimal overflow trap");                \
+  DECLARE_UX_SIGNAL_CODE                                               \
+    (SIGFPE, (~ 0L), FPE_SUBRNG_TRAP, "subscript-range trap");         \
+  DECLARE_UX_SIGNAL_CODE                                               \
+    (SIGFPE, (~ 0L), FPE_FLTOVF_FAULT, "floating-point overflow fault"); \
+  DECLARE_UX_SIGNAL_CODE                                               \
+    (SIGFPE, (~ 0L), FPE_FLTDIV_FAULT, "floating-point divide by 0 fault"); \
+  DECLARE_UX_SIGNAL_CODE                                               \
+    (SIGFPE, (~ 0L), FPE_FLTUND_FAULT, "floating-point underflow fault"); \
+  DECLARE_UX_SIGNAL_CODE                                               \
+    (SIGILL, (~ 0L), ILL_PRIVIN_FAULT, "reserved instruction trap");   \
+  DECLARE_UX_SIGNAL_CODE                                               \
+    (SIGILL, (~ 0L), ILL_RESOP_FAULT, "reserved operand trap");                \
+  DECLARE_UX_SIGNAL_CODE                                               \
+    (SIGILL, (~ 0L), ILL_RESAD_FAULT, "reserved addressing trap");     \
+}
+
+#else /* _SYSV4 */
+
+/* Many of these definitions are not specific to the MIPS processor. */
+
+#include <sys/siginfo.h>
+#include <sys/ucontext.h>
+
+#define SIGINFO_T siginfo_t *
+#define SIGINFO_CODE(info) ((info) -> si_code)
+
+#define SIGCONTEXT ucontext
+#define SIGCONTEXT_SP(scp) ((((scp) -> uc_mcontext) . gpregs) [CXT_SP])
+#define SIGCONTEXT_PC(scp) ((((scp) -> uc_mcontext) . gpregs) [CXT_EPC])
+
+#define HAVE_FULL_SIGCONTEXT
+#define FULL_SIGCONTEXT_RFREE(scp) ((((scp) -> uc_mcontext) . gpregs) [CXT_T1])
+#define FULL_SIGCONTEXT_SCHSP(scp) ((((scp) -> uc_mcontext) . gpregs) [CXT_V1])
+#define FULL_SIGCONTEXT_FIRST_REG(scp) (((scp) -> uc_mcontext) . gpregs)
+#define FULL_SIGCONTEXT_NREGS          NGREG
+#define PROCESSOR_NREGS                        NGREG
+
+#define INITIALIZE_UX_SIGNAL_CODES()                                   \
+{                                                                      \
+  DECLARE_UX_SIGNAL_CODE                                               \
+    (SIGFPE, (~ 0L), FPE_INTDIV, "integer divide by 0 trap");          \
+  DECLARE_UX_SIGNAL_CODE                                               \
+    (SIGFPE, (~ 0L), FPE_INTOVF, "integer overflow trap");             \
+  DECLARE_UX_SIGNAL_CODE                                               \
+    (SIGFPE, (~ 0L), FPE_FLTDIV, "floating-point divide by 0 trap");   \
+  DECLARE_UX_SIGNAL_CODE                                               \
+    (SIGFPE, (~ 0L), FPE_FLTOVF, "floating-point overflow trap");      \
+  DECLARE_UX_SIGNAL_CODE                                               \
+    (SIGFPE, (~ 0L), FPE_FLTUND, "floating-point underflow trap");     \
+  DECLARE_UX_SIGNAL_CODE                                               \
+    (SIGFPE, (~ 0L), FPE_FLTRES, "floating-point inexact result");     \
+  DECLARE_UX_SIGNAL_CODE                                               \
+    (SIGFPE, (~ 0L), FPE_FLTSUB, "subscript-range trap");              \
+  DECLARE_UX_SIGNAL_CODE                                               \
+    (SIGFPE, (~ 0L), FPE_FLTINV, "invalid floating-point operation");  \
+  DECLARE_UX_SIGNAL_CODE                                               \
+    (SIGILL, (~ 0L), ILL_ILLOPC, "illegal opcode trap");               \
+  DECLARE_UX_SIGNAL_CODE                                               \
+    (SIGILL, (~ 0L), ILL_ILLOPN, "illegal operand trap");              \
+  DECLARE_UX_SIGNAL_CODE                                               \
+    (SIGILL, (~ 0L), ILL_ILLADR, "illegal addressing mode trap");      \
+  DECLARE_UX_SIGNAL_CODE                                               \
+    (SIGILL, (~ 0L), ILL_ILLTRP, "illegal trap");                      \
+  DECLARE_UX_SIGNAL_CODE                                               \
+    (SIGILL, (~ 0L), ILL_PRVOPC, "privileged opcode trap");            \
+  DECLARE_UX_SIGNAL_CODE                                               \
+    (SIGILL, (~ 0L), ILL_PRVREG, "privileged register trap");          \
+  DECLARE_UX_SIGNAL_CODE                                               \
+    (SIGILL, (~ 0L), ILL_COPROC, "co-processor trap");                 \
+  DECLARE_UX_SIGNAL_CODE                                               \
+    (SIGILL, (~ 0L), ILL_BADSTK, "bad stack trap");                    \
 }
 
+#endif /* _SYSV4 */
 #endif /* mips */
 
+#ifndef SIGINFO_T
+#define SIGINFO_T int
+#define SIGINFO_CODE(info) (info)
+#endif
+
 #ifndef SIGCONTEXT
 #define SIGCONTEXT             sigcontext
 #define SIGCONTEXT_SP(scp)     ((scp)->sc_sp)
@@ -270,13 +363,8 @@ static struct ux_sig_code_desc ux_signal_codes[14] =                      \
 #define FULL_SIGCONTEXT_SCHSP FULL_SIGCONTEXT_SP
 #endif
 
-#ifndef DECLARE_UX_SIGNAL_CODES
-
-#define DECLARE_UX_SIGNAL_CODES                                                \
-static struct ux_sig_code_desc ux_signal_codes[] =                     \
-{                                                                      \
-  { 0, 0, 0, ((char *) NULL) }                                         \
-}
+#ifndef INITIALIZE_UX_SIGNAL_CODES
+#define INITIALIZE_UX_SIGNAL_CODES()
 #endif
 \f
 enum trap_state
@@ -292,7 +380,10 @@ extern void EXFUN (initialize_trap_recovery, (char * C_sp));
 extern enum trap_state EXFUN (OS_set_trap_state, (enum trap_state state));
 extern void EXFUN
   (trap_handler,
-   (CONST char * message, int signo, int code, struct FULL_SIGCONTEXT * scp));
+   (CONST char * message,
+    int signo,
+    SIGINFO_T info,
+    struct FULL_SIGCONTEXT * scp));
 extern void EXFUN (hard_reset, (struct FULL_SIGCONTEXT * scp));
 extern void EXFUN (soft_reset, (void));