/* Copyright (C) 2001 Free Software Foundation, Inc.
   This file is part of the GNU C Library.
     Contributed by Jakub Jelinek <jakub@redhat.com>.

   The GNU C Library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   version 2.1 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
   Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General Public
   License along with the GNU C Library; if not, write to the Free
   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
   02111-1307 USA.  */

/* Constants shared between setcontext() and getcontext().  Don't
   install this header file.  */

#define UC_LINK		0
#define __UC_SIGMASK	16
#define UC_M_PC		40
#define UC_M_NPC	48
#define UC_SIGMASK	536
#define SIGMASK_WORDS	16

/* Copyright (C) 1997, 2001 Free Software Foundation, Inc.
   This file is part of the GNU C Library.
   Contributed by Richard Henderson (rth@tamu.edu).

   The GNU C Library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   version 2.1 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
   Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General Public
   License along with the GNU C Library; if not, write to the Free
   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
   02111-1307 USA.  */

#include <linux/linkage.h>

/*#include "ucontext_i.h" (up above) */

/* int getcontext(ucontext_t *); */

ENTRY(__getcontext)

	ldx	[%o0 + UC_LINK], %o1	/* Preserve uc_link field, the
					   trap clears it.  */
	ta	0x6e
1:
	ldx	[%o0 + UC_M_PC], %o2
	ldx	[%o0 + UC_M_NPC], %o3
	ldx	[%o0 + __UC_SIGMASK], %o4
	stx	%o1, [%o0 + UC_LINK]
	add	%o2, 2f - 1b, %o2
	stx	%o2, [%o0 + UC_M_PC]
	add	%o3, 2f - 1b, %o3
	stx	%o3, [%o0 + UC_M_NPC]
#if SIGMASK_WORDS == 16
	stx	%o4, [%o0 + UC_SIGMASK]
	stx	%g0, [%o0 + UC_SIGMASK + 8]
	stx	%g0, [%o0 + UC_SIGMASK + 16]
	stx	%g0, [%o0 + UC_SIGMASK + 24]
	stx	%g0, [%o0 + UC_SIGMASK + 32]
	stx	%g0, [%o0 + UC_SIGMASK + 40]
	stx	%g0, [%o0 + UC_SIGMASK + 48]
	stx	%g0, [%o0 + UC_SIGMASK + 56]
	stx	%g0, [%o0 + UC_SIGMASK + 64]
	stx	%g0, [%o0 + UC_SIGMASK + 72]
	stx	%g0, [%o0 + UC_SIGMASK + 80]
	stx	%g0, [%o0 + UC_SIGMASK + 88]
	stx	%g0, [%o0 + UC_SIGMASK + 96]
	stx	%g0, [%o0 + UC_SIGMASK + 104]
	stx	%g0, [%o0 + UC_SIGMASK + 112]
	stx	%g0, [%o0 + UC_SIGMASK + 120]
#else
# error Adjust __getcontext
#endif
2:
	retl
	 clr	%o0

END(__getcontext)

weak_alias(__getcontext, getcontext)

/* Copyright (C) 1997, 2001 Free Software Foundation, Inc.
   This file is part of the GNU C Library.
   Contributed by Richard Henderson (rth@tamu.edu).

   The GNU C Library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   version 2.1 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
   Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General Public
   License along with the GNU C Library; if not, write to the Free
   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
   02111-1307 USA.  */

/*
#include <sysdep.h>
#include "ucontext_i.h"
*/

/* int setcontext(ucontext_t *ctx); */
.weak setcontext
ENTRY(setcontext)

	mov	1, %o1

/* int __setcontext(ucontext_t *ctx, int restoremask); */
ENTRY(__setcontext)

	ldx	[%o0 + UC_SIGMASK], %o2
	stx	%o2, [%o0 + __UC_SIGMASK]
	ta	0x6f

#ifdef END
#define END(x)
#endif

END(__setcontext)

