Blame sysdeps/unix/sysv/linux/riscv/setcontext.S

Packit Service 82fcde
/* Set current context.
Packit Service 82fcde
   Copyright (C) 2009-2018 Free Software Foundation, Inc.
Packit Service 82fcde
   This file is part of the GNU C Library.
Packit Service 82fcde
Packit Service 82fcde
   The GNU C Library is free software; you can redistribute it and/or
Packit Service 82fcde
   modify it under the terms of the GNU Lesser General Public
Packit Service 82fcde
   License as published by the Free Software Foundation; either
Packit Service 82fcde
   version 2.1 of the License, or (at your option) any later version.
Packit Service 82fcde
Packit Service 82fcde
   The GNU C Library is distributed in the hope that it will be useful,
Packit Service 82fcde
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 82fcde
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service 82fcde
   Lesser General Public License for more details.
Packit Service 82fcde
Packit Service 82fcde
   You should have received a copy of the GNU Lesser General Public
Packit Service 82fcde
   License along with the GNU C Library.  If not, see
Packit Service 82fcde
   <http://www.gnu.org/licenses/>.  */
Packit Service 82fcde
Packit Service 82fcde
#include "ucontext-macros.h"
Packit Service 82fcde
Packit Service 82fcde
/*  int __setcontext (const ucontext_t *ucp)
Packit Service 82fcde
Packit Service 82fcde
  Restores the machine context in UCP and thereby resumes execution
Packit Service 82fcde
  in that context.
Packit Service 82fcde
Packit Service 82fcde
  This implementation is intended to be used for *synchronous* context
Packit Service 82fcde
  switches only.  Therefore, it does not have to restore anything
Packit Service 82fcde
  other than the PRESERVED state.  */
Packit Service 82fcde
Packit Service 82fcde
	.text
Packit Service 82fcde
LEAF (__setcontext)
Packit Service 82fcde
Packit Service 82fcde
	mv	t0, a0	/* Save ucp into t0.  */
Packit Service 82fcde
Packit Service 82fcde
/* rt_sigprocmask (SIG_SETMASK, &ucp->uc_sigmask, NULL, _NSIG8) */
Packit Service 82fcde
	li	a3, _NSIG8
Packit Service 82fcde
	mv	a2, zero
Packit Service 82fcde
	add     a1, a0, UCONTEXT_SIGMASK
Packit Service 82fcde
	li	a0, SIG_SETMASK
Packit Service 82fcde
Packit Service 82fcde
	li	a7, SYS_ify (rt_sigprocmask)
Packit Service 82fcde
	scall
Packit Service 82fcde
Packit Service 82fcde
	bltz	a0, 99f
Packit Service 82fcde
Packit Service 82fcde
	cfi_def_cfa (t0, 0)
Packit Service 82fcde
Packit Service 82fcde
#ifndef __riscv_float_abi_soft
Packit Service 82fcde
	lw	t1, MCONTEXT_FSR(t0)
Packit Service 82fcde
Packit Service 82fcde
	RESTORE_FP_REG_CFI (fs0,   8, t0)
Packit Service 82fcde
	RESTORE_FP_REG_CFI (fs1,   9, t0)
Packit Service 82fcde
	RESTORE_FP_REG_CFI (fs2,  18, t0)
Packit Service 82fcde
	RESTORE_FP_REG_CFI (fs3,  19, t0)
Packit Service 82fcde
	RESTORE_FP_REG_CFI (fs4,  20, t0)
Packit Service 82fcde
	RESTORE_FP_REG_CFI (fs5,  21, t0)
Packit Service 82fcde
	RESTORE_FP_REG_CFI (fs6,  22, t0)
Packit Service 82fcde
	RESTORE_FP_REG_CFI (fs7,  23, t0)
Packit Service 82fcde
	RESTORE_FP_REG_CFI (fs8,  24, t0)
