* commit 'c63ddc8b8c793c732246cac9b4c95b9c1534ca12': Merge mips setjmp/longjmp family.
This commit is contained in:
		@@ -1,172 +0,0 @@
 | 
				
			|||||||
/*	$OpenBSD: _setjmp.S,v 1.4 2005/08/07 16:40:15 espie Exp $ */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 * Copyright (c) 2002 Opsycon AB  (www.opsycon.se / www.opsycon.com)
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * Redistribution and use in source and binary forms, with or without
 | 
					 | 
				
			||||||
 * modification, are permitted provided that the following conditions
 | 
					 | 
				
			||||||
 * are met:
 | 
					 | 
				
			||||||
 * 1. Redistributions of source code must retain the above copyright
 | 
					 | 
				
			||||||
 *    notice, this list of conditions and the following disclaimer.
 | 
					 | 
				
			||||||
 * 2. Redistributions in binary form must reproduce the above copyright
 | 
					 | 
				
			||||||
 *    notice, this list of conditions and the following disclaimer in the
 | 
					 | 
				
			||||||
 *    documentation and/or other materials provided with the distribution.
 | 
					 | 
				
			||||||
 * 3. Neither the name of Opsycon AB nor the names of its contributors
 | 
					 | 
				
			||||||
 *    may be used to endorse or promote products derived from this software
 | 
					 | 
				
			||||||
 *    without specific prior written permission.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
 | 
					 | 
				
			||||||
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
					 | 
				
			||||||
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
					 | 
				
			||||||
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
 | 
					 | 
				
			||||||
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 | 
					 | 
				
			||||||
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 | 
					 | 
				
			||||||
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 | 
					 | 
				
			||||||
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 | 
					 | 
				
			||||||
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 | 
					 | 
				
			||||||
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 | 
					 | 
				
			||||||
 * SUCH DAMAGE.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <private/bionic_asm.h>
 | 
					 | 
				
			||||||
#include <machine/signal.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 * _setjmp, _longjmp (not restoring signal state)
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 *  GPOFF and FRAMESIZE must be the same for both _setjmp and _longjmp!
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
FRAMESZ= MKFSIZ(0,4)
 | 
					 | 
				
			||||||
GPOFF= FRAMESZ-2*REGSZ
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
LEAF(_setjmp, FRAMESZ)
 | 
					 | 
				
			||||||
	PTR_SUBU sp, FRAMESZ
 | 
					 | 
				
			||||||
	SETUP_GP64(GPOFF, _setjmp)
 | 
					 | 
				
			||||||
	SAVE_GP(GPOFF)
 | 
					 | 
				
			||||||
	.set	reorder
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifndef __LP64__
 | 
					 | 
				
			||||||
	addiu   a0, 7				# roundup jmpbuf addr to 8-byte boundary
 | 
					 | 
				
			||||||
	li      t0, ~7
 | 
					 | 
				
			||||||
	and     a0, t0
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	# SC_MASK is unused here
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	li	v0, 0xACEDBADE			# sigcontext magic number
 | 
					 | 
				
			||||||
	sw	v0, SC_MAGIC(a0)
 | 
					 | 
				
			||||||
	# callee-saved long-sized regs:
 | 
					 | 
				
			||||||
	REG_S	ra, SC_REGS+0*REGSZ(a0)
 | 
					 | 
				
			||||||
	REG_S	s0, SC_REGS+1*REGSZ(a0)
 | 
					 | 
				
			||||||
	REG_S	s1, SC_REGS+2*REGSZ(a0)
 | 
					 | 
				
			||||||
	REG_S	s2, SC_REGS+3*REGSZ(a0)
 | 
					 | 
				
			||||||
	REG_S	s3, SC_REGS+4*REGSZ(a0)
 | 
					 | 
				
			||||||
	REG_S	s4, SC_REGS+5*REGSZ(a0)
 | 
					 | 
				
			||||||
	REG_S	s5, SC_REGS+6*REGSZ(a0)
 | 
					 | 
				
			||||||
	REG_S	s6, SC_REGS+7*REGSZ(a0)
 | 
					 | 
				
			||||||
	REG_S	s7, SC_REGS+8*REGSZ(a0)
 | 
					 | 
				
			||||||
	REG_S	s8, SC_REGS+9*REGSZ(a0)
 | 
					 | 
				
			||||||
	REG_L	v0, GPOFF(sp)
 | 
					 | 
				
			||||||
	REG_S	v0, SC_REGS+10*REGSZ(a0)
 | 
					 | 
				
			||||||
	PTR_ADDU v0, sp, FRAMESZ
 | 
					 | 
				
			||||||
	REG_S	v0, SC_REGS+11*REGSZ(a0)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	cfc1	v0, $31
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef __LP64__
 | 
					 | 
				
			||||||
	# callee-saved fp regs on mips n64 ABI are $f24..$f31
 | 
					 | 
				
			||||||
	s.d	$f24, SC_FPREGS+0*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
	s.d	$f25, SC_FPREGS+1*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
	s.d	$f26, SC_FPREGS+2*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
	s.d	$f27, SC_FPREGS+3*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
	s.d	$f28, SC_FPREGS+4*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
	s.d	$f29, SC_FPREGS+5*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
	s.d	$f30, SC_FPREGS+6*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
	s.d	$f31, SC_FPREGS+7*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
	# callee-saved fp regs on mips o32 ABI are
 | 
					 | 
				
			||||||
	#   the even-numbered fp regs $f20,$f22,...$f30
 | 
					 | 
				
			||||||
	s.d	$f20, SC_FPREGS+0*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
	s.d	$f22, SC_FPREGS+1*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
	s.d	$f24, SC_FPREGS+2*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
	s.d	$f26, SC_FPREGS+3*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
	s.d	$f28, SC_FPREGS+4*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
	s.d	$f30, SC_FPREGS+5*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
	sw	v0, SC_FPSR(a0)
 | 
					 | 
				
			||||||
	move	v0, zero
 | 
					 | 
				
			||||||
	RESTORE_GP64
 | 
					 | 
				
			||||||
	PTR_ADDU sp, FRAMESZ
 | 
					 | 
				
			||||||
	j	ra
 | 
					 | 
				
			||||||
END(_setjmp)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
LEAF(_longjmp, FRAMESZ)
 | 
					 | 
				
			||||||
	PTR_SUBU sp, FRAMESZ
 | 
					 | 
				
			||||||
	SETUP_GP64(GPOFF, _longjmp)
 | 
					 | 
				
			||||||
	SAVE_GP(GPOFF)
 | 
					 | 
				
			||||||
	.set	reorder
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifndef __LP64__
 | 
					 | 
				
			||||||
	addiu	a0, 7				# roundup jmpbuf addr to 8-byte boundary
 | 
					 | 
				
			||||||
	li      t0, ~7
 | 
					 | 
				
			||||||
	and	a0, t0
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	# SC_MASK is unused here
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	lw	v0, SC_MAGIC(a0)
 | 
					 | 
				
			||||||
	li	t0, 0xACEDBADE
 | 
					 | 
				
			||||||
	bne	v0, t0, botch			# jump if error
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	# callee-saved long-sized regs:
 | 
					 | 
				
			||||||
	REG_L	ra, SC_REGS+0*REGSZ(a0)
 | 
					 | 
				
			||||||
	REG_L	s0, SC_REGS+1*REGSZ(a0)
 | 
					 | 
				
			||||||
	REG_L	s1, SC_REGS+2*REGSZ(a0)
 | 
					 | 
				
			||||||
	REG_L	s2, SC_REGS+3*REGSZ(a0)
 | 
					 | 
				
			||||||
	REG_L	s3, SC_REGS+4*REGSZ(a0)
 | 
					 | 
				
			||||||
	REG_L	s4, SC_REGS+5*REGSZ(a0)
 | 
					 | 
				
			||||||
	REG_L	s5, SC_REGS+6*REGSZ(a0)
 | 
					 | 
				
			||||||
	REG_L	s6, SC_REGS+7*REGSZ(a0)
 | 
					 | 
				
			||||||
	REG_L	s7, SC_REGS+8*REGSZ(a0)
 | 
					 | 
				
			||||||
	REG_L	s8, SC_REGS+9*REGSZ(a0)
 | 
					 | 
				
			||||||
	REG_L	gp, SC_REGS+10*REGSZ(a0)
 | 
					 | 
				
			||||||
	REG_L	sp, SC_REGS+11*REGSZ(a0)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	lw	v0, SC_FPSR(a0)
 | 
					 | 
				
			||||||
	ctc1	v0, $31
 | 
					 | 
				
			||||||
