hjl / source-git / glibc

Forked from source-git/glibc 3 years ago
Clone

Blame sysdeps/unix/sysv/linux/hppa/getcontext.S

Packit 6c4009
/* Get current user context.
Packit 6c4009
   Copyright (C) 2008-2018 Free Software Foundation, Inc.
Packit 6c4009
   This file is part of the GNU C Library.
Packit 6c4009
   Contributed by Helge Deller <deller@gmx.de>, 2008.
Packit 6c4009
Packit 6c4009
   The GNU C Library is free software; you can redistribute it and/or
Packit 6c4009
   modify it under the terms of the GNU Lesser General Public
Packit 6c4009
   License as published by the Free Software Foundation; either
Packit 6c4009
   version 2.1 of the License, or (at your option) any later version.
Packit 6c4009
Packit 6c4009
   The GNU C Library is distributed in the hope that it will be useful,
Packit 6c4009
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 6c4009
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU
Packit 6c4009
   Lesser General Public License for more details.
Packit 6c4009
Packit 6c4009
   You should have received a copy of the GNU Lesser General Public
Packit 6c4009
   License along with the GNU C Library.  If not, see
Packit 6c4009
   <http://www.gnu.org/licenses/>.  */
Packit 6c4009
Packit 6c4009
#include <sysdep.h>
Packit 6c4009
Packit 6c4009
#include "ucontext_i.h"
Packit 6c4009
Packit 6c4009
Packit 6c4009
	/* Trampoline function. Non-standard calling ABI.  */
Packit 6c4009
	/* Can not use ENTRY(__getcontext_ret) here.  */
Packit 6c4009
	.type	__getcontext_ret, @function
Packit 6c4009
	.hidden	__getcontext_ret
Packit 6c4009
__getcontext_ret:
Packit 6c4009
	.proc
Packit 6c4009
	.callinfo FRAME=0,NO_CALLS
Packit 6c4009
	/* r26-r23 contain original r3-r6, but because setcontext
Packit 6c4009
	   does not reload r3-r6 (it's using them as temporaries)
Packit 6c4009
	   we must save them elsewhere and swap them back in.  */
Packit 6c4009
	copy	%r23, %r3
Packit 6c4009
	copy	%r24, %r4
Packit 6c4009
	copy	%r25, %r5
Packit 6c4009
	copy	%r26, %r6
Packit 6c4009
	/* r20 contains original return pointer.  */
Packit 6c4009
	bv	0(%r20)
Packit 6c4009
	copy	%r0, %ret0
Packit 6c4009
	.procend
Packit 6c4009
	.size	__getcontext_ret, .-__getcontext_ret
Packit 6c4009
Packit 6c4009
Packit 6c4009
ENTRY(__getcontext)
Packit 6c4009
	/* Save the registers.  */
Packit 6c4009
	stw	%r0, oR0(%r26)
Packit 6c4009
	stw	%r1, oR1(%r26)
Packit 6c4009
	/* stw	%r2, oR2(%r26) - used for trampoline.  */
Packit 6c4009
	stw	%r3, oR3(%r26)
Packit 6c4009
	stw	%r4, oR4(%r26)
Packit 6c4009
	stw	%r5, oR5(%r26)
Packit 6c4009
	stw	%r6, oR6(%r26)
Packit 6c4009
	stw	%r7, oR7(%r26)
Packit 6c4009
	stw	%r8, oR8(%r26)
Packit 6c4009
	stw	%r9, oR9(%r26)
Packit 6c4009
	stw	%r10, oR10(%r26)
Packit 6c4009
	stw	%r11, oR11(%r26)
Packit 6c4009
	stw	%r12, oR12(%r26)
Packit 6c4009
	stw	%r13, oR13(%r26)
Packit 6c4009
	stw	%r14, oR14(%r26)
Packit 6c4009
	stw	%r15, oR15(%r26)
Packit 6c4009
	stw	%r16, oR16(%r26)
Packit 6c4009
	stw	%r17, oR17(%r26)
Packit 6c4009
	stw	%r18, oR18(%r26)
Packit 6c4009
	stw	%r19, oR19(%r26)
Packit 6c4009
	/* stw	%r20, oR20(%r26) - used for trampoline.  */
Packit 6c4009
	stw	%r21, oR21(%r26)
Packit 6c4009
	stw	%r22, oR22(%r26)
Packit 6c4009
	/* stw	%r23, oR23(%r26) - used for trampoline.  */
Packit 6c4009
	/* stw	%r24, oR24(%r26) - used for trampoline.  */
Packit 6c4009
	/* stw	%r25, oR25(%r26) - used for trampoline.  */
Packit 6c4009
	/* stw	%r26, oR26(%r26) - used for trampoline.  */
Packit 6c4009
	stw	%r27, oR27(%r26)
Packit 6c4009
	stw	%r28, oR28(%r26)
Packit 6c4009
	stw	%r29, oR29(%r26)
Packit 6c4009
	stw	%sp, oR30(%r26)
Packit 6c4009
	stw	%r31, oR31(%r26)
Packit 6c4009
Packit 6c4009
	stw	%r0, oUC_FLAGS(%r26)
Packit 6c4009
	/* stw	%r0, oUC_LINK(%r26) - Do not overwrite.  */
Packit 6c4009
	stw	%sp, oSS_SP(%r26)
Packit 6c4009
	stw	%r0, oSS_FLAGS(%r26)
Packit 6c4009
	stw	%r0, oSS_SIZE(%r26)
Packit 6c4009
Packit 6c4009
	stw	%r0, oSC_FLAGS(%r26)
