1 /* $NetBSD: netbsd32_lwp.c,v 1.10 2008/04/29 06:53:02 martin 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.10 2008/04/29 06:53:02 martin 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 NETBSD32TOP_UAP(ucp, const ucontext_t); 59 NETBSD32TO64_UAP(flags); 60 NETBSD32TOP_UAP(new_lwp, lwpid_t); 61 62 return sys__lwp_create(l, &ua, retval); 63 } 64 65 int 66 netbsd32__lwp_wait(struct lwp *l, const struct netbsd32__lwp_wait_args *uap, register_t *retval) 67 { 68 /* { 69 syscallarg(lwpid_t) wait_for; 70 syscallarg(netbsd32_lwpidp) departed; 71 } */ 72 struct sys__lwp_wait_args ua; 73 74 NETBSD32TO64_UAP(wait_for); 75 NETBSD32TOP_UAP(departed, lwpid_t); 76 return sys__lwp_wait(l, &ua, retval); 77 } 78 79 int 80 netbsd32__lwp_suspend(struct lwp *l, const struct netbsd32__lwp_suspend_args *uap, register_t *retval) 81 { 82 /* { 83 syscallarg(lwpid_t) target; 84 } */ 85 struct sys__lwp_suspend_args ua; 86 87 NETBSD32TO64_UAP(target); 88 return sys__lwp_suspend(l, &ua, retval); 89 } 90 91 int 92 netbsd32__lwp_continue(struct lwp *l, const struct netbsd32__lwp_continue_args *uap, register_t *retval) 93 { 94 /* { 95 syscallarg(lwpid_t) target; 96 } */ 97 struct sys__lwp_continue_args ua; 98 99 NETBSD32TO64_UAP(target); 100 return sys__lwp_continue(l, &ua, retval); 101 } 102 103 int 104 netbsd32__lwp_wakeup(struct lwp *l, const struct netbsd32__lwp_wakeup_args *uap, register_t *retval) 105 { 106 /* { 107 syscallarg(lwpid_t) target; 108 } */ 109 struct sys__lwp_wakeup_args ua; 110 111 NETBSD32TO64_UAP(target); 112 return sys__lwp_wakeup(l, &ua, retval); 113 } 114 115 int 116 netbsd32__lwp_setprivate(struct lwp *l, const struct netbsd32__lwp_setprivate_args *uap, register_t *retval) 117 { 118 /* { 119 syscallarg(netbsd32_voidp) ptr; 120 } */ 121 struct sys__lwp_setprivate_args ua; 122 123 NETBSD32TOP_UAP(ptr, void); 124 return sys__lwp_setprivate(l, &ua, retval); 125 } 126 127 int 128 netbsd32__lwp_park(struct lwp *l, const struct netbsd32__lwp_park_args *uap, register_t *retval) 129 { 130 /* { 131 syscallarg(const netbsd32_timespecp) ts; 132 syscallarg(lwpid_t) unpark; 133 syscallarg(netbsd32_voidp) hint; 134 syscallarg(netbsd32_voidp) unparkhint; 135 } */ 136 struct timespec ts, *tsp; 137 struct netbsd32_timespec ts32; 138 int error; 139 140 if (SCARG_P32(uap, ts) == NULL) 141 tsp = NULL; 142 else { 143 error = copyin(SCARG_P32(uap, ts), &ts32, sizeof ts32); 144 if (error != 0) 145 return error; 146 netbsd32_to_timespec(&ts32, &ts); 147 tsp = &ts; 148 } 149 150 if (SCARG(uap, unpark) != 0) { 151 error = lwp_unpark(SCARG(uap, unpark), 152 SCARG_P32(uap, unparkhint)); 153 if (error != 0) 154 return error; 155 } 156 157 return lwp_park(tsp, SCARG_P32(uap, hint)); 158 } 159 160 int 161 netbsd32__lwp_kill(struct lwp *l, const struct netbsd32__lwp_kill_args *uap, register_t *retval) 162 { 163 /* { 164 syscallarg(lwpid_t) target; 165 syscallarg(int) signo; 166 } */ 167 struct sys__lwp_kill_args ua; 168 169 NETBSD32TO64_UAP(target); 170 NETBSD32TO64_UAP(signo); 171 return sys__lwp_kill(l, &ua, retval); 172 } 173 int 174 netbsd32__lwp_detach(struct lwp *l, const struct netbsd32__lwp_detach_args *uap, register_t *retval) 175 { 176 /* { 177 syscallarg(lwpid_t) target; 178 } */ 179 struct sys__lwp_detach_args ua; 180 181 NETBSD32TO64_UAP(target); 182 return sys__lwp_detach(l, &ua, retval); 183 } 184 185 int 186 netbsd32__lwp_unpark(struct lwp *l, const struct netbsd32__lwp_unpark_args *uap, register_t *retval) 187 { 188 /* { 189 syscallarg(lwpid_t) target; 190 syscallarg(netbsd32_voidp) hint; 191 } */ 192 struct sys__lwp_unpark_args ua; 193 194 NETBSD32TO64_UAP(target); 195 NETBSD32TOP_UAP(hint, void); 196 return sys__lwp_unpark(l, &ua, retval); 197 } 198 199 int 200 netbsd32__lwp_unpark_all(struct lwp *l, const struct netbsd32__lwp_unpark_all_args *uap, register_t *retval) 201 { 202 /* { 203 syscallarg(const netbsd32_lwpidp) targets; 204 syscallarg(netbsd32_size_t) ntargets; 205 syscallarg(netbsd32_voidp) hint; 206 } */ 207 struct sys__lwp_unpark_all_args ua; 208 209 NETBSD32TOP_UAP(targets, const lwpid_t); 210 NETBSD32TOX_UAP(ntargets, size_t); 211 NETBSD32TOP_UAP(hint, void); 212 return sys__lwp_unpark_all(l, &ua, retval); 213 } 214 215 int 216 netbsd32__lwp_setname(struct lwp *l, const struct netbsd32__lwp_setname_args *uap, register_t *retval) 217 { 218 /* { 219 syscallarg(lwpid_t) target; 220 syscallarg(const netbsd32_charp) name; 221 } */ 222 struct sys__lwp_setname_args ua; 223 224 NETBSD32TO64_UAP(target); 225 NETBSD32TOP_UAP(name, char *); 226 return sys__lwp_setname(l, &ua, retval); 227 } 228 229 int 230 netbsd32__lwp_getname(struct lwp *l, const struct netbsd32__lwp_getname_args *uap, register_t *retval) 231 { 232 /* { 233 syscallarg(lwpid_t) target; 234 syscallarg(netbsd32_charp) name; 235 syscallarg(netbsd32_size_t) len; 236 } */ 237 struct sys__lwp_getname_args ua; 238 239 NETBSD32TO64_UAP(target); 240 NETBSD32TOP_UAP(name, char *); 241 NETBSD32TOX_UAP(len, size_t); 242 return sys__lwp_getname(l, &ua, retval); 243 } 244 245 int 246 netbsd32__lwp_ctl(struct lwp *l, const struct netbsd32__lwp_ctl_args *uap, register_t *retval) 247 { 248 /* { 249 syscallarg(int) features; 250 syscallarg(netbsd32_pointer_t) address; 251 } */ 252 struct sys__lwp_ctl_args ua; 253 254 NETBSD32TO64_UAP(features); 255 NETBSD32TOP_UAP(address, struct lwpctl *); 256 return sys__lwp_ctl(l, &ua, retval); 257 } 258