compat_sigaltstack.h revision 1.4
1230557Sjimharris/*      $NetBSD: compat_sigaltstack.h,v 1.4 2021/11/01 05:07:16 thorpej Exp $        */
2230557Sjimharris
3230557Sjimharris/* Wrapper for calling sigaltstack1() from compat (or other) code */
4230557Sjimharris
5230557Sjimharris/* Maybe these definitions could be global. */
6230557Sjimharris#ifdef SCARG_P32
7230557Sjimharris/* compat32 */
8230557Sjimharris#define	SCARG_COMPAT_PTR(uap,p)	SCARG_P32(uap, p)
9230557Sjimharris#define	COMPAT_GET_PTR(p)	NETBSD32PTR64(p)
10230557Sjimharris#define	COMPAT_SET_PTR(p, v)	NETBSD32PTR32(p, v)
11230557Sjimharris#else
12230557Sjimharris/* not a size change */
13230557Sjimharris#define	SCARG_COMPAT_PTR(uap,p)	SCARG(uap, p)
14230557Sjimharris#define	COMPAT_GET_PTR(p)	(p)
15230557Sjimharris#define	COMPAT_SET_PTR(p, v)	((p) = (v))
16230557Sjimharris#endif
17230557Sjimharris
18230557Sjimharris#define compat_sigaltstack(uap, compat_ss, ss_onstack, ss_disable) do { \
19230557Sjimharris	struct compat_ss css; \
20230557Sjimharris	stack_t nss, oss; \
21230557Sjimharris	int error; \
22230557Sjimharris\
23230557Sjimharris	if (SCARG_COMPAT_PTR(uap, nss)) { \
24230557Sjimharris		error = copyin(SCARG_COMPAT_PTR(uap, nss), &css, sizeof css); \
25230557Sjimharris		if (error) \
26230557Sjimharris			return error; \
27230557Sjimharris		nss.ss_sp = COMPAT_GET_PTR(css.ss_sp); \
28230557Sjimharris		nss.ss_size = css.ss_size; \
29230557Sjimharris		if (ss_onstack == SS_ONSTACK && ss_disable == SS_DISABLE) \
30230557Sjimharris			nss.ss_flags = css.ss_flags; \
31230557Sjimharris		else \
32230557Sjimharris			nss.ss_flags = \
33230557Sjimharris			    (css.ss_flags & ss_onstack ? SS_ONSTACK : 0) \
34230557Sjimharris			    | (css.ss_flags & ss_disable ? SS_DISABLE : 0); \
35230557Sjimharris	} \
36230557Sjimharris\
37230557Sjimharris	error = sigaltstack1(curlwp, SCARG_COMPAT_PTR(uap, nss) ? &nss : 0, \
38230557Sjimharris				SCARG_COMPAT_PTR(uap, oss) ? &oss : 0); \
39230557Sjimharris	if (error) \
40230557Sjimharris		return (error); \
41230557Sjimharris\
42230557Sjimharris	if (SCARG_COMPAT_PTR(uap, oss)) { \
43230557Sjimharris		COMPAT_SET_PTR(css.ss_sp, oss.ss_sp); \
44230557Sjimharris		css.ss_size = oss.ss_size; \
45230557Sjimharris		if (ss_onstack == SS_ONSTACK && ss_disable == SS_DISABLE) \
46230557Sjimharris			css.ss_flags = oss.ss_flags; \
47230557Sjimharris		else \
48230557Sjimharris			css.ss_flags = \
49230557Sjimharris			    (oss.ss_flags & SS_ONSTACK ? ss_onstack : 0) \
50230557Sjimharris			    | (oss.ss_flags & SS_DISABLE ? ss_disable : 0); \
51230557Sjimharris		error = copyout(&css, SCARG_COMPAT_PTR(uap, oss), sizeof(css));\
52230557Sjimharris		if (error) \
53230557Sjimharris			return (error); \
54230557Sjimharris	} \
55230557Sjimharris	return (0); \
56230557Sjimharris} while (0)
57230557Sjimharris