1 /* $NetBSD: netbsd32_lwp.c,v 1.12 2011/02/05 13:46:44 yamt Exp $ */ 2 3 /* 4 * Copyright (c) 2005, 2006, 2007 The NetBSD Foundation. 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 17 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 18 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 19 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 20 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26 * POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29 #include <sys/cdefs.h> 30 __KERNEL_RCSID(0, "$NetBSD: netbsd32_lwp.c,v 1.12 2011/02/05 13:46:44 yamt Exp $"); 31 32 #include <sys/types.h> 33 #include <sys/param.h> 34 #include <sys/systm.h> 35 #include <sys/kernel.h> 36 #include <sys/dirent.h> 37 #include <sys/mount.h> 38 #include <sys/proc.h> 39 #include <sys/syscallargs.h> 40 #include <sys/lwpctl.h> 41 42 #include <compat/netbsd32/netbsd32.h> 43 #include <compat/netbsd32/netbsd32_syscallargs.h> 44 #include <compat/netbsd32/netbsd32_conv.h> 45 46 /* Sycalls conversion */ 47 48 int 49 netbsd32__lwp_create(struct lwp *l, const struct netbsd32__lwp_create_args *uap, register_t *retval) 50 { 51 /* { 52 syscallarg(const netbsd32_ucontextp) ucp; 53 syscallarg(netbsd32_u_long) flags; 54 syscallarg(netbsd32_lwpidp) new_lwp; 55 } */ 56 struct sys__lwp_create_args ua; 57 58 CTASSERT(sizeof(ucontext32_t) <= sizeof(ucontext_t)); 59 NETBSD32TOP_UAP(ucp, const ucontext_t); /* see startlwp32() */ 60 NETBSD32TO64_UAP(flags); 61 NETBSD32TOP_UAP(new_lwp, lwpid_t); 62 63 return sys__lwp_create(l, &ua, retval); 64 } 65 66 int 67 netbsd32__lwp_wait(struct lwp *l, const struct netbsd32__lwp_wait_args *uap, register_t *retval) 68 { 69 /* { 70 syscallarg(lwpid_t) wait_for; 71 syscallarg(netbsd32_lwpidp) departed; 72 } */ 73 struct sys__lwp_wait_args ua; 74 75 NETBSD32TO64_UAP(wait_for); 76 NETBSD32TOP_UAP(departed, lwpid_t); 77 return sys__lwp_wait(l, &ua, retval); 78 } 79 80 int 81 netbsd32__lwp_suspend(struct lwp *l, const struct netbsd32__lwp_suspend_args *uap, register_t *retval) 82 { 83 /* { 84 syscallarg(lwpid_t) target; 85 } */ 86 struct sys__lwp_suspend_args ua; 87 88 NETBSD32TO64_UAP(target); 89 return sys__lwp_suspend(l, &ua, retval); 90 } 91 92 int 93 netbsd32__lwp_continue(struct lwp *l, const struct netbsd32__lwp_continue_args *uap, register_t *retval) 94 { 95 /* { 96 syscallarg(lwpid_t) target; 97 } */ 98 struct sys__lwp_continue_args ua; 99 100 NETBSD32TO64_UAP(target); 101 return sys__lwp_continue(l, &ua, retval); 102 } 103 104 int 105 netbsd32__lwp_wakeup(struct lwp *l, const struct netbsd32__lwp_wakeup_args *uap, register_t *retval) 106 { 107 /* { 108 syscallarg(lwpid_t) target; 109 } */ 110 struct sys__lwp_wakeup_args ua; 111 112 NETBSD32TO64_UAP(target); 113 return sys__lwp_wakeup(l, &ua, retval); 114 } 115 116 int 117 netbsd32__lwp_setprivate(struct lwp *l, const struct netbsd32__lwp_setprivate_args *uap, register_t *retval) 118 { 119 /* { 120 syscallarg(netbsd32_voidp) ptr; 121 } */ 122 struct sys__lwp_setprivate_args ua; 123 124 NETBSD32TOP_UAP(ptr, void); 125 return sys__lwp_setprivate(l, &ua, retval); 126 } 127 128 int 129 netbsd32____lwp_park50(struct lwp *l, 130 const struct netbsd32____lwp_park50_args *uap, register_t *retval) 131 { 132 /* { 133 syscallarg(const netbsd32_timespec50p) ts; 134 syscallarg(lwpid_t) unpark; 135 syscallarg(netbsd32_voidp) hint; 136 syscallarg(netbsd32_voidp) unparkhint; 137 } */ 138 struct timespec ts, *tsp; 139 struct netbsd32_timespec ts32; 140 int error; 141 142 if (SCARG_P32(uap, ts) == NULL) 143 tsp = NULL; 144 else { 145 error = copyin(SCARG_P32(uap, ts), &ts32, sizeof ts32); 146 if (error != 0) 147 return error; 148 netbsd32_to_timespec(&ts32, &ts); 149 tsp = &ts; 150 } 151 152 if (SCARG(uap, unpark) != 0) { 153 error = lwp_unpark(SCARG(uap, unpark), 154 SCARG_P32(uap, unparkhint)); 155 if (error != 0) 156 return error; 157 } 158 159 return lwp_park(tsp, SCARG_P32(uap, hint)); 160 } 161 162 int 163 netbsd32__lwp_kill(struct lwp *l, const struct netbsd32__lwp_kill_args *uap, register_t *retval) 164 { 165 /* { 166 syscallarg(lwpid_t) target; 167 syscallarg(int) signo; 168 } */ 169 struct sys__lwp_kill_args ua; 170 171 NETBSD32TO64_UAP(target); 172 NETBSD32TO64_UAP(signo); 173 return sys__lwp_kill(l, &ua, retval); 174 } 175 int 176 netbsd32__lwp_detach(struct lwp *l, const struct netbsd32__lwp_detach_args *uap, register_t *retval) 177 { 178 /* { 179 syscallarg(lwpid_t) target; 180 } */ 181 struct sys__lwp_detach_args ua; 182 183 NETBSD32TO64_UAP(target); 184 return sys__lwp_detach(l, &ua, retval); 185 } 186 187 int 188 netbsd32__lwp_unpark(struct lwp *l, const struct netbsd32__lwp_unpark_args *uap, register_t *retval) 189 { 190 /* { 191 syscallarg(lwpid_t) target; 192 syscallarg(netbsd32_voidp) hint; 193 } */ 194 struct sys__lwp_unpark_args ua; 195 196 NETBSD32TO64_UAP(target); 197 NETBSD32TOP_UAP(hint, void); 198 return sys__lwp_unpark(l, &ua, retval); 199 } 200 201 int 202 netbsd32__lwp_unpark_all(struct lwp *l, const struct netbsd32__lwp_unpark_all_args *uap, register_t *retval) 203 { 204 /* { 205 syscallarg(const netbsd32_lwpidp) targets; 206 syscallarg(netbsd32_size_t) ntargets; 207 syscallarg(netbsd32_voidp) hint; 208 } */ 209 struct sys__lwp_unpark_all_args ua; 210 211 NETBSD32TOP_UAP(targets, const lwpid_t); 212 NETBSD32TOX_UAP(ntargets, size_t); 213 NETBSD32TOP_UAP(hint, void); 214 return sys__lwp_unpark_all(l, &ua, retval); 215 } 216 217 int 218 netbsd32__lwp_setname(struct lwp *l, const struct netbsd32__lwp_setname_args *uap, register_t *retval) 219 { 220 /* { 221 syscallarg(lwpid_t) target; 222 syscallarg(const netbsd32_charp) name; 223 } */ 224 struct sys__lwp_setname_args ua; 225 226 NETBSD32TO64_UAP(target); 227 NETBSD32TOP_UAP(name, char *); 228 return sys__lwp_setname(l, &ua, retval); 229 } 230 231 int 232 netbsd32__lwp_getname(struct lwp *l, const struct netbsd32__lwp_getname_args *uap, register_t *retval) 233 { 234 /* { 235 syscallarg(lwpid_t) target; 236 syscallarg(netbsd32_charp) name; 237 syscallarg(netbsd32_size_t) len; 238 } */ 239 struct sys__lwp_getname_args ua; 240 241 NETBSD32TO64_UAP(target); 242 NETBSD32TOP_UAP(name, char *); 243 NETBSD32TOX_UAP(len, size_t); 244 return sys__lwp_getname(l, &ua, retval); 245 } 246 247 int 248 netbsd32__lwp_ctl(struct lwp *l, const struct netbsd32__lwp_ctl_args *uap, register_t *retval) 249 { 250 /* { 251 syscallarg(int) features; 252 syscallarg(netbsd32_pointer_t) address; 253 } */ 254 struct sys__lwp_ctl_args ua; 255 256 NETBSD32TO64_UAP(features); 257 NETBSD32TOP_UAP(address, struct lwpctl *); 258 return sys__lwp_ctl(l, &ua, retval); 259 } 260