/* -*-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
#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
*/
#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)
#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)) \
"\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 */
#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.
#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
+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) \
#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.
#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.
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)
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.
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))
((-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
/* -*-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
/* 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:
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; \
(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; \
/* -*-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
#endif /* __hpux */
#endif /* _HPUX */
+
+#ifdef _SYSV4
+#define _POSIX
+#define _SYSV3
+#endif
#ifdef _SYSV3
#define _SYSV
#!/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.
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
/* -*-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
#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)
/* -*-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
#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>
#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)"
#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;
/* -*-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
(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
((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
/* -*-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
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));
}
/* -*-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
{
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;
/* -*-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
return (act . sa_handler);
}
+#ifndef SA_SIGINFO
+#define SA_SIGINFO 0
+#endif
+
static void
DEFUN (INSTALL_HANDLER, (signo, handler),
int signo AND
(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);
}
#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; \
#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; \
{
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
/* -*-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
#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)));
(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
(*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 */
/* -*-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
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. */
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);
/* -*-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
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
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;
">> [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"),
{
saved_trap_state = old_trap_state;
saved_signo = signo;
- saved_code = code;
+ saved_info = info;
saved_scp = scp;
trap_recover ();
}
fflush (stdout);
saved_trap_state = old_trap_state;
saved_signo = signo;
- saved_code = code;
+ saved_info = info;
saved_scp = scp;
while (1)
{
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
}
\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;
((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)
{
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);
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 */
#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;
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:");
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) ||
(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))
}
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)));
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)
}
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)));
{
(*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'.
/* -*-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
#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 */
#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 */
#endif /* vax */
#ifdef mips
+#ifndef _SYSV4
/* Information on sigcontext structure in signal.h */
#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)
#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
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));