Packit Service 82fcde
	RESTORE_FP_REG_CFI (fs9,  25, t0)
Packit Service 82fcde
	RESTORE_FP_REG_CFI (fs10, 26, t0)
Packit Service 82fcde
	RESTORE_FP_REG_CFI (fs11, 27, t0)
Packit Service 82fcde
Packit Service 82fcde
	fssr	t1
Packit Service 82fcde
#endif /* __riscv_float_abi_soft */
Packit Service 82fcde
Packit Service 82fcde
	/* Note the contents of argument registers will be random
Packit Service 82fcde
	   unless makecontext() has been called.  */
Packit Service 82fcde
	RESTORE_INT_REG     (t1,   0, t0)
Packit Service 82fcde
	RESTORE_INT_REG_CFI (ra,   1, t0)
Packit Service 82fcde
	RESTORE_INT_REG     (sp,   2, t0)
Packit Service 82fcde
	RESTORE_INT_REG_CFI (s0,   8, t0)
Packit Service 82fcde
	RESTORE_INT_REG_CFI (s1,   9, t0)
Packit Service 82fcde
	RESTORE_INT_REG     (a0,  10, t0)
Packit Service 82fcde
	RESTORE_INT_REG     (a1,  11, t0)
Packit Service 82fcde
	RESTORE_INT_REG     (a2,  12, t0)
Packit Service 82fcde
	RESTORE_INT_REG     (a3,  13, t0)
Packit Service 82fcde
	RESTORE_INT_REG     (a4,  14, t0)
Packit Service 82fcde
	RESTORE_INT_REG     (a5,  15, t0)
Packit Service 82fcde
	RESTORE_INT_REG     (a6,  16, t0)
Packit Service 82fcde
	RESTORE_INT_REG     (a7,  17, t0)
Packit Service 82fcde
	RESTORE_INT_REG_CFI (s2,  18, t0)
Packit Service 82fcde
	RESTORE_INT_REG_CFI (s3,  19, t0)
Packit Service 82fcde
	RESTORE_INT_REG_CFI (s4,  20, t0)
Packit Service 82fcde
	RESTORE_INT_REG_CFI (s5,  21, t0)
Packit Service 82fcde
	RESTORE_INT_REG_CFI (s6,  22, t0)
Packit Service 82fcde
	RESTORE_INT_REG_CFI (s7,  23, t0)
Packit Service 82fcde
	RESTORE_INT_REG_CFI (s8,  24, t0)
Packit Service 82fcde
	RESTORE_INT_REG_CFI (s9,  25, t0)
Packit Service 82fcde
	RESTORE_INT_REG_CFI (s10, 26, t0)
Packit Service 82fcde
	RESTORE_INT_REG_CFI (s11, 27, t0)
Packit Service 82fcde
Packit Service 82fcde
	jr	t1
Packit Service 82fcde
Packit Service 82fcde
99:	j	__syscall_error
Packit Service 82fcde
Packit Service 82fcde
PSEUDO_END (__setcontext)
Packit Service 82fcde
weak_alias (__setcontext, setcontext)
Packit Service 82fcde
Packit Service 82fcde
LEAF (__start_context)
Packit Service 82fcde
Packit Service 82fcde
	/* Terminate call stack by noting ra == 0.  Happily, s0 == 0 here.  */
Packit Service 82fcde
	cfi_register (ra, s0)
Packit Service 82fcde
Packit Service 82fcde
	/* Call the function passed to makecontext.  */
Packit Service 82fcde
	jalr	s1
Packit Service 82fcde
Packit Service 82fcde
	/* Invoke subsequent context if present, else exit(0).  */
Packit Service 82fcde
	mv	a0, s2
Packit Service 82fcde
	beqz	s2, 1f
Packit Service 82fcde
	jal	__setcontext
Packit Service 82fcde
1:	j	exit
Packit Service 82fcde
Packit Service 82fcde
PSEUDO_END (__start_context)