1 /* $NetBSD: compat_13_machdep.c,v 1.16 2009/11/21 17:40:29 rmind Exp $ */
4 * Copyright (C) 1995, 1996 Wolfgang Solfrank.
5 * Copyright (C) 1995, 1996 TooLs GmbH.
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
16 * 3. All advertising materials mentioning features or use of this software
17 * must display the following acknowledgement:
18 * This product includes software developed by TooLs GmbH.
19 * 4. The name of TooLs GmbH may not be used to endorse or promote products
20 * derived from this software without specific prior written permission.
22 * THIS SOFTWARE IS PROVIDED BY TOOLS GMBH ``AS IS'' AND ANY EXPRESS OR
23 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
24 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
25 * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
27 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
28 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
29 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
30 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
31 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34 #include <sys/cdefs.h>
35 __KERNEL_RCSID(0, "$NetBSD: compat_13_machdep.c,v 1.16 2009/11/21 17:40:29 rmind Exp $");
38 #include "opt_ppcarch.h"
41 #include <sys/param.h>
42 #include <sys/systm.h>
43 #include <sys/signalvar.h>
44 #include <sys/kernel.h>
46 #include <sys/mount.h>
47 #include <sys/syscallargs.h>
49 #include <uvm/uvm_extern.h>
51 #include <compat/sys/signal.h>
52 #include <compat/sys/signalvar.h>
55 compat_13_sys_sigreturn(struct lwp
*l
,
56 const struct compat_13_sys_sigreturn_args
*uap
, register_t
*retval
)
59 syscallarg(struct sigcontext13 *) sigcntxp;
61 struct proc
*p
= l
->l_proc
;
62 struct sigcontext13 sc
;
68 * The trampoline hands us the context.
69 * It is unsafe to keep track of it ourselves, in the event that a
70 * program jumps out of a signal hander.
72 if ((error
= copyin(SCARG(uap
, sigcntxp
), &sc
, sizeof sc
)) != 0)
75 /* Restore the register context. */
77 if (!PSL_USEROK_P(sc
.sc_frame
.srr1
))
80 /* Restore register context. */
81 memcpy(tf
->fixreg
, sc
.sc_frame
.fixreg
, sizeof(tf
->fixreg
));
82 tf
->lr
= sc
.sc_frame
.lr
;
83 tf
->cr
= sc
.sc_frame
.cr
;
84 tf
->xer
= sc
.sc_frame
.xer
;
85 tf
->ctr
= sc
.sc_frame
.ctr
;
86 tf
->srr0
= sc
.sc_frame
.srr0
;
87 tf
->srr1
= sc
.sc_frame
.srr1
;
89 tf
->tf_xtra
[TF_VRSAVE
] = sc
.sc_frame
.vrsave
;
90 tf
->tf_xtra
[TF_MQ
] = sc
.sc_frame
.mq
;
93 mutex_enter(p
->p_lock
);
94 /* Restore signal stack. */
95 if (sc
.sc_onstack
& SS_ONSTACK
)
96 l
->l_sigstk
.ss_flags
|= SS_ONSTACK
;
98 l
->l_sigstk
.ss_flags
&= ~SS_ONSTACK
;
100 /* Restore signal mask. */
101 native_sigset13_to_sigset(&sc
.sc_mask
, &mask
);
102 (void) sigprocmask1(l
, SIG_SETMASK
, &mask
, 0);
103 mutex_exit(p
->p_lock
);
105 return (EJUSTRETURN
);