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