setemul.c revision 1.8
1/* $NetBSD: setemul.c,v 1.8 2001/03/11 21:28:59 eeh Exp $ */ 2 3/*- 4 * Copyright (c) 2000 The NetBSD Foundation, Inc. 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 * 3. All advertising materials mentioning features or use of this software 16 * must display the following acknowledgement: 17 * This product includes software developed by the NetBSD 18 * Foundation, Inc. and its contributors. 19 * 4. Neither the name of The NetBSD Foundation nor the names of its 20 * contributors may be used to endorse or promote products derived 21 * from this software without specific prior written permission. 22 * 23 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 24 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 25 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 26 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 27 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 28 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 29 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 30 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 31 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 32 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 33 * POSSIBILITY OF SUCH DAMAGE. 34 */ 35 36/* 37 * Copyright (c) 1988, 1993 38 * The Regents of the University of California. All rights reserved. 39 * (c) UNIX System Laboratories, Inc. 40 * All or some portions of this file are derived from material licensed 41 * to the University of California by American Telephone and Telegraph 42 * Co. or Unix System Laboratories, Inc. and are reproduced herein with 43 * the permission of UNIX System Laboratories, Inc. 44 * 45 * Redistribution and use in source and binary forms, with or without 46 * modification, are permitted provided that the following conditions 47 * are met: 48 * 1. Redistributions of source code must retain the above copyright 49 * notice, this list of conditions and the following disclaimer. 50 * 2. Redistributions in binary form must reproduce the above copyright 51 * notice, this list of conditions and the following disclaimer in the 52 * documentation and/or other materials provided with the distribution. 53 * 3. All advertising materials mentioning features or use of this software 54 * must display the following acknowledgement: 55 * This product includes software developed by the University of 56 * California, Berkeley and its contributors. 57 * 4. Neither the name of the University nor the names of its contributors 58 * may be used to endorse or promote products derived from this software 59 * without specific prior written permission. 60 * 61 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 62 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 63 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 64 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 65 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 66 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 67 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 68 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 69 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 70 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 71 * SUCH DAMAGE. 72 */ 73 74#include <sys/cdefs.h> 75#ifndef lint 76__RCSID("$NetBSD: setemul.c,v 1.8 2001/03/11 21:28:59 eeh Exp $"); 77#endif /* not lint */ 78 79#include <sys/param.h> 80#include <sys/errno.h> 81#include <sys/time.h> 82 83#include <err.h> 84#include <stdio.h> 85#include <stdlib.h> 86#include <string.h> 87#include <unistd.h> 88#include <vis.h> 89 90#include "setemul.h" 91 92#include <sys/syscall.h> 93 94#include "../../sys/compat/netbsd32/netbsd32_syscall.h" 95#include "../../sys/compat/freebsd/freebsd_syscall.h" 96#include "../../sys/compat/hpux/hpux_syscall.h" 97#include "../../sys/compat/ibcs2/ibcs2_syscall.h" 98#include "../../sys/compat/linux/linux_syscall.h" 99#include "../../sys/compat/osf1/osf1_syscall.h" 100#include "../../sys/compat/sunos32/sunos32_syscall.h" 101#include "../../sys/compat/sunos/sunos_syscall.h" 102#include "../../sys/compat/svr4/svr4_syscall.h" 103#include "../../sys/compat/svr4_32/svr4_32_syscall.h" 104#include "../../sys/compat/ultrix/ultrix_syscall.h" 105 106#define KTRACE 107#include "../../sys/kern/syscalls.c" 108 109#include "../../sys/compat/netbsd32/netbsd32_syscalls.c" 110#include "../../sys/compat/freebsd/freebsd_syscalls.c" 111#include "../../sys/compat/hpux/hpux_syscalls.c" 112#include "../../sys/compat/ibcs2/ibcs2_syscalls.c" 113#include "../../sys/compat/linux/linux_syscalls.c" 114#include "../../sys/compat/osf1/osf1_syscalls.c" 115#include "../../sys/compat/sunos/sunos_syscalls.c" 116#include "../../sys/compat/sunos32/sunos32_syscalls.c" 117#include "../../sys/compat/svr4/svr4_syscalls.c" 118#include "../../sys/compat/svr4_32/svr4_32_syscalls.c" 119#include "../../sys/compat/ultrix/ultrix_syscalls.c" 120 121#include "../../sys/compat/hpux/hpux_errno.c" 122#include "../../sys/compat/svr4/svr4_errno.c" 123#include "../../sys/compat/ibcs2/ibcs2_errno.c" 124#include "../../sys/compat/linux/common/linux_errno.c" 125#undef KTRACE 126 127#define NELEM(a) (sizeof(a) / sizeof(a[0])) 128 129static const struct emulation emulations[] = { 130 { "netbsd", syscallnames, SYS_MAXSYSCALL, 131 NULL, 0 }, 132 { "netbsd32", netbsd32_syscallnames, SYS_MAXSYSCALL, 133 NULL, 0 }, 134 { "freebsd", freebsd_syscallnames, FREEBSD_SYS_MAXSYSCALL, 135 NULL, 0 }, 136 { "hpux", hpux_syscallnames, HPUX_SYS_MAXSYSCALL, 137 native_to_hpux_errno, NELEM(native_to_hpux_errno) }, 138 { "ibcs2", ibcs2_syscallnames, IBCS2_SYS_MAXSYSCALL, 139 native_to_ibcs2_errno, NELEM(native_to_ibcs2_errno) }, 140 { "linux", linux_syscallnames, LINUX_SYS_MAXSYSCALL, 141 native_to_linux_errno, NELEM(native_to_linux_errno) }, 142 { "osf1", osf1_syscallnames, OSF1_SYS_MAXSYSCALL, 143 NULL, 0 }, 144 { "sunos32",sunos32_syscallnames, SUNOS32_SYS_MAXSYSCALL, 145 NULL, 0 }, 146 { "sunos", sunos_syscallnames, SUNOS_SYS_MAXSYSCALL, 147 NULL, 0 }, 148 { "svr4", svr4_syscallnames, SVR4_SYS_MAXSYSCALL, 149 native_to_svr4_errno, NELEM(native_to_svr4_errno) }, 150 { "svr4_32", svr4_syscallnames, SVR4_SYS_MAXSYSCALL, 151 native_to_svr4_errno, NELEM(native_to_svr4_errno) }, 152 { "ultrix", ultrix_syscallnames, ULTRIX_SYS_MAXSYSCALL, 153 NULL, 0 }, 154 { "pecoff", syscallnames, SYS_MAXSYSCALL, 155 NULL, 0 }, 156 { NULL, NULL, 0, 157 NULL, 0 } 158}; 159 160struct emulation_ctx { 161 pid_t pid; 162 const struct emulation *emulation; 163 struct emulation_ctx *next; 164}; 165 166const struct emulation *current; 167const struct emulation *previous; 168 169static const struct emulation *default_emul=NULL; 170 171struct emulation_ctx *current_ctx; 172struct emulation_ctx *emul_ctx = NULL; 173 174static struct emulation_ctx *ectx_find __P((pid_t)); 175static void ectx_update __P((pid_t, const struct emulation *)); 176 177void 178setemul(name, pid, update_ectx) 179 const char *name; 180 pid_t pid; 181 int update_ectx; 182{ 183 int i; 184 const struct emulation *match = NULL; 185 186 for (i = 0; emulations[i].name != NULL; i++) { 187 if (strcmp(emulations[i].name, name) == 0) { 188 match = &emulations[i]; 189 break; 190 } 191 } 192 193 if (!match) { 194 warnx("Emulation `%s' unknown", name); 195 return; 196 } 197 198 if (update_ectx) 199 ectx_update(pid, match); 200 201 if (!default_emul) 202 default_emul = match; 203 204 if (current != NULL) 205 previous = current; 206 else 207 previous = match; 208 209 current = match; 210} 211 212/* 213 * Emulation context list is very simple chained list, not even hashed. 214 * We expect the number of separate traced contexts/processes to be 215 * fairly low, so it's not worth it to optimize this. 216 */ 217 218/* 219 * Find an emulation context appropriate for the given pid. 220 */ 221static struct emulation_ctx * 222ectx_find(pid) 223 pid_t pid; 224{ 225 struct emulation_ctx *ctx; 226 227 for(ctx = emul_ctx; ctx != NULL; ctx = ctx->next) { 228 if (ctx->pid == pid) 229 return ctx; 230 } 231 232 return NULL; 233} 234 235/* 236 * Update emulation context for given pid, or create new if no context 237 * for this pid exists. 238 */ 239static void 240ectx_update(pid, emul) 241 pid_t pid; 242 const struct emulation *emul; 243{ 244 struct emulation_ctx *ctx; 245 246 247 if ((ctx = ectx_find(pid)) != NULL) { 248 /* found and entry, ensure the emulation is right (exec!) */ 249 ctx->emulation = emul; 250 return; 251 } 252 253 ctx = (struct emulation_ctx *)malloc(sizeof(struct emulation_ctx)); 254 ctx->pid = pid; 255 ctx->emulation = emul; 256 257 /* put the entry on start of emul_ctx chain */ 258 ctx->next = emul_ctx; 259 emul_ctx = ctx; 260} 261 262/* 263 * Ensure current emulation context is correct for given pid. 264 */ 265void 266ectx_sanify(pid) 267 pid_t pid; 268{ 269 struct emulation_ctx *ctx; 270 271 if ((ctx = ectx_find(pid)) != NULL) 272 current = ctx->emulation; 273 else if (default_emul) 274 current = default_emul; 275 else 276 current = &emulations[0]; /* NetBSD */ 277} 278