Home | History | Annotate | Line # | Download | only in mips
sigcode.S revision 1.1
      1 /*	$NetBSD: sigcode.S,v 1.1 2002/11/09 02:02:33 nisimura Exp $	*/
      2 
      3 #include "opt_compat_ultrix.h"
      4 #include "opt_compat_linux.h"
      5 #include "opt_compat_irix.h"
      6 
      7 #include <sys/syscall.h>
      8 #ifdef COMPAT_ULTRIX
      9 #include <compat/ultrix/ultrix_syscall.h>
     10 #endif
     11 #ifdef COMPAT_LINUX
     12 #include <compat/linux/linux_syscall.h>
     13 #endif
     14 #ifdef COMPAT_IRIX
     15 #include <compat/irix/irix_syscall.h>
     16 #endif
     17 
     18 #include <mips/asm.h>
     19 #include "assym.h"
     20 
     21 	.set	noreorder
     22 
     23 /*
     24  * This code is copied the user's stack for returning from signal handlers
     25  * (see sendsig() and sigreturn()). We have to compute the address
     26  * of the sigcontext struct for the sigreturn call.
     27  *
     28  * NB: we cannot profile sigcode(), it executes from userspace.
     29  */
     30 LEAF_NOPROFILE(sigcode)
     31 	move	a0, sp			# address of sigcontext
     32 	li	v0, SYS___sigreturn14	# sigreturn(scp)
     33 	syscall
     34 	break	0			# just in case sigreturn fails
     35 END(sigcode)
     36 XLEAF(esigcode)
     37 
     38 #ifdef COMPAT_ULTRIX
     39 LEAF_NOPROFILE(ultrix_sigcode)
     40 	move	a0, sp			# address of sigcontext
     41 	li	v0, ULTRIX_SYS_sigreturn	# sigreturn(scp)
     42 	syscall
     43 	break	0			# just in case sigreturn fails
     44 END(ultrix_sigcode)
     45 XLEAF(ultrix_esigcode)
     46 #endif
     47 
     48 #ifdef COMPAT_LINUX
     49 #define SYSCALL_SHIFT 4000		# 4000 shift as in linux_syscall.c
     50 LEAF_NOPROFILE(linux_sigcode)
     51 	move	a0, sp			# address of sigcontext
     52 	li	v0, LINUX_SYS_sigreturn	+ SYSCALL_SHIFT # sigreturn(sf)
     53 	syscall
     54 	break	0			# just in case sigreturn fails
     55 END(linux_sigcode)
     56 XLEAF(linux_esigcode)
     57 #undef SYSCALL_SHIFT
     58 #endif
     59