Initial revision

This commit is contained in:
Brendan Kehoe 1992-04-30 03:11:04 +00:00
parent e6eb480835
commit 92a3358cb9
7 changed files with 407 additions and 0 deletions

79
sysdeps/mips/__longjmp.c Normal file
View File

@ -0,0 +1,79 @@
/* Copyright (C) 1992 Free Software Foundation, Inc.
Contributed by Brendan Kehoe (brendan@cs.widener.edu).
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 <ansidecl.h>
#include <setjmp.h>
#include <stdlib.h>
#undef __longjmp
__NORETURN
void
DEFUN(__longjmp, (env, val_arg), CONST __jmp_buf env AND int val_arg)
{
/* gcc 1.39.19 miscompiled the longjmp routine (as it did setjmp before
the hack around it); force it to use $a1 for the longjmp value.
Without this it saves $a1 in a register which gets clobbered
along the way. */
register int val asm ("a1");
/* Pull back the floating point callee-saved registers. */
asm volatile ("l.d $f20, %0" : : "m" (env[0].__fpregs[0]));
asm volatile ("l.d $f22, %0" : : "m" (env[0].__fpregs[1]));
asm volatile ("l.d $f24, %0" : : "m" (env[0].__fpregs[2]));
asm volatile ("l.d $f26, %0" : : "m" (env[0].__fpregs[3]));
asm volatile ("l.d $f28, %0" : : "m" (env[0].__fpregs[4]));
asm volatile ("l.d $f30, %0" : : "m" (env[0].__fpregs[5]));
/* Restore the stack pointer. */
asm volatile ("lw $29, %0" : : "m" (env[0].__sp));
/* Get and reconstruct the floating point csr. */
asm volatile ("lw $2, %0" : : "m" (env[0].__fpc_csr));
asm volatile ("ctc1 $2, $31");
/* Get the FP. */
asm volatile ("lw $30, %0" : : "m" (env[0].__fp));
/* Get the GP. */
asm volatile ("lw $gp, %0" : : "m" (env[0].__gp));
/* Get the callee-saved registers. */
asm volatile ("lw $16, %0" : : "m" (env[0].__regs[0]));
asm volatile ("lw $17, %0" : : "m" (env[0].__regs[1]));
asm volatile ("lw $18, %0" : : "m" (env[0].__regs[2]));
asm volatile ("lw $19, %0" : : "m" (env[0].__regs[3]));
asm volatile ("lw $20, %0" : : "m" (env[0].__regs[4]));
asm volatile ("lw $21, %0" : : "m" (env[0].__regs[5]));
asm volatile ("lw $22, %0" : : "m" (env[0].__regs[6]));
asm volatile ("lw $23, %0" : : "m" (env[0].__regs[7]));
/* Get the PC. */
asm volatile ("lw $31, %0" : : "m" (env[0].__pc));
/* Give setjmp() 1 if given a 0, or what they gave us if non-zero. */
if (val == 0)
asm volatile ("li $2, 1");
else
asm volatile ("move $2, %0" : : "r" (val));
asm volatile ("j $31");
/* Follow the trend.. */
abort ();
}

27
sysdeps/mips/setjmp.S Normal file
View File

@ -0,0 +1,27 @@
/* 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. */
#include <sysdep.h>
/* The function __setjmp_aux saves all the registers, but it can't
reliably access the stack or frame pointers, so we pass them in as
extra arguments. */
ENTRY (__setjmp)
move a1, sp
move a2, $fp
j __setjmp_aux

65
sysdeps/mips/setjmp_aux.c Normal file
View File

@ -0,0 +1,65 @@
/* Copyright (C) 1992 Free Software Foundation, Inc.
Contributed by Brendan Kehoe (brendan@cs.widener.edu).
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 <ansidecl.h>
#include <setjmp.h>
/* This function is only called via the assembly language routine
__setjmp, which arranges to pass in the stack pointer and the frame
pointer. We do things this way because it's difficult to reliably
access them in C. */
int
DEFUN(__setjmp_aux, (env, sp, fp), __jmp_buf env AND int sp AND int fp)
{
/* Store the floating point callee-saved registers... */
asm volatile ("s.d $f20, %0" : : "m" (env[0].__fpregs[0]));
asm volatile ("s.d $f22, %0" : : "m" (env[0].__fpregs[1]));
asm volatile ("s.d $f24, %0" : : "m" (env[0].__fpregs[2]));
asm volatile ("s.d $f26, %0" : : "m" (env[0].__fpregs[3]));
asm volatile ("s.d $f28, %0" : : "m" (env[0].__fpregs[4]));
asm volatile ("s.d $f30, %0" : : "m" (env[0].__fpregs[5]));
/* .. and the PC; */
asm volatile ("sw $31, %0" : : "m" (env[0].__pc));
/* .. and the stack pointer; */
asm volatile ("sw %1, %0" : : "m" (env[0].__sp), "r" (sp));
/* .. and the FP; it'll be in s8. */
asm volatile ("sw %1, %0" : : "m" (env[0].__fp), "r" (fp));
/* .. and the GP; */
asm volatile ("sw $gp, %0" : : "m" (env[0].__gp));
/* .. and the callee-saved registers; */
asm volatile ("sw $16, %0" : : "m" (env[0].__regs[0]));
asm volatile ("sw $17, %0" : : "m" (env[0].__regs[1]));
asm volatile ("sw $18, %0" : : "m" (env[0].__regs[2]));
asm volatile ("sw $19, %0" : : "m" (env[0].__regs[3]));
asm volatile ("sw $20, %0" : : "m" (env[0].__regs[4]));
asm volatile ("sw $21, %0" : : "m" (env[0].__regs[5]));
asm volatile ("sw $22, %0" : : "m" (env[0].__regs[6]));
asm volatile ("sw $23, %0" : : "m" (env[0].__regs[7]));
/* .. and finally get and reconstruct the floating point csr. */
asm volatile ("cfc1 $2, $31");
asm volatile ("sw $2, %0" : : "m" (env[0].__fpc_csr));
return 0;
}

View File

@ -0,0 +1,6 @@
ifeq ($(subdir),signal)
sysdep_routines := $(sysdep_routines) sigtramp __handler
endif
ifeq ($(subdir),posix)
sysdep_routines := $(sysdep_routines) __getsysinf
endif

View File

@ -0,0 +1,109 @@
/* Copyright (C) 1992 Free Software Foundation, Inc.
Contributed by Brendan Kehoe (brendan@cs.widener.edu).
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, 48(a2)
sw t7, 52(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)
/* Save the floating pointer and the stack pointer in
sc_regs[29] and sc_regs[30]. */
sw sp, 128(a2)
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

View File

@ -0,0 +1,60 @@
/* Copyright (C) 1992 Free Software Foundation, Inc.
Contributed by Brendan Kehoe (brendan@cs.widener.edu).
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
{
/* onsigstack flag, for the sigstack state we should restore */
int sc_onstack;
/* signal mask to restore */
sigset_t sc_mask;
/* Program counter when the signal hit. */
int sc_pc;
/* registers 0 through 31 */
int sc_regs[32];
/* mul/div low and hi; these aren't part of a jmpbuf, 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. */
int sc_badvaddr;
/* CPU board bad physical address. */
int sc_badpaddr;
};

View File

@ -0,0 +1,61 @@
/* 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>
#ifndef __GNUC__
#error This file uses GNU C extensions; you must compile with GCC.
#endif
/* This will also get us sigcontext.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);
}