#ifdef __LP64__
 | 
					 | 
				
			||||||
	# callee-saved fp regs on mips n64 ABI are $f24..$f31
 | 
					 | 
				
			||||||
	l.d	$f24, SC_FPREGS+0*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
	l.d	$f25, SC_FPREGS+1*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
	l.d	$f26, SC_FPREGS+2*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
	l.d	$f27, SC_FPREGS+3*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
	l.d	$f28, SC_FPREGS+4*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
	l.d	$f29, SC_FPREGS+5*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
	l.d	$f30, SC_FPREGS+6*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
	l.d	$f31, SC_FPREGS+7*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
	# callee-saved fp regs on mips o32 ABI are
 | 
					 | 
				
			||||||
	#   the even-numbered fp regs $f20,$f22,...$f30
 | 
					 | 
				
			||||||
	l.d	$f20, SC_FPREGS+0*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
	l.d	$f22, SC_FPREGS+1*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
	l.d	$f24, SC_FPREGS+2*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
	l.d	$f26, SC_FPREGS+3*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
	l.d	$f28, SC_FPREGS+4*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
	l.d	$f30, SC_FPREGS+5*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
	bne	a1, zero, 1f
 | 
					 | 
				
			||||||
	li	a1, 1			# never return 0!
 | 
					 | 
				
			||||||
1:
 | 
					 | 
				
			||||||
	move	v0, a1
 | 
					 | 
				
			||||||
	j	ra
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
botch:
 | 
					 | 
				
			||||||
	jal	longjmperror
 | 
					 | 
				
			||||||
	jal	abort
 | 
					 | 
				
			||||||
	RESTORE_GP64
 | 
					 | 
				
			||||||
	PTR_ADDU sp, FRAMESZ
 | 
					 | 
				
			||||||
END(_longjmp)
 | 
					 | 
				
			||||||
@@ -1,5 +1,3 @@
 | 
				
			|||||||
/*      $OpenBSD: setjmp.S,v 1.5 2005/08/07 16:40:15 espie Exp $ */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Copyright (c) 2001-2002 Opsycon AB  (www.opsycon.se / www.opsycon.com)
 | 
					 * Copyright (c) 2001-2002 Opsycon AB  (www.opsycon.se / www.opsycon.com)
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
@@ -28,9 +26,111 @@
 | 
				
			|||||||
 * SUCH DAMAGE.
 | 
					 * SUCH DAMAGE.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					/*-
 | 
				
			||||||
 | 
					 * Copyright (c) 1991, 1993, 1995,
 | 
				
			||||||
 | 
					 *	The Regents of the University of California.  All rights reserved.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * This code is derived from software contributed to Berkeley by
 | 
				
			||||||
 | 
					 * Havard Eidnes.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Redistribution and use in source and binary forms, with or without
 | 
				
			||||||
 | 
					 * modification, are permitted provided that the following conditions
 | 
				
			||||||
 | 
					 * are met:
 | 
				
			||||||
 | 
					 * 1. Redistributions of source code must retain the above copyright
 | 
				
			||||||
 | 
					 *    notice, this list of conditions and the following disclaimer.
 | 
				
			||||||
 | 
					 * 2. Redistributions in binary form must reproduce the above copyright
 | 
				
			||||||
 | 
					 *    notice, this list of conditions and the following disclaimer in the
 | 
				
			||||||
 | 
					 *    documentation and/or other materials provided with the distribution.
 | 
				
			||||||
 | 
					 * 3. Neither the name of the University nor the names of its contributors
 | 
				
			||||||
 | 
					 *    may be used to endorse or promote products derived from this software
 | 
				
			||||||
 | 
					 *    without specific prior written permission.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 | 
				
			||||||
 | 
					 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
				
			||||||
 | 
					 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
				
			||||||
 | 
					 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 | 
				
			||||||
 | 
					 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 | 
				
			||||||
 | 
					 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 | 
				
			||||||
 | 
					 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 | 
				
			||||||
 | 
					 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 | 
				
			||||||
 | 
					 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 | 
				
			||||||
 | 
					 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 | 
				
			||||||
 | 
					 * SUCH DAMAGE.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Copyright (c) 1992, 1993
 | 
				
			||||||
 | 
					 *	The Regents of the University of California.  All rights reserved.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * This code is derived from software contributed to Berkeley by
 | 
				
			||||||
 | 
					 * Ralph Campbell.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Redistribution and use in source and binary forms, with or without
 | 
				
			||||||
 | 
					 * modification, are permitted provided that the following conditions
 | 
				
			||||||
 | 
					 * are met:
 | 
				
			||||||
 | 
					 * 1. Redistributions of source code must retain the above copyright
 | 
				
			||||||
 | 
					 *    notice, this list of conditions and the following disclaimer.
 | 
				
			||||||
 | 
					 * 2. Redistributions in binary form must reproduce the above copyright
 | 
				
			||||||
 | 
					 *    notice, this list of conditions and the following disclaimer in the
 | 
				
			||||||
 | 
					 *    documentation and/or other materials provided with the distribution.
 | 
				
			||||||
 | 
					 * 3. Neither the name of the University nor the names of its contributors
 | 
				
			||||||
 | 
					 *    may be used to endorse or promote products derived from this software
 | 
				
			||||||
 | 
					 *    without specific prior written permission.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 | 
				
			||||||
 | 
					 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
				
			||||||
 | 
					 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
				
			||||||
 | 
					 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 | 
				
			||||||
 | 
					 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 | 
				
			||||||
 | 
					 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 | 
				
			||||||
 | 
					 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 | 
				
			||||||
 | 
					 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 | 
				
			||||||
 | 
					 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 | 
				
			||||||
 | 
					 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 | 
				
			||||||
 | 
					 * SUCH DAMAGE.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *	@(#)signal.h	8.1 (Berkeley) 6/10/93
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <private/bionic_asm.h>
 | 
					#include <private/bionic_asm.h>
 | 
				
			||||||
#include <machine/signal.h>
 | 
					#include <machine/setjmp.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* On Mips32, jmpbuf begins with optional 4-byte filler so that
 | 
				
			||||||
 | 
					 *  all saved FP regs are aligned on 8-byte boundary, despite this whole
 | 
				
			||||||
 | 
					 *  struct being mis-declared to users as an array of (4-byte) longs.
 | 
				
			||||||
 | 
					 *  All the following offsets are then from the rounded-up base addr
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Fields of same size on all MIPS abis: */
 | 
				
			||||||
 | 
					#define	SC_MAGIC        (0*4)		/* 4 bytes, identify jmpbuf */
 | 
				
			||||||
 | 
					#define	SC_MASK		(1*4)		/* 4 bytes, saved signal mask */
 | 
				
			||||||
 | 
					#define	SC_FPSR		(2*4)		/* 4 bytes, floating point control/status reg */
 | 
				
			||||||
 | 
					/*     	filler2		(3*4)		   4 bytes, pad to 8-byte boundary */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Registers that are 4-byte on mips32 o32, and 8-byte on mips64 n64 abi */
 | 
				
			||||||
 | 
					#define	SC_REGS_SAVED	12		/* ra,gp,sp,s0-s8 */
 | 
				
			||||||
 | 
					#define	SC_REGS		(4*4)		/* SC_REGS_SAVED*REGSZ bytes */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Floating pt registers are 8-bytes on all abis,
 | 
				
			||||||
 | 
					 * but the number of saved fp regs varies for o32/n32 versus n64 abis:
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __LP64__
 | 
				
			||||||
 | 
					#define	SC_FPREGS_SAVED	8  /* all  fp regs f24,f25,f26,f27,f28,f29,f30,f31 */
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#define	SC_FPREGS_SAVED	6  /* even fp regs f20,f22,f24,f26,f28,f30 */
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	SC_FPREGS	(SC_REGS + SC_REGS_SAVED*REGSZ)  /* SC_FPREGS_SAVED*REGSZ_FP bytes */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	SC_BYTES	(SC_FPREGS + SC_FPREGS_SAVED*REGSZ_FP)
 | 
				
			||||||
 | 
					#define	SC_LONGS	(SC_BYTES/REGSZ)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __LP64__
 | 
				
			||||||
 | 
					/* SC_LONGS is 22, so _JBLEN should be 22 or larger */
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					/* SC_LONGS is 28, but must also allocate dynamic-roundup filler.
 | 
				
			||||||
 | 
					   so _JBLEN should be 29 or larger */
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * _setjmp, _longjmp (restoring signal state)
 | 
					 * _setjmp, _longjmp (restoring signal state)
 | 
				
			||||||
@@ -114,7 +214,6 @@ NON_LEAF(setjmp, FRAMESZ, ra)
 | 
				
			|||||||
	j	ra
 | 
						j	ra
 | 
				
			||||||
END(setjmp)
 | 
					END(setjmp)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
