hjl / source-git / glibc

Forked from source-git/glibc 3 years ago
Clone

Blame sysdeps/unix/sysv/linux/sparc/sparc32/swapcontext.S

Packit 6c4009
/* Save current context and install the given one.
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 David S. Miller <davem@davemloft.net>, 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
#include <sys/trap.h>
Packit 6c4009
Packit 6c4009
#include "ucontext_i.h"
Packit 6c4009
Packit 6c4009
Packit 6c4009
/* int __swapcontext (ucontext_t *oucp, const ucontext_t *ucp);
Packit 6c4009
Packit 6c4009
  Saves the machine context in oucp such that when it is activated,
Packit 6c4009
  it appears as if __swapcontext() returned again, restores the
Packit 6c4009
  machine context in ucp and thereby resumes execution in that
Packit 6c4009
  context.
Packit 6c4009
Packit 6c4009
  This implementation is intended to be used for *synchronous* context
Packit 6c4009
  switches only.  Therefore, it does not have to save anything
Packit 6c4009
  other than the PRESERVED state.  */
Packit 6c4009
Packit 6c4009
ENTRY(__swapcontext)
Packit 6c4009
	save	%sp, -112, %sp
Packit 6c4009
	ta	ST_FLUSH_WINDOWS
Packit 6c4009
	st	%g0, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_PSR]
Packit 6c4009
	add	%i7, 8, %o0
Packit 6c4009
	st	%o0, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_PC]
Packit 6c4009
	add	%o0, 4, %o0
Packit 6c4009
	st	%o0, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_NPC]
Packit 6c4009
	rd	%y, %o1
Packit 6c4009
	st	%o1, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_Y]
Packit 6c4009
	st	%g1, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G1]
Packit 6c4009
	st	%g2, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G2]
Packit 6c4009
	st	%g3, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G3]
Packit 6c4009
	st	%g4, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G4]
Packit 6c4009
	st	%g5, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G5]
Packit 6c4009
	st	%g6, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G6]
Packit 6c4009
	st	%g7, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G7]
Packit 6c4009
	st	%g0, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O0]
Packit 6c4009
	st	%i1, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O1]
Packit 6c4009
	st	%i2, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O2]
Packit 6c4009
	st	%i3, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O3]
Packit 6c4009
	st	%i4, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O4]
Packit 6c4009
	st	%i5, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O5]
Packit 6c4009
	st	%i6, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O6]
Packit 6c4009
	st	%i7, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O7]
Packit 6c4009
	st	%g0, [%i0 + UC_MCONTEXT + MC_GWINS]
Packit 6c4009
	stb	%g0, [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_EN]
Packit 6c4009
	st	%g0, [%i0 + UC_MCONTEXT + MC_XRS + XRS_ID]
Packit 6c4009
	st	%g0, [%i0 + UC_MCONTEXT + MC_XRS + XRS_PTR]
Packit 6c4009
Packit 6c4009
	mov	SIG_SETMASK, %o0
Packit 6c4009
	add	%i1, UC_SIGMASK, %o1
Packit 6c4009
	add	%i0, UC_SIGMASK, %o2
Packit 6c4009
	mov	8, %o3
Packit 6c4009
	mov	__NR_rt_sigprocmask, %g1
Packit 6c4009
	ta	0x10
Packit 6c4009
Packit 6c4009
	mov	%i1, %i0
Packit 6c4009
	ldub	[%i0 + UC_MCONTEXT + MC_FPREGS + FPU_EN], %g1
Packit 6c4009
	cmp	%g1, 0
Packit 6c4009
	be	1f
Packit 6c4009
	 nop
Packit 6c4009
	ld	[%i0 + UC_MCONTEXT + MC_FPREGS + FPU_FSR], %fsr
Packit 6c4009
	ldd	[%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D0], %f0
Packit 6c4009
	ldd	[%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D2], %f2
Packit 6c4009
	ldd	[%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D4], %f4
Packit 6c4009
	ldd	[%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D6], %f6
Packit 6c4009
	ldd	[%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D8], %f8
Packit 6c4009
	ldd	[%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D10], %f10
Packit 6c4009
	ldd	[%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D12], %f12
Packit 6c4009
	ldd	[%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D14], %f14
Packit 6c4009
	ldd	[%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D16], %f16
Packit 6c4009
	ldd	[%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D18], %f18
Packit 6c4009
	ldd	[%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D20], %f20
Packit 6c4009
	ldd	[%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D22], %f22
Packit 6c4009
	ldd	[%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D24], %f24
Packit 6c4009
	ldd	[%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D26], %f26
Packit 6c4009
	ldd	[%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D28], %f28
Packit 6c4009
	ldd	[%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D30], %f30
Packit 6c4009
1:
Packit 6c4009
	ld	[%i0 + UC_MCONTEXT + MC_GREGS + GREG_Y], %g1
Packit 6c4009
	wr	%g1, 0x0, %y
Packit 6c4009
	ld	[%i0 + UC_MCONTEXT + MC_GREGS + GREG_G2], %g2
Packit 6c4009
	ld	[%i0 + UC_MCONTEXT + MC_GREGS + GREG_G3], %g3
Packit 6c4009
	ld	[%i0 + UC_MCONTEXT + MC_GREGS + GREG_G4], %g4
Packit 6c4009
	ld	[%i0 + UC_MCONTEXT + MC_GREGS + GREG_G5], %g5
Packit 6c4009
	ld	[%i0 + UC_MCONTEXT + MC_GREGS + GREG_G6], %g6
Packit 6c4009
	ld	[%i0 + UC_MCONTEXT + MC_GREGS + GREG_G7], %g7
Packit 6c4009
	ld	[%i0 + UC_MCONTEXT + MC_GREGS + GREG_O1], %i1
Packit 6c4009
	ld	[%i0 + UC_MCONTEXT + MC_GREGS + GREG_O2], %i2
Packit 6c4009
	ld	[%i0 + UC_MCONTEXT + MC_GREGS + GREG_O3], %i3
Packit 6c4009
	ld	[%i0 + UC_MCONTEXT + MC_GREGS + GREG_O4], %i4
Packit 6c4009
	ld	[%i0 + UC_MCONTEXT + MC_GREGS + GREG_O5], %i5
Packit 6c4009
	ld	[%i0 + UC_MCONTEXT + MC_GREGS + GREG_O6], %i6
Packit 6c4009
	restore
Packit 6c4009
	ld	[%o0 + UC_MCONTEXT + MC_GREGS + GREG_O7], %o7
Packit 6c4009
	ld	[%o0 + UC_MCONTEXT + MC_GREGS + GREG_PC], %g1
Packit 6c4009
	jmpl	%g1, %g0
Packit 6c4009
	 ld	[%o0 + UC_MCONTEXT + MC_GREGS + GREG_O0], %o0
Packit 6c4009
END(__swapcontext)
Packit 6c4009
Packit 6c4009
weak_alias (__swapcontext, swapcontext)