Packit 6c4009
Packit 6c4009
	stw	%r0, oIASQ0(%r26)
Packit 6c4009
	stw	%r0, oIASQ1(%r26)
Packit 6c4009
	stw	%r0, oIAOQ0(%r26)
Packit 6c4009
	stw	%r0, oIAOQ1(%r26)
Packit 6c4009
	stw	%r0, oSAR(%r26) /* used as flag in swapcontext().  */
Packit 6c4009
Packit 6c4009
Packit 6c4009
	/* Store floating-point regs.  */
Packit 6c4009
	ldo	oFPREGS0(%r26),%r1
Packit 6c4009
	fstds,ma %fr0, 8(%r1)
Packit 6c4009
	fstds,ma %fr1, 8(%r1)
Packit 6c4009
	fstds,ma %fr2, 8(%r1)
Packit 6c4009
	fstds,ma %fr3, 8(%r1)
Packit 6c4009
	fstds,ma %fr4, 8(%r1)
Packit 6c4009
	fstds,ma %fr5, 8(%r1)
Packit 6c4009
	fstds,ma %fr6, 8(%r1)
Packit 6c4009
	fstds,ma %fr7, 8(%r1)
Packit 6c4009
	fstds,ma %fr8, 8(%r1)
Packit 6c4009
	fstds,ma %fr9, 8(%r1)
Packit 6c4009
	fstds,ma %fr10, 8(%r1)
Packit 6c4009
	fstds,ma %fr11, 8(%r1)
Packit 6c4009
	fstds,ma %fr12, 8(%r1)
Packit 6c4009
	fstds,ma %fr13, 8(%r1)
Packit 6c4009
	fstds,ma %fr14, 8(%r1)
Packit 6c4009
	fstds,ma %fr15, 8(%r1)
Packit 6c4009
	fstds,ma %fr16, 8(%r1)
Packit 6c4009
	fstds,ma %fr17, 8(%r1)
Packit 6c4009
	fstds,ma %fr18, 8(%r1)
Packit 6c4009
	fstds,ma %fr19, 8(%r1)
Packit 6c4009
	fstds,ma %fr20, 8(%r1)
Packit 6c4009
	fstds,ma %fr21, 8(%r1)
Packit 6c4009
	fstds,ma %fr22, 8(%r1)
Packit 6c4009
	fstds,ma %fr23, 8(%r1)
Packit 6c4009
	fstds,ma %fr24, 8(%r1)
Packit 6c4009
	fstds,ma %fr25, 8(%r1)
Packit 6c4009
	fstds,ma %fr26, 8(%r1)
Packit 6c4009
	fstds,ma %fr27, 8(%r1)
Packit 6c4009
	fstds,ma %fr28, 8(%r1)
Packit 6c4009
	fstds,ma %fr29, 8(%r1)
Packit 6c4009
	fstds,ma %fr30, 8(%r1)
Packit 6c4009
	fstds	 %fr31, 0(%r1)
Packit 6c4009
Packit 6c4009
	/* Prologue */
Packit 6c4009
	stw	%r2, -20(%sp)
Packit 6c4009
	.cfi_offset 2, -20
Packit 6c4009
	stwm	%r4, 64(%sp)
Packit 6c4009
	.cfi_def_cfa_offset -64
Packit 6c4009
	.cfi_offset 4, 0
Packit 6c4009
#ifdef PIC
Packit 6c4009
	stw	%r19, -32(%sp)
Packit 6c4009
	.cfi_offset 19, 32
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
	/* Set up the trampoline registers.
Packit 6c4009
	   r20, r23, r24, r25, r26 and r2 are clobbered
Packit 6c4009
	   by call to getcontext() anyway. Reuse them.  */
Packit 6c4009
	stw	%r2, oR20(%r26)
Packit 6c4009
	stw	%r3, oR23(%r26)
Packit 6c4009
	stw	%r4, oR24(%r26)
Packit 6c4009
	stw	%r5, oR25(%r26)
Packit 6c4009
	stw	%r6, oR26(%r26)
Packit 6c4009
#ifdef PIC
Packit 6c4009
	addil	LT%__getcontext_ret, %r19
Packit 6c4009
	ldw     RT%__getcontext_ret(%r1), %r1
Packit 6c4009
#else
Packit 6c4009
	ldil	L%__getcontext_ret, %r1
Packit 6c4009
	ldo     R%__getcontext_ret(%r1), %r1
Packit 6c4009
#endif
Packit 6c4009
	stw	%r1, oR2(%r26)
Packit 6c4009
Packit 6c4009
	/* Save the current signal mask.  */
Packit 6c4009
	/* sigprocmask(SIG_BLOCK, NULL, &ucp->uc_sigmask);  */
Packit 6c4009
	ldo	oSIGMASK(%r26), %r24
Packit 6c4009
	copy	%r0, %r25
Packit 6c4009
	bl	__sigprocmask, %r2
Packit 6c4009
	ldi	SIG_BLOCK, %r26
Packit 6c4009
Packit 6c4009
	/* Epilogue */
Packit 6c4009
	ldw	-84(%sp), %r2
Packit 6c4009
#ifdef PIC
Packit 6c4009
	ldw	-32(%sp), %r19
Packit 6c4009
#endif
Packit 6c4009
	bv	%r0(%r2)
Packit 6c4009
	ldwm	-64(%sp), %r4
Packit 6c4009
END(__getcontext)
Packit 6c4009
Packit 6c4009
weak_alias (__getcontext, getcontext)