1 1.4 thorpej /* $NetBSD: compat_sigaltstack.h,v 1.4 2021/11/01 05:07:16 thorpej Exp $ */ 2 1.1 dsl 3 1.1 dsl /* Wrapper for calling sigaltstack1() from compat (or other) code */ 4 1.1 dsl 5 1.1 dsl /* Maybe these definitions could be global. */ 6 1.1 dsl #ifdef SCARG_P32 7 1.1 dsl /* compat32 */ 8 1.1 dsl #define SCARG_COMPAT_PTR(uap,p) SCARG_P32(uap, p) 9 1.1 dsl #define COMPAT_GET_PTR(p) NETBSD32PTR64(p) 10 1.1 dsl #define COMPAT_SET_PTR(p, v) NETBSD32PTR32(p, v) 11 1.1 dsl #else 12 1.1 dsl /* not a size change */ 13 1.1 dsl #define SCARG_COMPAT_PTR(uap,p) SCARG(uap, p) 14 1.1 dsl #define COMPAT_GET_PTR(p) (p) 15 1.1 dsl #define COMPAT_SET_PTR(p, v) ((p) = (v)) 16 1.1 dsl #endif 17 1.1 dsl 18 1.2 dsl #define compat_sigaltstack(uap, compat_ss, ss_onstack, ss_disable) do { \ 19 1.1 dsl struct compat_ss css; \ 20 1.4 thorpej stack_t nss, oss; \ 21 1.1 dsl int error; \ 22 1.1 dsl \ 23 1.1 dsl if (SCARG_COMPAT_PTR(uap, nss)) { \ 24 1.1 dsl error = copyin(SCARG_COMPAT_PTR(uap, nss), &css, sizeof css); \ 25 1.1 dsl if (error) \ 26 1.1 dsl return error; \ 27 1.2 dsl nss.ss_sp = COMPAT_GET_PTR(css.ss_sp); \ 28 1.2 dsl nss.ss_size = css.ss_size; \ 29 1.2 dsl if (ss_onstack == SS_ONSTACK && ss_disable == SS_DISABLE) \ 30 1.2 dsl nss.ss_flags = css.ss_flags; \ 31 1.2 dsl else \ 32 1.2 dsl nss.ss_flags = \ 33 1.2 dsl (css.ss_flags & ss_onstack ? SS_ONSTACK : 0) \ 34 1.2 dsl | (css.ss_flags & ss_disable ? SS_DISABLE : 0); \ 35 1.1 dsl } \ 36 1.1 dsl \ 37 1.3 dsl error = sigaltstack1(curlwp, SCARG_COMPAT_PTR(uap, nss) ? &nss : 0, \ 38 1.1 dsl SCARG_COMPAT_PTR(uap, oss) ? &oss : 0); \ 39 1.1 dsl if (error) \ 40 1.1 dsl return (error); \ 41 1.1 dsl \ 42 1.1 dsl if (SCARG_COMPAT_PTR(uap, oss)) { \ 43 1.1 dsl COMPAT_SET_PTR(css.ss_sp, oss.ss_sp); \ 44 1.1 dsl css.ss_size = oss.ss_size; \ 45 1.2 dsl if (ss_onstack == SS_ONSTACK && ss_disable == SS_DISABLE) \ 46 1.2 dsl css.ss_flags = oss.ss_flags; \ 47 1.2 dsl else \ 48 1.2 dsl css.ss_flags = \ 49 1.2 dsl (oss.ss_flags & SS_ONSTACK ? ss_onstack : 0) \ 50 1.2 dsl | (oss.ss_flags & SS_DISABLE ? ss_disable : 0); \ 51 1.2 dsl error = copyout(&css, SCARG_COMPAT_PTR(uap, oss), sizeof(css));\ 52 1.1 dsl if (error) \ 53 1.1 dsl return (error); \ 54 1.1 dsl } \ 55 1.1 dsl return (0); \ 56 1.1 dsl } while (0) 57