From: Chris Hanson Date: Sat, 15 Jun 1991 00:41:05 +0000 (+0000) Subject: Changes for sony news laptop running news os 5.01. X-Git-Tag: 20090517-FFI~10512 X-Git-Url: https://birchwood-abbey.net/git?a=commitdiff_plain;h=9d2cba55451d84e4b30ba60dde6f4bbe5b00d2a8;p=mit-scheme.git Changes for sony news laptop running news os 5.01. --- diff --git a/v7/src/microcode/cmpintmd/mips.h b/v7/src/microcode/cmpintmd/mips.h index 090d987da..5e869dd21 100644 --- a/v7/src/microcode/cmpintmd/mips.h +++ b/v7/src/microcode/cmpintmd/mips.h @@ -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 #include -#include +#include + +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 +#include +#include 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); \ } /* 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); \ } /* 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) /* 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 diff --git a/v7/src/microcode/gccode.h b/v7/src/microcode/gccode.h index 58f6b4e85..258694c22 100644 --- a/v7/src/microcode/gccode.h +++ b/v7/src/microcode/gccode.h @@ -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 /* 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; \ diff --git a/v7/src/microcode/oscond.h b/v7/src/microcode/oscond.h index 594075397..152724dac 100644 --- a/v7/src/microcode/oscond.h +++ b/v7/src/microcode/oscond.h @@ -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 diff --git a/v7/src/microcode/unxutl/config b/v7/src/microcode/unxutl/config index 46bfc62b0..d80172a79 100755 --- a/v7/src/microcode/unxutl/config +++ b/v7/src/microcode/unxutl/config @@ -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 diff --git a/v7/src/microcode/unxutl/ymkfile b/v7/src/microcode/unxutl/ymkfile index e9746b76e..0228a2905 100644 --- a/v7/src/microcode/unxutl/ymkfile +++ b/v7/src/microcode/unxutl/ymkfile @@ -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) diff --git a/v7/src/microcode/ux.h b/v7/src/microcode/ux.h index 0afacf24d..0fee63576 100644 --- a/v7/src/microcode/ux.h +++ b/v7/src/microcode/ux.h @@ -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 +/* will redefine these. */ +#undef DBL_MAX +#undef DBL_MIN +#undef FLT_MAX +#undef FLT_MIN +#endif + #include #include #include @@ -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 + +#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 */ #ifdef VOID_SIGNAL_HANDLERS typedef void Tsignal_handler_result; diff --git a/v7/src/microcode/uxctty.c b/v7/src/microcode/uxctty.c index a586df50d..005f7a5ff 100644 --- a/v7/src/microcode/uxctty.c +++ b/v7/src/microcode/uxctty.c @@ -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 diff --git a/v7/src/microcode/uxfile.c b/v7/src/microcode/uxfile.c index c12aa01be..34dce435c 100644 --- a/v7/src/microcode/uxfile.c +++ b/v7/src/microcode/uxfile.c @@ -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)); } diff --git a/v7/src/microcode/uxproc.c b/v7/src/microcode/uxproc.c index 92fea1d84..a5166fe77 100644 --- a/v7/src/microcode/uxproc.c +++ b/v7/src/microcode/uxproc.c @@ -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; diff --git a/v7/src/microcode/uxsig.c b/v7/src/microcode/uxsig.c index ac22468b4..55d848bb2 100644 --- a/v7/src/microcode/uxsig.c +++ b/v7/src/microcode/uxsig.c @@ -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 diff --git a/v7/src/microcode/uxsock.c b/v7/src/microcode/uxsock.c index acc1e76af..1d009c9c3 100644 --- a/v7/src/microcode/uxsock.c +++ b/v7/src/microcode/uxsock.c @@ -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 */ #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); } + +#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 */ diff --git a/v7/src/microcode/uxterm.c b/v7/src/microcode/uxterm.c index 8addbe149..cc514eadc 100644 --- a/v7/src/microcode/uxterm.c +++ b/v7/src/microcode/uxterm.c @@ -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); diff --git a/v7/src/microcode/uxtrap.c b/v7/src/microcode/uxtrap.c index 68f3d1a48..9355ca215 100644 --- a/v7/src/microcode/uxtrap.c +++ b/v7/src/microcode/uxtrap.c @@ -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); } 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), } 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); } /* Find the compiled code block in area which contains `pc_value'. diff --git a/v7/src/microcode/uxtrap.h b/v7/src/microcode/uxtrap.h index c69426fdd..4c2ed5ba0 100644 --- a/v7/src/microcode/uxtrap.h +++ b/v7/src/microcode/uxtrap.h @@ -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 +#include + +#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 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));