NON_LEAF(longjmp, FRAMESZ, ra)
 | 
					NON_LEAF(longjmp, FRAMESZ, ra)
 | 
				
			||||||
	.mask	0x80000000, RAOFF
 | 
						.mask	0x80000000, RAOFF
 | 
				
			||||||
	PTR_SUBU sp, FRAMESZ
 | 
						PTR_SUBU sp, FRAMESZ
 | 
				
			||||||
@@ -137,7 +236,7 @@ NON_LEAF(longjmp, FRAMESZ, ra)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	lw	v0, SC_MAGIC(a0)
 | 
						lw	v0, SC_MAGIC(a0)
 | 
				
			||||||
	li	t0, 0xACEDBADE
 | 
						li	t0, 0xACEDBADE
 | 
				
			||||||
	bne	v0, t0, botch			# jump if error
 | 
						bne	v0, t0, longjmp_botch			# jump if error
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	# callee-saved long-sized regs:
 | 
						# callee-saved long-sized regs:
 | 
				
			||||||
	REG_L	ra, SC_REGS+0*REGSZ(a0)
 | 
						REG_L	ra, SC_REGS+0*REGSZ(a0)
 | 
				
			||||||
@@ -181,9 +280,190 @@ NON_LEAF(longjmp, FRAMESZ, ra)
 | 
				
			|||||||
	move	v0, a1
 | 
						move	v0, a1
 | 
				
			||||||
	j	ra
 | 
						j	ra
 | 
				
			||||||
 | 
					
 | 
				
			||||||
botch:
 | 
					longjmp_botch:
 | 
				
			||||||
	jal	longjmperror
 | 
						jal	longjmperror
 | 
				
			||||||
	jal	abort
 | 
						jal	abort
 | 
				
			||||||
	RESTORE_GP64
 | 
						RESTORE_GP64
 | 
				
			||||||
	PTR_ADDU sp, FRAMESZ
 | 
						PTR_ADDU sp, FRAMESZ
 | 
				
			||||||
