about summary refs log tree commit diff
path: root/sysdeps/unix/bsd/ultrix4/mips
diff options
context:
space:
mode:
authorRoland McGrath <roland@gnu.org>1995-02-18 01:27:10 +0000
committerRoland McGrath <roland@gnu.org>1995-02-18 01:27:10 +0000
commit28f540f45bbacd939bfd07f213bcad2bf730b1bf (patch)
tree15f07c4c43d635959c6afee96bde71fb1b3614ee /sysdeps/unix/bsd/ultrix4/mips
downloadglibc-28f540f45bbacd939bfd07f213bcad2bf730b1bf.tar.gz
glibc-28f540f45bbacd939bfd07f213bcad2bf730b1bf.tar.xz
glibc-28f540f45bbacd939bfd07f213bcad2bf730b1bf.zip
initial import
Diffstat (limited to 'sysdeps/unix/bsd/ultrix4/mips')
-rw-r--r--sysdeps/unix/bsd/ultrix4/mips/Dist1
-rw-r--r--sysdeps/unix/bsd/ultrix4/mips/Makefile3
-rw-r--r--sysdeps/unix/bsd/ultrix4/mips/__handler.S113
-rw-r--r--sysdeps/unix/bsd/ultrix4/mips/sigcontext.h60
-rw-r--r--sysdeps/unix/bsd/ultrix4/mips/sigtramp.c55
-rw-r--r--sysdeps/unix/bsd/ultrix4/mips/sigvec.S24
-rw-r--r--sysdeps/unix/bsd/ultrix4/mips/start.S77
-rw-r--r--sysdeps/unix/bsd/ultrix4/mips/vfork.S33
8 files changed, 366 insertions, 0 deletions
diff --git a/sysdeps/unix/bsd/ultrix4/mips/Dist b/sysdeps/unix/bsd/ultrix4/mips/Dist
new file mode 100644
index 0000000000..c2e8abb84d
--- /dev/null
+++ b/sysdeps/unix/bsd/ultrix4/mips/Dist
@@ -0,0 +1 @@
+sigtramp.c __handler.S
diff --git a/sysdeps/unix/bsd/ultrix4/mips/Makefile b/sysdeps/unix/bsd/ultrix4/mips/Makefile
new file mode 100644
index 0000000000..0b71fd9e18
--- /dev/null
+++ b/sysdeps/unix/bsd/ultrix4/mips/Makefile
@@ -0,0 +1,3 @@
+ifeq ($(subdir),signal)
+sysdep_routines := $(sysdep_routines) sigtramp __handler
+endif
diff --git a/sysdeps/unix/bsd/ultrix4/mips/__handler.S b/sysdeps/unix/bsd/ultrix4/mips/__handler.S
new file mode 100644
index 0000000000..3ea697c5a0
--- /dev/null
+++ b/sysdeps/unix/bsd/ultrix4/mips/__handler.S
@@ -0,0 +1,113 @@
+/* Copyright (C) 1992 Free Software Foundation, Inc.
+   Contributed by Brendan Kehoe (brendan@zen.org).
+   Also hacked by Ian Lance Taylor (ian@airs.com).
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA.  */
+
+#include <sysdep.h>
+
+/* This function saves all the registers, calls the
+   user function, and then executes a sigreturn system call.  The
+   sigreturn call wants the address of a sigcontext structure.  This
+   is all hideously system dependent and, for all intents and
+   purposes, undocumented.
+
+   When we enter here, a3 holds the user's signal handler.  We are
+   supposed to fill in the context given in a2, and then pass it and
+   the first two arguments to the user's function.  If the user's
+   function returns, we execute a sigreturn system call.
+
+   The sc_onstack, sc_mask and sc_pc elements of the context are
+   already set by the kernel.  For some reason we don't have to save
+   the floating point state or the coprocessor state; the kernel may
+   have saved them for us, or it doesn't use them.  */
+
+.set noat
+ENTRY (__handler)
+	/* Store zero and the asm temp reg.  */
+	sw $0, 12(a2)
+	sw AT, 16(a2)
+
+	/* Put v1 in sc_regs[3].  */
+	sw v1, 24(a2)
+
+	/* Save the caller saved registers in sc_regs[8..15].  */
+	sw t0, 44(a2)
+	sw t1, 48(a2)
+	sw t2, 52(a2)
+	sw t3, 56(a2)
+	sw t4, 60(a2)
+	sw t5, 64(a2)
+	sw t6, 68(a2)
+	sw t7, 72(a2)
+
+	/* Save the callee saved registers in sc_regs[16..23].  */
+	sw s0, 76(a2)
+	sw s1, 80(a2)
+	sw s2, 84(a2)
+	sw s3, 88(a2)
+	sw s4, 92(a2)
+	sw s5, 96(a2)
+	sw s6, 100(a2)
+	sw s7, 104(a2)
+
+	/* Save the code generator registers in sc_regs[24] & sc_regs[25].  */
+	sw t8, 108(a2)
+	sw t9, 112(a2)
+
+	/* Save the kernel temp regs in sc_regs[26] & sc_regs[27]. */
+	sw k0, 116(a2)
+	sw k1, 120(a2)
+
+	/* Save the global pointer in sc_regs[28].  */
+	sw gp, 124(a2)
+
+	/* ... and also the return address in sc_regs[31].  */
+	sw ra, 136(a2)
+
+	/* Note: we don't save the stack pointer in sc_regs[29];
+	   instead, we use the one that was already there.  */
+#if 0
+	sw sp, 128(a2)
+#endif
+
+	/* Save the floating pointer in sc_regs[30].  */
+	sw $fp, 132(a2)
+
+	/* Save the mul/div stuff in sc_mdlo and sc_mdhi.  */
+	mflo t0
+	sw t0, 140(a2)
+	mfhi t0
+	sw t0, 144(a2)
+
+	/* Move the stack up four.  This will save the context.  */
+	addu sp, sp, -32
+	sw a2, 16(sp)
+
+	/* Call their handler with the signal, code, and context; note
+	   this will clobber the context.  */
+	.set noreorder
+	jal ra, a3
+	nop
+	.set reorder
+
+	/* When we come back, restore the context and pass it right
+	   on into sigreturn().  */
+	lw a0, 16(sp)
+
+	/* Do a sigreturn syscall; this doesn't return.  */
+	la v0, __sigreturn
+	jal ra, v0
diff --git a/sysdeps/unix/bsd/ultrix4/mips/sigcontext.h b/sysdeps/unix/bsd/ultrix4/mips/sigcontext.h
new file mode 100644
index 0000000000..4bddcf2f4b
--- /dev/null
+++ b/sysdeps/unix/bsd/ultrix4/mips/sigcontext.h
@@ -0,0 +1,60 @@
+/* Copyright (C) 1992, 1994 Free Software Foundation, Inc.
+   Contributed by Brendan Kehoe (brendan@zen.org).
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA.  */
+
+/* Note that ANY change to this instantly implies a change to __handler.S.  */
+
+struct sigcontext
+  {
+    /* Nonzero if running on signal stack.  */
+    int sc_onstack;
+    
+    /* Signal mask to restore.  */
+    __sigset_t sc_mask;
+    
+    /* Program counter when the signal hit.  */
+    __ptr_t sc_pc;
+    
+    /* Registers 0 through 31.  */
+    int sc_regs[32];
+    
+    /* mul/div low and hi; these aren't part of a jmp_buf, but are part of the
+       sigcontext and are referenced from the signal trampoline code.  */
+    int sc_mdlo;
+    int sc_mdhi;
+    
+    /* Flag to see if the FP's been used.  */
+    int sc_ownedfp;
+    
+    /* Floating point registers 0 to 31.  */
+    int sc_fpregs[32];
+    /* Control & status register for FP.  */
+    int sc_fpc_csr;
+    
+    /* Exception instruction register for FP. */
+    int sc_fpc_eir;
+    
+    /* The coprocessor's cause register.  */
+    int sc_cause;
+    
+    /* CPU bad virtual address.  */
+    __ptr_t sc_badvaddr;
+    
+    /* CPU board bad physical address.  */
+    __ptr_t sc_badpaddr;
+  };
+
diff --git a/sysdeps/unix/bsd/ultrix4/mips/sigtramp.c b/sysdeps/unix/bsd/ultrix4/mips/sigtramp.c
new file mode 100644
index 0000000000..1bb208dd8b
--- /dev/null
+++ b/sysdeps/unix/bsd/ultrix4/mips/sigtramp.c
@@ -0,0 +1,55 @@
+/* Copyright (C) 1992 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA.  */
+
+/* The sigvec system call on MIPS Ultrix takes an additional
+   parameter, which is the address that is actually called when the
+   signal occurs.
+
+   When a signal occurs, we arrange for the kernel to call __handler.
+   That will save the frame and stack pointers into the context, and
+   then jump to this routine.  See __handler.S.
+
+   This code is based on sysdeps/unix/bsd/sun4/sigtramp.c, but it's
+   different because since we get passed the user signal handler we
+   don't actually need a trampoline.  */
+
+#include <ansidecl.h>
+#include <signal.h>
+#include <stddef.h>
+#include <errno.h>
+
+/* The user's signal handler is called with three arguments.  */
+typedef void (*handler_type) (int sig, int code, struct sigcontext *);
+
+/* Defined in __raw_sigvec.S.  */
+extern int EXFUN(__raw_sigvec, (int sig, CONST struct sigvec *vec,
+				struct sigvec *ovec,
+				void (*)(int sig, int code,
+					 struct sigcontext *,
+					 handler_type)));
+
+extern void EXFUN(__handler, (int sig, int code,
+			      struct sigcontext *,
+			      handler_type));
+
+int
+DEFUN(__sigvec, (sig, vec, ovec),
+      int sig AND CONST struct sigvec *vec AND struct sigvec *ovec)
+{
+  return __raw_sigvec (sig, vec, ovec, __handler);
+}
diff --git a/sysdeps/unix/bsd/ultrix4/mips/sigvec.S b/sysdeps/unix/bsd/ultrix4/mips/sigvec.S
new file mode 100644
index 0000000000..20a5dd1c49
--- /dev/null
+++ b/sysdeps/unix/bsd/ultrix4/mips/sigvec.S
@@ -0,0 +1,24 @@
+/* Copyright (C) 1991, 1992, 1995 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA.  */
+
+#include <sysdep.h>
+
+/* __sigvec is defined by sigtramp.c.  */
+
+PSEUDO (__raw_sigvec, sigvec, 3)
+	ret
diff --git a/sysdeps/unix/bsd/ultrix4/mips/start.S b/sysdeps/unix/bsd/ultrix4/mips/start.S
new file mode 100644
index 0000000000..ec0f9d833d
--- /dev/null
+++ b/sysdeps/unix/bsd/ultrix4/mips/start.S
@@ -0,0 +1,77 @@
+/* Copyright (C) 1993, 1995 Free Software Foundation, Inc.
+   Contributed by Brendan Kehoe (brendan@zen.org).
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA.  */
+
+#include <sysdep.h>
+
+#ifndef HAVE_WEAK_SYMBOLS
+#define __environ environ
+#else
+weak_alias (__environ, environ)
+#endif
+
+.comm __environ,	4
+.comm errno,		4
+
+ENTRY(__start)
+  .set noreorder
+
+  /* The first thing on the stack is argc.  */
+  lw s0, 0(sp)
+  nop
+
+  /* Set up the global pointer.  */
+  la gp, _gp
+
+  /* Then set up argv.  */
+  addiu s1, sp, 4
+
+  /* To compute where envp is, first we have to jump ahead four
+     bytes from what argv was.  This will bring us ahead, so we don't
+     need to compute the NULL at the end of argv later.  */
+  addiu v1, s1, 4
+
+  /* Now, compute the space to skip given the number of arguments
+     we've got.  We do this by multiplying argc by 4.  */
+  sll v0, s0, 2
+
+  /* Now, add (argv+4) with the space to skip...that's envp.  */
+  addu s2, v1, v0
+
+  /* __environ = envp; */
+  sw s2, __environ
+
+  addiu sp, sp, -24
+
+  /* __libc_init (argc, argv, envp); */
+  move a0, s0
+  move a1, s1
+  jal __libc_init
+  move a2, s2
+
+  /* errno = 0; */
+  sw zero, errno
+
+  /* exit (main (argc, argv, envp)); */
+  move a0, s0
+  move a1, s1
+  jal main
+  move a2, s2
+
+  /* Make the value returned by main be the argument to exit.  */
+  jal exit
+  move a0, v0
diff --git a/sysdeps/unix/bsd/ultrix4/mips/vfork.S b/sysdeps/unix/bsd/ultrix4/mips/vfork.S
new file mode 100644
index 0000000000..37f6d8016d
--- /dev/null
+++ b/sysdeps/unix/bsd/ultrix4/mips/vfork.S
@@ -0,0 +1,33 @@
+/* Copyright (C) 1992, 1995 Free Software Foundation, Inc.
+   Contributed by Brendan Kehoe (brendan@zen.org).
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA.  */
+
+#include <sysdep.h>
+
+#ifndef        SYS_vfork
+#define        SYS_vfork      66
+#endif
+
+SYSCALL__ (vfork, 0)
+	beq v1, zero, parent /* Branch if parent.  */
+	nop
+	move v0, zero
+parent:
+	ret
+	nop
+
+weak_alias (__vfork, vfork)