END(longjmp)
 | 
					END(longjmp)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * _setjmp, _longjmp (not restoring signal state)
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *  GPOFF and FRAMESIZE must be the same for both _setjmp and _longjmp!
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					FRAMESZ= MKFSIZ(0,4)
 | 
				
			||||||
 | 
					GPOFF= FRAMESZ-2*REGSZ
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					LEAF(_setjmp, FRAMESZ)
 | 
				
			||||||
 | 
						PTR_SUBU sp, FRAMESZ
 | 
				
			||||||
 | 
						SETUP_GP64(GPOFF, _setjmp)
 | 
				
			||||||
 | 
						SAVE_GP(GPOFF)
 | 
				
			||||||
 | 
						.set	reorder
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef __LP64__
 | 
				
			||||||
 | 
						addiu   a0, 7				# roundup jmpbuf addr to 8-byte boundary
 | 
				
			||||||
 | 
						li      t0, ~7
 | 
				
			||||||
 | 
						and     a0, t0
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# SC_MASK is unused here
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						li	v0, 0xACEDBADE			# sigcontext magic number
 | 
				
			||||||
 | 
						sw	v0, SC_MAGIC(a0)
 | 
				
			||||||
 | 
						# callee-saved long-sized regs:
 | 
				
			||||||
 | 
						REG_S	ra, SC_REGS+0*REGSZ(a0)
 | 
				
			||||||
 | 
						REG_S	s0, SC_REGS+1*REGSZ(a0)
 | 
				
			||||||
 | 
						REG_S	s1, SC_REGS+2*REGSZ(a0)
 | 
				
			||||||
 | 
						REG_S	s2, SC_REGS+3*REGSZ(a0)
 | 
				
			||||||
 | 
						REG_S	s3, SC_REGS+4*REGSZ(a0)
 | 
				
			||||||
 | 
						REG_S	s4, SC_REGS+5*REGSZ(a0)
 | 
				
			||||||
 | 
						REG_S	s5, SC_REGS+6*REGSZ(a0)
 | 
				
			||||||
 | 
						REG_S	s6, SC_REGS+7*REGSZ(a0)
 | 
				
			||||||
 | 
						REG_S	s7, SC_REGS+8*REGSZ(a0)
 | 
				
			||||||
 | 
						REG_S	s8, SC_REGS+9*REGSZ(a0)
 | 
				
			||||||
 | 
						REG_L	v0, GPOFF(sp)
 | 
				
			||||||
 | 
						REG_S	v0, SC_REGS+10*REGSZ(a0)
 | 
				
			||||||
 | 
						PTR_ADDU v0, sp, FRAMESZ
 | 
				
			||||||
 | 
						REG_S	v0, SC_REGS+11*REGSZ(a0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cfc1	v0, $31
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __LP64__
 | 
				
			||||||
 | 
						# callee-saved fp regs on mips n64 ABI are $f24..$f31
 | 
				
			||||||
 | 
						s.d	$f24, SC_FPREGS+0*REGSZ_FP(a0)
 | 
				
			||||||
 | 
						s.d	$f25, SC_FPREGS+1*REGSZ_FP(a0)
 | 
				
			||||||
 | 
						s.d	$f26, SC_FPREGS+2*REGSZ_FP(a0)
 | 
				
			||||||
 | 
						s.d	$f27, SC_FPREGS+3*REGSZ_FP(a0)
 | 
				
			||||||
 | 
						s.d	$f28, SC_FPREGS+4*REGSZ_FP(a0)
 | 
				
			||||||
 | 
						s.d	$f29, SC_FPREGS+5*REGSZ_FP(a0)
 | 
				
			||||||
 | 
						s.d	$f30, SC_FPREGS+6*REGSZ_FP(a0)
 | 
				
			||||||
 | 
						s.d	$f31, SC_FPREGS+7*REGSZ_FP(a0)
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
						# callee-saved fp regs on mips o32 ABI are
 | 
				
			||||||
 | 
						#   the even-numbered fp regs $f20,$f22,...$f30
 | 
				
			||||||
 | 
						s.d	$f20, SC_FPREGS+0*REGSZ_FP(a0)
 | 
				
			||||||
 | 
						s.d	$f22, SC_FPREGS+1*REGSZ_FP(a0)
 | 
				
			||||||
 | 
						s.d	$f24, SC_FPREGS+2*REGSZ_FP(a0)
 | 
				
			||||||
 | 
						s.d	$f26, SC_FPREGS+3*REGSZ_FP(a0)
 | 
				
			||||||
 | 
						s.d	$f28, SC_FPREGS+4*REGSZ_FP(a0)
 | 
				
			||||||
 | 
						s.d	$f30, SC_FPREGS+5*REGSZ_FP(a0)
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
						sw	v0, SC_FPSR(a0)
 | 
				
			||||||
 | 
						move	v0, zero
 | 
				
			||||||
 | 
						RESTORE_GP64
 | 
				
			||||||
 | 
						PTR_ADDU sp, FRAMESZ
 | 
				
			||||||
 | 
						j	ra
 | 
				
			||||||
 | 
					END(_setjmp)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					LEAF(_longjmp, FRAMESZ)
 | 
				
			||||||
 | 
						PTR_SUBU sp, FRAMESZ
 | 
				
			||||||
 | 
						SETUP_GP64(GPOFF, _longjmp)
 | 
				
			||||||
 | 
						SAVE_GP(GPOFF)
 | 
				
			||||||
 | 
						.set	reorder
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef __LP64__
 | 
				
			||||||
 | 
						addiu	a0, 7				# roundup jmpbuf addr to 8-byte boundary
 | 
				
			||||||
 | 
						li      t0, ~7
 | 
				
			||||||
 | 
						and	a0, t0
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# SC_MASK is unused here
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						lw	v0, SC_MAGIC(a0)
 | 
				
			||||||
 | 
						li	t0, 0xACEDBADE
 | 
				
			||||||
 | 
						bne	v0, t0, _longjmp_botch			# jump if error
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# callee-saved long-sized regs:
 | 
				
			||||||
 | 
						REG_L	ra, SC_REGS+0*REGSZ(a0)
 | 
				
			||||||
 | 
						REG_L	s0, SC_REGS+1*REGSZ(a0)
 | 
				
			||||||
 | 
						REG_L	s1, SC_REGS+2*REGSZ(a0)
 | 
				
			||||||
 | 
						REG_L	s2, SC_REGS+3*REGSZ(a0)
 | 
				
			||||||
 | 
						REG_L	s3, SC_REGS+4*REGSZ(a0)
 | 
				
			||||||
 | 
						REG_L	s4, SC_REGS+5*REGSZ(a0)
 | 
				
			||||||
 | 
						REG_L	s5, SC_REGS+6*REGSZ(a0)
 | 
				
			||||||
 | 
						REG_L	s6, SC_REGS+7*REGSZ(a0)
 | 
				
			||||||
 | 
						REG_L	s7, SC_REGS+8*REGSZ(a0)
 | 
				
			||||||
 | 
						REG_L	s8, SC_REGS+9*REGSZ(a0)
 | 
				
			||||||
 | 
						REG_L	gp, SC_REGS+10*REGSZ(a0)
 | 
				
			||||||
 | 
						REG_L	sp, SC_REGS+11*REGSZ(a0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						lw	v0, SC_FPSR(a0)
 | 
				
			||||||
 | 
						ctc1	v0, $31
 | 
				
			||||||
 | 
					#ifdef __LP64__
 | 
				
			||||||
 | 
						# callee-saved fp regs on mips n64 ABI are $f24..$f31
 | 
				
			||||||
 | 
						l.d	$f24, SC_FPREGS+0*REGSZ_FP(a0)
 | 
				
			||||||
 | 
						l.d	$f25, SC_FPREGS+1*REGSZ_FP(a0)
 | 
				
			||||||
 | 
						l.d	$f26, SC_FPREGS+2*REGSZ_FP(a0)
 | 
				
			||||||
 | 
						l.d	$f27, SC_FPREGS+3*REGSZ_FP(a0)
 | 
				
			||||||
 | 
						l.d	$f28, SC_FPREGS+4*REGSZ_FP(a0)
 | 
				
			||||||
 | 
						l.d	$f29, SC_FPREGS+5*REGSZ_FP(a0)
 | 
				
			||||||
 | 
						l.d	$f30, SC_FPREGS+6*REGSZ_FP(a0)
 | 
				
			||||||
 | 
						l.d	$f31, SC_FPREGS+7*REGSZ_FP(a0)
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
						# callee-saved fp regs on mips o32 ABI are
 | 
				
			||||||
 | 
						#   the even-numbered fp regs $f20,$f22,...$f30
 | 
				
			||||||
 | 
						l.d	$f20, SC_FPREGS+0*REGSZ_FP(a0)
 | 
				
			||||||
 | 
						l.d	$f22, SC_FPREGS+1*REGSZ_FP(a0)
 | 
				
			||||||
 | 
						l.d	$f24, SC_FPREGS+2*REGSZ_FP(a0)
 | 
				
			||||||
 | 
						l.d	$f26, SC_FPREGS+3*REGSZ_FP(a0)
 | 
				
			||||||
 | 
						l.d	$f28, SC_FPREGS+4*REGSZ_FP(a0)
 | 
				
			||||||
 | 
						l.d	$f30, SC_FPREGS+5*REGSZ_FP(a0)
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
						bne	a1, zero, 1f
 | 
				
			||||||
 | 
						li	a1, 1			# never return 0!
 | 
				
			||||||
 | 
					1:
 | 
				
			||||||
 | 
						move	v0, a1
 | 
				
			||||||
 | 
						j	ra
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					_longjmp_botch:
 | 
				
			||||||
 | 
						jal	longjmperror
 | 
				
			||||||
 | 
						jal	abort
 | 
				
			||||||
 | 
						RESTORE_GP64
 | 
				
			||||||
 | 
						PTR_ADDU sp, FRAMESZ
 | 
				
			||||||
 | 
					END(_longjmp)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * trampolines for sigsetjmp and  siglongjmp save and restore mask.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					FRAMESZ= MKFSIZ(1,1)
 | 
				
			||||||
 | 
					GPOFF= FRAMESZ-2*REGSZ
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					LEAF(sigsetjmp, FRAMESZ)
 | 
				
			||||||
 | 
						PTR_SUBU sp, FRAMESZ
 | 
				
			||||||
 | 
						SETUP_GP64(GPOFF, sigsetjmp)
 | 
				
			||||||
 | 
						.set	reorder
 | 
				
			||||||
 | 
						sw	a1, _JBLEN*REGSZ(a0)		# save "savemask"
 | 
				
			||||||
 | 
						bne	a1, 0x0, 1f			# do saving of signal mask?
 | 
				
			||||||
 | 
						LA	t9, _setjmp
 | 
				
			||||||
 | 
						RESTORE_GP64
 | 
				
			||||||
 | 
						PTR_ADDU sp, FRAMESZ
 | 
				
			||||||
 | 
						jr t9
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					1:	LA	t9, setjmp
 | 
				
			||||||
 | 
						RESTORE_GP64
 | 
				
			||||||
 | 
						PTR_ADDU sp, FRAMESZ
 | 
				
			||||||
 | 
						jr t9
 | 
				
			||||||
 | 
					END(sigsetjmp)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					LEAF(siglongjmp, FRAMESZ)
 | 
				
			||||||
 | 
						PTR_SUBU sp, FRAMESZ
 | 
				
			||||||
 | 
						SETUP_GP64(GPOFF, siglongjmp)
 | 
				
			||||||
 | 
						.set	reorder
 | 
				
			||||||
 | 
						lw	t0, _JBLEN*REGSZ(a0)		# get "savemask"
 | 
				
			||||||
 | 
						bne	t0, 0x0, 1f			# restore signal mask?
 | 
				
			||||||
 | 
						LA	t9, _longjmp
 | 
				
			||||||
 | 
						RESTORE_GP64
 | 
				
			||||||
 | 
						PTR_ADDU sp, FRAMESZ
 | 
				
			||||||
 | 
						jr	t9
 | 
				
			||||||
 | 
					1:
 | 
				
			||||||
 | 
						LA	t9, longjmp
 | 
				
			||||||
 | 
						RESTORE_GP64
 | 
				
			||||||
 | 
						PTR_ADDU sp, FRAMESZ
 | 
				
			||||||
 | 
						jr	t9
 | 
				
			||||||
 | 
					END(siglongjmp)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,76 +0,0 @@
 | 
				
			|||||||
/* $OpenBSD: sigsetjmp.S,v 1.5 2005/08/07 16:40:15 espie Exp $ */
 | 
					 | 
				
			||||||
/*-
 | 
					 | 
				
			||||||
 * Copyright (c) 1991, 1993, 1995,
 | 
					 | 
				
			||||||
 *	The Regents of the University of California.  All rights reserved.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * This code is derived from software contributed to Berkeley by
 | 
					 | 
				
			||||||
 * Havard Eidnes.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * Redistribution and use in source and binary forms, with or without
 | 
					 | 
				
			||||||
 * modification, are permitted provided that the following conditions
 | 
					 | 
				
			||||||
 * are met:
 | 
					 | 
				
			||||||
 * 1. Redistributions of source code must retain the above copyright
 | 
					 | 
				
			||||||
 *    notice, this list of conditions and the following disclaimer.
 | 
					 | 
				
			||||||
 * 2. Redistributions in binary form must reproduce the above copyright
 | 
					 | 
				
			||||||
 *    notice, this list of conditions and the following disclaimer in the
 | 
					 | 
				
			||||||
 *    documentation and/or other materials provided with the distribution.
 | 
					 | 
				
			||||||
 * 3. Neither the name of the University nor the names of its contributors
 | 
					 | 
				
			||||||
 *    may be used to endorse or promote products derived from this software
 | 
					 | 
				
			||||||
 *    without specific prior written permission.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 | 
					 | 
				
			||||||
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
					 | 
				
			||||||
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
					 | 
				
			||||||
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 | 
					 | 
				
			||||||
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 | 
					 | 
				
			||||||
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 | 
					 | 
				
			||||||
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 | 
					 | 
				
			||||||
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 | 
					 | 
				
			||||||
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 | 
					 | 
				
			||||||
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 | 
					 | 
				
			||||||
 * SUCH DAMAGE.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <private/bionic_asm.h>
 | 
					 | 
				
			||||||
#include <machine/setjmp.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 * trampolines for sigsetjmp and  siglongjmp save and restore mask.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
FRAMESZ= MKFSIZ(1,1)
 | 
					 | 
				
			||||||
GPOFF= FRAMESZ-2*REGSZ
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
LEAF(sigsetjmp, FRAMESZ)
 | 
					 | 
				
			||||||
	PTR_SUBU sp, FRAMESZ
 | 
					 | 
				
			||||||
	SETUP_GP64(GPOFF, sigsetjmp)
 | 
					 | 
				
			||||||
	.set	reorder
 | 
					 | 
				
			||||||
	sw	a1, _JBLEN*REGSZ(a0)		# save "savemask"
 | 
					 | 
				
			||||||
	bne	a1, 0x0, 1f			# do saving of signal mask?
 | 
					 | 
				
			||||||
	LA	t9, _setjmp
 | 
					 | 
				
			||||||
	RESTORE_GP64
 | 
					 | 
				
			||||||
	PTR_ADDU sp, FRAMESZ
 | 
					 | 
				
			||||||
	jr t9
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
1:	LA	t9, setjmp
 | 
					 | 
				
			||||||
	RESTORE_GP64
 | 
					 | 
				
			||||||
	PTR_ADDU sp, FRAMESZ
 | 
					 | 
				
			||||||
	jr t9
 | 
					 | 
				
			||||||
END(sigsetjmp)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
LEAF(siglongjmp, FRAMESZ)
 | 
					 | 
				
			||||||
	PTR_SUBU sp, FRAMESZ
 | 
					 | 
				
			||||||
	SETUP_GP64(GPOFF, siglongjmp)
 | 
					 | 
				
			||||||
	.set	reorder
 | 
					 | 
				
			||||||
	lw	t0, _JBLEN*REGSZ(a0)		# get "savemask"
 | 
					 | 
				
			||||||
	bne	t0, 0x0, 1f			# restore signal mask?
 | 
					 | 
				
			||||||
	LA	t9, _longjmp
 | 
					 | 
				
			||||||
	RESTORE_GP64
 | 
					 | 
				
			||||||
	PTR_ADDU sp, FRAMESZ
 | 
					 | 
				
			||||||
	jr	t9
 | 
					 | 
				
			||||||
1:
 | 
					 | 
				
			||||||
	LA	t9, longjmp
 | 
					 | 
				
			||||||
	RESTORE_GP64
 | 
					 | 
				
			||||||
	PTR_ADDU sp, FRAMESZ
 | 
					 | 
				
			||||||
	jr	t9
 | 
					 | 
				
			||||||
END(siglongjmp)
 | 
					 | 
				
			||||||
@@ -1,78 +0,0 @@
 | 
				
			|||||||
/*	$OpenBSD: signal.h,v 1.8 2006/01/09 18:18:37 millert Exp $	*/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 * Copyright (c) 1992, 1993
 | 
					 | 
				
			||||||
 *	The Regents of the University of California.  All rights reserved.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * This code is derived from software contributed to Berkeley by
 | 
					 | 
				
			||||||
 * Ralph Campbell.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * Redistribution and use in source and binary forms, with or without
 | 
					 | 
				
			||||||
 * modification, are permitted provided that the following conditions
 | 
					 | 
				
			||||||
 * are met:
 | 
					 | 
				
			||||||
 * 1. Redistributions of source code must retain the above copyright
 | 
					 | 
				
			||||||
 *    notice, this list of conditions and the following disclaimer.
 | 
					 | 
				
			||||||
 * 2. Redistributions in binary form must reproduce the above copyright
 | 
					 | 
				
			||||||
 *    notice, this list of conditions and the following disclaimer in the
 | 
					 | 
				
			||||||
 *    documentation and/or other materials provided with the distribution.
 | 
					 | 
				
			||||||
 * 3. Neither the name of the University nor the names of its contributors
 | 
					 | 
				
			||||||
 *    may be used to endorse or promote products derived from this software
 | 
					 | 
				
			||||||
 *    without specific prior written permission.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 | 
					 | 
				
			||||||
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
					 | 
				
			||||||
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
					 | 
				
			||||||
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 | 
					 | 
				
			||||||
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 | 
					 | 
				
			||||||
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 | 
					 | 
				
			||||||
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 | 
					 | 
				
			||||||
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 | 
					 | 
				
			||||||
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 | 
					 | 
				
			||||||
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 | 
					 | 
				
			||||||
 * SUCH DAMAGE.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 *	@(#)signal.h	8.1 (Berkeley) 6/10/93
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifndef _MIPS_SIGNAL_H_
 | 
					 | 
				
			||||||
#define _MIPS_SIGNAL_H_
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* On Mips32, jmpbuf begins with optional 4-byte filler so that
 | 
					 | 
				
			||||||
 *  all saved FP regs are aligned on 8-byte boundary, despite this whole
 | 
					 | 
				
			||||||
 *  struct being mis-declared to users as an array of (4-byte) longs.
 | 
					 | 
				
			||||||
 *  All the following offsets are then from the rounded-up base addr
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* Fields of same size on all MIPS abis: */
 | 
					 | 
				
			||||||
#define	SC_MAGIC        (0*4)		/* 4 bytes, identify jmpbuf */
 | 
					 | 
				
			||||||
#define	SC_MASK		(1*4)		/* 4 bytes, saved signal mask */
 | 
					 | 
				
			||||||
#define	SC_FPSR		(2*4)		/* 4 bytes, floating point control/status reg */
 | 
					 | 
				
			||||||
/*     	filler2		(3*4)		   4 bytes, pad to 8-byte boundary */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* Registers that are 4-byte on mips32 o32, and 8-byte on mips64 n64 abi */
 | 
					 | 
				
			||||||
#define	SC_REGS_SAVED	12		/* ra,gp,sp,s0-s8 */
 | 
					 | 
				
			||||||
#define	SC_REGS		(4*4)		/* SC_REGS_SAVED*REGSZ bytes */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* Floating pt registers are 8-bytes on all abis,
 | 
					 | 
				
			||||||
 * but the number of saved fp regs varies for o32/n32 versus n64 abis:
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef __LP64__
 | 
					 | 
				
			||||||
#define	SC_FPREGS_SAVED	8  /* all  fp regs f24,f25,f26,f27,f28,f29,f30,f31 */
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
#define	SC_FPREGS_SAVED	6  /* even fp regs f20,f22,f24,f26,f28,f30 */
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define	SC_FPREGS	(SC_REGS + SC_REGS_SAVED*REGSZ)  /* SC_FPREGS_SAVED*REGSZ_FP bytes */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define	SC_BYTES	(SC_FPREGS + SC_FPREGS_SAVED*REGSZ_FP)
 | 
					 | 
				
			||||||
#define	SC_LONGS	(SC_BYTES/REGSZ)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef __LP64__
 | 
					 | 
				
			||||||
/* SC_LONGS is 22, so _JBLEN should be 22 or larger */
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
/* SC_LONGS is 28, but must also allocate dynamic-roundup filler.
 | 
					 | 
				
			||||||
   so _JBLEN should be 29 or larger */
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif	/* !_MIPS_SIGNAL_H_ */
 | 
					 | 
				
			||||||
@@ -67,9 +67,7 @@ libc_bionic_src_files_mips += \
 | 
				
			|||||||
    arch-mips/bionic/bzero.S \
 | 
					    arch-mips/bionic/bzero.S \
 | 
				
			||||||
    arch-mips/bionic/cacheflush.cpp \
 | 
					    arch-mips/bionic/cacheflush.cpp \
 | 
				
			||||||
    arch-mips/bionic/_exit_with_stack_teardown.S \
 | 
					    arch-mips/bionic/_exit_with_stack_teardown.S \
 | 
				
			||||||
    arch-mips/bionic/_setjmp.S \
 | 
					 | 
				
			||||||
    arch-mips/bionic/setjmp.S \
 | 
					    arch-mips/bionic/setjmp.S \
 | 
				
			||||||
    arch-mips/bionic/sigsetjmp.S \
 | 
					 | 
				
			||||||
    arch-mips/bionic/syscall.S \
 | 
					    arch-mips/bionic/syscall.S \
 | 
				
			||||||
    arch-mips/bionic/vfork.S \
 | 
					    arch-mips/bionic/vfork.S \
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,172 +0,0 @@
 | 
				
			|||||||
/*	$OpenBSD: _setjmp.S,v 1.4 2005/08/07 16:40:15 espie Exp $ */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 * Copyright (c) 2002 Opsycon AB  (www.opsycon.se / www.opsycon.com)
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * Redistribution and use in source and binary forms, with or without
 | 
					 | 
				
			||||||
 * modification, are permitted provided that the following conditions
 | 
					 | 
				
			||||||
 * are met:
 | 
					 | 
				
			||||||
 * 1. Redistributions of source code must retain the above copyright
 | 
					 | 
				
			||||||
 *    notice, this list of conditions and the following disclaimer.
 | 
					 | 
				
			||||||
 * 2. Redistributions in binary form must reproduce the above copyright
 | 
					 | 
				
			||||||
 *    notice, this list of conditions and the following disclaimer in the
 | 
					 | 
				
			||||||
 *    documentation and/or other materials provided with the distribution.
 | 
					 | 
				
			||||||
 * 3. Neither the name of Opsycon AB nor the names of its contributors
 | 
					 | 
				
			||||||
 *    may be used to endorse or promote products derived from this software
 | 
					 | 
				
			||||||
 *    without specific prior written permission.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
 | 
					 | 
				
			||||||
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
					 | 
				
			||||||
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
					 | 
				
			||||||
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
 | 
					 | 
				
			||||||
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 | 
					 | 
				
			||||||
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 | 
					 | 
				
			||||||
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 | 
					 | 
				
			||||||
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 | 
					 | 
				
			||||||
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 | 
					 | 
				
			||||||
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 | 
					 | 
				
			||||||
 * SUCH DAMAGE.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <private/bionic_asm.h>
 | 
					 | 
				
			||||||
#include <machine/signal.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 * _setjmp, _longjmp (not restoring signal state)
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 *  GPOFF and FRAMESIZE must be the same for both _setjmp and _longjmp!
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
FRAMESZ= MKFSIZ(0,4)
 | 
					 | 
				
			||||||
GPOFF= FRAMESZ-2*REGSZ
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
LEAF(_setjmp, FRAMESZ)
 | 
					 | 
				
			||||||
	PTR_SUBU sp, FRAMESZ
 | 
					 | 
				
			||||||
	SETUP_GP64(GPOFF, _setjmp)
 | 
					 | 
				
			||||||
	SAVE_GP(GPOFF)
 | 
					 | 
				
			||||||
	.set	reorder
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifndef __LP64__
 | 
					 | 
				
			||||||
	addiu   a0, 7				# roundup jmpbuf addr to 8-byte boundary
 | 
					 | 
				
			||||||
	li      t0, ~7
 | 
					 | 
				
			||||||
	and     a0, t0
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	# SC_MASK is unused here
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	li	v0, 0xACEDBADE			# sigcontext magic number
 | 
					 | 
				
			||||||
	sw	v0, SC_MAGIC(a0)
 | 
					 | 
				
			||||||
	# callee-saved long-sized regs:
 | 
					 | 
				
			||||||
	REG_S	ra, SC_REGS+0*REGSZ(a0)
 | 
					 | 
				
			||||||
	REG_S	s0, SC_REGS+1*REGSZ(a0)
 | 
					 | 
				
			||||||
	REG_S	s1, SC_REGS+2*REGSZ(a0)
 | 
					 | 
				
			||||||
	REG_S	s2, SC_REGS+3*REGSZ(a0)
 | 
					 | 
				
			||||||
	REG_S	s3, SC_REGS+4*REGSZ(a0)
 | 
					 | 
				
			||||||
	REG_S	s4, SC_REGS+5*REGSZ(a0)
 | 
					 | 
				
			||||||
	REG_S	s5, SC_REGS+6*REGSZ(a0)
 | 
					 | 
				
			||||||
	REG_S	s6, SC_REGS+7*REGSZ(a0)
 | 
					 | 
				
			||||||
	REG_S	s7, SC_REGS+8*REGSZ(a0)
 | 
					 | 
				
			||||||
	REG_S	s8, SC_REGS+9*REGSZ(a0)
 | 
					 | 
				
			||||||
	REG_L	v0, GPOFF(sp)
 | 
					 | 
				
			||||||
	REG_S	v0, SC_REGS+10*REGSZ(a0)
 | 
					 | 
				
			||||||
	PTR_ADDU v0, sp, FRAMESZ
 | 
					 | 
				
			||||||
	REG_S	v0, SC_REGS+11*REGSZ(a0)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	cfc1	v0, $31
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef __LP64__
 | 
					 | 
				
			||||||
	# callee-saved fp regs on mips n64 ABI are $f24..$f31
 | 
					 | 
				
			||||||
	s.d	$f24, SC_FPREGS+0*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
	s.d	$f25, SC_FPREGS+1*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
	s.d	$f26, SC_FPREGS+2*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
	s.d	$f27, SC_FPREGS+3*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
	s.d	$f28, SC_FPREGS+4*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
	s.d	$f29, SC_FPREGS+5*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
	s.d	$f30, SC_FPREGS+6*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
	s.d	$f31, SC_FPREGS+7*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
	# callee-saved fp regs on mips o32 ABI are
 | 
					 | 
				
			||||||
	#   the even-numbered fp regs $f20,$f22,...$f30
 | 
					 | 
				
			||||||
	s.d	$f20, SC_FPREGS+0*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
	s.d	$f22, SC_FPREGS+1*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
	s.d	$f24, SC_FPREGS+2*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
	s.d	$f26, SC_FPREGS+3*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
	s.d	$f28, SC_FPREGS+4*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
	s.d	$f30, SC_FPREGS+5*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
	sw	v0, SC_FPSR(a0)
 | 
					 | 
				
			||||||
	move	v0, zero
 | 
					 | 
				
			||||||
	RESTORE_GP64
 | 
					 | 
				
			||||||
	PTR_ADDU sp, FRAMESZ
 | 
					 | 
				
			||||||
	j	ra
 | 
					 | 
				
			||||||
END(_setjmp)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
LEAF(_longjmp, FRAMESZ)
 | 
					 | 
				
			||||||
	PTR_SUBU sp, FRAMESZ
 | 
					 | 
				
			||||||
	SETUP_GP64(GPOFF, _longjmp)
 | 
					 | 
				
			||||||
	SAVE_GP(GPOFF)
 | 
					 | 
				
			||||||
	.set	reorder
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifndef __LP64__
 | 
					 | 
				
			||||||
	addiu	a0, 7				# roundup jmpbuf addr to 8-byte boundary
 | 
					 | 
				
			||||||
	li      t0, ~7
 | 
					 | 
				
			||||||
	and	a0, t0
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	# SC_MASK is unused here
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	lw	v0, SC_MAGIC(a0)
 | 
					 | 
				
			||||||
	li	t0, 0xACEDBADE
 | 
					 | 
				
			||||||
	bne	v0, t0, botch			# jump if error
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	# callee-saved long-sized regs:
 | 
					 | 
				
			||||||
	REG_L	ra, SC_REGS+0*REGSZ(a0)
 | 
					 | 
				
			||||||
	REG_L	s0, SC_REGS+1*REGSZ(a0)
 | 
					 | 
				
			||||||
	REG_L	s1, SC_REGS+2*REGSZ(a0)
 | 
					 | 
				
			||||||
	REG_L	s2, SC_REGS+3*REGSZ(a0)
 | 
					 | 
				
			||||||
	REG_L	s3, SC_REGS+4*REGSZ(a0)
 | 
					 | 
				
			||||||
	REG_L	s4, SC_REGS+5*REGSZ(a0)
 | 
					 | 
				
			||||||
	REG_L	s5, SC_REGS+6*REGSZ(a0)
 | 
					 | 
				
			||||||
	REG_L	s6, SC_REGS+7*REGSZ(a0)
 | 
					 | 
				
			||||||
	REG_L	s7, SC_REGS+8*REGSZ(a0)
 | 
					 | 
				
			||||||
	REG_L	s8, SC_REGS+9*REGSZ(a0)
 | 
					 | 
				
			||||||
	REG_L	gp, SC_REGS+10*REGSZ(a0)
 | 
					 | 
				
			||||||
	REG_L	sp, SC_REGS+11*REGSZ(a0)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	lw	v0, SC_FPSR(a0)
 | 
					 | 
				
			||||||
	ctc1	v0, $31
 | 
					 | 
				
			||||||
#ifdef __LP64__
 | 
					 | 
				
			||||||
	# callee-saved fp regs on mips n64 ABI are $f24..$f31
 | 
					 | 
				
			||||||
	l.d	$f24, SC_FPREGS+0*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
	l.d	$f25, SC_FPREGS+1*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
	l.d	$f26, SC_FPREGS+2*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
	l.d	$f27, SC_FPREGS+3*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
	l.d	$f28, SC_FPREGS+4*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
	l.d	$f29, SC_FPREGS+5*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
	l.d	$f30, SC_FPREGS+6*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
	l.d	$f31, SC_FPREGS+7*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
	# callee-saved fp regs on mips o32 ABI are
 | 
					 | 
				
			||||||
	#   the even-numbered fp regs $f20,$f22,...$f30
 | 
					 | 
				
			||||||
	l.d	$f20, SC_FPREGS+0*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
	l.d	$f22, SC_FPREGS+1*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
	l.d	$f24, SC_FPREGS+2*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
	l.d	$f26, SC_FPREGS+3*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
	l.d	$f28, SC_FPREGS+4*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
	l.d	$f30, SC_FPREGS+5*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
	bne	a1, zero, 1f
 | 
					 | 
				
			||||||
	li	a1, 1			# never return 0!
 | 
					 | 
				
			||||||
1:
 | 
					 | 
				
			||||||
	move	v0, a1
 | 
					 | 
				
			||||||
	j	ra
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
botch:
 | 
					 | 
				
			||||||
	jal	longjmperror
 | 
					 | 
				
			||||||
	jal	abort
 | 
					 | 
				
			||||||
	RESTORE_GP64
 | 
					 | 
				
			||||||
	PTR_ADDU sp, FRAMESZ
 | 
					 | 
				
			||||||
END(_longjmp)
 | 
					 | 
				
			||||||
@@ -1,189 +0,0 @@
 | 
				
			|||||||
/*      $OpenBSD: setjmp.S,v 1.5 2005/08/07 16:40:15 espie Exp $ */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 * Copyright (c) 2001-2002 Opsycon AB  (www.opsycon.se / www.opsycon.com)
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * Redistribution and use in source and binary forms, with or without
 | 
					 | 
				
			||||||
 * modification, are permitted provided that the following conditions
 | 
					 | 
				
			||||||
 * are met:
 | 
					 | 
				
			||||||
 * 1. Redistributions of source code must retain the above copyright
 | 
					 | 
				
			||||||
 *    notice, this list of conditions and the following disclaimer.
 | 
					 | 
				
			||||||
 * 2. Redistributions in binary form must reproduce the above copyright
 | 
					 | 
				
			||||||
 *    notice, this list of conditions and the following disclaimer in the
 | 
					 | 
				
			||||||
 *    documentation and/or other materials provided with the distribution.
 | 
					 | 
				
			||||||
 * 3. Neither the name of Opsycon AB nor the names of its contributors
 | 
					 | 
				
			||||||
 *    may be used to endorse or promote products derived from this software
 | 
					 | 
				
			||||||
 *    without specific prior written permission.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
 | 
					 | 
				
			||||||
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
					 | 
				
			||||||
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
					 | 
				
			||||||
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
 | 
					 | 
				
			||||||
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 | 
					 | 
				
			||||||
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 | 
					 | 
				
			||||||
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 | 
					 | 
				
			||||||
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 | 
					 | 
				
			||||||
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 | 
					 | 
				
			||||||
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 | 
					 | 
				
			||||||
 * SUCH DAMAGE.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <private/bionic_asm.h>
 | 
					 | 
				
			||||||
#include <machine/signal.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 * _setjmp, _longjmp (restoring signal state)
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 *  GPOFF and FRAMESIZE must be the same for both _setjmp and _longjmp!
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
FRAMESZ= MKFSIZ(2,6)
 | 
					 | 
				
			||||||
A1OFF= FRAMESZ-4*REGSZ
 | 
					 | 
				
			||||||
A0OFF= FRAMESZ-3*REGSZ
 | 
					 | 
				
			||||||
GPOFF= FRAMESZ-2*REGSZ
 | 
					 | 
				
			||||||
RAOFF= FRAMESZ-1*REGSZ
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
NON_LEAF(setjmp, FRAMESZ, ra)
 | 
					 | 
				
			||||||
	.mask	0x80000000, RAOFF
 | 
					 | 
				
			||||||
	PTR_SUBU sp, FRAMESZ			# allocate stack frame
 | 
					 | 
				
			||||||
	SETUP_GP64(GPOFF, setjmp)
 | 
					 | 
				
			||||||
	SAVE_GP(GPOFF)
 | 
					 | 
				
			||||||
	.set	reorder
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifndef __LP64__
 | 
					 | 
				
			||||||
	addiu   a0, 7				# roundup jmpbuf addr to 8-byte boundary
 | 
					 | 
				
			||||||
	li      t0, ~7
 | 
					 | 
				
			||||||
	and     a0, t0
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	REG_S	ra, RAOFF(sp)			# save state
 | 
					 | 
				
			||||||
	REG_S	a0, A0OFF(sp)
 | 
					 | 
				
			||||||
	move	a0, zero			# get current signal mask
 | 
					 | 
				
			||||||
	jal	sigblock
 | 
					 | 
				
			||||||
	REG_L	a0, A0OFF(sp)
 | 
					 | 
				
			||||||
	REG_L	ra, RAOFF(sp)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	REG_S	v0, SC_MASK(a0)			# save sc_mask = sigblock(0)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	li	v0, 0xACEDBADE			# sigcontext magic number
 | 
					 | 
				
			||||||
	sw	v0, SC_MAGIC(a0)
 | 
					 | 
				
			||||||
	# callee-saved long-sized regs:
 | 
					 | 
				
			||||||
	REG_S	ra, SC_REGS+0*REGSZ(a0)
 | 
					 | 
				
			||||||
	REG_S	s0, SC_REGS+1*REGSZ(a0)
 | 
					 | 
				
			||||||
	REG_S	s1, SC_REGS+2*REGSZ(a0)
 | 
					 | 
				
			||||||
	REG_S	s2, SC_REGS+3*REGSZ(a0)
 | 
					 | 
				
			||||||
	REG_S	s3, SC_REGS+4*REGSZ(a0)
 | 
					 | 
				
			||||||
	REG_S	s4, SC_REGS+5*REGSZ(a0)
 | 
					 | 
				
			||||||
	REG_S	s5, SC_REGS+6*REGSZ(a0)
 | 
					 | 
				
			||||||
	REG_S	s6, SC_REGS+7*REGSZ(a0)
 | 
					 | 
				
			||||||
	REG_S	s7, SC_REGS+8*REGSZ(a0)
 | 
					 | 
				
			||||||
	REG_S	s8, SC_REGS+9*REGSZ(a0)
 | 
					 | 
				
			||||||
	REG_L	v0, GPOFF(sp)
 | 
					 | 
				
			||||||
	REG_S	v0, SC_REGS+10*REGSZ(a0)
 | 
					 | 
				
			||||||
	PTR_ADDU v0, sp, FRAMESZ
 | 
					 | 
				
			||||||
	REG_S	v0, SC_REGS+11*REGSZ(a0)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	cfc1	v0, $31
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef __LP64__
 | 
					 | 
				
			||||||
	# callee-saved fp regs on mips n64 ABI are $f24..$f31
 | 
					 | 
				
			||||||
	s.d	$f24, SC_FPREGS+0*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
	s.d	$f25, SC_FPREGS+1*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
	s.d	$f26, SC_FPREGS+2*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
	s.d	$f27, SC_FPREGS+3*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
	s.d	$f28, SC_FPREGS+4*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
	s.d	$f29, SC_FPREGS+5*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
	s.d	$f30, SC_FPREGS+6*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
	s.d	$f31, SC_FPREGS+7*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
	# callee-saved fp regs on mips o32 ABI are
 | 
					 | 
				
			||||||
	#   the even-numbered fp regs $f20,$f22,...$f30
 | 
					 | 
				
			||||||
	s.d	$f20, SC_FPREGS+0*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
	s.d	$f22, SC_FPREGS+1*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
	s.d	$f24, SC_FPREGS+2*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
	s.d	$f26, SC_FPREGS+3*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
	s.d	$f28, SC_FPREGS+4*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
	s.d	$f30, SC_FPREGS+5*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
	sw	v0, SC_FPSR(a0)
 | 
					 | 
				
			||||||
	move	v0, zero
 | 
					 | 
				
			||||||
	RESTORE_GP64
 | 
					 | 
				
			||||||
	PTR_ADDU sp, FRAMESZ
 | 
					 | 
				
			||||||
	j	ra
 | 
					 | 
				
			||||||
END(setjmp)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
NON_LEAF(longjmp, FRAMESZ, ra)
 | 
					 | 
				
			||||||
	.mask	0x80000000, RAOFF
 | 
					 | 
				
			||||||
	PTR_SUBU sp, FRAMESZ
 | 
					 | 
				
			||||||
	SETUP_GP64(GPOFF, longjmp)
 | 
					 | 
				
			||||||
	SAVE_GP(GPOFF)
 | 
					 | 
				
			||||||
	.set	reorder
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifndef __LP64__
 | 
					 | 
				
			||||||
	addiu	a0, 7				# roundup jmpbuf addr to 8-byte boundary
 | 
					 | 
				
			||||||
	li      t0, ~7
 | 
					 | 
				
			||||||
	and	a0, t0
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	REG_S	a1, A1OFF(sp)
 | 
					 | 
				
			||||||
	REG_S	a0, A0OFF(sp)
 | 
					 | 
				
			||||||
	lw	a0, SC_MASK(a0)
 | 
					 | 
				
			||||||
	jal	sigsetmask
 | 
					 | 
				
			||||||
	REG_L	a0, A0OFF(sp)
 | 
					 | 
				
			||||||
	REG_L	a1, A1OFF(sp)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	lw	v0, SC_MAGIC(a0)
 | 
					 | 
				
			||||||
	li	t0, 0xACEDBADE
 | 
					 | 
				
			||||||
	bne	v0, t0, botch			# jump if error
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	# callee-saved long-sized regs:
 | 
					 | 
				
			||||||
	REG_L	ra, SC_REGS+0*REGSZ(a0)
 | 
					 | 
				
			||||||
	REG_L	s0, SC_REGS+1*REGSZ(a0)
 | 
					 | 
				
			||||||
	REG_L	s1, SC_REGS+2*REGSZ(a0)
 | 
					 | 
				
			||||||
	REG_L	s2, SC_REGS+3*REGSZ(a0)
 | 
					 | 
				
			||||||
	REG_L	s3, SC_REGS+4*REGSZ(a0)
 | 
					 | 
				
			||||||
	REG_L	s4, SC_REGS+5*REGSZ(a0)
 | 
					 | 
				
			||||||
	REG_L	s5, SC_REGS+6*REGSZ(a0)
 | 
					 | 
				
			||||||
	REG_L	s6, SC_REGS+7*REGSZ(a0)
 | 
					 | 
				
			||||||
	REG_L	s7, SC_REGS+8*REGSZ(a0)
 | 
					 | 
				
			||||||
	REG_L	s8, SC_REGS+9*REGSZ(a0)
 | 
					 | 
				
			||||||
	REG_L	gp, SC_REGS+10*REGSZ(a0)
 | 
					 | 
				
			||||||
	REG_L	sp, SC_REGS+11*REGSZ(a0)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	lw	v0, SC_FPSR(a0)
 | 
					 | 
				
			||||||
	ctc1	v0, $31
 | 
					 | 
				
			||||||
#ifdef __LP64__
 | 
					 | 
				
			||||||
	# callee-saved fp regs on mips n64 ABI are $f24..$f31
 | 
					 | 
				
			||||||
	l.d	$f24, SC_FPREGS+0*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
	l.d	$f25, SC_FPREGS+1*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
	l.d	$f26, SC_FPREGS+2*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
	l.d	$f27, SC_FPREGS+3*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
	l.d	$f28, SC_FPREGS+4*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
	l.d	$f29, SC_FPREGS+5*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
	l.d	$f30, SC_FPREGS+6*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
	l.d	$f31, SC_FPREGS+7*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
	# callee-saved fp regs on mips o32 ABI are
 | 
					 | 
				
			||||||
	#   the even-numbered fp regs $f20,$f22,...$f30
 | 
					 | 
				
			||||||
	l.d	$f20, SC_FPREGS+0*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
	l.d	$f22, SC_FPREGS+1*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
	l.d	$f24, SC_FPREGS+2*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
	l.d	$f26, SC_FPREGS+3*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
	l.d	$f28, SC_FPREGS+4*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
	l.d	$f30, SC_FPREGS+5*REGSZ_FP(a0)
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
	bne	a1, zero, 1f
 | 
					 | 
				
			||||||
	li	a1, 1			# never return 0!
 | 
					 | 
				
			||||||
1:
 | 
					 | 
				
			||||||
	move	v0, a1
 | 
					 | 
				
			||||||
	j	ra
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
botch:
 | 
					 | 
				
			||||||
	jal	longjmperror
 | 
					 | 
				
			||||||
	jal	abort
 | 
					 | 
				
			||||||
	RESTORE_GP64
 | 
					 | 
				
			||||||
	PTR_ADDU sp, FRAMESZ
 | 
					 | 
				
			||||||
END(longjmp)
 | 
					 | 
				
			||||||
							
								
								
									
										1
									
								
								libc/arch-mips64/bionic/setjmp.S
									
									
									
									
									
										Symbolic link
									
								
							
							
						
						
									
										1
									
								
								libc/arch-mips64/bionic/setjmp.S
									
									
									
									
									
										Symbolic link
									
								
							@@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					../../arch-mips/bionic/setjmp.S
 | 
				
			||||||
@@ -1,76 +0,0 @@
 | 
				
			|||||||
/* $OpenBSD: sigsetjmp.S,v 1.5 2005/08/07 16:40:15 espie Exp $ */
 | 
					 | 
				
			||||||
/*-
 | 
					 | 
				
			||||||
 * Copyright (c) 1991, 1993, 1995,
 | 
					 | 
				
			||||||
 *	The Regents of the University of California.  All rights reserved.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * This code is derived from software contributed to Berkeley by
 | 
					 | 
				
			||||||
 * Havard Eidnes.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * Redistribution and use in source and binary forms, with or without
 | 
					 | 
				
			||||||
 * modification, are permitted provided that the following conditions
 | 
					 | 
				
			||||||
 * are met:
 | 
					 | 
				
			||||||
 * 1. Redistributions of source code must retain the above copyright
 | 
					 | 
				
			||||||
 *    notice, this list of conditions and the following disclaimer.
 | 
					 | 
				
			||||||
 * 2. Redistributions in binary form must reproduce the above copyright
 | 
					 | 
				
			||||||
 *    notice, this list of conditions and the following disclaimer in the
 | 
					 | 
				
			||||||
 *    documentation and/or other materials provided with the distribution.
 | 
					 | 
				
			||||||
 * 3. Neither the name of the University nor the names of its contributors
 | 
					 | 
				
			||||||
 *    may be used to endorse or promote products derived from this software
 | 
					 | 
				
			||||||
 *    without specific prior written permission.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 | 
					 | 
				
			||||||
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
					 | 
				
			||||||
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
					 | 
				
			||||||
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 | 
					 | 
				
			||||||
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 | 
					 | 
				
			||||||
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 | 
					 | 
				
			||||||
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 | 
					 | 
				
			||||||
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 | 
					 | 
				
			||||||
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 | 
					 | 
				
			||||||
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 | 
					 | 
				
			||||||
 * SUCH DAMAGE.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <private/bionic_asm.h>
 | 
					 | 
				
			||||||
#include <machine/setjmp.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 * trampolines for sigsetjmp and  siglongjmp save and restore mask.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
FRAMESZ= MKFSIZ(1,1)
 | 
					 | 
				
			||||||
GPOFF= FRAMESZ-2*REGSZ
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
LEAF(sigsetjmp, FRAMESZ)
 | 
					 | 
				
			||||||
	PTR_SUBU sp, FRAMESZ
 | 
					 | 
				
			||||||
	SETUP_GP64(GPOFF, sigsetjmp)
 | 
					 | 
				
			||||||
	.set	reorder
 | 
					 | 
				
			||||||
	sw	a1, _JBLEN*REGSZ(a0)		# save "savemask"
 | 
					 | 
				
			||||||
	bne	a1, 0x0, 1f			# do saving of signal mask?
 | 
					 | 
				
			||||||
	LA	t9, _setjmp
 | 
					 | 
				
			||||||
	RESTORE_GP64
 | 
					 | 
				
			||||||
	PTR_ADDU sp, FRAMESZ
 | 
					 | 
				
			||||||
	jr t9
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
1:	LA	t9, setjmp
 | 
					 | 
				
			||||||
	RESTORE_GP64
 | 
					 | 
				
			||||||
	PTR_ADDU sp, FRAMESZ
 | 
					 | 
				
			||||||
	jr t9
 | 
					 | 
				
			||||||
END(sigsetjmp)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
LEAF(siglongjmp, FRAMESZ)
 | 
					 | 
				
			||||||
	PTR_SUBU sp, FRAMESZ
 | 
					 | 
				
			||||||
	SETUP_GP64(GPOFF, siglongjmp)
 | 
					 | 
				
			||||||
	.set	reorder
 | 
					 | 
				
			||||||
	lw	t0, _JBLEN*REGSZ(a0)		# get "savemask"
 | 
					 | 
				
			||||||
	bne	t0, 0x0, 1f			# restore signal mask?
 | 
					 | 
				
			||||||
	LA	t9, _longjmp
 | 
					 | 
				
			||||||
	RESTORE_GP64
 | 
					 | 
				
			||||||
	PTR_ADDU sp, FRAMESZ
 | 
					 | 
				
			||||||
	jr	t9
 | 
					 | 
				
			||||||
1:
 | 
					 | 
				
			||||||
	LA	t9, longjmp
 | 
					 | 
				
			||||||
	RESTORE_GP64
 | 
					 | 
				
			||||||
	PTR_ADDU sp, FRAMESZ
 | 
					 | 
				
			||||||
	jr	t9
 | 
					 | 
				
			||||||
END(siglongjmp)
 | 
					 | 
				
			||||||
@@ -49,9 +49,7 @@ libc_openbsd_src_files_mips64 += \
 | 
				
			|||||||
libc_bionic_src_files_mips64 += \
 | 
					libc_bionic_src_files_mips64 += \
 | 
				
			||||||
    arch-mips64/bionic/__bionic_clone.S \
 | 
					    arch-mips64/bionic/__bionic_clone.S \
 | 
				
			||||||
    arch-mips64/bionic/_exit_with_stack_teardown.S \
 | 
					    arch-mips64/bionic/_exit_with_stack_teardown.S \
 | 
				
			||||||
    arch-mips64/bionic/_setjmp.S \
 | 
					 | 
				
			||||||
    arch-mips64/bionic/setjmp.S \
 | 
					    arch-mips64/bionic/setjmp.S \
 | 
				
			||||||
    arch-mips64/bionic/sigsetjmp.S \
 | 
					 | 
				
			||||||
    arch-mips64/bionic/syscall.S \
 | 
					    arch-mips64/bionic/syscall.S \
 | 
				
			||||||
    arch-mips64/bionic/vfork.S \
 | 
					    arch-mips64/bionic/vfork.S \
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user