From nobody Thu May 9 22:44:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1558298416; cv=none; d=zoho.com; s=zohoarc; b=GWcB5tE/McbTkoNJf76T2waIdZygir/fhYk7qwUm7B1WI22Ea2ZvSx+DzJ0KsPFgKXu/pYn5YkSesurHkel7PBIEN2FwjWghMmECG0ENyD1NK4Hf7gpbNNeIe7wNcG9m5ix1tKLMolSkHaNIr4xXWrtO3adMHgjLJoGdF/LAS6k= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1558298416; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=cmoV0D7GN+O7XMTBinQw7l8h/uqp/z8ssaPQ/O0YSSk=; b=Jt4XRbmP78J4zdDOVaZhBImqBm5rNJNKHIy5DI5Yf3+Tu2uRB7RNqrfuUnCTJcQau73j+d2Xto0EHwK70hy5XhL3Y4BO6CJQcjpV4AwCBGMpknNM96mGE2KoxKK4gM2wa42jDlTNECzNmOcQd71Q47ts//cVLjR+wQbZUuHBHA0= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (209.51.188.17 [209.51.188.17]) by mx.zohomail.com with SMTPS id 1558298416694610.2550789599422; Sun, 19 May 2019 13:40:16 -0700 (PDT) Received: from localhost ([127.0.0.1]:53120 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSbH-0004SN-9P for importer@patchew.org; Sun, 19 May 2019 16:40:07 -0400 Received: from eggs.gnu.org ([209.51.188.92]:50067) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSYo-0002j5-8N for qemu-devel@nongnu.org; Sun, 19 May 2019 16:37:36 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hSSYl-0003LX-Ib for qemu-devel@nongnu.org; Sun, 19 May 2019 16:37:34 -0400 Received: from mail-pl1-x643.google.com ([2607:f8b0:4864:20::643]:46925) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hSSYl-0003KY-8n for qemu-devel@nongnu.org; Sun, 19 May 2019 16:37:31 -0400 Received: by mail-pl1-x643.google.com with SMTP id r18so5698374pls.13 for ; Sun, 19 May 2019 13:37:31 -0700 (PDT) Received: from localhost.localdomain (97-113-13-231.tukw.qwest.net. [97.113.13.231]) by smtp.gmail.com with ESMTPSA id i7sm11397448pfo.19.2019.05.19.13.37.28 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 19 May 2019 13:37:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=cmoV0D7GN+O7XMTBinQw7l8h/uqp/z8ssaPQ/O0YSSk=; b=spB9JcPkJE9212Ohu8Z9VbpQGH+3q35l5tXjegomRNFuJEcvwwG65i3F0E1Y9M07Br ow468ffcsjrdSRY9hsPPDqjsxA28e+e6oYNeQr90RKKoCDjZRFKj/RwM/SCbQNyvvlDX y3PY0+LTgtyNv8dmGwYQTRGgJBKjse+lHQjDQKk29ytrPMwuvTCYHYtonUF3ol+yIAhp OEv7OtwYZe0vJowK7m1swE3iRwttLBgEzFCBDreYvxF0ht45eVGHhwoVL4/MaooS8C6q Gt5Z7U/jRnneFxfBHMGALk0vq4a4lcLj4fLrNvGrh+0hQ6GqThEgVJ7E1vsMT3R3lNXc I+Hw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=cmoV0D7GN+O7XMTBinQw7l8h/uqp/z8ssaPQ/O0YSSk=; b=lr1gcxHve7mA02xCnSKgNMTb0tk6KmiyWfSSalesXUR2Frxn5sAJejXJdf6zJIMMp6 zJV0nz+SMnA7jT/pUNdF0hm9iRybMkjjFbLYLKtbF7xL8TC0HS/0r5TK3I9x7GeoPtAk U2RhTz4K7I96JO/zsnn8toAwdQTgj3DBFQsbez3uWxHBrJJE7Qmyn8RRwvVpbrI2mP1t rt+NH5mCIcIKmXEJuW/3eqLv4oT36r839q6ssVa6BoQUkrfpiSa1riQDVdTCqY4InmN6 58zai6xK9uaAfrvoNjqlHrnu5gjqMXv5OCLYgHiWYmUyjp3rTOiBmQgIKgjB9nbG7PPA ql6A== X-Gm-Message-State: APjAAAVYRkl71Ag5seOy+hV/0HqwnC+O5ArJ4eu4YSRjTz77upj6kqNY XHjskxXqdZs46WqOoS8TA3CWfQL0hdY= X-Google-Smtp-Source: APXvYqw14a6KoBzRFeybCiKyUM/i11w5wh2L3eHVVAyT425Z2sAgwViN5LJa4vG/Ewf1sJRLk2WvoQ== X-Received: by 2002:a17:902:f81:: with SMTP id 1mr22215188plz.242.1558298249521; Sun, 19 May 2019 13:37:29 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sun, 19 May 2019 13:36:13 -0700 Message-Id: <20190519203726.20729-2-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190519203726.20729-1-richard.henderson@linaro.org> References: <20190519203726.20729-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::643 Subject: [Qemu-devel] [PATCH v7 01/74] linux-user: Setup split syscall infrastructure X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: laurent@vivier.eu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Defines a unified structure for implementation and strace. Signed-off-by: Richard Henderson --- linux-user/syscall-defs.h | 17 ++ linux-user/syscall.h | 89 +++++++++ linux-user/strace.c | 388 +++++++++++++++++++++++++++----------- linux-user/syscall.c | 103 +++++++++- 4 files changed, 484 insertions(+), 113 deletions(-) create mode 100644 linux-user/syscall-defs.h create mode 100644 linux-user/syscall.h diff --git a/linux-user/syscall-defs.h b/linux-user/syscall-defs.h new file mode 100644 index 0000000000..8c0490425a --- /dev/null +++ b/linux-user/syscall-defs.h @@ -0,0 +1,17 @@ +/* + * Linux syscall definitions + * Copyright (c) 2003 Fabrice Bellard + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + */ diff --git a/linux-user/syscall.h b/linux-user/syscall.h new file mode 100644 index 0000000000..43b5dc0684 --- /dev/null +++ b/linux-user/syscall.h @@ -0,0 +1,89 @@ +/* + * Linux syscalls internals + * Copyright (c) 2018 Linaro, Limited. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + */ + +#ifndef LINUX_USER_SYSCALL_H +#define LINUX_USER_SYSCALL_H 1 + +typedef struct SyscallDef SyscallDef; + +/* + * This hook extracts max 6 arguments from max 8 input registers. + * In the process, register pairs that store 64-bit arguments are merged. + * Finally, syscalls are demultipliexed; e.g. the hook for socketcall will + * return the SyscallDef for bind, listen, etc. In the process the hook + * may need to read from guest memory, or otherwise validate operands. + * On failure, set errno (to a host value) and return NULL; + * the (target adjusted) errno will be returned to the guest. + */ +typedef const SyscallDef *SyscallArgsFn(const SyscallDef *, int64_t out[6], + abi_long in[8]); + +/* This hook implements the syscall. */ +typedef abi_long SyscallImplFn(CPUArchState *, int64_t, int64_t, int64_t, + int64_t, int64_t, int64_t); + +/* This hook prints the arguments to the syscall for strace. */ +typedef void SyscallPrintFn(const SyscallDef *, int64_t arg[6]); + +/* This hook print the return value from the syscall for strace. */ +typedef void SyscallPrintRetFn(const SyscallDef *, abi_long); + +/* + * These flags describe the arguments for the generic fallback to + * SyscallPrintFn. ARG_NONE indicates that the argument is not present. + */ +typedef enum { + ARG_NONE =3D 0, + + /* These print as numbers of abi_long. */ + ARG_DEC, + ARG_HEX, + ARG_OCT, + + /* These print as sets of flags. */ + ARG_ATDIRFD, + ARG_MODEFLAG, + ARG_OPENFLAG, + + /* These are interpreted as pointers. */ + ARG_PTR, + ARG_STR, + ARG_BUF, + + /* For a 32-bit host, force printing as a 64-bit operand. */ +#if TARGET_ABI_BITS =3D=3D 32 + ARG_DEC64, +#else + ARG_DEC64 =3D ARG_DEC, +#endif +} SyscallArgType; + +struct SyscallDef { + const char *name; + SyscallArgsFn *args; + SyscallImplFn *impl; + SyscallPrintFn *print; + SyscallPrintRetFn *print_ret; + SyscallArgType arg_type[6]; +}; + +void print_syscall_def(const SyscallDef *def, int64_t args[6]); +void print_syscall_def_ret(const SyscallDef *def, abi_long ret); +void print_syscall_ptr_ret(const SyscallDef *def, abi_long ret); + +#endif diff --git a/linux-user/strace.c b/linux-user/strace.c index 6f72a74c09..33a5b10c0a 100644 --- a/linux-user/strace.c +++ b/linux-user/strace.c @@ -10,6 +10,7 @@ #include #include #include "qemu.h" +#include "syscall.h" =20 int do_strace=3D0; =20 @@ -796,7 +797,7 @@ UNUSED static struct flags unlinkat_flags[] =3D { FLAG_END, }; =20 -UNUSED static struct flags mode_flags[] =3D { +static struct flags const mode_flags[] =3D { FLAG_GENERIC(S_IFSOCK), FLAG_GENERIC(S_IFLNK), FLAG_GENERIC(S_IFREG), @@ -807,14 +808,14 @@ UNUSED static struct flags mode_flags[] =3D { FLAG_END, }; =20 -UNUSED static struct flags open_access_flags[] =3D { +static struct flags const open_access_flags[] =3D { FLAG_TARGET(O_RDONLY), FLAG_TARGET(O_WRONLY), FLAG_TARGET(O_RDWR), FLAG_END, }; =20 -UNUSED static struct flags open_flags[] =3D { +static struct flags const open_flags[] =3D { FLAG_TARGET(O_APPEND), FLAG_TARGET(O_CREAT), FLAG_TARGET(O_DIRECTORY), @@ -989,84 +990,86 @@ get_comma(int last) return ((last) ? "" : ","); } =20 +static int add_flags(char *buf, int size, const struct flags *f, + int flags, bool octal) +{ + const char *sep =3D ""; + int off =3D 0; + + if (flags =3D=3D 0 && f->f_value =3D=3D 0) { + return snprintf(buf, size, "%s", f->f_string); + } + + for (; f->f_string !=3D NULL; f++) { + if (f->f_value !=3D 0 && (flags & f->f_value) =3D=3D f->f_value) { + off +=3D snprintf(buf + off, size - off, "%s%s", sep, f->f_str= ing); + flags &=3D ~f->f_value; + sep =3D "|"; + } + } + + /* Print rest of the flags as numeric. */ + if (flags) { + if (octal) { + off +=3D snprintf(buf + off, size - off, "%s%#o", sep, flags); + } else { + off +=3D snprintf(buf + off, size - off, "%s%#x", sep, flags); + } + } + return off; +} + static void print_flags(const struct flags *f, abi_long flags, int last) { - const char *sep =3D ""; - int n; + char buf[256]; + add_flags(buf, sizeof(buf), f, flags, false); + gemu_log("%s%s", buf, get_comma(last)); +} =20 - if ((flags =3D=3D 0) && (f->f_value =3D=3D 0)) { - gemu_log("%s%s", f->f_string, get_comma(last)); - return; - } - for (n =3D 0; f->f_string !=3D NULL; f++) { - if ((f->f_value !=3D 0) && ((flags & f->f_value) =3D=3D f->f_value= )) { - gemu_log("%s%s", sep, f->f_string); - flags &=3D ~f->f_value; - sep =3D "|"; - n++; - } - } - - if (n > 0) { - /* print rest of the flags as numeric */ - if (flags !=3D 0) { - gemu_log("%s%#x%s", sep, (unsigned int)flags, get_comma(last)); - } else { - gemu_log("%s", get_comma(last)); - } +static int add_atdirfd(char *buf, int size, int fd) +{ + if (fd =3D=3D AT_FDCWD) { + return snprintf(buf, size, "AT_FDCWD"); } else { - /* no string version of flags found, print them in hex then */ - gemu_log("%#x%s", (unsigned int)flags, get_comma(last)); + return snprintf(buf, size, "%d", fd); } } =20 static void print_at_dirfd(abi_long dirfd, int last) { -#ifdef AT_FDCWD - if (dirfd =3D=3D AT_FDCWD) { - gemu_log("AT_FDCWD%s", get_comma(last)); - return; - } -#endif - gemu_log("%d%s", (int)dirfd, get_comma(last)); + char buf[16]; + add_atdirfd(buf, sizeof(buf), dirfd); + gemu_log("%s%s", buf, get_comma(last)); } =20 static void print_file_mode(abi_long mode, int last) { - const char *sep =3D ""; - const struct flags *m; + char buf[256]; + add_flags(buf, sizeof(buf), mode_flags, mode, true); + gemu_log("%s%s", buf, get_comma(last)); +} =20 - for (m =3D &mode_flags[0]; m->f_string !=3D NULL; m++) { - if ((m->f_value & mode) =3D=3D m->f_value) { - gemu_log("%s%s", m->f_string, sep); - sep =3D "|"; - mode &=3D ~m->f_value; - break; - } +static int add_open_flags(char *buf, int size, int flags) +{ + int off =3D add_flags(buf, size, open_access_flags, + flags & TARGET_O_ACCMODE, false); + flags &=3D ~TARGET_O_ACCMODE; + if (flags =3D=3D 0 || off + 2 >=3D size) { + return off; } - - mode &=3D ~S_IFMT; - /* print rest of the mode as octal */ - if (mode !=3D 0) - gemu_log("%s%#o", sep, (unsigned int)mode); - - gemu_log("%s", get_comma(last)); + buf[off++] =3D '|'; + return off + add_flags(buf + off, size - off, open_flags, flags, true); } =20 static void print_open_flags(abi_long flags, int last) { - print_flags(open_access_flags, flags & TARGET_O_ACCMODE, 1); - flags &=3D ~TARGET_O_ACCMODE; - if (flags =3D=3D 0) { - gemu_log("%s", get_comma(last)); - return; - } - gemu_log("|"); - print_flags(open_flags, flags, last); + char buf[256]; + add_open_flags(buf, sizeof(buf), flags); + gemu_log("%s%s", buf, get_comma(last)); } =20 static void @@ -1083,48 +1086,86 @@ print_syscall_epilogue(const struct syscallname *sc) gemu_log(")"); } =20 -static void -print_string(abi_long addr, int last) +static int add_pointer(char *buf, int size, abi_ulong addr) { - char *s; - - if ((s =3D lock_user_string(addr)) !=3D NULL) { - gemu_log("\"%s\"%s", s, get_comma(last)); - unlock_user(s, addr, 0); + if (addr) { + return snprintf(buf, size, "0x" TARGET_ABI_FMT_lx, addr); } else { - /* can't get string out of it, so print it as pointer */ - print_pointer(addr, last); + return snprintf(buf, size, "NULL"); } } =20 +static int add_string(char *buf, int size, abi_ulong addr) +{ + char *s =3D lock_user_string(addr); + if (s) { + /* TODO: Escape special characters within the string. */ + /* TODO: Limit the string length for logging. */ + int len =3D snprintf(buf, size, "\"%s\"", s); + unlock_user(s, addr, 0); + return len; + } + return add_pointer(buf, size, addr); +} + +static void +print_string(abi_long addr, int last) +{ + char buf[256]; + add_string(buf, sizeof(buf), addr); + gemu_log("%s%s", buf, get_comma(last)); +} + #define MAX_PRINT_BUF 40 + +static int add_buffer(char *buf, int size, abi_long addr, abi_ulong len) +{ + unsigned char *p; + int off =3D 0; + abi_ulong i; + + p =3D lock_user(VERIFY_READ, addr, MIN(len, MAX_PRINT_BUF), 1); + if (!p) { + return add_pointer(buf, size, addr); + } + + buf[0] =3D '"'; + off =3D 1; + + for (i =3D 0; i < MAX_PRINT_BUF; ++i) { + int len; + + if (isprint(p[i])) { + buf[off] =3D p[i]; + len =3D 1; + } else { + len =3D snprintf(buf + off, size - off, "\\%o", p[i]); + } + off +=3D len; + if (off + 2 >=3D size) { + goto overflow; + } + } + unlock_user(p, addr, 0); + + if (i =3D=3D len && off + 2 < size) { + buf[off] =3D '"'; + buf[off + 1] =3D 0; + return off + 1; + } + + overflow: + off =3D MIN(off, size - 5); + strcpy(buf + off, "...\""); + return off + 4; +} + static void print_buf(abi_long addr, abi_long len, int last) { - uint8_t *s; - int i; - - s =3D lock_user(VERIFY_READ, addr, len, 1); - if (s) { - gemu_log("\""); - for (i =3D 0; i < MAX_PRINT_BUF && i < len; i++) { - if (isprint(s[i])) { - gemu_log("%c", s[i]); - } else { - gemu_log("\\%o", s[i]); - } - } - gemu_log("\""); - if (i !=3D len) { - gemu_log("..."); - } - if (!last) { - gemu_log(","); - } - unlock_user(s, addr, 0); - } else { - print_pointer(addr, last); - } + char buf[256]; + add_buffer(buf, sizeof(buf), addr, len); + gemu_log("%s%s", buf, get_comma(last)); } =20 /* @@ -1143,10 +1184,9 @@ print_raw_param(const char *fmt, abi_long param, int= last) static void print_pointer(abi_long p, int last) { - if (p =3D=3D 0) - gemu_log("NULL%s", get_comma(last)); - else - gemu_log("0x" TARGET_ABI_FMT_lx "%s", p, get_comma(last)); + char buf[24]; + add_pointer(buf, sizeof(buf), p); + gemu_log("%s%s", buf, get_comma(last)); } =20 /* @@ -2650,32 +2690,170 @@ print_syscall(int num, gemu_log("Unknown syscall %d\n", num); } =20 +static void print_syscall_def1(const SyscallDef *def, int64_t args[6]) +{ + char buf[1024], *b =3D buf; + int i, rest =3D sizeof(buf); + + /* + * Render the argument list into BUF. This allows us to log the + * entire syscall in one write statement at the end. + * While this is still not quite as good as separate files, a-la + * strace -ff, it can minimize confusion with a multithreaded guest. + */ + buf[0] =3D 0; + for (i =3D 0; i < 6; ++i) { + SyscallArgType type =3D def->arg_type[i]; + int64_t arg =3D args[i]; + int len; + + if (type =3D=3D ARG_NONE) { + break; + } + + /* Validate remaining space. */ + if (rest < 4) { + goto overflow; + } + + /* Add separator. */ + if (i > 0) { + b[0] =3D ','; + b[1] =3D ' '; + b +=3D 2; + rest -=3D 2; + } + + switch (type) { +#if TARGET_ABI_BITS =3D=3D 32 + /* + * ??? We don't have TARGET_ABI_FMT_* macros for exactly + * what we want here. For this case it probably makes + * most sense to just special case. + */ + case ARG_DEC: + len =3D snprintf(b, rest, "%d", (int32_t)arg); + break; + case ARG_HEX: + len =3D snprintf(b, rest, "%#x", (uint32_t)arg); + break; + case ARG_OCT: + len =3D snprintf(b, rest, "%#o", (uint32_t)arg); + break; + case ARG_DEC64: + len =3D snprintf(b, rest, "%" PRId64, arg); + break; +#else + case ARG_DEC: + len =3D snprintf(b, rest, "%" PRId64, arg); + break; + case ARG_OCT: + len =3D snprintf(b, rest, "%" PRIo64, arg); + break; + case ARG_HEX: + len =3D snprintf(b, rest, "%" PRIx64, arg); + break; +#endif + case ARG_ATDIRFD: + len =3D add_atdirfd(b, rest, arg); + break; + case ARG_MODEFLAG: + len =3D add_flags(b, rest, mode_flags, arg, true); + break; + case ARG_OPENFLAG: + len =3D add_open_flags(b, rest, arg); + break; + case ARG_PTR: + len =3D add_pointer(b, rest, arg); + break; + case ARG_STR: + len =3D add_string(b, rest, arg); + break; + case ARG_BUF: + len =3D add_buffer(b, rest, arg, MAX_PRINT_BUF); + break; + default: + g_assert_not_reached(); + } + + b +=3D len; + rest -=3D len; + if (rest =3D=3D 0) { + goto overflow; + } + } + goto done; + + overflow: + strcpy(buf + sizeof(buf) - 4, "..."); + done: + gemu_log("%d %s(%s)", getpid(), def->name, buf); +} + +void print_syscall_def(const SyscallDef *def, int64_t args[6]) +{ + SyscallPrintFn *print =3D def->print; + if (!print) { + print =3D print_syscall_def1; + } + print(def, args); +} + +static void print_syscall_def_ret1(const SyscallDef *def, abi_long ret) +{ + if (is_error(ret)) { + const char *errstr =3D target_strerror(-ret); + if (errstr) { + gemu_log(" =3D -1 errno=3D" TARGET_ABI_FMT_ld " (%s)\n", + -ret, errstr); + } else { + gemu_log(" =3D -1 errno=3D" TARGET_ABI_FMT_ld "\n", -ret); + } + } else { + gemu_log(" =3D " TARGET_ABI_FMT_ld "\n", ret); + } +} =20 void print_syscall_ret(int num, abi_long ret) { int i; - const char *errstr =3D NULL; =20 for(i=3D0;iprint_ret; + if (!print) { + print =3D print_syscall_def_ret1; + } + print(def, ret); +} + void print_taken_signal(int target_signum, const target_siginfo_t *tinfo) { /* Print the strace output for a signal being taken: diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 1feb740f66..e27cab34af 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -108,6 +108,7 @@ =20 #include "qemu.h" #include "fd-trans.h" +#include "syscall.h" =20 #ifndef CLONE_IO #define CLONE_IO 0x80000000 /* Clone io context */ @@ -11631,12 +11632,70 @@ static abi_long do_syscall1(void *cpu_env, int nu= m, abi_long arg1, return ret; } =20 +/* Emit the signature for a SyscallArgsFn. */ +#define SYSCALL_ARGS(NAME) \ + static const SyscallDef *args_##NAME(const SyscallDef *def, \ + int64_t out[6], abi_long in[8]) + +/* Emit the signature for a SyscallImplFn. */ +#define SYSCALL_IMPL(NAME) \ + static abi_long impl_##NAME(CPUArchState *cpu_env, int64_t arg1, \ + int64_t arg2, int64_t arg3, int64_t arg4, \ + int64_t arg5, int64_t arg6) + + +#undef SYSCALL_IMPL +#undef SYSCALL_ARGS + +/* + * Emit a complete SyscallDef structure. + */ +#define SYSCALL_DEF_FULL(NAME, ...) \ + static const SyscallDef def_##NAME =3D { .name =3D #NAME, __VA_ARGS__ } + +/* + * Emit the definition for a "simple" syscall. Such does not use + * SyscallArgsFn and only uses arg_type for strace. + */ +#define SYSCALL_DEF(NAME, ...) \ + SYSCALL_DEF_FULL(NAME, .impl =3D impl_##NAME, .arg_type =3D { __VA_ARG= S__ }) + +/* Similarly, but also uses an args hook. */ +#define SYSCALL_DEF_ARGS(NAME, ...) \ + SYSCALL_DEF_FULL(NAME, .impl =3D impl_##NAME, .args =3D args_##NAME, \ + .arg_type =3D { __VA_ARGS__ }) + +#include "syscall-defs.h" + +#undef SYSCALL_DEF +#undef SYSCALL_DEF_ARGS +#undef SYSCALL_DEF_FULL + +static const SyscallDef *syscall_table(int num) +{ +#define SYSCALL_DEF(NAME, ...) case TARGET_NR_##NAME: return &def_##NAME +#define SYSCALL_DEF_ARGS(NAME, ...) SYSCALL_DEF(NAME) +#define SYSCALL_DEF_FULL(NAME, ...) SYSCALL_DEF(NAME) + + switch (num) { +#include "syscall-defs.h" + } + return NULL; + +#undef SYSCALL_DEF +#undef SYSCALL_DEF_ARGS +#undef SYSCALL_DEF_FULL +} + abi_long do_syscall(void *cpu_env, int num, abi_long arg1, abi_long arg2, abi_long arg3, abi_long arg4, abi_long arg5, abi_long arg6, abi_long arg7, abi_long arg8) { CPUState *cpu =3D ENV_GET_CPU(cpu_env); + const SyscallDef *def, *orig_def; + abi_long raw_args[8] =3D { arg1, arg2, arg3, arg4, arg5, arg6, arg7, a= rg8 }; + int64_t out_args[6] =3D { arg1, arg2, arg3, arg4, arg5, arg6 }; abi_long ret; =20 #ifdef DEBUG_ERESTARTSYS @@ -11656,16 +11715,44 @@ abi_long do_syscall(void *cpu_env, int num, abi_l= ong arg1, trace_guest_user_syscall(cpu, num, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8); =20 - if (unlikely(do_strace)) { - print_syscall(num, arg1, arg2, arg3, arg4, arg5, arg6); - ret =3D do_syscall1(cpu_env, num, arg1, arg2, arg3, arg4, - arg5, arg6, arg7, arg8); - print_syscall_ret(num, ret); - } else { - ret =3D do_syscall1(cpu_env, num, arg1, arg2, arg3, arg4, - arg5, arg6, arg7, arg8); + orig_def =3D def =3D syscall_table(num); + if (def =3D=3D NULL) { + /* Unconverted. */ + if (unlikely(do_strace)) { + print_syscall(num, arg1, arg2, arg3, arg4, arg5, arg6); + ret =3D do_syscall1(cpu_env, num, arg1, arg2, arg3, arg4, + arg5, arg6, arg7, arg8); + print_syscall_ret(num, ret); + } else { + ret =3D do_syscall1(cpu_env, num, arg1, arg2, arg3, arg4, + arg5, arg6, arg7, arg8); + } + goto fini; } =20 + if (def->args) { + def =3D def->args(def, out_args, raw_args); + if (unlikely(def =3D=3D NULL)) { + ret =3D -host_to_target_errno(errno); + if (unlikely(do_strace)) { + print_syscall_def(orig_def, out_args); + print_syscall_def_ret(orig_def, ret); + } + goto fini; + } + } + + if (unlikely(do_strace)) { + print_syscall_def(def, out_args); + ret =3D def->impl(cpu_env, out_args[0], out_args[1], out_args[2], + out_args[3], out_args[4], out_args[5]); + print_syscall_def_ret(def, ret); + } else { + ret =3D def->impl(cpu_env, out_args[0], out_args[1], out_args[2], + out_args[3], out_args[4], out_args[5]); + } + + fini: trace_guest_user_syscall_ret(cpu, num, ret); return ret; } --=20 2.17.1 From nobody Thu May 9 22:44:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1558298593; cv=none; d=zoho.com; s=zohoarc; b=HD968Zf2EK9itf8xHspNVZyeaYHTK+WQRn7E9dY9J/wCAUp0FcFdYye1uyZ5aXvcsmQAITN+O3D/BCBgps0zXZ69hfAOFn6/6uPPJjo7ogeryIvurHiKewQmwGV+82iTaMsQ0wpwpHmWwkmaW45vJpkXXB2LlqYhsakT4OBGsPI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1558298593; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=bfIW3dDz2FoSPZN1vIes2S+TXhduA0I/DLj9+BFzzwg=; b=lt9KYg6PGVoUM/vtR8WGF4yj1h3lu486RWmPuO6AGMtqkMFSh4IfU5jj42yUGPuGgliP33zylAypkUhhbZrCiP70TaW3Lfg4H445qiI9Ok7IAxvnrXS1y/3PrQMoPMvuE866UOlusv/xf6aENgmYQM1Xb3Lidgz9CT2J9uo9kAU= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1558298593394604.8459371979633; Sun, 19 May 2019 13:43:13 -0700 (PDT) Received: from localhost ([127.0.0.1]:53181 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSeE-0007D0-26 for importer@patchew.org; Sun, 19 May 2019 16:43:10 -0400 Received: from eggs.gnu.org ([209.51.188.92]:50086) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSYp-0002k3-Fc for qemu-devel@nongnu.org; Sun, 19 May 2019 16:37:40 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hSSYm-0003N1-Tz for qemu-devel@nongnu.org; Sun, 19 May 2019 16:37:35 -0400 Received: from mail-pl1-x641.google.com ([2607:f8b0:4864:20::641]:44232) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hSSYm-0003MF-Kt for qemu-devel@nongnu.org; Sun, 19 May 2019 16:37:32 -0400 Received: by mail-pl1-x641.google.com with SMTP id c5so5690384pll.11 for ; Sun, 19 May 2019 13:37:32 -0700 (PDT) Received: from localhost.localdomain (97-113-13-231.tukw.qwest.net. [97.113.13.231]) by smtp.gmail.com with ESMTPSA id i7sm11397448pfo.19.2019.05.19.13.37.29 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 19 May 2019 13:37:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=bfIW3dDz2FoSPZN1vIes2S+TXhduA0I/DLj9+BFzzwg=; b=xonhWcZlyONqzYHuOJbZW56Uv8Jd/wIsn0iyyY/7gXe2anegQGmFmnboRAAsBIJ+7R fVs25sgKqCGC0Cz+KFUsrNfDG7O+btOo1D0SB60JAG3gZd6YJlV+NuytrbosquJBKqib eaOTHKgnMmfuQyaj2TA10QF9vX7Htp9ZMJIEOVShk9V8HlfAX3n+Tfdy7Iix2urFb8X5 MB+lXsFaaEpFA466wInFbo0YuGGkS5fDM3fZ5xp6ITOaxZfvUpLMe9TrLzO7Tj7etvJY u4RJrYZriOOf9QyIcAToMwDMAlw3wsq6JWQUIiAXdXBlrfv60nsuJRlheX1+3ZSdoRMB wxxQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=bfIW3dDz2FoSPZN1vIes2S+TXhduA0I/DLj9+BFzzwg=; b=sS/2cRIanFf6iOIlq87kQ4jYRY1xyTb8+KwFcaz/FokUtO2/klN9PCExCVYtf0HOHj oFnw3ss5e4Uks5iHBQJ/9uIfEUR7WpSRplYjM7zfqLUk/nLNoe6buVk07scoQygTSlDn vIln+6FKFVHP1aBSNepsF/ytDJf1HaLNxzoGTfPwnYi1jh1kD/1uVLg26qNAzI5ZhhJN SOMG+gdglnh49eF46ctFiqO7+2QqZHT0zqbwS57hzn6KipMFnOOh8krotbgQd4dihNR4 8odz+WKjAY+whuVz2nIGiIQ4IeGu/K+4eCq1H0lYvdRGvqlm87FL2rdJlYLt8d/W3SuK 2Wsg== X-Gm-Message-State: APjAAAUOynJ4Yb0w58jlmadC67rhUHeW8bxux4fF7mzu50PSi29mr9Go lkUqekinNihUBnvyh5WmjVaQLoJoEZM= X-Google-Smtp-Source: APXvYqx+GYK+CURyLbX/XCwUNpyyCwP4XfsSFRrEUDf6MtXLaatDJtSQrixMGuuzPwWj552DRKVfZw== X-Received: by 2002:a17:902:4e:: with SMTP id 72mr19183869pla.80.1558298250923; Sun, 19 May 2019 13:37:30 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sun, 19 May 2019 13:36:14 -0700 Message-Id: <20190519203726.20729-3-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190519203726.20729-1-richard.henderson@linaro.org> References: <20190519203726.20729-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::641 Subject: [Qemu-devel] [PATCH v7 02/74] linux-user: Split out open, open_at X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: laurent@vivier.eu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" For the moment, leave a forward declaration for is_proc_myself until the readlink syscalls are also moved to syscall-file.inc.c. Signed-off-by: Richard Henderson --- linux-user/syscall-defs.h | 5 + linux-user/strace.c | 35 ---- linux-user/syscall-file.inc.c | 325 ++++++++++++++++++++++++++++++++++ linux-user/syscall.c | 288 +----------------------------- linux-user/strace.list | 6 - 5 files changed, 332 insertions(+), 327 deletions(-) create mode 100644 linux-user/syscall-file.inc.c diff --git a/linux-user/syscall-defs.h b/linux-user/syscall-defs.h index 8c0490425a..1f3a9c47ab 100644 --- a/linux-user/syscall-defs.h +++ b/linux-user/syscall-defs.h @@ -15,3 +15,8 @@ * You should have received a copy of the GNU General Public License * along with this program; if not, see . */ + +#ifdef TARGET_NR_open +SYSCALL_DEF(open, ARG_STR, ARG_OPENFLAG, ARG_MODEFLAG); +#endif +SYSCALL_DEF(openat, ARG_ATDIRFD, ARG_STR, ARG_OPENFLAG, ARG_MODEFLAG); diff --git a/linux-user/strace.c b/linux-user/strace.c index 33a5b10c0a..24ef14b5e6 100644 --- a/linux-user/strace.c +++ b/linux-user/strace.c @@ -2228,41 +2228,6 @@ print_mq_open(const struct syscallname *name, } #endif =20 -#ifdef TARGET_NR_open -static void -print_open(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - int is_creat =3D (arg1 & TARGET_O_CREAT); - - print_syscall_prologue(name); - print_string(arg0, 0); - print_open_flags(arg1, (is_creat =3D=3D 0)); - if (is_creat) - print_file_mode(arg2, 1); - print_syscall_epilogue(name); -} -#endif - -#ifdef TARGET_NR_openat -static void -print_openat(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - int is_creat =3D (arg2 & TARGET_O_CREAT); - - print_syscall_prologue(name); - print_at_dirfd(arg0, 0); - print_string(arg1, 0); - print_open_flags(arg2, (is_creat =3D=3D 0)); - if (is_creat) - print_file_mode(arg3, 1); - print_syscall_epilogue(name); -} -#endif - #ifdef TARGET_NR_mq_unlink static void print_mq_unlink(const struct syscallname *name, diff --git a/linux-user/syscall-file.inc.c b/linux-user/syscall-file.inc.c new file mode 100644 index 0000000000..7974148ccb --- /dev/null +++ b/linux-user/syscall-file.inc.c @@ -0,0 +1,325 @@ +/* + * Linux file-related syscall implementations + * Copyright (c) 2003 Fabrice Bellard + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + */ + +/* + * Helpers for do_openat, manipulating /proc/self/foo. + */ + +static int open_self_cmdline(void *cpu_env, int fd) +{ + CPUState *cpu =3D ENV_GET_CPU((CPUArchState *)cpu_env); + struct linux_binprm *bprm =3D ((TaskState *)cpu->opaque)->bprm; + int i; + + for (i =3D 0; i < bprm->argc; i++) { + size_t len =3D strlen(bprm->argv[i]) + 1; + + if (write(fd, bprm->argv[i], len) !=3D len) { + return -1; + } + } + + return 0; +} + +static int open_self_maps(void *cpu_env, int fd) +{ + CPUState *cpu =3D ENV_GET_CPU((CPUArchState *)cpu_env); + TaskState *ts =3D cpu->opaque; + FILE *fp; + char *line =3D NULL; + size_t len =3D 0; + ssize_t read; + + fp =3D fopen("/proc/self/maps", "r"); + if (fp =3D=3D NULL) { + return -1; + } + + while ((read =3D getline(&line, &len, fp)) !=3D -1) { + int fields, dev_maj, dev_min, inode; + uint64_t min, max, offset; + char flag_r, flag_w, flag_x, flag_p; + char path[512] =3D ""; + fields =3D sscanf(line, "%"PRIx64"-%"PRIx64" %c%c%c%c %"PRIx64" %x= :%x %d" + " %512s", &min, &max, &flag_r, &flag_w, &flag_x, + &flag_p, &offset, &dev_maj, &dev_min, &inode, path= ); + + if ((fields < 10) || (fields > 11)) { + continue; + } + if (h2g_valid(min)) { + int flags =3D page_get_flags(h2g(min)); + max =3D h2g_valid(max - 1) ? max : (uintptr_t)g2h(GUEST_ADDR_M= AX) + 1; + if (page_check_range(h2g(min), max - min, flags) =3D=3D -1) { + continue; + } + if (h2g(min) =3D=3D ts->info->stack_limit) { + pstrcpy(path, sizeof(path), " [stack]"); + } + dprintf(fd, TARGET_ABI_FMT_ptr "-" TARGET_ABI_FMT_ptr + " %c%c%c%c %08" PRIx64 " %02x:%02x %d %s%s\n", + h2g(min), h2g(max - 1) + 1, flag_r, flag_w, + flag_x, flag_p, offset, dev_maj, dev_min, inode, + path[0] ? " " : "", path); + } + } + + free(line); + fclose(fp); + + return 0; +} + +static int open_self_stat(void *cpu_env, int fd) +{ + CPUState *cpu =3D ENV_GET_CPU((CPUArchState *)cpu_env); + TaskState *ts =3D cpu->opaque; + abi_ulong start_stack =3D ts->info->start_stack; + int i; + + for (i =3D 0; i < 44; i++) { + char buf[128]; + int len; + uint64_t val =3D 0; + + if (i =3D=3D 0) { + /* pid */ + val =3D getpid(); + snprintf(buf, sizeof(buf), "%"PRId64 " ", val); + } else if (i =3D=3D 1) { + /* app name */ + snprintf(buf, sizeof(buf), "(%s) ", ts->bprm->argv[0]); + } else if (i =3D=3D 27) { + /* stack bottom */ + val =3D start_stack; + snprintf(buf, sizeof(buf), "%"PRId64 " ", val); + } else { + /* for the rest, there is MasterCard */ + snprintf(buf, sizeof(buf), "0%c", i =3D=3D 43 ? '\n' : ' '); + } + + len =3D strlen(buf); + if (write(fd, buf, len) !=3D len) { + return -1; + } + } + + return 0; +} + +static int open_self_auxv(void *cpu_env, int fd) +{ + CPUState *cpu =3D ENV_GET_CPU((CPUArchState *)cpu_env); + TaskState *ts =3D cpu->opaque; + abi_ulong auxv =3D ts->info->saved_auxv; + abi_ulong len =3D ts->info->auxv_len; + char *ptr; + + /* + * Auxiliary vector is stored in target process stack. + * read in whole auxv vector and copy it to file + */ + ptr =3D lock_user(VERIFY_READ, auxv, len, 0); + if (ptr !=3D NULL) { + while (len > 0) { + ssize_t r; + r =3D write(fd, ptr, len); + if (r <=3D 0) { + break; + } + len -=3D r; + ptr +=3D r; + } + lseek(fd, 0, SEEK_SET); + unlock_user(ptr, auxv, len); + } + + return 0; +} + +static int is_proc_myself(const char *filename, const char *entry) +{ + if (!strncmp(filename, "/proc/", strlen("/proc/"))) { + filename +=3D strlen("/proc/"); + if (!strncmp(filename, "self/", strlen("self/"))) { + filename +=3D strlen("self/"); + } else if (*filename >=3D '1' && *filename <=3D '9') { + char myself[80]; + snprintf(myself, sizeof(myself), "%d/", getpid()); + if (!strncmp(filename, myself, strlen(myself))) { + filename +=3D strlen(myself); + } else { + return 0; + } + } else { + return 0; + } + if (!strcmp(filename, entry)) { + return 1; + } + } + return 0; +} + +#if defined(HOST_WORDS_BIGENDIAN) !=3D defined(TARGET_WORDS_BIGENDIAN) +static int is_proc(const char *filename, const char *entry) +{ + return strcmp(filename, entry) =3D=3D 0; +} + +static int open_net_route(void *cpu_env, int fd) +{ + FILE *fp; + char *line =3D NULL; + size_t len =3D 0; + ssize_t read; + + fp =3D fopen("/proc/net/route", "r"); + if (fp =3D=3D NULL) { + return -1; + } + + /* read header */ + + read =3D getline(&line, &len, fp); + dprintf(fd, "%s", line); + + /* read routes */ + + while ((read =3D getline(&line, &len, fp)) !=3D -1) { + char iface[16]; + uint32_t dest, gw, mask; + unsigned int flags, refcnt, use, metric, mtu, window, irtt; + int fields; + + fields =3D sscanf(line, + "%s\t%08x\t%08x\t%04x\t%d\t%d\t%d\t%08x\t%d\t%u\t%= u\n", + iface, &dest, &gw, &flags, &refcnt, &use, &metric, + &mask, &mtu, &window, &irtt); + if (fields !=3D 11) { + continue; + } + dprintf(fd, "%s\t%08x\t%08x\t%04x\t%d\t%d\t%d\t%08x\t%d\t%u\t%u\n", + iface, tswap32(dest), tswap32(gw), flags, refcnt, use, + metric, tswap32(mask), mtu, window, irtt); + } + + free(line); + fclose(fp); + + return 0; +} +#endif + +static int do_openat(void *cpu_env, int dirfd, const char *pathname, + int flags, mode_t mode) +{ + struct fake_open { + const char *filename; + int (*fill)(void *cpu_env, int fd); + int (*cmp)(const char *s1, const char *s2); + }; + const struct fake_open *fake_open; + static const struct fake_open fakes[] =3D { + { "maps", open_self_maps, is_proc_myself }, + { "stat", open_self_stat, is_proc_myself }, + { "auxv", open_self_auxv, is_proc_myself }, + { "cmdline", open_self_cmdline, is_proc_myself }, +#if defined(HOST_WORDS_BIGENDIAN) !=3D defined(TARGET_WORDS_BIGENDIAN) + { "/proc/net/route", open_net_route, is_proc }, +#endif + { NULL, NULL, NULL } + }; + + if (is_proc_myself(pathname, "exe")) { + int execfd =3D qemu_getauxval(AT_EXECFD); + return execfd ? execfd : safe_openat(dirfd, exec_path, flags, mode= ); + } + + for (fake_open =3D fakes; fake_open->filename; fake_open++) { + if (fake_open->cmp(pathname, fake_open->filename)) { + break; + } + } + + if (fake_open->filename) { + const char *tmpdir; + char filename[PATH_MAX]; + int fd, r; + + /* create temporary file to map stat to */ + tmpdir =3D getenv("TMPDIR"); + if (!tmpdir) { + tmpdir =3D "/tmp"; + } + snprintf(filename, sizeof(filename), "%s/qemu-open.XXXXXX", tmpdir= ); + fd =3D mkstemp(filename); + if (fd < 0) { + return fd; + } + unlink(filename); + + r =3D fake_open->fill(cpu_env, fd); + if (r) { + int e =3D errno; + close(fd); + errno =3D e; + return r; + } + lseek(fd, 0, SEEK_SET); + + return fd; + } + + return safe_openat(dirfd, path(pathname), flags, mode); +} + +#ifdef TARGET_NR_open +SYSCALL_IMPL(open) +{ + char *p =3D lock_user_string(arg1); + abi_long ret; + + if (!p) { + return -TARGET_EFAULT; + } + ret =3D get_errno(do_openat(cpu_env, AT_FDCWD, p, + target_to_host_bitmask(arg2, fcntl_flags_tbl= ), + arg3)); + fd_trans_unregister(ret); + unlock_user(p, arg1, 0); + return ret; +} +#endif + +SYSCALL_IMPL(openat) +{ + char *p =3D lock_user_string(arg2); + abi_long ret; + + if (!p) { + return -TARGET_EFAULT; + } + ret =3D get_errno(do_openat(cpu_env, arg1, p, + target_to_host_bitmask(arg3, fcntl_flags_tbl= ), + arg4)); + fd_trans_unregister(ret); + unlock_user(p, arg2, 0); + return ret; +} diff --git a/linux-user/syscall.c b/linux-user/syscall.c index e27cab34af..fe52ac15c2 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -6633,272 +6633,7 @@ int host_to_target_waitstatus(int status) return status; } =20 -static int open_self_cmdline(void *cpu_env, int fd) -{ - CPUState *cpu =3D ENV_GET_CPU((CPUArchState *)cpu_env); - struct linux_binprm *bprm =3D ((TaskState *)cpu->opaque)->bprm; - int i; - - for (i =3D 0; i < bprm->argc; i++) { - size_t len =3D strlen(bprm->argv[i]) + 1; - - if (write(fd, bprm->argv[i], len) !=3D len) { - return -1; - } - } - - return 0; -} - -static int open_self_maps(void *cpu_env, int fd) -{ - CPUState *cpu =3D ENV_GET_CPU((CPUArchState *)cpu_env); - TaskState *ts =3D cpu->opaque; - FILE *fp; - char *line =3D NULL; - size_t len =3D 0; - ssize_t read; - - fp =3D fopen("/proc/self/maps", "r"); - if (fp =3D=3D NULL) { - return -1; - } - - while ((read =3D getline(&line, &len, fp)) !=3D -1) { - int fields, dev_maj, dev_min, inode; - uint64_t min, max, offset; - char flag_r, flag_w, flag_x, flag_p; - char path[512] =3D ""; - fields =3D sscanf(line, "%"PRIx64"-%"PRIx64" %c%c%c%c %"PRIx64" %x= :%x %d" - " %512s", &min, &max, &flag_r, &flag_w, &flag_x, - &flag_p, &offset, &dev_maj, &dev_min, &inode, path= ); - - if ((fields < 10) || (fields > 11)) { - continue; - } - if (h2g_valid(min)) { - int flags =3D page_get_flags(h2g(min)); - max =3D h2g_valid(max - 1) ? max : (uintptr_t)g2h(GUEST_ADDR_M= AX) + 1; - if (page_check_range(h2g(min), max - min, flags) =3D=3D -1) { - continue; - } - if (h2g(min) =3D=3D ts->info->stack_limit) { - pstrcpy(path, sizeof(path), " [stack]"); - } - dprintf(fd, TARGET_ABI_FMT_ptr "-" TARGET_ABI_FMT_ptr - " %c%c%c%c %08" PRIx64 " %02x:%02x %d %s%s\n", - h2g(min), h2g(max - 1) + 1, flag_r, flag_w, - flag_x, flag_p, offset, dev_maj, dev_min, inode, - path[0] ? " " : "", path); - } - } - - free(line); - fclose(fp); - - return 0; -} - -static int open_self_stat(void *cpu_env, int fd) -{ - CPUState *cpu =3D ENV_GET_CPU((CPUArchState *)cpu_env); - TaskState *ts =3D cpu->opaque; - abi_ulong start_stack =3D ts->info->start_stack; - int i; - - for (i =3D 0; i < 44; i++) { - char buf[128]; - int len; - uint64_t val =3D 0; - - if (i =3D=3D 0) { - /* pid */ - val =3D getpid(); - snprintf(buf, sizeof(buf), "%"PRId64 " ", val); - } else if (i =3D=3D 1) { - /* app name */ - snprintf(buf, sizeof(buf), "(%s) ", ts->bprm->argv[0]); - } else if (i =3D=3D 27) { - /* stack bottom */ - val =3D start_stack; - snprintf(buf, sizeof(buf), "%"PRId64 " ", val); - } else { - /* for the rest, there is MasterCard */ - snprintf(buf, sizeof(buf), "0%c", i =3D=3D 43 ? '\n' : ' '); - } - - len =3D strlen(buf); - if (write(fd, buf, len) !=3D len) { - return -1; - } - } - - return 0; -} - -static int open_self_auxv(void *cpu_env, int fd) -{ - CPUState *cpu =3D ENV_GET_CPU((CPUArchState *)cpu_env); - TaskState *ts =3D cpu->opaque; - abi_ulong auxv =3D ts->info->saved_auxv; - abi_ulong len =3D ts->info->auxv_len; - char *ptr; - - /* - * Auxiliary vector is stored in target process stack. - * read in whole auxv vector and copy it to file - */ - ptr =3D lock_user(VERIFY_READ, auxv, len, 0); - if (ptr !=3D NULL) { - while (len > 0) { - ssize_t r; - r =3D write(fd, ptr, len); - if (r <=3D 0) { - break; - } - len -=3D r; - ptr +=3D r; - } - lseek(fd, 0, SEEK_SET); - unlock_user(ptr, auxv, len); - } - - return 0; -} - -static int is_proc_myself(const char *filename, const char *entry) -{ - if (!strncmp(filename, "/proc/", strlen("/proc/"))) { - filename +=3D strlen("/proc/"); - if (!strncmp(filename, "self/", strlen("self/"))) { - filename +=3D strlen("self/"); - } else if (*filename >=3D '1' && *filename <=3D '9') { - char myself[80]; - snprintf(myself, sizeof(myself), "%d/", getpid()); - if (!strncmp(filename, myself, strlen(myself))) { - filename +=3D strlen(myself); - } else { - return 0; - } - } else { - return 0; - } - if (!strcmp(filename, entry)) { - return 1; - } - } - return 0; -} - -#if defined(HOST_WORDS_BIGENDIAN) !=3D defined(TARGET_WORDS_BIGENDIAN) -static int is_proc(const char *filename, const char *entry) -{ - return strcmp(filename, entry) =3D=3D 0; -} - -static int open_net_route(void *cpu_env, int fd) -{ - FILE *fp; - char *line =3D NULL; - size_t len =3D 0; - ssize_t read; - - fp =3D fopen("/proc/net/route", "r"); - if (fp =3D=3D NULL) { - return -1; - } - - /* read header */ - - read =3D getline(&line, &len, fp); - dprintf(fd, "%s", line); - - /* read routes */ - - while ((read =3D getline(&line, &len, fp)) !=3D -1) { - char iface[16]; - uint32_t dest, gw, mask; - unsigned int flags, refcnt, use, metric, mtu, window, irtt; - int fields; - - fields =3D sscanf(line, - "%s\t%08x\t%08x\t%04x\t%d\t%d\t%d\t%08x\t%d\t%u\t%= u\n", - iface, &dest, &gw, &flags, &refcnt, &use, &metric, - &mask, &mtu, &window, &irtt); - if (fields !=3D 11) { - continue; - } - dprintf(fd, "%s\t%08x\t%08x\t%04x\t%d\t%d\t%d\t%08x\t%d\t%u\t%u\n", - iface, tswap32(dest), tswap32(gw), flags, refcnt, use, - metric, tswap32(mask), mtu, window, irtt); - } - - free(line); - fclose(fp); - - return 0; -} -#endif - -static int do_openat(void *cpu_env, int dirfd, const char *pathname, int f= lags, mode_t mode) -{ - struct fake_open { - const char *filename; - int (*fill)(void *cpu_env, int fd); - int (*cmp)(const char *s1, const char *s2); - }; - const struct fake_open *fake_open; - static const struct fake_open fakes[] =3D { - { "maps", open_self_maps, is_proc_myself }, - { "stat", open_self_stat, is_proc_myself }, - { "auxv", open_self_auxv, is_proc_myself }, - { "cmdline", open_self_cmdline, is_proc_myself }, -#if defined(HOST_WORDS_BIGENDIAN) !=3D defined(TARGET_WORDS_BIGENDIAN) - { "/proc/net/route", open_net_route, is_proc }, -#endif - { NULL, NULL, NULL } - }; - - if (is_proc_myself(pathname, "exe")) { - int execfd =3D qemu_getauxval(AT_EXECFD); - return execfd ? execfd : safe_openat(dirfd, exec_path, flags, mode= ); - } - - for (fake_open =3D fakes; fake_open->filename; fake_open++) { - if (fake_open->cmp(pathname, fake_open->filename)) { - break; - } - } - - if (fake_open->filename) { - const char *tmpdir; - char filename[PATH_MAX]; - int fd, r; - - /* create temporary file to map stat to */ - tmpdir =3D getenv("TMPDIR"); - if (!tmpdir) - tmpdir =3D "/tmp"; - snprintf(filename, sizeof(filename), "%s/qemu-open.XXXXXX", tmpdir= ); - fd =3D mkstemp(filename); - if (fd < 0) { - return fd; - } - unlink(filename); - - if ((r =3D fake_open->fill(cpu_env, fd))) { - int e =3D errno; - close(fd); - errno =3D e; - return r; - } - lseek(fd, 0, SEEK_SET); - - return fd; - } - - return safe_openat(dirfd, path(pathname), flags, mode); -} +static int is_proc_myself(const char *filename, const char *entry); =20 #define TIMER_MAGIC 0x0caf0000 #define TIMER_MAGIC_MASK 0xffff0000 @@ -7083,26 +6818,6 @@ static abi_long do_syscall1(void *cpu_env, int num, = abi_long arg1, unlock_user(p, arg2, 0); return ret; =20 -#ifdef TARGET_NR_open - case TARGET_NR_open: - if (!(p =3D lock_user_string(arg1))) - return -TARGET_EFAULT; - ret =3D get_errno(do_openat(cpu_env, AT_FDCWD, p, - target_to_host_bitmask(arg2, fcntl_flags= _tbl), - arg3)); - fd_trans_unregister(ret); - unlock_user(p, arg1, 0); - return ret; -#endif - case TARGET_NR_openat: - if (!(p =3D lock_user_string(arg2))) - return -TARGET_EFAULT; - ret =3D get_errno(do_openat(cpu_env, arg1, p, - target_to_host_bitmask(arg3, fcntl_flags= _tbl), - arg4)); - fd_trans_unregister(ret); - unlock_user(p, arg2, 0); - return ret; #if defined(TARGET_NR_name_to_handle_at) && defined(CONFIG_OPEN_BY_HANDLE) case TARGET_NR_name_to_handle_at: ret =3D do_name_to_handle_at(arg1, arg2, arg3, arg4, arg5); @@ -11643,6 +11358,7 @@ static abi_long do_syscall1(void *cpu_env, int num,= abi_long arg1, int64_t arg2, int64_t arg3, int64_t arg4, \ int64_t arg5, int64_t arg6) =20 +#include "syscall-file.inc.c" =20 #undef SYSCALL_IMPL #undef SYSCALL_ARGS diff --git a/linux-user/strace.list b/linux-user/strace.list index db21ce4177..2c7a595e19 100644 --- a/linux-user/strace.list +++ b/linux-user/strace.list @@ -677,12 +677,6 @@ #ifdef TARGET_NR_olduname { TARGET_NR_olduname, "olduname" , NULL, NULL, NULL }, #endif -#ifdef TARGET_NR_open -{ TARGET_NR_open, "open" , NULL, print_open, NULL }, -#endif -#ifdef TARGET_NR_openat -{ TARGET_NR_openat, "openat" , NULL, print_openat, NULL }, -#endif #ifdef TARGET_NR_osf_adjtime { TARGET_NR_osf_adjtime, "osf_adjtime" , NULL, NULL, NULL }, #endif --=20 2.17.1 From nobody Thu May 9 22:44:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1558298577; cv=none; d=zoho.com; s=zohoarc; b=ALDz6D8Ltt9EaaBsFq6lneTFza4I7U4GDkp/b2p/q627uhpD3XiDSRSxUmXrxKPdAHPxDKdWpuRI6Osx5XnZauDxa7U2ReeBN2juKML2UX6MxIfVdt/u50CrnKZ8/NJUwDaN9NQvBOAD40Bpv9gjHGHNn8nYp16xc3Vmn7gKMPA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1558298577; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=eSYdriPx4kdDTBySMjSQ3hbHBLevuc9v6XaVM577ESk=; b=idhxpKibsezdbRD+6Pxoupa1Kt2mHkBUWqwtGOnQ1Sv2+Bf5x8SDZT5rlPWpuLtis3GKjkzrBWkHaDJlKL92otdBg9nhtDUuxm1DrsSd1szSzslEq6+gpPO0RfXA3wcusIS9ntg4kN/fI9L7uvtHINyz4ZP3WlcZm/imwZWnaYU= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1558298577436545.6826509322902; Sun, 19 May 2019 13:42:57 -0700 (PDT) Received: from localhost ([127.0.0.1]:53175 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSdv-0006yM-5G for importer@patchew.org; Sun, 19 May 2019 16:42:51 -0400 Received: from eggs.gnu.org ([209.51.188.92]:50070) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSYo-0002jK-I1 for qemu-devel@nongnu.org; Sun, 19 May 2019 16:37:35 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hSSYn-0003Nn-Cg for qemu-devel@nongnu.org; Sun, 19 May 2019 16:37:34 -0400 Received: from mail-pl1-x641.google.com ([2607:f8b0:4864:20::641]:39842) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hSSYn-0003Mi-5l for qemu-devel@nongnu.org; Sun, 19 May 2019 16:37:33 -0400 Received: by mail-pl1-x641.google.com with SMTP id g9so5708797plm.6 for ; Sun, 19 May 2019 13:37:33 -0700 (PDT) Received: from localhost.localdomain (97-113-13-231.tukw.qwest.net. [97.113.13.231]) by smtp.gmail.com with ESMTPSA id i7sm11397448pfo.19.2019.05.19.13.37.30 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 19 May 2019 13:37:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=eSYdriPx4kdDTBySMjSQ3hbHBLevuc9v6XaVM577ESk=; b=Sg/4sKNreLI47I2kSXyvKrfz/F9UXr8TRh0XKbe/P//pAE2vgTHjX0USqkAoNdpenR 1AHiGGzNl8e+QgGrMqaEYMUrYdGlXuBYXWGsJ4XY4dz2IBBhEqpD/iOdJYDs/i1AS3NI s0ZRWShf11oA39tEj2NZUPCj96dwvKsz2sD//woQ5rVHMgzvXDJX6dAEtnWLhD+wo9KU oxiT4rBTbQJ1ckGTbgCqH1VSAJ/vaBV44QHHLMJZMA6+UnT5J+EwV4ax2Gv90NLjFnfI 9W9GwBGMCElBsP9R89Ujbsu1MgNks/D4GHqdQZhHmOeo4IrIr+bPeI55Kd/BgI/Mr7dy HfwQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=eSYdriPx4kdDTBySMjSQ3hbHBLevuc9v6XaVM577ESk=; b=bS5B/KC70G0uN+dWCEmqizNw0DXlLQqfJwkri9/B+mTRu8hLQSEv5XYccOjDNfmx2c TtHKAh597oU/lLuwydPlRlHB5YIqoBGvswOIkyXZYPC1QgsO+AKWnjc1Pbs+NNJqIM/9 kdrsN2lbmZWUd5CJWkaMOZ8dEF7qDyR75PliWUoXxUqnCduXxkUcN7NGxd5swwVect99 97NmWFFFg9HkbVBGiVfiIP/TuKJk/pFxDMgWmJG2s0f7ERIif3kFoYYgtg8E7CyowNz4 4hfxJVWQcvjZ4ph9C6A6Qd6PyP/qF/kKmVeI9hJeGAP5t5cfi4BCNvQIE3hKRbfl764h yFIg== X-Gm-Message-State: APjAAAUiNWv6d/MG80Jwwe25tf7Ha1ZpRy/XldSguT77PuatZZUEBhK4 Z8hIZ4P6MlzrLtAwRHneG1MYJKHqCGI= X-Google-Smtp-Source: APXvYqzTc7xPJiOo2QTPVlHn5xM7bl2SbzTtj/ogb/Zg2ZCCUZedQSu/5j/to5T4ex4NoMGifEIhFQ== X-Received: by 2002:a17:902:bd46:: with SMTP id b6mr10556307plx.173.1558298251963; Sun, 19 May 2019 13:37:31 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sun, 19 May 2019 13:36:15 -0700 Message-Id: <20190519203726.20729-4-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190519203726.20729-1-richard.henderson@linaro.org> References: <20190519203726.20729-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::641 Subject: [Qemu-devel] [PATCH v7 03/74] linux-user: Share more code for open and openat X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: laurent@vivier.eu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" The do_openat helper can have all of the code that is not directly related to the argument ordering of these two syscalls. Signed-off-by: Richard Henderson --- linux-user/syscall-file.inc.c | 69 ++++++++++++++++------------------- 1 file changed, 31 insertions(+), 38 deletions(-) diff --git a/linux-user/syscall-file.inc.c b/linux-user/syscall-file.inc.c index 7974148ccb..961eed13ae 100644 --- a/linux-user/syscall-file.inc.c +++ b/linux-user/syscall-file.inc.c @@ -227,8 +227,8 @@ static int open_net_route(void *cpu_env, int fd) } #endif =20 -static int do_openat(void *cpu_env, int dirfd, const char *pathname, - int flags, mode_t mode) +static abi_long do_openat(void *cpu_env, int dirfd, abi_ulong target_path, + int target_flags, mode_t mode) { struct fake_open { const char *filename; @@ -247,9 +247,20 @@ static int do_openat(void *cpu_env, int dirfd, const c= har *pathname, { NULL, NULL, NULL } }; =20 + char *pathname =3D lock_user_string(target_path); + int flags =3D target_to_host_bitmask(target_flags, fcntl_flags_tbl); + abi_long ret; + + if (!pathname) { + return -TARGET_EFAULT; + } + if (is_proc_myself(pathname, "exe")) { - int execfd =3D qemu_getauxval(AT_EXECFD); - return execfd ? execfd : safe_openat(dirfd, exec_path, flags, mode= ); + ret =3D qemu_getauxval(AT_EXECFD); + if (ret =3D=3D 0) { + ret =3D get_errno(safe_openat(dirfd, exec_path, flags, mode)); + } + goto done; } =20 for (fake_open =3D fakes; fake_open->filename; fake_open++) { @@ -261,7 +272,7 @@ static int do_openat(void *cpu_env, int dirfd, const ch= ar *pathname, if (fake_open->filename) { const char *tmpdir; char filename[PATH_MAX]; - int fd, r; + int fd; =20 /* create temporary file to map stat to */ tmpdir =3D getenv("TMPDIR"); @@ -271,55 +282,37 @@ static int do_openat(void *cpu_env, int dirfd, const = char *pathname, snprintf(filename, sizeof(filename), "%s/qemu-open.XXXXXX", tmpdir= ); fd =3D mkstemp(filename); if (fd < 0) { - return fd; + ret =3D -TARGET_ENOENT; + goto done; } unlink(filename); =20 - r =3D fake_open->fill(cpu_env, fd); - if (r) { - int e =3D errno; + ret =3D fake_open->fill(cpu_env, fd); + if (ret) { + ret =3D get_errno(ret); close(fd); - errno =3D e; - return r; + goto done; } lseek(fd, 0, SEEK_SET); - - return fd; + ret =3D fd; + goto done; } =20 - return safe_openat(dirfd, path(pathname), flags, mode); + ret =3D get_errno(safe_openat(dirfd, path(pathname), flags, mode)); + done: + fd_trans_unregister(ret); + unlock_user(pathname, target_path, 0); + return ret; } =20 #ifdef TARGET_NR_open SYSCALL_IMPL(open) { - char *p =3D lock_user_string(arg1); - abi_long ret; - - if (!p) { - return -TARGET_EFAULT; - } - ret =3D get_errno(do_openat(cpu_env, AT_FDCWD, p, - target_to_host_bitmask(arg2, fcntl_flags_tbl= ), - arg3)); - fd_trans_unregister(ret); - unlock_user(p, arg1, 0); - return ret; + return do_openat(cpu_env, AT_FDCWD, arg1, arg2, arg3); } #endif =20 SYSCALL_IMPL(openat) { - char *p =3D lock_user_string(arg2); - abi_long ret; - - if (!p) { - return -TARGET_EFAULT; - } - ret =3D get_errno(do_openat(cpu_env, arg1, p, - target_to_host_bitmask(arg3, fcntl_flags_tbl= ), - arg4)); - fd_trans_unregister(ret); - unlock_user(p, arg2, 0); - return ret; + return do_openat(cpu_env, arg1, arg2, arg3, arg4); } --=20 2.17.1 From nobody Thu May 9 22:44:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1558299701; cv=none; d=zoho.com; s=zohoarc; b=lmiwGv6SHWqINKmoJIcb6WicUIqQNvr3TJ2QmEWoomimjoe1aLTMRbOB6JhTlIdq7LAFKa69S+XrQLYo6DfJUoP5G41cW5wd+f0r0Xa8YWBfH49REfP7N7GxM1UvKTeYKsN9gTWlgHba5UQLjibwwD+b1VSEYoqNpl7JKuQ8Exs= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1558299701; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=qYhnP8CmUyN8DJK4QlR57fQbe3qhOBTecaegSn//V4c=; b=KmnfqBzPkSU7Upwwo41DlzG8Y8sM+1bRCMLsFp8KQ70YRpX3JXkhGKDm+T8wDRv1UhmFVQGuK4ZJyWIXVd3jCAPVhSCcf5AHRWymNV7yYC3x9C86fe9F+yr5zAjT6IS+UM267MqaErVh9pkKxbcsupjeaeH8SzOngiZ/XtJ+Bs4= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (209.51.188.17 [209.51.188.17]) by mx.zohomail.com with SMTPS id 1558299701527755.6119620458068; Sun, 19 May 2019 14:01:41 -0700 (PDT) Received: from localhost ([127.0.0.1]:53219 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSgg-0000qf-8o for importer@patchew.org; Sun, 19 May 2019 16:45:42 -0400 Received: from eggs.gnu.org ([209.51.188.92]:50098) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSYq-0002kh-8y for qemu-devel@nongnu.org; Sun, 19 May 2019 16:37:37 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hSSYp-0003Py-9e for qemu-devel@nongnu.org; Sun, 19 May 2019 16:37:36 -0400 Received: from mail-pf1-x442.google.com ([2607:f8b0:4864:20::442]:38309) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hSSYp-0003P3-3o for qemu-devel@nongnu.org; Sun, 19 May 2019 16:37:35 -0400 Received: by mail-pf1-x442.google.com with SMTP id b76so6171269pfb.5 for ; Sun, 19 May 2019 13:37:35 -0700 (PDT) Received: from localhost.localdomain (97-113-13-231.tukw.qwest.net. [97.113.13.231]) by smtp.gmail.com with ESMTPSA id i7sm11397448pfo.19.2019.05.19.13.37.32 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 19 May 2019 13:37:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=qYhnP8CmUyN8DJK4QlR57fQbe3qhOBTecaegSn//V4c=; b=Pig4dPrhh0IQm2puL4y7L1z5VCzEWx8rAXfTzOzVG954/QZK7RpTsJZy4z1bW2BNJS 9v3NoT/3b/QSvihL1POvzSZRt4gq2lg2io6GZq/U2AEs8N8kExJuGYMNvsuBHsrfUOD7 3Fzr5mz/qoklKqDJChWhpBRxx8gp0NwT8J7SpMUTo9scUeFs7t7wLf4v5AV1HbvuWGT7 1K+GKhj63Z20E7QZ54UdZp5dalZt3qFXAKCA+G4O5E/7aFeU2UrXngO1pcqH/hbsU1Ik 5GFfjOim4KUAgj14hfzp6dH799w/9EeGfavRjwLKoq+GMOxj+Dg9JdIlmXwon58A3vML e8gQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=qYhnP8CmUyN8DJK4QlR57fQbe3qhOBTecaegSn//V4c=; b=m6M2EXQh0/KffIsSKekup6+dXnG/ftK8S2wS+7t1VmFhV0fFTOvKOJLilpmA8Hb/xZ k7jltatGDXTL28yHap8JE9Rb7nptJ2Ewy0WBgxz6pJblUBcynxhEbgNysoD7nqY4NiF/ xMiHJwnXhi1KRJscI87W1EgWlQo4pExHA6pTbr28GftR5wfX8z7O39uW7pfhWginv7tJ bML9RSf4dYZcQ3o0nkMo+xOq3BDErMWHU+Qbm3rpd3pBlFykHFGNzlbiE/bC9B0f2Der hwhcFFhktcgEaOZIRXf0VwWP6VV8SHZBdegxZk16SN5ry67/Ywh8yLzCRrtgNrwuyoib mKKQ== X-Gm-Message-State: APjAAAUi3OEbEAf+BzUYIZIZov/AdYdnh04IK7rZUYZvjlRCaKKSWdJu A4eQUbdIOGcsKXls48QEN4diPATPamw= X-Google-Smtp-Source: APXvYqw+ALPcUrxjj6nEWahdpZU8jwelqI//CcT5EMGcBGVVlMmjAJZCLJm+LczsBjxbnnAm3Acsfg== X-Received: by 2002:a63:374b:: with SMTP id g11mr15571441pgn.421.1558298253819; Sun, 19 May 2019 13:37:33 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sun, 19 May 2019 13:36:16 -0700 Message-Id: <20190519203726.20729-5-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190519203726.20729-1-richard.henderson@linaro.org> References: <20190519203726.20729-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::442 Subject: [Qemu-devel] [PATCH v7 04/74] linux-user: Tidy do_openat loop over fakes X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: laurent@vivier.eu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Cleaner to use ARRAY_SIZE to loop over elements instead of using a sentinel within the data structure. Signed-off-by: Richard Henderson --- linux-user/syscall-file.inc.c | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/linux-user/syscall-file.inc.c b/linux-user/syscall-file.inc.c index 961eed13ae..30f8e35cdd 100644 --- a/linux-user/syscall-file.inc.c +++ b/linux-user/syscall-file.inc.c @@ -235,7 +235,6 @@ static abi_long do_openat(void *cpu_env, int dirfd, abi= _ulong target_path, int (*fill)(void *cpu_env, int fd); int (*cmp)(const char *s1, const char *s2); }; - const struct fake_open *fake_open; static const struct fake_open fakes[] =3D { { "maps", open_self_maps, is_proc_myself }, { "stat", open_self_stat, is_proc_myself }, @@ -244,12 +243,12 @@ static abi_long do_openat(void *cpu_env, int dirfd, a= bi_ulong target_path, #if defined(HOST_WORDS_BIGENDIAN) !=3D defined(TARGET_WORDS_BIGENDIAN) { "/proc/net/route", open_net_route, is_proc }, #endif - { NULL, NULL, NULL } }; =20 char *pathname =3D lock_user_string(target_path); int flags =3D target_to_host_bitmask(target_flags, fcntl_flags_tbl); abi_long ret; + size_t i; =20 if (!pathname) { return -TARGET_EFAULT; @@ -263,17 +262,16 @@ static abi_long do_openat(void *cpu_env, int dirfd, a= bi_ulong target_path, goto done; } =20 - for (fake_open =3D fakes; fake_open->filename; fake_open++) { - if (fake_open->cmp(pathname, fake_open->filename)) { - break; - } - } - - if (fake_open->filename) { + for (i =3D 0; i < ARRAY_SIZE(fakes); ++i) { + const struct fake_open *fake_open =3D &fakes[i]; const char *tmpdir; char filename[PATH_MAX]; int fd; =20 + if (!fake_open->cmp(pathname, fake_open->filename)) { + continue; + } + /* create temporary file to map stat to */ tmpdir =3D getenv("TMPDIR"); if (!tmpdir) { --=20 2.17.1 From nobody Thu May 9 22:44:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1558298773; cv=none; d=zoho.com; s=zohoarc; b=oVfK7ER8qv73pbk0+0GR6RMMcX1Y8KdnqEG9JOwtugwYSFtMi4kY674t+q90pmL0QMM5nTNk2urHttzMc/pGuQ2nKfiJv+Jnp/nu/yGJdBOryZjrvJJmZrdrpHb8JQwEk2RWlZNBUt05Hr9eGSa5ILSLgAiagCSul3Icj7sOCns= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1558298773; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=T/gNF/+WQ4Pn+UuyOMg1wvHnA4fUii7t4Tux8xUmkoc=; b=MMIqgI1tJx77FXuhnQ/6yi5tNvoGy2he3jgzgRTzZuVKlYDKm6hZpUBCH52SZbSWWBqI1MimkEeTQhyeJdtKnWoPuifiLRFNhioMbogl6XmNzX6aM+1rCMP39Ya5CQfpk2h4tJyRblzyeVBljroTRQqhubc0qQRYks7HNaKiYL8= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (209.51.188.17 [209.51.188.17]) by mx.zohomail.com with SMTPS id 1558298773205535.8141348288018; Sun, 19 May 2019 13:46:13 -0700 (PDT) Received: from localhost ([127.0.0.1]:53236 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSgz-0001BN-0T for importer@patchew.org; Sun, 19 May 2019 16:46:01 -0400 Received: from eggs.gnu.org ([209.51.188.92]:50125) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSYs-0002m9-74 for qemu-devel@nongnu.org; Sun, 19 May 2019 16:37:40 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hSSYq-0003Rl-Qa for qemu-devel@nongnu.org; Sun, 19 May 2019 16:37:38 -0400 Received: from mail-pg1-x544.google.com ([2607:f8b0:4864:20::544]:36049) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hSSYq-0003Qv-Jr for qemu-devel@nongnu.org; Sun, 19 May 2019 16:37:36 -0400 Received: by mail-pg1-x544.google.com with SMTP id a3so5747684pgb.3 for ; Sun, 19 May 2019 13:37:36 -0700 (PDT) Received: from localhost.localdomain (97-113-13-231.tukw.qwest.net. [97.113.13.231]) by smtp.gmail.com with ESMTPSA id i7sm11397448pfo.19.2019.05.19.13.37.34 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 19 May 2019 13:37:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=T/gNF/+WQ4Pn+UuyOMg1wvHnA4fUii7t4Tux8xUmkoc=; b=Dt6Oh+GYc5ECBGvXm8k40HNriBNshJGfarJIgu4ZyvWlyiJ7RPVRJRXbceNCNFeHdZ +HXBwmHKQSKyam0OggyMej2UtxVQQEpbzY3AeIhhaoOKO4E6pHgV+Aq8mtJXE8UrCvfi hDiaIpcW7AsenQSdR7tqqEN7Qsx4B2yWK2wMfKNQhk9J5H2/Dovott+pRkDvG0LIE6Tw aTi/a8PkuqOpG4DnnbMTzxJC4ot9S02hjUALTRVErDxBZCG2JV+3zGlIXlJmEbTjHTBK Q1sAILEQ7kqiIRPhk+errWRwwixVqmWL8sRbEIS3mUi0O/nu9kQK7iV8cgZcAmWzHLLY EICg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=T/gNF/+WQ4Pn+UuyOMg1wvHnA4fUii7t4Tux8xUmkoc=; b=qBDKjF0fH6RrsoBwNIC9hcKx4EoFP9kIj9UtZdFu+hD6NiEd3NLfzNA1I49Um3wkKt is3CilLtKU6YhsFnmeCFGXBBwAxwTsV2JvElQOTpjwTxbIi5VFGXJn/Jd1NWYgBHJBcZ Kwbp3vIHffUgbmL6vOXgiFrR1fnLmKY9gSx4ThJetqL0F7hwdmKOBLdzZM99Gr5cYvva SYVeBqDcsTaYdD2veiydQveY+/Wrr221CNb8qfjUnCvyhCZ3LeTfn4gzTKVedHPb5VVt woCdQP7NQ4qPz7Krlz9FiFkUyGm+vBm2HC+tVxnsGwotrR1hvML5kMbvErunCt3y4nIX hrPg== X-Gm-Message-State: APjAAAU/3FzwhjuxQQzt1tYB9lzhpjZKZ+AtL27G54DUeuwQmE0B0GVw 7SMwxOB6DrqFK3e2rh7fGLrY0rBoElc= X-Google-Smtp-Source: APXvYqy8+fS70NI1GkAOCZBtCYqeXlqWSSt1gl0TgvzZGXd1GubkQOgY3SCjreK5VnBXdjJr+ndNWA== X-Received: by 2002:a65:5c89:: with SMTP id a9mr71871984pgt.334.1558298255333; Sun, 19 May 2019 13:37:35 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sun, 19 May 2019 13:36:17 -0700 Message-Id: <20190519203726.20729-6-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190519203726.20729-1-richard.henderson@linaro.org> References: <20190519203726.20729-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::544 Subject: [Qemu-devel] [PATCH v7 05/74] linux-user: Split out readlink, readlinkat X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: laurent@vivier.eu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Split out a shared implementation for both of these; unify the best parts of /proc/self/exe checking. Remove the temporary forward declaration for is_proc_self. Signed-off-by: Richard Henderson --- linux-user/syscall-defs.h | 6 ++++ linux-user/strace.c | 29 ------------------ linux-user/syscall-file.inc.c | 45 ++++++++++++++++++++++++++++ linux-user/syscall.c | 55 ----------------------------------- linux-user/strace.list | 6 ---- 5 files changed, 51 insertions(+), 90 deletions(-) diff --git a/linux-user/syscall-defs.h b/linux-user/syscall-defs.h index 1f3a9c47ab..d1a6c6fa3c 100644 --- a/linux-user/syscall-defs.h +++ b/linux-user/syscall-defs.h @@ -20,3 +20,9 @@ SYSCALL_DEF(open, ARG_STR, ARG_OPENFLAG, ARG_MODEFLAG); #endif SYSCALL_DEF(openat, ARG_ATDIRFD, ARG_STR, ARG_OPENFLAG, ARG_MODEFLAG); +#ifdef TARGET_NR_readlink +SYSCALL_DEF(readlink, ARG_STR, ARG_PTR, ARG_DEC); +#endif +#ifdef TARGET_NR_readlinkat +SYSCALL_DEF(readlinkat, ARG_ATDIRFD, ARG_STR, ARG_PTR, ARG_DEC); +#endif diff --git a/linux-user/strace.c b/linux-user/strace.c index 24ef14b5e6..2f1c7e537f 100644 --- a/linux-user/strace.c +++ b/linux-user/strace.c @@ -2256,35 +2256,6 @@ print_fstatat64(const struct syscallname *name, #define print_newfstatat print_fstatat64 #endif =20 -#ifdef TARGET_NR_readlink -static void -print_readlink(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - print_syscall_prologue(name); - print_string(arg0, 0); - print_pointer(arg1, 0); - print_raw_param("%u", arg2, 1); - print_syscall_epilogue(name); -} -#endif - -#ifdef TARGET_NR_readlinkat -static void -print_readlinkat(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - print_syscall_prologue(name); - print_at_dirfd(arg0, 0); - print_string(arg1, 0); - print_pointer(arg2, 0); - print_raw_param("%u", arg3, 1); - print_syscall_epilogue(name); -} -#endif - #ifdef TARGET_NR_rename static void print_rename(const struct syscallname *name, diff --git a/linux-user/syscall-file.inc.c b/linux-user/syscall-file.inc.c index 30f8e35cdd..4ef0be2c6f 100644 --- a/linux-user/syscall-file.inc.c +++ b/linux-user/syscall-file.inc.c @@ -314,3 +314,48 @@ SYSCALL_IMPL(openat) { return do_openat(cpu_env, arg1, arg2, arg3, arg4); } + +static abi_long do_readlinkat(int dirfd, abi_ulong target_path, + abi_ulong target_buf, abi_ulong bufsiz) +{ + char *p =3D lock_user_string(target_path); + void *buf =3D lock_user(VERIFY_WRITE, target_buf, bufsiz, 0); + abi_long ret; + + if (!p || !buf) { + ret =3D -TARGET_EFAULT; + } else if (!bufsiz) { + /* Short circuit this for the magic exe check. */ + ret =3D -TARGET_EINVAL; + } else if (is_proc_myself((const char *)p, "exe")) { + char real[PATH_MAX]; + char *temp =3D realpath(exec_path, real); + + if (temp =3D=3D NULL) { + ret =3D -host_to_target_errno(errno); + } else { + ret =3D MIN(strlen(real), bufsiz); + /* We cannot NUL terminate the string. */ + memcpy(buf, real, ret); + } + } else { + ret =3D get_errno(readlinkat(dirfd, path(p), buf, bufsiz)); + } + unlock_user(buf, target_buf, ret); + unlock_user(p, target_path, 0); + return ret; +} + +#ifdef TARGET_NR_readlink +SYSCALL_IMPL(readlink) +{ + return do_readlinkat(AT_FDCWD, arg1, arg2, arg3); +} +#endif + +#ifdef TARGET_NR_readlinkat +SYSCALL_IMPL(readlinkat) +{ + return do_readlinkat(arg1, arg2, arg3, arg4); +} +#endif diff --git a/linux-user/syscall.c b/linux-user/syscall.c index fe52ac15c2..53fb211f16 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -6633,8 +6633,6 @@ int host_to_target_waitstatus(int status) return status; } =20 -static int is_proc_myself(const char *filename, const char *entry); - #define TIMER_MAGIC 0x0caf0000 #define TIMER_MAGIC_MASK 0xffff0000 =20 @@ -8108,59 +8106,6 @@ static abi_long do_syscall1(void *cpu_env, int num, = abi_long arg1, } return ret; #endif -#ifdef TARGET_NR_readlink - case TARGET_NR_readlink: - { - void *p2; - p =3D lock_user_string(arg1); - p2 =3D lock_user(VERIFY_WRITE, arg2, arg3, 0); - if (!p || !p2) { - ret =3D -TARGET_EFAULT; - } else if (!arg3) { - /* Short circuit this for the magic exe check. */ - ret =3D -TARGET_EINVAL; - } else if (is_proc_myself((const char *)p, "exe")) { - char real[PATH_MAX], *temp; - temp =3D realpath(exec_path, real); - /* Return value is # of bytes that we wrote to the buffer.= */ - if (temp =3D=3D NULL) { - ret =3D get_errno(-1); - } else { - /* Don't worry about sign mismatch as earlier mapping - * logic would have thrown a bad address error. */ - ret =3D MIN(strlen(real), arg3); - /* We cannot NUL terminate the string. */ - memcpy(p2, real, ret); - } - } else { - ret =3D get_errno(readlink(path(p), p2, arg3)); - } - unlock_user(p2, arg2, ret); - unlock_user(p, arg1, 0); - } - return ret; -#endif -#if defined(TARGET_NR_readlinkat) - case TARGET_NR_readlinkat: - { - void *p2; - p =3D lock_user_string(arg2); - p2 =3D lock_user(VERIFY_WRITE, arg3, arg4, 0); - if (!p || !p2) { - ret =3D -TARGET_EFAULT; - } else if (is_proc_myself((const char *)p, "exe")) { - char real[PATH_MAX], *temp; - temp =3D realpath(exec_path, real); - ret =3D temp =3D=3D NULL ? get_errno(-1) : strlen(real) ; - snprintf((char *)p2, arg4, "%s", real); - } else { - ret =3D get_errno(readlinkat(arg1, path(p), p2, arg4)); - } - unlock_user(p2, arg3, ret); - unlock_user(p, arg2, 0); - } - return ret; -#endif #ifdef TARGET_NR_swapon case TARGET_NR_swapon: if (!(p =3D lock_user_string(arg1))) diff --git a/linux-user/strace.list b/linux-user/strace.list index 2c7a595e19..53cee3db92 100644 --- a/linux-user/strace.list +++ b/linux-user/strace.list @@ -1079,12 +1079,6 @@ #ifdef TARGET_NR_readdir { TARGET_NR_readdir, "readdir" , NULL, NULL, NULL }, #endif -#ifdef TARGET_NR_readlink -{ TARGET_NR_readlink, "readlink" , NULL, print_readlink, NULL }, -#endif -#ifdef TARGET_NR_readlinkat -{ TARGET_NR_readlinkat, "readlinkat" , NULL, print_readlinkat, NULL }, -#endif #ifdef TARGET_NR_readv { TARGET_NR_readv, "readv" , NULL, NULL, NULL }, #endif --=20 2.17.1 From nobody Thu May 9 22:44:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1558298417; cv=none; d=zoho.com; s=zohoarc; b=JzWcLkh6v9V7C4pvJ9vbxkPUn4sxlS5Qni0KBNSg91L7WkEwN0k39UAPCZsS/C0z70K0/EXeKqmsZC0AUlU0QdmclcpxntgozqTJmt2AguUHzWcHoIZ8moM/CrEqEVPb/1JzgM7hHRZ/odN9DDgxQPgFPVYgvgKdzz/9Bh3caWk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1558298417; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=WUYfVdZEVtBk9MHhOPPZhUCKLb9+xv1voeQk5PhUfpc=; b=UXmcAtbtIbLFkE83i+tznbqcmpjZfU+VtqTiVsndJMp3g0pP9jW3XqBB6rdrkrCDhW9erAg+u9U4EPbbf3ofUqJ+uEvEy5jlRHIpw6Ueva5GxwfXcJbOjTks8HkbS9iZqpaBtcYgHb6LcJtgAjN5DR3+/SRX+YF4lSoND2nt7GM= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (209.51.188.17 [209.51.188.17]) by mx.zohomail.com with SMTPS id 1558298417849518.4584447761551; Sun, 19 May 2019 13:40:17 -0700 (PDT) Received: from localhost ([127.0.0.1]:53122 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSbG-0004T9-FQ for importer@patchew.org; Sun, 19 May 2019 16:40:06 -0400 Received: from eggs.gnu.org ([209.51.188.92]:50133) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSYs-0002mB-T6 for qemu-devel@nongnu.org; Sun, 19 May 2019 16:37:40 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hSSYr-0003Sw-RR for qemu-devel@nongnu.org; Sun, 19 May 2019 16:37:38 -0400 Received: from mail-pf1-x441.google.com ([2607:f8b0:4864:20::441]:45406) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hSSYr-0003SL-Lt for qemu-devel@nongnu.org; Sun, 19 May 2019 16:37:37 -0400 Received: by mail-pf1-x441.google.com with SMTP id s11so6148107pfm.12 for ; Sun, 19 May 2019 13:37:37 -0700 (PDT) Received: from localhost.localdomain (97-113-13-231.tukw.qwest.net. [97.113.13.231]) by smtp.gmail.com with ESMTPSA id i7sm11397448pfo.19.2019.05.19.13.37.35 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 19 May 2019 13:37:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=WUYfVdZEVtBk9MHhOPPZhUCKLb9+xv1voeQk5PhUfpc=; b=njAw4p9772b+h3oN2yLFzA7FLillXnb1Lf8lnMJU7VLCfwlmHjFfRH6wFrzE35r7Of Eoc20tumRaLO5akv+ql0lZ4wfyFgYP1E8Uk78KAd27eOQBN4+4pUHNi7m7BW8Nxr6yh/ VXu/svjD30BIoMBlbxEAAP+RM12LYDxTnXif+91CRueKAQEduLGggAm4xsTpzeqY2XeV kwH2hvrXXXr+erMPWjc9X/V4QwnB8owZ87llebOz3vxIGRJ9qydnaAR4VisuyC+lQEKH /Lw6hJAhuHJ6U2O9hkI+VqlBirXbyGEndi0jUiYRg1dhn1VpoimyrB50XrZfdZPKojZm MhIw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=WUYfVdZEVtBk9MHhOPPZhUCKLb9+xv1voeQk5PhUfpc=; b=uL7Xiwj+O/Zh9bmkfDdMduDrtGWdPMQCGPGn3CsKwGJF+qHsZGDib9eRiOaC1bpj0k XVf1NYSMWL7E+UUxexgNDUq7bB3KDGQLXAzMkFf9t69CKQ4uOTOjAznO+DIecj6lRDPu wBAg67b4HPq9RPl4ZkHZsXxag2zANQsMHqSAeMhKKskNCOU9H4IeBjiVytUlGHwNZ++R WyZZK65tkg9ysvv58P0PXqs5CnfLEyMJspzqBhqWKLLW4TPWxtoCQsmQeGcvgqjSRlnz ClyNfovA3b3Qm03mQlNiG7fvbTq/9LiEG73frIeDDVBFtHNV89nM50IaNsxREvLwsh+i 6rbQ== X-Gm-Message-State: APjAAAV1lT1jzBzUV5pdriC0SIYpw8IPBJNM70FH/xIcjMq5EwEAzgg+ ZNpgGjRNxSU8QI6l7nf4ivpJpCkYPwI= X-Google-Smtp-Source: APXvYqwUyhXyOfSeZTZ2cQP/xiwArBMAnLg9Fe/tN+hy6PHeSV+zS1wkBrV7oYg85it5+x5M+08VRw== X-Received: by 2002:a63:1316:: with SMTP id i22mr71592462pgl.274.1558298256356; Sun, 19 May 2019 13:37:36 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sun, 19 May 2019 13:36:18 -0700 Message-Id: <20190519203726.20729-7-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190519203726.20729-1-richard.henderson@linaro.org> References: <20190519203726.20729-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::441 Subject: [Qemu-devel] [PATCH v7 06/74] linux-user: Split out close X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: laurent@vivier.eu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Richard Henderson --- linux-user/syscall-defs.h | 1 + linux-user/syscall-file.inc.c | 8 ++++++++ linux-user/syscall.c | 4 ---- linux-user/strace.list | 3 --- 4 files changed, 9 insertions(+), 7 deletions(-) diff --git a/linux-user/syscall-defs.h b/linux-user/syscall-defs.h index d1a6c6fa3c..797426ae6f 100644 --- a/linux-user/syscall-defs.h +++ b/linux-user/syscall-defs.h @@ -16,6 +16,7 @@ * along with this program; if not, see . */ =20 +SYSCALL_DEF(close, ARG_DEC); #ifdef TARGET_NR_open SYSCALL_DEF(open, ARG_STR, ARG_OPENFLAG, ARG_MODEFLAG); #endif diff --git a/linux-user/syscall-file.inc.c b/linux-user/syscall-file.inc.c index 4ef0be2c6f..d9b09c2cd2 100644 --- a/linux-user/syscall-file.inc.c +++ b/linux-user/syscall-file.inc.c @@ -16,6 +16,14 @@ * along with this program; if not, see . */ =20 +SYSCALL_IMPL(close) +{ + int fd =3D arg1; + + fd_trans_unregister(fd); + return get_errno(close(fd)); +} + /* * Helpers for do_openat, manipulating /proc/self/foo. */ diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 53fb211f16..d2b1bb76c4 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -6827,10 +6827,6 @@ static abi_long do_syscall1(void *cpu_env, int num, = abi_long arg1, fd_trans_unregister(ret); return ret; #endif - case TARGET_NR_close: - fd_trans_unregister(arg1); - return get_errno(close(arg1)); - case TARGET_NR_brk: return do_brk(arg1); #ifdef TARGET_NR_fork diff --git a/linux-user/strace.list b/linux-user/strace.list index 53cee3db92..43d3088669 100644 --- a/linux-user/strace.list +++ b/linux-user/strace.list @@ -97,9 +97,6 @@ #ifdef TARGET_NR_clone { TARGET_NR_clone, "clone" , NULL, print_clone, NULL }, #endif -#ifdef TARGET_NR_close -{ TARGET_NR_close, "close" , "%s(%d)", NULL, NULL }, -#endif #ifdef TARGET_NR_connect { TARGET_NR_connect, "connect" , "%s(%d,%#x,%d)", NULL, NULL }, #endif --=20 2.17.1 From nobody Thu May 9 22:44:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1558298820; cv=none; d=zoho.com; s=zohoarc; b=FSs0MM9U1B6zn2VlYEXFx963iqx28hWE7m3jpJ5c5vGYoVJIntaTA5LWRZSPKVct3XRLT2ua4fdTex9IXfh+dnuD3uYJs2mtUKddzgw9jqGFNNkuYjOYtxiGcZwZSCOp3S7ankm5lXzaqAxvKSqY7ZV1IzoF7W4y8he4aMHyl/4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1558298820; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=v+DSPWFfKETKW6djLG4dV30pA06tpKN/mDvUPl9xg1M=; b=nW3CIxhQAZClY4FqjgQhAWfK/RuROBug3/e/cAgjf2qO7aPQZj7RgDKYXE9GmLG/iJwHEXlRETdVs6v/nEMRRHwr81qyz9kjy7rKv43iHPL7vlk8AOyqocsNjkAk3dfli+m/KFay0VjTpYRhKHSRamiAkQ89zFqrmOPX+z9GDk4= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (209.51.188.17 [209.51.188.17]) by mx.zohomail.com with SMTPS id 1558298820917481.8487416905401; Sun, 19 May 2019 13:47:00 -0700 (PDT) Received: from localhost ([127.0.0.1]:53238 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSho-00020p-Js for importer@patchew.org; Sun, 19 May 2019 16:46:52 -0400 Received: from eggs.gnu.org ([209.51.188.92]:50159) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSYw-0002nl-Ci for qemu-devel@nongnu.org; Sun, 19 May 2019 16:37:43 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hSSYv-0003Wm-4f for qemu-devel@nongnu.org; Sun, 19 May 2019 16:37:42 -0400 Received: from mail-pg1-x544.google.com ([2607:f8b0:4864:20::544]:32972) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hSSYu-0003Vo-Ug for qemu-devel@nongnu.org; Sun, 19 May 2019 16:37:41 -0400 Received: by mail-pg1-x544.google.com with SMTP id h17so5751680pgv.0 for ; Sun, 19 May 2019 13:37:40 -0700 (PDT) Received: from localhost.localdomain (97-113-13-231.tukw.qwest.net. [97.113.13.231]) by smtp.gmail.com with ESMTPSA id i7sm11397448pfo.19.2019.05.19.13.37.36 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 19 May 2019 13:37:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=v+DSPWFfKETKW6djLG4dV30pA06tpKN/mDvUPl9xg1M=; b=kul8EKJ+Q4XjOZ96gaPQl3ei1QXKW4h4xkEUQ6XK080ElloUc1iEFs6lO9vKbFR9XY 7yItQEu89XB+RVe1GfGBGgx8UCwOw02bedJvIQWxH5IgnRZYvAtsHdVdQ72LooB5RrBc hh4wqx6aRaaoEQtdJCY+ikK8aMH5LKP1PQT764rE9KUxkk+wpvSH4xFwHJhbu67LKWLg 9Q3APNNKUkiDWwaW65EAa+QJ2sHwD/LK4UQM+yZwYBdQwTLZ8Hnx+sHu0YxXID+X6OQH F+i5qwjcdFRP6k+iuxxvvRgKUqWDUtbWSZEew2Zkk/rG2WpvE3jgcLSrqhGTgmHcQclh ORBQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=v+DSPWFfKETKW6djLG4dV30pA06tpKN/mDvUPl9xg1M=; b=lDEuC6ATvINchhGeLD35ckGs9uuZ4F1GQYQ5D/RTIe0mS1Fr79kXalqn8ujlh4rpps SlV/DsQ92iqMNskQoxeXGOfcW56HYbdEicnzViPOls3+uQkobveNWmUmu8fu6gOId0vA GZotglboVrWPWCswmOQ3IWIyPYzNnAhgdB7f2k6ovmOrxn12OmvQOTTJyGu+mTipVV1N u79UNwndAReKCnZLPhvT1beWic389wXxVGO0Mp87IENXxykkQ/41wFKI7JnB2syQgPQL 9fD3zIidm0nEhNC5cKzL2XXCIdfdPtk/q02M+iffRyjHDJv071kI5TiLzLSjhrD2muwh vPIQ== X-Gm-Message-State: APjAAAWNBb9ya+pw8T4zCcqBQWU6Iyc7FNhRSxrccB/hfSEVP8Fp8NBM ga5fnCWaYANDRUZ2hDpeib6jUVuk1UQ= X-Google-Smtp-Source: APXvYqwMA3kqcXRsnECaZ7cBhBGOMLDrpu6VEL+UHy5PpeAOF0u/w+6XXKE0g1Cosiz4qHMWiCq6JQ== X-Received: by 2002:a65:64da:: with SMTP id t26mr71680641pgv.322.1558298259460; Sun, 19 May 2019 13:37:39 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sun, 19 May 2019 13:36:19 -0700 Message-Id: <20190519203726.20729-8-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190519203726.20729-1-richard.henderson@linaro.org> References: <20190519203726.20729-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::544 Subject: [Qemu-devel] [PATCH v7 07/74] linux-user: Split out read, write X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: laurent@vivier.eu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Richard Henderson --- linux-user/syscall-defs.h | 2 ++ linux-user/syscall-file.inc.c | 58 +++++++++++++++++++++++++++++++++++ linux-user/syscall.c | 34 -------------------- linux-user/strace.list | 6 ---- 4 files changed, 60 insertions(+), 40 deletions(-) diff --git a/linux-user/syscall-defs.h b/linux-user/syscall-defs.h index 797426ae6f..b031de1375 100644 --- a/linux-user/syscall-defs.h +++ b/linux-user/syscall-defs.h @@ -21,9 +21,11 @@ SYSCALL_DEF(close, ARG_DEC); SYSCALL_DEF(open, ARG_STR, ARG_OPENFLAG, ARG_MODEFLAG); #endif SYSCALL_DEF(openat, ARG_ATDIRFD, ARG_STR, ARG_OPENFLAG, ARG_MODEFLAG); +SYSCALL_DEF(read, ARG_DEC, ARG_PTR, ARG_DEC); #ifdef TARGET_NR_readlink SYSCALL_DEF(readlink, ARG_STR, ARG_PTR, ARG_DEC); #endif #ifdef TARGET_NR_readlinkat SYSCALL_DEF(readlinkat, ARG_ATDIRFD, ARG_STR, ARG_PTR, ARG_DEC); #endif +SYSCALL_DEF(write, ARG_DEC, ARG_PTR, ARG_DEC); diff --git a/linux-user/syscall-file.inc.c b/linux-user/syscall-file.inc.c index d9b09c2cd2..e6adcc351c 100644 --- a/linux-user/syscall-file.inc.c +++ b/linux-user/syscall-file.inc.c @@ -323,6 +323,32 @@ SYSCALL_IMPL(openat) return do_openat(cpu_env, arg1, arg2, arg3, arg4); } =20 +SYSCALL_IMPL(read) +{ + int fd =3D arg1; + abi_ulong target_p =3D arg2; + abi_ulong size =3D arg3; + void *p; + abi_long ret; + + if (target_p =3D=3D 0 && size =3D=3D 0) { + return get_errno(safe_read(fd, NULL, 0)); + } + p =3D lock_user(VERIFY_WRITE, target_p, size, 0); + if (p =3D=3D NULL) { + return -TARGET_EFAULT; + } + ret =3D get_errno(safe_read(fd, p, size)); + if (!is_error(ret)) { + TargetFdDataFunc trans =3D fd_trans_host_to_target_data(fd); + if (trans) { + ret =3D trans(p, ret); + } + } + unlock_user(p, target_p, ret); + return ret; +} + static abi_long do_readlinkat(int dirfd, abi_ulong target_path, abi_ulong target_buf, abi_ulong bufsiz) { @@ -367,3 +393,35 @@ SYSCALL_IMPL(readlinkat) return do_readlinkat(arg1, arg2, arg3, arg4); } #endif + +SYSCALL_IMPL(write) +{ + int fd =3D arg1; + abi_ulong target_p =3D arg2; + abi_ulong size =3D arg3; + TargetFdDataFunc trans; + abi_long ret; + void *p; + + if (target_p =3D=3D 0 && size =3D=3D 0) { + return get_errno(safe_write(fd, NULL, 0)); + } + p =3D lock_user(VERIFY_READ, target_p, size, 1); + if (p =3D=3D NULL) { + return -TARGET_EFAULT; + } + trans =3D fd_trans_target_to_host_data(fd); + if (trans) { + void *copy =3D g_malloc(size); + memcpy(copy, p, size); + ret =3D trans(copy, size); + if (ret >=3D 0) { + ret =3D get_errno(safe_write(fd, copy, ret)); + } + g_free(copy); + } else { + ret =3D get_errno(safe_write(fd, p, size)); + } + unlock_user(p, target_p, 0); + return ret; +} diff --git a/linux-user/syscall.c b/linux-user/syscall.c index d2b1bb76c4..de80ddb330 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -6782,40 +6782,6 @@ static abi_long do_syscall1(void *cpu_env, int num, = abi_long arg1, preexit_cleanup(cpu_env, arg1); _exit(arg1); return 0; /* avoid warning */ - case TARGET_NR_read: - if (arg2 =3D=3D 0 && arg3 =3D=3D 0) { - return get_errno(safe_read(arg1, 0, 0)); - } else { - if (!(p =3D lock_user(VERIFY_WRITE, arg2, arg3, 0))) - return -TARGET_EFAULT; - ret =3D get_errno(safe_read(arg1, p, arg3)); - if (ret >=3D 0 && - fd_trans_host_to_target_data(arg1)) { - ret =3D fd_trans_host_to_target_data(arg1)(p, ret); - } - unlock_user(p, arg2, ret); - } - return ret; - case TARGET_NR_write: - if (arg2 =3D=3D 0 && arg3 =3D=3D 0) { - return get_errno(safe_write(arg1, 0, 0)); - } - if (!(p =3D lock_user(VERIFY_READ, arg2, arg3, 1))) - return -TARGET_EFAULT; - if (fd_trans_target_to_host_data(arg1)) { - void *copy =3D g_malloc(arg3); - memcpy(copy, p, arg3); - ret =3D fd_trans_target_to_host_data(arg1)(copy, arg3); - if (ret >=3D 0) { - ret =3D get_errno(safe_write(arg1, copy, ret)); - } - g_free(copy); - } else { - ret =3D get_errno(safe_write(arg1, p, arg3)); - } - unlock_user(p, arg2, 0); - return ret; - #if defined(TARGET_NR_name_to_handle_at) && defined(CONFIG_OPEN_BY_HANDLE) case TARGET_NR_name_to_handle_at: ret =3D do_name_to_handle_at(arg1, arg2, arg3, arg4, arg5); diff --git a/linux-user/strace.list b/linux-user/strace.list index 43d3088669..2d6bfec692 100644 --- a/linux-user/strace.list +++ b/linux-user/strace.list @@ -1067,9 +1067,6 @@ #ifdef TARGET_NR_quotactl { TARGET_NR_quotactl, "quotactl" , NULL, NULL, NULL }, #endif -#ifdef TARGET_NR_read -{ TARGET_NR_read, "read" , "%s(%d,%#x,%d)", NULL, NULL }, -#endif #ifdef TARGET_NR_readahead { TARGET_NR_readahead, "readahead" , NULL, NULL, NULL }, #endif @@ -1611,9 +1608,6 @@ #ifdef TARGET_NR_waitpid { TARGET_NR_waitpid, "waitpid" , "%s(%d,%p,%#x)", NULL, NULL }, #endif -#ifdef TARGET_NR_write -{ TARGET_NR_write, "write" , "%s(%d,%#x,%d)", NULL, NULL }, -#endif #ifdef TARGET_NR_writev { TARGET_NR_writev, "writev" , "%s(%d,%p,%#x)", NULL, NULL }, #endif --=20 2.17.1 From nobody Thu May 9 22:44:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1558298957; cv=none; d=zoho.com; s=zohoarc; b=Y1j1Em8iotLyBnBxZGDhA4c7NH5AGrdl5R2PK4LeIehJHxPCbNSuJ8PuOVunvSnIdN4aVHt3bvt2PDpB6/zUs6w4TkbSoy7dqD0bWhojFZFHKOg6Hf9STPE3pyQLIuFca3ZuIiKmxwitED2Mm9goyM60JebcdMKu14tmxZrinow= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1558298957; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=v4TN8eiQB7XlopQZigkJd3iS16AoI2I7VjbeWaf5rzc=; b=BCxfuHH4FWPyO1crwOFke0HnrqEZ+BMCy6YNKt4aAENmjsnmS+f7JW2cv8BP5hRIYldmrGJKqpu8p7ehyXKL8hTZILTAMSOs741+O8VXFDajBphl2EYzrZjAXwVVQZVztLH3TUijwCST0EWoShbAQWktCrQ3INj1QSd72fmlFT0= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1558298957188260.6711899923522; Sun, 19 May 2019 13:49:17 -0700 (PDT) Received: from localhost ([127.0.0.1]:53260 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSk2-0003rm-RZ for importer@patchew.org; Sun, 19 May 2019 16:49:10 -0400 Received: from eggs.gnu.org ([209.51.188.92]:50174) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSYx-0002on-ER for qemu-devel@nongnu.org; Sun, 19 May 2019 16:37:44 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hSSYw-0003YA-Dd for qemu-devel@nongnu.org; Sun, 19 May 2019 16:37:43 -0400 Received: from mail-pf1-x441.google.com ([2607:f8b0:4864:20::441]:39712) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hSSYw-0003XN-6n for qemu-devel@nongnu.org; Sun, 19 May 2019 16:37:42 -0400 Received: by mail-pf1-x441.google.com with SMTP id z26so6167151pfg.6 for ; Sun, 19 May 2019 13:37:42 -0700 (PDT) Received: from localhost.localdomain (97-113-13-231.tukw.qwest.net. [97.113.13.231]) by smtp.gmail.com with ESMTPSA id i7sm11397448pfo.19.2019.05.19.13.37.39 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 19 May 2019 13:37:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=v4TN8eiQB7XlopQZigkJd3iS16AoI2I7VjbeWaf5rzc=; b=ltrAgxdo+sqOTVlbfP4OEyTUTut08QxXb1zpk7dgtyQ93CnBcsxetW6RNelYHnjmcf SdN+rLfpAfSsh9iKcesaPWHVnFyvxO5h1MJEhu9UA2VVWPmbjTaGHQFfeu1NbTM6olhb W5FrxkclUwiCdfil0SsaT70j0efcaUBdqc9oAmGIAjyw5RYLqrbHkdMkwdCqyKv8sslk jChGwj6YqZGtHpq40sQl9Km8jcoio6Y60j+zuYNdH/gArg+tJ3NgW9uR+SSXGqoym0oR t8/sOe/3RL31Q9C15ZvMmqAOHr3/1dbeUAnlkPsrC0JJgKNTDSNFwuzNBlYo98DK7WYV dVIg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=v4TN8eiQB7XlopQZigkJd3iS16AoI2I7VjbeWaf5rzc=; b=qI8zPMNhYcYvwmDmdYa1Kw8/ziW8T2EBI9uzX2YK7b3QYT/PnHIYnFts05QaxIMfrD bSpYbWmlOEr8AGZlpvxmHz/ZPYCLc+/1BJ/kFLm+Yj2D3QALSenAAOV8YXHZ0JY3uoIf d6YruK96fpkPBblXaqG9RQ3ji7KFdCx+yrGjek9sfmmT5oAeTbfikoJhKS6ulMjcZnfP cCv7bhwl3bv9bwHrnfq9AJT3WTtzdKAGSCxQ8WmLqrzZyGMy80j/hdMqtg72HcV1bvOx BCmP8hS5zz+p3nBpu93HSJZvRLTp3TmPc/0tpTFso3L6eMcxggYxoLGTXrgo4ydkYaWH G4oQ== X-Gm-Message-State: APjAAAXWb7zekd+zkBft1mIS1JHi7OTXV5k7HJsaZM5tHjlhF85BqZFF qmRaCLG1xbjCLOtt0YANDxQNueWVJTU= X-Google-Smtp-Source: APXvYqz3FltNzJN/T3SQ6gyk0y12pZM7hUfXHdI+SCzOBBuSPwn0qHoW2u7Jc8FLOGWExvl4HCa1dQ== X-Received: by 2002:a62:d044:: with SMTP id p65mr55690797pfg.37.1558298260905; Sun, 19 May 2019 13:37:40 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sun, 19 May 2019 13:36:20 -0700 Message-Id: <20190519203726.20729-9-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190519203726.20729-1-richard.henderson@linaro.org> References: <20190519203726.20729-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::441 Subject: [Qemu-devel] [PATCH v7 08/74] linux-user: Reduce regpairs_aligned & target_offset64 ifdefs X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: laurent@vivier.eu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Richard Henderson --- linux-user/syscall.c | 54 ++++++++++++++++++++------------------------ 1 file changed, 25 insertions(+), 29 deletions(-) diff --git a/linux-user/syscall.c b/linux-user/syscall.c index de80ddb330..61cd73db26 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -464,37 +464,38 @@ static inline int next_free_host_timer(void) } #endif =20 -/* ARM EABI and MIPS expect 64bit types aligned even on pairs or registers= */ +/* + * Returns true if syscall NUM expects 64bit types aligned even + * on pairs of registers. + */ +static inline bool regpairs_aligned(void *cpu_env, int num) +{ #ifdef TARGET_ARM -static inline int regpairs_aligned(void *cpu_env, int num) -{ - return ((((CPUARMState *)cpu_env)->eabi) =3D=3D 1) ; -} -#elif defined(TARGET_MIPS) && (TARGET_ABI_BITS =3D=3D 32) -static inline int regpairs_aligned(void *cpu_env, int num) { return 1; } + return ((CPUARMState *)cpu_env)->eabi; +#elif defined(TARGET_MIPS) && TARGET_ABI_BITS =3D=3D 32 + return true; #elif defined(TARGET_PPC) && !defined(TARGET_PPC64) -/* SysV AVI for PPC32 expects 64bit parameters to be passed on odd/even pa= irs - * of registers which translates to the same as ARM/MIPS, because we start= with - * r3 as arg1 */ -static inline int regpairs_aligned(void *cpu_env, int num) { return 1; } + /* + * SysV AVI for PPC32 expects 64bit parameters to be passed on + * odd/even pairs of registers which translates to the same as + * we start with r3 as arg1. + */ + return true; #elif defined(TARGET_SH4) -/* SH4 doesn't align register pairs, except for p{read,write}64 */ -static inline int regpairs_aligned(void *cpu_env, int num) -{ + /* SH4 doesn't align register pairs, except for p{read,write}64. */ switch (num) { case TARGET_NR_pread64: case TARGET_NR_pwrite64: - return 1; - + return true; default: - return 0; + return false; } -} #elif defined(TARGET_XTENSA) -static inline int regpairs_aligned(void *cpu_env, int num) { return 1; } + return true; #else -static inline int regpairs_aligned(void *cpu_env, int num) { return 0; } + return false; #endif +} =20 #define ERRNO_TABLE_SIZE 1200 =20 @@ -6161,21 +6162,16 @@ void syscall_init(void) } } =20 -#if TARGET_ABI_BITS =3D=3D 32 -static inline uint64_t target_offset64(uint32_t word0, uint32_t word1) +static inline uint64_t target_offset64(abi_ulong word0, abi_ulong word1) { -#ifdef TARGET_WORDS_BIGENDIAN +#if TARGET_ABI_BITS =3D=3D 64 + return word0; +#elif defined(TARGET_WORDS_BIGENDIAN) return ((uint64_t)word0 << 32) | word1; #else return ((uint64_t)word1 << 32) | word0; #endif } -#else /* TARGET_ABI_BITS =3D=3D 32 */ -static inline uint64_t target_offset64(uint64_t word0, uint64_t word1) -{ - return word0; -} -#endif /* TARGET_ABI_BITS !=3D 32 */ =20 #ifdef TARGET_NR_truncate64 static inline abi_long target_truncate64(void *cpu_env, const char *arg1, --=20 2.17.1 From nobody Thu May 9 22:44:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1558299165; cv=none; d=zoho.com; s=zohoarc; b=PwsXZCYk7YDcHOIJvh9Ox+e6TpBVASW0SircmfKY4kg9U4PcUSzrI0Rr7MdE2HyWLNKWIgCiMc7WSk0w0T3UWE6mHGr515NvcT0U7zPJ7yFhXZ++fj0P3x+jN5DKjVwUE3NqZrchSteg1GAyY5iZl1K7wWrItxCwhs5nqMBRGM8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1558299165; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=JWb0gO0FR8omCjsq9CBOm7HqleJuQXyRTIuggbhXR0I=; b=gzW4XQGyjRFOH3N6tKOCYps10wCt91osPCPfazXfqXZsxcSGk6L5ref6uF3W9hA8sMhhHRfiB04PSk+atRl5ylw+41UDtesttKnSsZkyDqgsPkZAssy/4592M1cuPEK0INA55SZnFTDdIurjtS+QRwHEmHo6rjb2fBk78nSrudk= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (209.51.188.17 [209.51.188.17]) by mx.zohomail.com with SMTPS id 1558299165067160.48749723675326; Sun, 19 May 2019 13:52:45 -0700 (PDT) Received: from localhost ([127.0.0.1]:53312 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSnA-0006ZD-6X for importer@patchew.org; Sun, 19 May 2019 16:52:24 -0400 Received: from eggs.gnu.org ([209.51.188.92]:50198) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSYz-0002tD-Ow for qemu-devel@nongnu.org; Sun, 19 May 2019 16:37:46 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hSSYy-0003b4-JV for qemu-devel@nongnu.org; Sun, 19 May 2019 16:37:45 -0400 Received: from mail-pf1-x443.google.com ([2607:f8b0:4864:20::443]:36502) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hSSYy-0003aB-Cd for qemu-devel@nongnu.org; Sun, 19 May 2019 16:37:44 -0400 Received: by mail-pf1-x443.google.com with SMTP id v80so6171244pfa.3 for ; Sun, 19 May 2019 13:37:44 -0700 (PDT) Received: from localhost.localdomain (97-113-13-231.tukw.qwest.net. [97.113.13.231]) by smtp.gmail.com with ESMTPSA id i7sm11397448pfo.19.2019.05.19.13.37.41 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 19 May 2019 13:37:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=JWb0gO0FR8omCjsq9CBOm7HqleJuQXyRTIuggbhXR0I=; b=knfgDER37TXLkkIf/7urgSaz0r/SfBFbkjvXw/XiP6sLx4w7eklJiFggC3UDYdDaqx tUhha63z+Hg5ScSWxjc6KAo1snLcAFEZfsx9RhgITT0zYdt6B6L55bUKfe/oxpk0YCh5 4UEyMJYIMSpSlIhzNZy2QF6HrMAfzyDWMCYbFVWkB1AMa2Eh8AkQGHAQ0pnyVVeeABki CB13GMOWkZWUZ+zWPHpe7qpBnC2H4j8QIcBoTfBOvS1QinQ3bE1LNpaDhg2eNNGYgg+D 4MxCDiaCljbi0qfnbrwygoTy1droAfjhFvlgEKtYFgOJT14E6lczRaMx/SRMOfiPkU+/ r+8Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=JWb0gO0FR8omCjsq9CBOm7HqleJuQXyRTIuggbhXR0I=; b=o0XgaY4O6Owu052mgraC7SvgORdcXjpuyoo/BYpFMwO4us+JRav8Q0lRxBxfYhSD7J QH1xqmb/CB3q8Pz56zwZ90txPU4cVMHF5gr2COlWqWIx4+aF5RMgm46Fhv5CYZ2dv7Z8 nYCWal1YC//pPPBQ4rkVeJSps8S6BcGh8vnKKB29qvsNA/Mqxu/I18iClm+ev7EH5ih3 qgCGA+1SCQBzTuLS8itoTlywPpmzxhvMNX5IY4QDzbd4Bzw6H4WedMIr+hu/dPgG0Fl1 vSshQ1e/GFolKuBPPtwK+1/xrv0PqIh1qIYNSwIccJjPJy0kLQbExJR1CoP2uxTYeZSE ix/A== X-Gm-Message-State: APjAAAWtXEwPnraL+053KOK5w+LxN94ZpLnC7ox9to9/XvlBXSHYS/q2 1JA8JXQBeebpR4EPkLWPnyTR6A3PEyA= X-Google-Smtp-Source: APXvYqyAZJcngqF2tvZH9/7vdmup1/QLo1BotSTkGU0X9v8tlu3q+nZNvjrMzqe9zIO4234YQO/itQ== X-Received: by 2002:a62:4281:: with SMTP id h1mr76213248pfd.162.1558298262235; Sun, 19 May 2019 13:37:42 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sun, 19 May 2019 13:36:21 -0700 Message-Id: <20190519203726.20729-10-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190519203726.20729-1-richard.henderson@linaro.org> References: <20190519203726.20729-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::443 Subject: [Qemu-devel] [PATCH v7 09/74] linux-user: Split out readv, writev X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: laurent@vivier.eu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Richard Henderson --- linux-user/syscall-defs.h | 2 ++ linux-user/syscall-file.inc.c | 34 ++++++++++++++++++++++++++++++++++ linux-user/syscall.c | 22 ---------------------- linux-user/strace.list | 6 ------ 4 files changed, 36 insertions(+), 28 deletions(-) diff --git a/linux-user/syscall-defs.h b/linux-user/syscall-defs.h index b031de1375..130ba7e344 100644 --- a/linux-user/syscall-defs.h +++ b/linux-user/syscall-defs.h @@ -28,4 +28,6 @@ SYSCALL_DEF(readlink, ARG_STR, ARG_PTR, ARG_DEC); #ifdef TARGET_NR_readlinkat SYSCALL_DEF(readlinkat, ARG_ATDIRFD, ARG_STR, ARG_PTR, ARG_DEC); #endif +SYSCALL_DEF(readv, ARG_DEC, ARG_PTR, ARG_DEC); SYSCALL_DEF(write, ARG_DEC, ARG_PTR, ARG_DEC); +SYSCALL_DEF(writev, ARG_DEC, ARG_PTR, ARG_DEC); diff --git a/linux-user/syscall-file.inc.c b/linux-user/syscall-file.inc.c index e6adcc351c..2297ca1760 100644 --- a/linux-user/syscall-file.inc.c +++ b/linux-user/syscall-file.inc.c @@ -349,6 +349,23 @@ SYSCALL_IMPL(read) return ret; } =20 +SYSCALL_IMPL(readv) +{ + int fd =3D arg1; + abi_ulong target_vec =3D arg2; + int count =3D arg3; + struct iovec *vec =3D lock_iovec(VERIFY_WRITE, target_vec, count, 0); + abi_long ret; + + if (vec !=3D NULL) { + ret =3D get_errno(safe_readv(fd, vec, count)); + unlock_iovec(vec, target_vec, count, 1); + } else { + ret =3D -host_to_target_errno(errno); + } + return ret; +} + static abi_long do_readlinkat(int dirfd, abi_ulong target_path, abi_ulong target_buf, abi_ulong bufsiz) { @@ -425,3 +442,20 @@ SYSCALL_IMPL(write) unlock_user(p, target_p, 0); return ret; } + +SYSCALL_IMPL(writev) +{ + int fd =3D arg1; + abi_ulong target_vec =3D arg2; + int count =3D arg3; + struct iovec *vec =3D lock_iovec(VERIFY_READ, target_vec, count, 1); + abi_long ret; + + if (vec !=3D NULL) { + ret =3D get_errno(safe_writev(fd, vec, count)); + unlock_iovec(vec, target_vec, count, 0); + } else { + ret =3D -host_to_target_errno(errno); + } + return ret; +} diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 61cd73db26..8086626707 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -9005,28 +9005,6 @@ static abi_long do_syscall1(void *cpu_env, int num, = abi_long arg1, /* NOTE: the flock constant seems to be the same for every Linux platform */ return get_errno(safe_flock(arg1, arg2)); - case TARGET_NR_readv: - { - struct iovec *vec =3D lock_iovec(VERIFY_WRITE, arg2, arg3, 0); - if (vec !=3D NULL) { - ret =3D get_errno(safe_readv(arg1, vec, arg3)); - unlock_iovec(vec, arg2, arg3, 1); - } else { - ret =3D -host_to_target_errno(errno); - } - } - return ret; - case TARGET_NR_writev: - { - struct iovec *vec =3D lock_iovec(VERIFY_READ, arg2, arg3, 1); - if (vec !=3D NULL) { - ret =3D get_errno(safe_writev(arg1, vec, arg3)); - unlock_iovec(vec, arg2, arg3, 0); - } else { - ret =3D -host_to_target_errno(errno); - } - } - return ret; #if defined(TARGET_NR_preadv) case TARGET_NR_preadv: { diff --git a/linux-user/strace.list b/linux-user/strace.list index 2d6bfec692..c4ae70b485 100644 --- a/linux-user/strace.list +++ b/linux-user/strace.list @@ -1073,9 +1073,6 @@ #ifdef TARGET_NR_readdir { TARGET_NR_readdir, "readdir" , NULL, NULL, NULL }, #endif -#ifdef TARGET_NR_readv -{ TARGET_NR_readv, "readv" , NULL, NULL, NULL }, -#endif #ifdef TARGET_NR_reboot { TARGET_NR_reboot, "reboot" , NULL, NULL, NULL }, #endif @@ -1608,9 +1605,6 @@ #ifdef TARGET_NR_waitpid { TARGET_NR_waitpid, "waitpid" , "%s(%d,%p,%#x)", NULL, NULL }, #endif -#ifdef TARGET_NR_writev -{ TARGET_NR_writev, "writev" , "%s(%d,%p,%#x)", NULL, NULL }, -#endif #ifdef TARGET_NR_utimensat { TARGET_NR_utimensat, "utimensat", NULL, print_utimensat, NULL }, #endif --=20 2.17.1 From nobody Thu May 9 22:44:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1558298589; cv=none; d=zoho.com; s=zohoarc; b=LRKtLoumpKJ6ilYTdbhU2C2wW8O1ENqLOksr7+OgIW/aN2mAzBoT3oLEGBVDjn8/GB6P4U7KqP6vBVXUF+9nhmLbyCt036wnITZ26e0L9bRKt5+h8oAc+LeTkaEbgtGgMAtTgRWlhqOf8dtafTV5/Lg/QnI6UEaE2cqdOdKPOO0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1558298589; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=nuZhVVs0grkA8++mqqAYSgCu6GK8Ulmk49OHI5Gid5E=; b=U9yF7xtBrS6UMYTTRagiyT9spz1jNKWJFK1F+P8pXI2P9PGw52Zc3FwcYkuYWbGP0AvhZnZfo8c/v8DvTPvLltIPsFrRI8q8jBEznJERPXJ46mLbPE7RQHJSZgLMt21XXWyZq9OZ+33vHKsW6/6Gfyi9d8TrlH4KwO2y+MFnusY= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1558298589764767.5539439113917; Sun, 19 May 2019 13:43:09 -0700 (PDT) Received: from localhost ([127.0.0.1]:53179 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSeA-0007C2-JY for importer@patchew.org; Sun, 19 May 2019 16:43:06 -0400 Received: from eggs.gnu.org ([209.51.188.92]:50209) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSZ0-0002tn-BR for qemu-devel@nongnu.org; Sun, 19 May 2019 16:37:47 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hSSYz-0003bb-2x for qemu-devel@nongnu.org; Sun, 19 May 2019 16:37:46 -0400 Received: from mail-pl1-x644.google.com ([2607:f8b0:4864:20::644]:36599) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hSSYy-0003aR-SF for qemu-devel@nongnu.org; Sun, 19 May 2019 16:37:45 -0400 Received: by mail-pl1-x644.google.com with SMTP id d21so5723612plr.3 for ; Sun, 19 May 2019 13:37:44 -0700 (PDT) Received: from localhost.localdomain (97-113-13-231.tukw.qwest.net. [97.113.13.231]) by smtp.gmail.com with ESMTPSA id i7sm11397448pfo.19.2019.05.19.13.37.42 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 19 May 2019 13:37:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=nuZhVVs0grkA8++mqqAYSgCu6GK8Ulmk49OHI5Gid5E=; b=N0JHQqNfxKmMMByWgPuV+E2KnwQJh2aUwKenfhLEps1BNQQOm69z+Lf51CpcuKx+GP E6/amsaEG1/0Q0Ne71CAm4hiSCRcJw0mdF4VCwD+5CRBcG4BYlmqDvVhzqPO7slBj3DC 6nVr8j7UsdW9ubVZ4m4PuFxwPRBPBPLnLT3MbHfaWS8hS3QIDBAE67/bzsxvlxQsXGtv rHsr4LvRhgn36ortXh79KOJILn0/dhsJ8vU4FKx+G8w1oiYSrRQPUcmSLMXN6YSKngjN 2qkKXeWL67f2yxqxQJjMgioVCNWiuoF3q07rDyb8mfgHD91xJh3IIbRtW3DKGAX6A4kU 1yaQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=nuZhVVs0grkA8++mqqAYSgCu6GK8Ulmk49OHI5Gid5E=; b=XV7T3Ya/AzpGbMLVjZl1b4ICDyqG/tAdlaPzHAbeq9Q0sLwQxCmmgi8UsZIJhq5FOh KgxPuNYNNRGHvipg3aHKXasX5QMhP/iYc48Qam2wyAB/ke2RFkxGSjTGIYjk00r285db dJ+zClnQqdBt6CxEySFTde3ZzmsXJQPUot4aYHG7tPn2BX8FeuWojW+6yLmeMVJZ1S98 6F4EPEXKtLebUnfwPfciTQFEh4XC0vHZ1wBkTuKK771lOCKfv84IpeUKzGGn+I78Il40 PQdv5hJ4673x/d85/Xgtvwo/eraYJIyVhfgBNC0Y2xV2sxz3udPUKbP1EWjbQDqW2GBy Pd1w== X-Gm-Message-State: APjAAAU4Nx4pO4dO3FUb/0qj95URHpF1TgqIcJMijSg/1nBuCfFlnDcE F19BJS7HSNaybhYmA9/YFaHliSLQXRs= X-Google-Smtp-Source: APXvYqwVSP0OO/yhtqjqnAcj4ng6ET73c+hfLNTliiTTRJGZk016O7ezEijepx31v9XNoKRMvYwbyQ== X-Received: by 2002:a17:902:201:: with SMTP id 1mr26870277plc.263.1558298263493; Sun, 19 May 2019 13:37:43 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sun, 19 May 2019 13:36:22 -0700 Message-Id: <20190519203726.20729-11-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190519203726.20729-1-richard.henderson@linaro.org> References: <20190519203726.20729-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::644 Subject: [Qemu-devel] [PATCH v7 10/74] linux-user: Split out pread64, pwrite64 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: laurent@vivier.eu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Richard Henderson --- linux-user/syscall-defs.h | 6 ++++ linux-user/syscall-file.inc.c | 62 +++++++++++++++++++++++++++++++++++ linux-user/syscall.c | 36 -------------------- linux-user/strace.list | 6 ---- 4 files changed, 68 insertions(+), 42 deletions(-) diff --git a/linux-user/syscall-defs.h b/linux-user/syscall-defs.h index 130ba7e344..027793d5d0 100644 --- a/linux-user/syscall-defs.h +++ b/linux-user/syscall-defs.h @@ -21,6 +21,12 @@ SYSCALL_DEF(close, ARG_DEC); SYSCALL_DEF(open, ARG_STR, ARG_OPENFLAG, ARG_MODEFLAG); #endif SYSCALL_DEF(openat, ARG_ATDIRFD, ARG_STR, ARG_OPENFLAG, ARG_MODEFLAG); +SYSCALL_DEF_FULL(pread64, .impl =3D impl_pread64, + .args =3D args_pread64_pwrite64, + .arg_type =3D { ARG_DEC, ARG_PTR, ARG_DEC, ARG_DEC64 }); +SYSCALL_DEF_FULL(pwrite64, .impl =3D impl_pwrite64, + .args =3D args_pread64_pwrite64, + .arg_type =3D { ARG_DEC, ARG_PTR, ARG_DEC, ARG_DEC64 }); SYSCALL_DEF(read, ARG_DEC, ARG_PTR, ARG_DEC); #ifdef TARGET_NR_readlink SYSCALL_DEF(readlink, ARG_STR, ARG_PTR, ARG_DEC); diff --git a/linux-user/syscall-file.inc.c b/linux-user/syscall-file.inc.c index 2297ca1760..43aa6eeeb8 100644 --- a/linux-user/syscall-file.inc.c +++ b/linux-user/syscall-file.inc.c @@ -323,6 +323,68 @@ SYSCALL_IMPL(openat) return do_openat(cpu_env, arg1, arg2, arg3, arg4); } =20 +/* + * Both pread64 and pwrite64 merge args into a 64-bit offset, + * but the input registers and ordering are target specific. + */ +#if TARGET_ABI_BITS =3D=3D 32 +SYSCALL_ARGS(pread64_pwrite64) +{ + /* We have already assigned out[0-2]. */ + int off =3D regpairs_aligned(cpu_env, TARGET_NR_pread64); + out[3] =3D target_offset64(in[3 + off], in[4 + off]); + return def; +} +#else +#define args_pread64_pwrite64 NULL +#endif + +SYSCALL_IMPL(pread64) +{ + int fd =3D arg1; + abi_ulong target_buf =3D arg2; + abi_ulong len =3D arg3; + uint64_t off =3D arg4; + void *p; + abi_long ret; + + if (target_buf =3D=3D 0 && len =3D=3D 0) { + /* Special-case NULL buffer and zero length, which should succeed = */ + p =3D NULL; + } else { + p =3D lock_user(VERIFY_WRITE, target_buf, len, 0); + if (!p) { + return -TARGET_EFAULT; + } + } + ret =3D get_errno(pread64(fd, p, len, off)); + unlock_user(p, target_buf, ret); + return ret; +} + +SYSCALL_IMPL(pwrite64) +{ + int fd =3D arg1; + abi_ulong target_buf =3D arg2; + abi_ulong len =3D arg3; + uint64_t off =3D arg4; + void *p; + abi_long ret; + + if (target_buf =3D=3D 0 && len =3D=3D 0) { + /* Special-case NULL buffer and zero length, which should succeed = */ + p =3D 0; + } else { + p =3D lock_user(VERIFY_READ, target_buf, len, 1); + if (!p) { + return -TARGET_EFAULT; + } + } + ret =3D get_errno(pwrite64(fd, p, len, off)); + unlock_user(p, target_buf, 0); + return ret; +} + SYSCALL_IMPL(read) { int fd =3D arg1; diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 8086626707..f636fb8bb3 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -9404,42 +9404,6 @@ static abi_long do_syscall1(void *cpu_env, int num, = abi_long arg1, #else #error unreachable #endif -#endif -#ifdef TARGET_NR_pread64 - case TARGET_NR_pread64: - if (regpairs_aligned(cpu_env, num)) { - arg4 =3D arg5; - arg5 =3D arg6; - } - if (arg2 =3D=3D 0 && arg3 =3D=3D 0) { - /* Special-case NULL buffer and zero length, which should succ= eed */ - p =3D 0; - } else { - p =3D lock_user(VERIFY_WRITE, arg2, arg3, 0); - if (!p) { - return -TARGET_EFAULT; - } - } - ret =3D get_errno(pread64(arg1, p, arg3, target_offset64(arg4, arg= 5))); - unlock_user(p, arg2, ret); - return ret; - case TARGET_NR_pwrite64: - if (regpairs_aligned(cpu_env, num)) { - arg4 =3D arg5; - arg5 =3D arg6; - } - if (arg2 =3D=3D 0 && arg3 =3D=3D 0) { - /* Special-case NULL buffer and zero length, which should succ= eed */ - p =3D 0; - } else { - p =3D lock_user(VERIFY_READ, arg2, arg3, 1); - if (!p) { - return -TARGET_EFAULT; - } - } - ret =3D get_errno(pwrite64(arg1, p, arg3, target_offset64(arg4, ar= g5))); - unlock_user(p, arg2, 0); - return ret; #endif case TARGET_NR_getcwd: if (!(p =3D lock_user(VERIFY_WRITE, arg1, arg2, 0))) diff --git a/linux-user/strace.list b/linux-user/strace.list index c4ae70b485..a11ad3c3c7 100644 --- a/linux-user/strace.list +++ b/linux-user/strace.list @@ -1025,9 +1025,6 @@ #ifdef TARGET_NR_prctl { TARGET_NR_prctl, "prctl" , NULL, NULL, NULL }, #endif -#ifdef TARGET_NR_pread64 -{ TARGET_NR_pread64, "pread64" , NULL, NULL, NULL }, -#endif #ifdef TARGET_NR_preadv { TARGET_NR_preadv, "preadv" , NULL, NULL, NULL }, #endif @@ -1055,9 +1052,6 @@ #ifdef TARGET_NR_putpmsg { TARGET_NR_putpmsg, "putpmsg" , NULL, NULL, NULL }, #endif -#ifdef TARGET_NR_pwrite64 -{ TARGET_NR_pwrite64, "pwrite64" , NULL, NULL, NULL }, -#endif #ifdef TARGET_NR_pwritev { TARGET_NR_pwritev, "pwritev" , NULL, NULL, NULL }, #endif --=20 2.17.1 From nobody Thu May 9 22:44:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1558299009; cv=none; d=zoho.com; s=zohoarc; b=liPyPB59lu6PyUWcZQ3Eixg+2Nrkaw5TvL7cUbCA+ZPq1m+1Em+igkR7y7NPSXbkcnuM65lJpnLND3Ji2YKj7VqDw+b8ZcMN15yG3LovZDfbuudW+kDV1MSx0Fqb9BCpscsH0IuDJuMiwafiqd81WLcp5GN2F/F4BLfgvYhJEOE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1558299009; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=7G+hJOBDRTLscZajbGHATg460taQH3Fs6lhNe9/8aV8=; b=gq9gNPDUJ9tXxRtNoqGHBqNcw+N5yQGeb0blda6+W5/pwMpEI0SKOlygANQso+pRo2Kr4Z4HGC2NukmruMCPaHCXWNL/i9mNxY8yDg29d1xiGQShd28Q052lbWfoiplV+1c+NH1YxduAOcoqC791um7j8nRX7lrzHR5z27sd3Xs= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1558299009352298.3710065732987; Sun, 19 May 2019 13:50:09 -0700 (PDT) Received: from localhost ([127.0.0.1]:53264 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSkt-0004Ux-7t for importer@patchew.org; Sun, 19 May 2019 16:50:03 -0400 Received: from eggs.gnu.org ([209.51.188.92]:50236) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSZ2-0002w0-H5 for qemu-devel@nongnu.org; Sun, 19 May 2019 16:37:50 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hSSZ1-0003eK-0b for qemu-devel@nongnu.org; Sun, 19 May 2019 16:37:48 -0400 Received: from mail-pf1-x444.google.com ([2607:f8b0:4864:20::444]:34961) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hSSZ0-0003d3-PM for qemu-devel@nongnu.org; Sun, 19 May 2019 16:37:46 -0400 Received: by mail-pf1-x444.google.com with SMTP id t87so6174984pfa.2 for ; Sun, 19 May 2019 13:37:46 -0700 (PDT) Received: from localhost.localdomain (97-113-13-231.tukw.qwest.net. [97.113.13.231]) by smtp.gmail.com with ESMTPSA id i7sm11397448pfo.19.2019.05.19.13.37.43 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 19 May 2019 13:37:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=7G+hJOBDRTLscZajbGHATg460taQH3Fs6lhNe9/8aV8=; b=ZLv0hkHvVmH6uPLmeGbxpepwZtnAVJ+3cY9c+igY4+aqt97tKh2qUSiPiknzzu8V2T WWJNvbAzkGexTwZpF50G7d8qX97ibfQOkH5wBXWhWfVCr1gApdDEFiWE01ey4NR3qXuD Pfn0ta+knoaKPoEtRuTZMj7gWekCrwGVFXQlKzjErCMEep67iNDve+1PYlzbXi9KIDrd cgnVxvmPKJRu/UOMAKEqaNeiNnpMQIceJrccdddKdcrqpjlfa9bGhs4XUgkzaVRMBgbj d8tMg1FgaeU1PoRXkokoL11EZjXZVEV90pE800FTCCWnqFejL7hWHrowNXI9QbYt9aK2 +gpg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=7G+hJOBDRTLscZajbGHATg460taQH3Fs6lhNe9/8aV8=; b=KilZTMJjPCjO+anpKgmeqAD4QOKaV8KCD7gmJ/PHxJubP4wynR8O1sZfTbuMWc09uF AF9c6b3xXzbYcUIYcx9aJkfhVFRp8HM1LCLdWNS6RXy3qh4II+STpGs4rUE89UsXIRu6 L2Pe1Ae/ly2MnVogVqU69Ipi53U89PYBOqt7nu4X+VjQLvVxxmXwt/YJMVk+dqxQTiGn EGhn9wVtAuonrLF9Q2bNMRG56XX+cZGqo0uwPUDSZNJfWAalGu+O+IiENYMFjKsppCdc n8w+1MnpyAS09pgnIECI4EtHhsUDlugoBTJR20krMJjD1iU52P3Id9wfiZvaiN/kXkeG DXMw== X-Gm-Message-State: APjAAAU02Jgo/xMvVr+E39rBaCDj6o6Ielb+3+FybT1r5dKMu7omS9B7 DvWfcNczXeox0iCPxjBkJk/MCJHpEQE= X-Google-Smtp-Source: APXvYqzgWGtl/7+ieQdpxG0oNJdCUxcKF+ljLNxJBfvFF5pPa5a0bFu42wn1Xc7rd/V6vedX3+hKig== X-Received: by 2002:aa7:99dd:: with SMTP id v29mr77603622pfi.252.1558298264606; Sun, 19 May 2019 13:37:44 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sun, 19 May 2019 13:36:23 -0700 Message-Id: <20190519203726.20729-12-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190519203726.20729-1-richard.henderson@linaro.org> References: <20190519203726.20729-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::444 Subject: [Qemu-devel] [PATCH v7 11/74] linux-user: Split out preadv, pwritev X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: laurent@vivier.eu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Richard Henderson --- linux-user/syscall-defs.h | 6 ++++ linux-user/syscall-file.inc.c | 64 +++++++++++++++++++++++++++++++++++ linux-user/syscall.c | 49 --------------------------- linux-user/strace.list | 6 ---- 4 files changed, 70 insertions(+), 55 deletions(-) diff --git a/linux-user/syscall-defs.h b/linux-user/syscall-defs.h index 027793d5d0..ae89be0e87 100644 --- a/linux-user/syscall-defs.h +++ b/linux-user/syscall-defs.h @@ -27,6 +27,12 @@ SYSCALL_DEF_FULL(pread64, .impl =3D impl_pread64, SYSCALL_DEF_FULL(pwrite64, .impl =3D impl_pwrite64, .args =3D args_pread64_pwrite64, .arg_type =3D { ARG_DEC, ARG_PTR, ARG_DEC, ARG_DEC64 }); +SYSCALL_DEF_FULL(preadv, .impl =3D impl_preadv, + .args =3D args_preadv_pwritev, + .arg_type =3D { ARG_DEC, ARG_PTR, ARG_DEC, ARG_DEC64 }); +SYSCALL_DEF_FULL(pwritev, .impl =3D impl_pwritev, + .args =3D args_preadv_pwritev, + .arg_type =3D { ARG_DEC, ARG_PTR, ARG_DEC, ARG_DEC64 }); SYSCALL_DEF(read, ARG_DEC, ARG_PTR, ARG_DEC); #ifdef TARGET_NR_readlink SYSCALL_DEF(readlink, ARG_STR, ARG_PTR, ARG_DEC); diff --git a/linux-user/syscall-file.inc.c b/linux-user/syscall-file.inc.c index 43aa6eeeb8..61cfe2acb7 100644 --- a/linux-user/syscall-file.inc.c +++ b/linux-user/syscall-file.inc.c @@ -385,6 +385,70 @@ SYSCALL_IMPL(pwrite64) return ret; } =20 +/* + * Both preadv and pwritev merge args 4/5 into a 64-bit offset. + * Moreover, the parts are *always* in little-endian order. + */ +#if TARGET_ABI_BITS =3D=3D 32 +SYSCALL_ARGS(preadv_pwritev) +{ + /* We have already assigned out[0-2]. */ + abi_ulong lo =3D in[3], hi =3D in[4]; + out[3] =3D (((uint64_t)hi << (TARGET_ABI_BITS - 1)) << 1) | lo; + return def; +} +#else +#define args_preadv_pwritev NULL +#endif + +/* Perform the inverse operation for the host. */ +static inline void host_offset64_low_high(unsigned long *l, unsigned long = *h, + uint64_t off) +{ + *l =3D off; + *h =3D (off >> (HOST_LONG_BITS - 1)) >> 1; +} + +SYSCALL_IMPL(preadv) +{ + int fd =3D arg1; + abi_ulong target_vec =3D arg2; + int count =3D arg3; + uint64_t off =3D arg4; + struct iovec *vec =3D lock_iovec(VERIFY_WRITE, target_vec, count, 0); + unsigned long lo, hi; + abi_long ret; + + if (vec =3D=3D NULL) { + return -TARGET_EFAULT; + } + + host_offset64_low_high(&lo, &hi, off); + ret =3D get_errno(safe_preadv(fd, vec, count, lo, hi)); + unlock_iovec(vec, target_vec, count, 1); + return ret; +} + +SYSCALL_IMPL(pwritev) +{ + int fd =3D arg1; + abi_ulong target_vec =3D arg2; + int count =3D arg3; + uint64_t off =3D arg4; + struct iovec *vec =3D lock_iovec(VERIFY_READ, target_vec, count, 1); + unsigned long lo, hi; + abi_long ret; + + if (vec =3D=3D NULL) { + return -TARGET_EFAULT; + } + + host_offset64_low_high(&lo, &hi, off); + ret =3D get_errno(safe_pwritev(fd, vec, count, lo, hi)); + unlock_iovec(vec, target_vec, count, 0); + return ret; +} + SYSCALL_IMPL(read) { int fd =3D arg1; diff --git a/linux-user/syscall.c b/linux-user/syscall.c index f636fb8bb3..817c4a7296 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -2437,23 +2437,6 @@ static abi_long do_getsockopt(int sockfd, int level,= int optname, return ret; } =20 -/* Convert target low/high pair representing file offset into the host - * low/high pair. This function doesn't handle offsets bigger than 64 bits - * as the kernel doesn't handle them either. - */ -static void target_to_host_low_high(abi_ulong tlow, - abi_ulong thigh, - unsigned long *hlow, - unsigned long *hhigh) -{ - uint64_t off =3D tlow | - ((unsigned long long)thigh << TARGET_LONG_BITS / 2) << - TARGET_LONG_BITS / 2; - - *hlow =3D off; - *hhigh =3D (off >> HOST_LONG_BITS / 2) >> HOST_LONG_BITS / 2; -} - static struct iovec *lock_iovec(int type, abi_ulong target_addr, abi_ulong count, int copy) { @@ -9005,38 +8988,6 @@ static abi_long do_syscall1(void *cpu_env, int num, = abi_long arg1, /* NOTE: the flock constant seems to be the same for every Linux platform */ return get_errno(safe_flock(arg1, arg2)); -#if defined(TARGET_NR_preadv) - case TARGET_NR_preadv: - { - struct iovec *vec =3D lock_iovec(VERIFY_WRITE, arg2, arg3, 0); - if (vec !=3D NULL) { - unsigned long low, high; - - target_to_host_low_high(arg4, arg5, &low, &high); - ret =3D get_errno(safe_preadv(arg1, vec, arg3, low, high)); - unlock_iovec(vec, arg2, arg3, 1); - } else { - ret =3D -host_to_target_errno(errno); - } - } - return ret; -#endif -#if defined(TARGET_NR_pwritev) - case TARGET_NR_pwritev: - { - struct iovec *vec =3D lock_iovec(VERIFY_READ, arg2, arg3, 1); - if (vec !=3D NULL) { - unsigned long low, high; - - target_to_host_low_high(arg4, arg5, &low, &high); - ret =3D get_errno(safe_pwritev(arg1, vec, arg3, low, high)= ); - unlock_iovec(vec, arg2, arg3, 0); - } else { - ret =3D -host_to_target_errno(errno); - } - } - return ret; -#endif case TARGET_NR_getsid: return get_errno(getsid(arg1)); #if defined(TARGET_NR_fdatasync) /* Not on alpha (osf_datasync ?) */ diff --git a/linux-user/strace.list b/linux-user/strace.list index a11ad3c3c7..f326613934 100644 --- a/linux-user/strace.list +++ b/linux-user/strace.list @@ -1025,9 +1025,6 @@ #ifdef TARGET_NR_prctl { TARGET_NR_prctl, "prctl" , NULL, NULL, NULL }, #endif -#ifdef TARGET_NR_preadv -{ TARGET_NR_preadv, "preadv" , NULL, NULL, NULL }, -#endif #ifdef TARGET_NR_prlimit64 { TARGET_NR_prlimit64, "prlimit64" , NULL, NULL, NULL }, #endif @@ -1052,9 +1049,6 @@ #ifdef TARGET_NR_putpmsg { TARGET_NR_putpmsg, "putpmsg" , NULL, NULL, NULL }, #endif -#ifdef TARGET_NR_pwritev -{ TARGET_NR_pwritev, "pwritev" , NULL, NULL, NULL }, -#endif #ifdef TARGET_NR_query_module { TARGET_NR_query_module, "query_module" , NULL, NULL, NULL }, #endif --=20 2.17.1 From nobody Thu May 9 22:44:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1558299203; cv=none; d=zoho.com; s=zohoarc; b=hrGCsl37qHHmik2jHIj+PwuRT7ttN4hwIjaPs1UKPEzdWQ5DZHwUpS9mf8ANyAO4QaxRZuIqD8l81Q7kqKQkhmJHI0aJa/ylGRTvI7WBHaZc5IKCI8xKyl34MDTChvsNlSIj5SZblYn/nyYh7TniH4VxRYOoqvRXG2jHweewkag= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1558299203; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=oMFlfEqih7Sfj/vQATNw8M06mkjRkntlWcN2dDQKmHc=; b=HQl6BT27qUme8bwvzT0eTsJRE6flfuIq6yVIFbE302OqZD9Ewvc/yJoer3JOKfUyEaXlWZLYVfTmKoiHfMqiNX73UYkbyTcceWkY2jdk5DPden3tqpGqTIRZUKhyYCecD2f58yP0jenIUV5yTLT/UJMs0QNhH3uvYuhVRn8M0jk= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (209.51.188.17 [209.51.188.17]) by mx.zohomail.com with SMTPS id 1558299203829265.1636902933127; Sun, 19 May 2019 13:53:23 -0700 (PDT) Received: from localhost ([127.0.0.1]:53318 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSo1-0007EH-FX for importer@patchew.org; Sun, 19 May 2019 16:53:17 -0400 Received: from eggs.gnu.org ([209.51.188.92]:50253) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSZ4-00032X-Ca for qemu-devel@nongnu.org; Sun, 19 May 2019 16:37:52 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hSSZ2-0003gB-JR for qemu-devel@nongnu.org; Sun, 19 May 2019 16:37:50 -0400 Received: from mail-pg1-x543.google.com ([2607:f8b0:4864:20::543]:36050) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hSSZ2-0003fG-4u for qemu-devel@nongnu.org; Sun, 19 May 2019 16:37:48 -0400 Received: by mail-pg1-x543.google.com with SMTP id a3so5747808pgb.3 for ; Sun, 19 May 2019 13:37:48 -0700 (PDT) Received: from localhost.localdomain (97-113-13-231.tukw.qwest.net. [97.113.13.231]) by smtp.gmail.com with ESMTPSA id i7sm11397448pfo.19.2019.05.19.13.37.44 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 19 May 2019 13:37:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=oMFlfEqih7Sfj/vQATNw8M06mkjRkntlWcN2dDQKmHc=; b=E0uU6tyHCgCKWSZLU5LvFSsaJUIx03ALgXp7QiGMVHAj1BpnCQzXTldbc4Yiwpni0z q/C3bhJCcxjojQMNzUitgZP04GZ40WsMTQk0h34YvWmnhxdMUUtEroZK/SwP5yBFjGy4 jUxItShfEtRrfI85qS7ZW4Ngqn76o+kfCXZh9ovsbaJqrPTskUUZS90j1nyRDMXIpI4L /MfWXEQoYguf160JYIqfRFQt3KGKHuBKtBlM+RAPnFaEsmBBmz6LMM5zb1nQf4Y59iqV FPOSDJvla8r3dtWjftZcDxKneQx0fjgI+vBQd1shL8+R7sr4T9tv3OYG2VdTvmh6Ou4d Txmg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=oMFlfEqih7Sfj/vQATNw8M06mkjRkntlWcN2dDQKmHc=; b=aMlO17uN7P0W9RtgCEVff1pD6umIYbjOAcJ91TSGSVkUBQvR1lgkHHYzt725QDcVdY qJHSNvmMpLiiftrM6tYIpDxUEyLIvp+B4Nr6V+BRJVrOYkETSHJQv6avJFtwCrdB2Akk hh3G1Scoqr+CV2O5z6ShAv4XoMn/DayusRYoMzwl6rGSAYlXwtnndx1nIOVWGx/VBz1x VI4TGFUjsuR+DBn/WB/DadDM1OSAnaUHpwnLS/KOsFu0/3FcRMfpmUgUJUFT2Ww3z5Br XTKvKqu0ARKePwEDPzVT84JhTrET/wP2ObCPWeCwL3oD18FfqyDWFvT4aO80RR9PT0Zy mJ8A== X-Gm-Message-State: APjAAAXwXfLb8ef7s+FEzGMH0WiV6FAKw/ujgzIGO8Tcrhu6GEhYQGOM RoA8fmboFPdV5jNfa1MSQEmojIUJoIM= X-Google-Smtp-Source: APXvYqyr+e02ira13sLoyJh80aPmo6OJu1Vv+77fb8YISG2tQ4zcWnMMz0g4QUg5k2FrewCVOaI15Q== X-Received: by 2002:a62:1b85:: with SMTP id b127mr47952138pfb.165.1558298265797; Sun, 19 May 2019 13:37:45 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sun, 19 May 2019 13:36:24 -0700 Message-Id: <20190519203726.20729-13-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190519203726.20729-1-richard.henderson@linaro.org> References: <20190519203726.20729-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::543 Subject: [Qemu-devel] [PATCH v7 12/74] linux-user: Split out name_to_handle_at, open_by_handle_at X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: laurent@vivier.eu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" All targets have these syscalls, so they need not be ifdefed. If we provide safe syscalls for the host, we can remove the configure test for this too. Signed-off-by: Richard Henderson --- linux-user/syscall-defs.h | 3 + linux-user/syscall.h | 1 + linux-user/strace.c | 5 +- linux-user/syscall-file.inc.c | 81 +++++++++++++++++++++++++++ linux-user/syscall.c | 102 ++-------------------------------- configure | 20 ------- linux-user/strace.list | 3 - 7 files changed, 93 insertions(+), 122 deletions(-) diff --git a/linux-user/syscall-defs.h b/linux-user/syscall-defs.h index ae89be0e87..1fc89c1b08 100644 --- a/linux-user/syscall-defs.h +++ b/linux-user/syscall-defs.h @@ -17,10 +17,13 @@ */ =20 SYSCALL_DEF(close, ARG_DEC); +SYSCALL_DEF(name_to_handle_at, + ARG_ATDIRFD, ARG_STR, ARG_PTR, ARG_PTR, ARG_ATFLAG); #ifdef TARGET_NR_open SYSCALL_DEF(open, ARG_STR, ARG_OPENFLAG, ARG_MODEFLAG); #endif SYSCALL_DEF(openat, ARG_ATDIRFD, ARG_STR, ARG_OPENFLAG, ARG_MODEFLAG); +SYSCALL_DEF(open_by_handle_at, ARG_DEC, ARG_PTR, ARG_OPENFLAG); SYSCALL_DEF_FULL(pread64, .impl =3D impl_pread64, .args =3D args_pread64_pwrite64, .arg_type =3D { ARG_DEC, ARG_PTR, ARG_DEC, ARG_DEC64 }); diff --git a/linux-user/syscall.h b/linux-user/syscall.h index 43b5dc0684..83f602f8e7 100644 --- a/linux-user/syscall.h +++ b/linux-user/syscall.h @@ -57,6 +57,7 @@ typedef enum { =20 /* These print as sets of flags. */ ARG_ATDIRFD, + ARG_ATFLAG, ARG_MODEFLAG, ARG_OPENFLAG, =20 diff --git a/linux-user/strace.c b/linux-user/strace.c index 2f1c7e537f..e92b2c298e 100644 --- a/linux-user/strace.c +++ b/linux-user/strace.c @@ -780,7 +780,7 @@ UNUSED static struct flags access_flags[] =3D { FLAG_END, }; =20 -UNUSED static struct flags at_file_flags[] =3D { +static struct flags const at_file_flags[] =3D { #ifdef AT_EACCESS FLAG_GENERIC(AT_EACCESS), #endif @@ -2693,6 +2693,9 @@ static void print_syscall_def1(const SyscallDef *def,= int64_t args[6]) case ARG_ATDIRFD: len =3D add_atdirfd(b, rest, arg); break; + case ARG_ATFLAG: + len =3D add_flags(b, rest, at_file_flags, arg, false); + break; case ARG_MODEFLAG: len =3D add_flags(b, rest, mode_flags, arg, true); break; diff --git a/linux-user/syscall-file.inc.c b/linux-user/syscall-file.inc.c index 61cfe2acb7..dd44d5b804 100644 --- a/linux-user/syscall-file.inc.c +++ b/linux-user/syscall-file.inc.c @@ -323,6 +323,87 @@ SYSCALL_IMPL(openat) return do_openat(cpu_env, arg1, arg2, arg3, arg4); } =20 +SYSCALL_IMPL(name_to_handle_at) +{ + struct file_handle *target_fh; + struct file_handle *fh; + int mid =3D 0; + abi_long ret; + char *name; + uint32_t size, total_size; + + if (get_user_s32(size, arg3)) { + return -TARGET_EFAULT; + } + total_size =3D sizeof(struct file_handle) + size; + target_fh =3D lock_user(VERIFY_WRITE, arg3, total_size, 0); + if (!target_fh) { + return -TARGET_EFAULT; + } + + name =3D lock_user_string(arg2); + if (!name) { + unlock_user(target_fh, arg3, 0); + return -TARGET_EFAULT; + } + + fh =3D g_malloc0(total_size); + fh->handle_bytes =3D size; + + ret =3D get_errno(safe_name_to_handle_at(arg1, path(name), fh, &mid, a= rg5)); + unlock_user(name, arg2, 0); + + /* + * man name_to_handle_at(2): + * Other than the use of the handle_bytes field, the caller should tre= at + * the file_handle structure as an opaque data type + */ + if (!is_error(ret)) { + memcpy(target_fh, fh, total_size); + target_fh->handle_bytes =3D tswap32(fh->handle_bytes); + target_fh->handle_type =3D tswap32(fh->handle_type); + g_free(fh); + unlock_user(target_fh, arg3, total_size); + + if (put_user_s32(mid, arg4)) { + return -TARGET_EFAULT; + } + } + return ret; +} + +SYSCALL_IMPL(open_by_handle_at) +{ + abi_long mount_fd =3D arg1; + abi_long handle =3D arg2; + int host_flags =3D target_to_host_bitmask(arg3, fcntl_flags_tbl); + struct file_handle *target_fh; + struct file_handle *fh; + unsigned int size, total_size; + abi_long ret; + + if (get_user_s32(size, handle)) { + return -TARGET_EFAULT; + } + total_size =3D sizeof(struct file_handle) + size; + target_fh =3D lock_user(VERIFY_READ, handle, total_size, 1); + if (!target_fh) { + return -TARGET_EFAULT; + } + + fh =3D g_memdup(target_fh, total_size); + fh->handle_bytes =3D size; + fh->handle_type =3D tswap32(target_fh->handle_type); + + ret =3D get_errno(safe_open_by_handle_at(mount_fd, fh, host_flags)); + + g_free(fh); + unlock_user(target_fh, handle, total_size); + + fd_trans_unregister(ret); + return ret; +} + /* * Both pread64 and pwrite64 merge args into a 64-bit offset, * but the input registers and ordering are target specific. diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 817c4a7296..c49f8aebd2 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -806,6 +806,10 @@ safe_syscall5(int, mq_timedsend, int, mqdes, const cha= r *, msg_ptr, safe_syscall5(int, mq_timedreceive, int, mqdes, char *, msg_ptr, size_t, len, unsigned *, prio, const struct timespec *, time= out) #endif +safe_syscall5(int, name_to_handle_at, int, dirfd, const char *, pathname, + struct file_handle *, handle, int *, mount_id, int, flags) +safe_syscall3(int, open_by_handle_at, int, mount_fd, + struct file_handle *, handle, int, flags) /* We do ioctl like this rather than via safe_syscall3 to preserve the * "third argument might be integer or pointer or not present" behaviour of * the libc function. @@ -6479,93 +6483,6 @@ static int do_futex(target_ulong uaddr, int op, int = val, target_ulong timeout, return -TARGET_ENOSYS; } } -#if defined(TARGET_NR_name_to_handle_at) && defined(CONFIG_OPEN_BY_HANDLE) -static abi_long do_name_to_handle_at(abi_long dirfd, abi_long pathname, - abi_long handle, abi_long mount_id, - abi_long flags) -{ - struct file_handle *target_fh; - struct file_handle *fh; - int mid =3D 0; - abi_long ret; - char *name; - unsigned int size, total_size; - - if (get_user_s32(size, handle)) { - return -TARGET_EFAULT; - } - - name =3D lock_user_string(pathname); - if (!name) { - return -TARGET_EFAULT; - } - - total_size =3D sizeof(struct file_handle) + size; - target_fh =3D lock_user(VERIFY_WRITE, handle, total_size, 0); - if (!target_fh) { - unlock_user(name, pathname, 0); - return -TARGET_EFAULT; - } - - fh =3D g_malloc0(total_size); - fh->handle_bytes =3D size; - - ret =3D get_errno(name_to_handle_at(dirfd, path(name), fh, &mid, flags= )); - unlock_user(name, pathname, 0); - - /* man name_to_handle_at(2): - * Other than the use of the handle_bytes field, the caller should tre= at - * the file_handle structure as an opaque data type - */ - - memcpy(target_fh, fh, total_size); - target_fh->handle_bytes =3D tswap32(fh->handle_bytes); - target_fh->handle_type =3D tswap32(fh->handle_type); - g_free(fh); - unlock_user(target_fh, handle, total_size); - - if (put_user_s32(mid, mount_id)) { - return -TARGET_EFAULT; - } - - return ret; - -} -#endif - -#if defined(TARGET_NR_open_by_handle_at) && defined(CONFIG_OPEN_BY_HANDLE) -static abi_long do_open_by_handle_at(abi_long mount_fd, abi_long handle, - abi_long flags) -{ - struct file_handle *target_fh; - struct file_handle *fh; - unsigned int size, total_size; - abi_long ret; - - if (get_user_s32(size, handle)) { - return -TARGET_EFAULT; - } - - total_size =3D sizeof(struct file_handle) + size; - target_fh =3D lock_user(VERIFY_READ, handle, total_size, 1); - if (!target_fh) { - return -TARGET_EFAULT; - } - - fh =3D g_memdup(target_fh, total_size); - fh->handle_bytes =3D size; - fh->handle_type =3D tswap32(target_fh->handle_type); - - ret =3D get_errno(open_by_handle_at(mount_fd, fh, - target_to_host_bitmask(flags, fcntl_flags_tbl))); - - g_free(fh); - - unlock_user(target_fh, handle, total_size); - - return ret; -} -#endif =20 #if defined(TARGET_NR_signalfd) || defined(TARGET_NR_signalfd4) =20 @@ -6761,17 +6678,6 @@ static abi_long do_syscall1(void *cpu_env, int num, = abi_long arg1, preexit_cleanup(cpu_env, arg1); _exit(arg1); return 0; /* avoid warning */ -#if defined(TARGET_NR_name_to_handle_at) && defined(CONFIG_OPEN_BY_HANDLE) - case TARGET_NR_name_to_handle_at: - ret =3D do_name_to_handle_at(arg1, arg2, arg3, arg4, arg5); - return ret; -#endif -#if defined(TARGET_NR_open_by_handle_at) && defined(CONFIG_OPEN_BY_HANDLE) - case TARGET_NR_open_by_handle_at: - ret =3D do_open_by_handle_at(arg1, arg2, arg3); - fd_trans_unregister(ret); - return ret; -#endif case TARGET_NR_brk: return do_brk(arg1); #ifdef TARGET_NR_fork diff --git a/configure b/configure index d2fc346302..6573fcefcb 100755 --- a/configure +++ b/configure @@ -5243,22 +5243,6 @@ if test "$debug_stack_usage" =3D "yes"; then fi =20 =20 -########################################## -# check if we have open_by_handle_at - -open_by_handle_at=3Dno -cat > $TMPC << EOF -#include -#if !defined(AT_EMPTY_PATH) -# error missing definition -#else -int main(void) { struct file_handle fh; return open_by_handle_at(0, &fh, 0= ); } -#endif -EOF -if compile_prog "" "" ; then - open_by_handle_at=3Dyes -fi - ######################################## # check if we have linux/magic.h =20 @@ -7012,10 +6996,6 @@ if test "$crypto_afalg" =3D "yes" ; then echo "CONFIG_AF_ALG=3Dy" >> $config_host_mak fi =20 -if test "$open_by_handle_at" =3D "yes" ; then - echo "CONFIG_OPEN_BY_HANDLE=3Dy" >> $config_host_mak -fi - if test "$linux_magic_h" =3D "yes" ; then echo "CONFIG_LINUX_MAGIC_H=3Dy" >> $config_host_mak fi diff --git a/linux-user/strace.list b/linux-user/strace.list index f326613934..bf239cb9a3 100644 --- a/linux-user/strace.list +++ b/linux-user/strace.list @@ -635,9 +635,6 @@ #ifdef TARGET_NR_munmap { TARGET_NR_munmap, "munmap" , NULL, print_munmap, NULL }, #endif -#ifdef TARGET_NR_name_to_handle_at -{ TARGET_NR_name_to_handle_at, "name_to_handle_at" , NULL, NULL, NULL }, -#endif #ifdef TARGET_NR_nanosleep { TARGET_NR_nanosleep, "nanosleep" , NULL, NULL, NULL }, #endif --=20 2.17.1 From nobody Thu May 9 22:44:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1558299809; cv=none; d=zoho.com; s=zohoarc; b=d0UhAXedjCTA/cCZ48+nep6dTaDBw6/xAMIp0BLlFeh+lZcZcgDR9R3FZWf7KBkCRabnSzO8lk5pl5WJ+QMt5yLfdQpCczCqTPfGNDO010Zf8PMdLcP+FeY/DKGCO0b8N1uvdPVorrNDtgIV46HQPW/fCoGgl/UzQGVkAdj7/HI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1558299809; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=auz6sklL4M5LXs+Q33JnnlVdFEtL/kK5mScgKa9VDE4=; b=OPRCEodWg15OBqg+7iU5+mfkGcuwWpZk7NdPM7tZ4dn3dJ6cwAg9/F2UgO0xZYLMa4dfX8pE4OjRScg1M9V/a2mGM4FRM4tYeMkeP1afMBewFOaYvPSCfy0hwrQB/Ys5uDZsyj3ehChT8x3CkMRAY18QGKj7Vzbk77uWMVQ2cvg= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (209.51.188.17 [209.51.188.17]) by mx.zohomail.com with SMTPS id 1558299809716120.70645952262885; Sun, 19 May 2019 14:03:29 -0700 (PDT) Received: from localhost ([127.0.0.1]:53468 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSxn-0007Wb-EQ for importer@patchew.org; Sun, 19 May 2019 17:03:23 -0400 Received: from eggs.gnu.org ([209.51.188.92]:50321) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSZ9-0003AI-N1 for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:02 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hSSZ3-0003hJ-HQ for qemu-devel@nongnu.org; Sun, 19 May 2019 16:37:55 -0400 Received: from mail-pf1-x442.google.com ([2607:f8b0:4864:20::442]:34960) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hSSZ3-0003gI-4H for qemu-devel@nongnu.org; Sun, 19 May 2019 16:37:49 -0400 Received: by mail-pf1-x442.google.com with SMTP id t87so6175001pfa.2 for ; Sun, 19 May 2019 13:37:49 -0700 (PDT) Received: from localhost.localdomain (97-113-13-231.tukw.qwest.net. [97.113.13.231]) by smtp.gmail.com with ESMTPSA id i7sm11397448pfo.19.2019.05.19.13.37.45 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 19 May 2019 13:37:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=auz6sklL4M5LXs+Q33JnnlVdFEtL/kK5mScgKa9VDE4=; b=tg50ALsXNqQQjAS8XjYfKA2FhMZbUDDNy/YPboc6EQal1lu4LAEko9pVy6vVcUHUYW 7QAExrod/bCki+tizOuT1zeCb2u1mnxEsMTaFgztsAkqz6MD1NpxVjBcvLsLXOlVHRI8 fI8pdT3vT10I3R/xaVZgQ13/l+Q9jFBAdM5QCbdPZ8AL2Q8s2JWfrob1tqkG+7pzhZIN zQWv8M37cpk2jo0NCqnmw5IxJatuWzXFZt/y5V04TvANiAb/xKfWNPRieXqTwfGcWCBf DxJjEacJ3fdSOoUo3JnEXCEkmJzTUI48OLkNT7bfSwNP2jWTj3AguxmW13E4yRYUDcrS vGxA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=auz6sklL4M5LXs+Q33JnnlVdFEtL/kK5mScgKa9VDE4=; b=G0ygqT9uNdaLnveCZhWASVVd9jlAhQyt94PsXth9mcz6VhGsza9JeHgzNxtPBVplz9 l11MwsMB72qF4dGPGhUzG6dtWQ5zVEY3a55RhF3nvMkn9W4UqCctTpy0OgkQkSY7nyS7 rm/uvCiy2DotEvz4W6Gqa2bkYOnJ+f3ep/P5LtBUQdwwhDc9/XQj7ebEEEC9GPH/u4Lm IL9jxFb2g8N8UUvgExYLmDzlkJXgMygQf/10qmBtIYMOIscoNpDtklH7IlcKWvfNs8G/ fjJpxUQZbkX20ATXJt0ntfj6YEnBrE8Qb/PydMSEfE4OuUpStLsCvZlJo2iRPytwSb9d ouqA== X-Gm-Message-State: APjAAAVEA3fDNX8XzbXn3U/XHggpFW89AUs7t4DsNorMiVi7APxqntAs rHmOKHpT78e42I3vfK7mgjqIgyAx7Sw= X-Google-Smtp-Source: APXvYqxS4Scdxlug+vXkVnYxZ8jxvRO6YVG5nfdcqqVvBL5UjxpPXCNH5OcsIF9Ng8lZqRWsejsPWg== X-Received: by 2002:a62:6456:: with SMTP id y83mr11075131pfb.71.1558298266906; Sun, 19 May 2019 13:37:46 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sun, 19 May 2019 13:36:25 -0700 Message-Id: <20190519203726.20729-14-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190519203726.20729-1-richard.henderson@linaro.org> References: <20190519203726.20729-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::442 Subject: [Qemu-devel] [PATCH v7 13/74] linux-user: Split out ipc syscalls X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: laurent@vivier.eu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Because of the ipc multiplex syscall, these must be done all at once. Signed-off-by: Richard Henderson --- linux-user/syscall-defs.h | 38 ++ linux-user/strace.c | 83 --- linux-user/syscall-ipc.inc.c | 1088 ++++++++++++++++++++++++++++++++++ linux-user/syscall.c | 973 +----------------------------- linux-user/strace.list | 42 -- 5 files changed, 1129 insertions(+), 1095 deletions(-) create mode 100644 linux-user/syscall-ipc.inc.c diff --git a/linux-user/syscall-defs.h b/linux-user/syscall-defs.h index 1fc89c1b08..6d6349da01 100644 --- a/linux-user/syscall-defs.h +++ b/linux-user/syscall-defs.h @@ -17,6 +17,21 @@ */ =20 SYSCALL_DEF(close, ARG_DEC); +#ifdef TARGET_NR_ipc +SYSCALL_DEF_ARGS(ipc, ARG_HEX, ARG_DEC, ARG_DEC, ARG_HEX, ARG_PTR, ARG_HEX= ); +#endif +#if !defined(SYSCALL_TABLE) || defined(TARGET_NR_msgctl) +SYSCALL_DEF(msgctl, ARG_DEC, ARG_DEC, ARG_PTR); +#endif +#if !defined(SYSCALL_TABLE) || defined(TARGET_NR_msgget) +SYSCALL_DEF(msgget, ARG_DEC, ARG_DEC); +#endif +#if !defined(SYSCALL_TABLE) || defined(TARGET_NR_msgrcv) +SYSCALL_DEF(msgrcv, ARG_DEC, ARG_PTR, ARG_DEC, ARG_DEC, ARG_HEX); +#endif +#if !defined(SYSCALL_TABLE) || defined(TARGET_NR_msgsnd) +SYSCALL_DEF(msgsnd, ARG_DEC, ARG_PTR, ARG_DEC, ARG_HEX); +#endif SYSCALL_DEF(name_to_handle_at, ARG_ATDIRFD, ARG_STR, ARG_PTR, ARG_PTR, ARG_ATFLAG); #ifdef TARGET_NR_open @@ -44,5 +59,28 @@ SYSCALL_DEF(readlink, ARG_STR, ARG_PTR, ARG_DEC); SYSCALL_DEF(readlinkat, ARG_ATDIRFD, ARG_STR, ARG_PTR, ARG_DEC); #endif SYSCALL_DEF(readv, ARG_DEC, ARG_PTR, ARG_DEC); +#if !defined(SYSCALL_TABLE) || defined(TARGET_NR_semctl) +SYSCALL_DEF(semctl, ARG_DEC, ARG_DEC, ARG_DEC, ARG_HEX); +#endif +#if !defined(SYSCALL_TABLE) || defined(TARGET_NR_semget) +SYSCALL_DEF(semget, ARG_DEC, ARG_DEC, ARG_HEX); +#endif +#if !defined(SYSCALL_TABLE) || defined(TARGET_NR_semop) +SYSCALL_DEF(semop, ARG_DEC, ARG_PTR, ARG_DEC); +#endif +#if !defined(SYSCALL_TABLE) || defined(TARGET_NR_shmat) +SYSCALL_DEF_FULL(shmat, .impl =3D impl_shmat, + .print_ret =3D print_syscall_ptr_ret, + .arg_type =3D { ARG_DEC, ARG_PTR, ARG_HEX }); +#endif +#if !defined(SYSCALL_TABLE) || defined(TARGET_NR_shmctl) +SYSCALL_DEF(shmctl, ARG_DEC, ARG_DEC, ARG_PTR); +#endif +#if !defined(SYSCALL_TABLE) || defined(TARGET_NR_shmdt) +SYSCALL_DEF(shmdt, ARG_PTR); +#endif +#if !defined(SYSCALL_TABLE) || defined(TARGET_NR_shmget) +SYSCALL_DEF(shmget, ARG_DEC, ARG_DEC, ARG_HEX); +#endif SYSCALL_DEF(write, ARG_DEC, ARG_PTR, ARG_DEC); SYSCALL_DEF(writev, ARG_DEC, ARG_PTR, ARG_DEC); diff --git a/linux-user/strace.c b/linux-user/strace.c index e92b2c298e..e1c4859a95 100644 --- a/linux-user/strace.c +++ b/linux-user/strace.c @@ -1,8 +1,4 @@ #include "qemu/osdep.h" -#include -#include -#include -#include #include #include #include @@ -74,54 +70,6 @@ UNUSED static void print_socket_protocol(int domain, int= type, int protocol); /* * Utility functions */ -static void -print_ipc_cmd(int cmd) -{ -#define output_cmd(val) \ -if( cmd =3D=3D val ) { \ - gemu_log(#val); \ - return; \ -} - - cmd &=3D 0xff; - - /* General IPC commands */ - output_cmd( IPC_RMID ); - output_cmd( IPC_SET ); - output_cmd( IPC_STAT ); - output_cmd( IPC_INFO ); - /* msgctl() commands */ - output_cmd( MSG_STAT ); - output_cmd( MSG_INFO ); - /* shmctl() commands */ - output_cmd( SHM_LOCK ); - output_cmd( SHM_UNLOCK ); - output_cmd( SHM_STAT ); - output_cmd( SHM_INFO ); - /* semctl() commands */ - output_cmd( GETPID ); - output_cmd( GETVAL ); - output_cmd( GETALL ); - output_cmd( GETNCNT ); - output_cmd( GETZCNT ); - output_cmd( SETVAL ); - output_cmd( SETALL ); - output_cmd( SEM_STAT ); - output_cmd( SEM_INFO ); - output_cmd( IPC_RMID ); - output_cmd( IPC_RMID ); - output_cmd( IPC_RMID ); - output_cmd( IPC_RMID ); - output_cmd( IPC_RMID ); - output_cmd( IPC_RMID ); - output_cmd( IPC_RMID ); - output_cmd( IPC_RMID ); - output_cmd( IPC_RMID ); - - /* Some value we don't recognize */ - gemu_log("%d",cmd); -} - static void print_signal(abi_ulong arg, int last) { @@ -620,18 +568,6 @@ print_newselect(const struct syscallname *name, } #endif =20 -#ifdef TARGET_NR_semctl -static void -print_semctl(const struct syscallname *name, - abi_long arg1, abi_long arg2, abi_long arg3, - abi_long arg4, abi_long arg5, abi_long arg6) -{ - gemu_log("%s(" TARGET_ABI_FMT_ld "," TARGET_ABI_FMT_ld ",", name->name= , arg1, arg2); - print_ipc_cmd(arg3); - gemu_log(",0x" TARGET_ABI_FMT_lx ")", arg4); -} -#endif - static void print_execve(const struct syscallname *name, abi_long arg1, abi_long arg2, abi_long arg3, @@ -664,25 +600,6 @@ print_execve(const struct syscallname *name, gemu_log("NULL})"); } =20 -#ifdef TARGET_NR_ipc -static void -print_ipc(const struct syscallname *name, - abi_long arg1, abi_long arg2, abi_long arg3, - abi_long arg4, abi_long arg5, abi_long arg6) -{ - switch(arg1) { - case IPCOP_semctl: - gemu_log("semctl(" TARGET_ABI_FMT_ld "," TARGET_ABI_FMT_ld ",", ar= g1, arg2); - print_ipc_cmd(arg3); - gemu_log(",0x" TARGET_ABI_FMT_lx ")", arg4); - break; - default: - gemu_log("%s(" TARGET_ABI_FMT_ld "," TARGET_ABI_FMT_ld "," TARGET_= ABI_FMT_ld "," TARGET_ABI_FMT_ld ")", - name->name, arg1, arg2, arg3, arg4); - } -} -#endif - /* * Variants for the return value output function */ diff --git a/linux-user/syscall-ipc.inc.c b/linux-user/syscall-ipc.inc.c new file mode 100644 index 0000000000..26ee3be8bf --- /dev/null +++ b/linux-user/syscall-ipc.inc.c @@ -0,0 +1,1088 @@ +/* + * Linux ipc-related syscalls + * Copyright (c) 2003 Fabrice Bellard + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + */ + + +#ifdef __NR_msgsnd +safe_syscall4(int, msgsnd, int, msgid, const void *, msgp, size_t, sz, + int, flags) +safe_syscall5(int, msgrcv, int, msgid, void *, msgp, size_t, sz, + long, msgtype, int, flags) +safe_syscall4(int, semtimedop, int, semid, struct sembuf *, tsops, + unsigned, nsops, const struct timespec *, timeout) +#else +/* + * This host kernel architecture uses a single ipc syscall; fake up + * wrappers for the sub-operations to hide this implementation detail. + * Annoyingly we can't include linux/ipc.h to get the constant definitions + * for the call parameter because some structs in there conflict with the + * sys/ipc.h ones. So we just define them here, and rely on them being + * the same for all host architectures. + */ +#define Q_SEMTIMEDOP 4 +#define Q_MSGSND 11 +#define Q_MSGRCV 12 +#define Q_IPCCALL(VERSION, OP) ((VERSION) << 16 | (OP)) + +safe_syscall6(int, ipc, int, call, long, first, long, second, long, third, + void *, ptr, long, fifth) + +static int safe_msgsnd(int msgid, const void *msgp, size_t sz, int flags) +{ + return safe_ipc(Q_IPCCALL(0, Q_MSGSND), msgid, sz, flags, (void *)msgp= , 0); +} + +static int safe_msgrcv(int msgid, void *msgp, size_t sz, long type, int fl= ags) +{ + return safe_ipc(Q_IPCCALL(1, Q_MSGRCV), msgid, sz, flags, msgp, type); +} + +static int safe_semtimedop(int semid, struct sembuf *tsops, unsigned nsops, + const struct timespec *timeout) +{ + return safe_ipc(Q_IPCCALL(0, Q_SEMTIMEDOP), semid, nsops, 0, tsops, + (long)timeout); +} +#endif + +/* See comment above. */ +#define SEMOPM 500 + +#define N_SHM_REGIONS 32 + +static struct shm_region { + abi_ulong start; + abi_ulong size; + bool in_use; +} shm_regions[N_SHM_REGIONS]; + +#ifndef TARGET_SEMID64_DS +/* asm-generic version of this struct */ +struct target_semid64_ds { + struct target_ipc_perm sem_perm; + abi_ulong sem_otime; +#if TARGET_ABI_BITS =3D=3D 32 + abi_ulong __unused1; +#endif + abi_ulong sem_ctime; +#if TARGET_ABI_BITS =3D=3D 32 + abi_ulong __unused2; +#endif + abi_ulong sem_nsems; + abi_ulong __unused3; + abi_ulong __unused4; +}; +#endif + +static abi_long target_to_host_ipc_perm(struct ipc_perm *host_ip, + abi_ulong target_addr) +{ + struct target_ipc_perm *target_ip; + struct target_semid64_ds *target_sd; + + if (!lock_user_struct(VERIFY_READ, target_sd, target_addr, 1)) { + return -TARGET_EFAULT; + } + target_ip =3D &target_sd->sem_perm; + host_ip->__key =3D tswap32(target_ip->__key); + host_ip->uid =3D tswap32(target_ip->uid); + host_ip->gid =3D tswap32(target_ip->gid); + host_ip->cuid =3D tswap32(target_ip->cuid); + host_ip->cgid =3D tswap32(target_ip->cgid); +#if defined(TARGET_ALPHA) || defined(TARGET_MIPS) || defined(TARGET_PPC) + host_ip->mode =3D tswap32(target_ip->mode); +#else + host_ip->mode =3D tswap16(target_ip->mode); +#endif +#if defined(TARGET_PPC) + host_ip->__seq =3D tswap32(target_ip->__seq); +#else + host_ip->__seq =3D tswap16(target_ip->__seq); +#endif + unlock_user_struct(target_sd, target_addr, 0); + return 0; +} + +static abi_long host_to_target_ipc_perm(abi_ulong target_addr, + struct ipc_perm *host_ip) +{ + struct target_ipc_perm *target_ip; + struct target_semid64_ds *target_sd; + + if (!lock_user_struct(VERIFY_WRITE, target_sd, target_addr, 0)) { + return -TARGET_EFAULT; + } + target_ip =3D &target_sd->sem_perm; + target_ip->__key =3D tswap32(host_ip->__key); + target_ip->uid =3D tswap32(host_ip->uid); + target_ip->gid =3D tswap32(host_ip->gid); + target_ip->cuid =3D tswap32(host_ip->cuid); + target_ip->cgid =3D tswap32(host_ip->cgid); +#if defined(TARGET_ALPHA) || defined(TARGET_MIPS) || defined(TARGET_PPC) + target_ip->mode =3D tswap32(host_ip->mode); +#else + target_ip->mode =3D tswap16(host_ip->mode); +#endif +#if defined(TARGET_PPC) + target_ip->__seq =3D tswap32(host_ip->__seq); +#else + target_ip->__seq =3D tswap16(host_ip->__seq); +#endif + unlock_user_struct(target_sd, target_addr, 1); + return 0; +} + +static abi_long target_to_host_semid_ds(struct semid_ds *host_sd, + abi_ulong target_addr) +{ + struct target_semid64_ds *target_sd; + + if (target_to_host_ipc_perm(&host_sd->sem_perm, target_addr)) { + return -TARGET_EFAULT; + } + if (!lock_user_struct(VERIFY_READ, target_sd, target_addr, 1)) { + return -TARGET_EFAULT; + } + host_sd->sem_nsems =3D tswapal(target_sd->sem_nsems); + host_sd->sem_otime =3D tswapal(target_sd->sem_otime); + host_sd->sem_ctime =3D tswapal(target_sd->sem_ctime); + unlock_user_struct(target_sd, target_addr, 0); + return 0; +} + +static abi_long host_to_target_semid_ds(abi_ulong target_addr, + struct semid_ds *host_sd) +{ + struct target_semid64_ds *target_sd; + + if (host_to_target_ipc_perm(target_addr, &host_sd->sem_perm)) { + return -TARGET_EFAULT; + } + if (!lock_user_struct(VERIFY_WRITE, target_sd, target_addr, 0)) { + return -TARGET_EFAULT; + } + target_sd->sem_nsems =3D tswapal(host_sd->sem_nsems); + target_sd->sem_otime =3D tswapal(host_sd->sem_otime); + target_sd->sem_ctime =3D tswapal(host_sd->sem_ctime); + unlock_user_struct(target_sd, target_addr, 1); + return 0; +} + +struct target_seminfo { + int semmap; + int semmni; + int semmns; + int semmnu; + int semmsl; + int semopm; + int semume; + int semusz; + int semvmx; + int semaem; +}; + +static abi_long host_to_target_seminfo(abi_ulong target_addr, + struct seminfo *host_seminfo) +{ + struct target_seminfo *target_seminfo; + + if (!lock_user_struct(VERIFY_WRITE, target_seminfo, target_addr, 0)) { + return -TARGET_EFAULT; + } + __put_user(host_seminfo->semmap, &target_seminfo->semmap); + __put_user(host_seminfo->semmni, &target_seminfo->semmni); + __put_user(host_seminfo->semmns, &target_seminfo->semmns); + __put_user(host_seminfo->semmnu, &target_seminfo->semmnu); + __put_user(host_seminfo->semmsl, &target_seminfo->semmsl); + __put_user(host_seminfo->semopm, &target_seminfo->semopm); + __put_user(host_seminfo->semume, &target_seminfo->semume); + __put_user(host_seminfo->semusz, &target_seminfo->semusz); + __put_user(host_seminfo->semvmx, &target_seminfo->semvmx); + __put_user(host_seminfo->semaem, &target_seminfo->semaem); + unlock_user_struct(target_seminfo, target_addr, 1); + return 0; +} + +union semun { + int val; + struct semid_ds *buf; + unsigned short *array; + struct seminfo *__buf; +}; + +union target_semun { + int val; + abi_ulong buf; + abi_ulong array; + abi_ulong __buf; +}; + +static abi_long target_to_host_semarray(int semid, + unsigned short **host_array, + abi_ulong target_addr) +{ + int nsems; + unsigned short *array; + union semun semun; + struct semid_ds semid_ds; + int i, ret; + + semun.buf =3D &semid_ds; + + ret =3D semctl(semid, 0, IPC_STAT, semun); + if (ret =3D=3D -1) { + return get_errno(ret); + } + + nsems =3D semid_ds.sem_nsems; + + *host_array =3D g_try_new(unsigned short, nsems); + if (!*host_array) { + return -TARGET_ENOMEM; + } + array =3D lock_user(VERIFY_READ, target_addr, + nsems * sizeof(unsigned short), 1); + if (!array) { + g_free(*host_array); + return -TARGET_EFAULT; + } + for (i =3D 0; i < nsems; i++) { + __get_user((*host_array)[i], &array[i]); + } + unlock_user(array, target_addr, 0); + + return 0; +} + +static abi_long host_to_target_semarray(int semid, abi_ulong target_addr, + unsigned short **host_array) +{ + int nsems; + unsigned short *array; + union semun semun; + struct semid_ds semid_ds; + int i, ret; + + semun.buf =3D &semid_ds; + + ret =3D semctl(semid, 0, IPC_STAT, semun); + if (ret =3D=3D -1) { + return get_errno(ret); + } + + nsems =3D semid_ds.sem_nsems; + + array =3D lock_user(VERIFY_WRITE, target_addr, + nsems * sizeof(unsigned short), 0); + if (!array) { + return -TARGET_EFAULT; + } + for (i =3D 0; i < nsems; i++) { + __put_user((*host_array)[i], &array[i]); + } + g_free(*host_array); + unlock_user(array, target_addr, 1); + + return 0; +} + +struct target_sembuf { + unsigned short sem_num; + short sem_op; + short sem_flg; +}; + +static abi_long target_to_host_sembuf(struct sembuf *host_sembuf, + abi_ulong target_addr, + unsigned nsops) +{ + struct target_sembuf *target_sembuf; + int i; + + target_sembuf =3D lock_user(VERIFY_READ, target_addr, + nsops * sizeof(struct target_sembuf), 1); + if (!target_sembuf) { + return -TARGET_EFAULT; + } + for (i =3D 0; i < nsops; i++) { + __get_user(host_sembuf[i].sem_num, &target_sembuf[i].sem_num); + __get_user(host_sembuf[i].sem_op, &target_sembuf[i].sem_op); + __get_user(host_sembuf[i].sem_flg, &target_sembuf[i].sem_flg); + } + unlock_user(target_sembuf, target_addr, 0); + return 0; +} + +struct target_msqid_ds { + struct target_ipc_perm msg_perm; + abi_ulong msg_stime; +#if TARGET_ABI_BITS =3D=3D 32 + abi_ulong __unused1; +#endif + abi_ulong msg_rtime; +#if TARGET_ABI_BITS =3D=3D 32 + abi_ulong __unused2; +#endif + abi_ulong msg_ctime; +#if TARGET_ABI_BITS =3D=3D 32 + abi_ulong __unused3; +#endif + abi_ulong __msg_cbytes; + abi_ulong msg_qnum; + abi_ulong msg_qbytes; + abi_ulong msg_lspid; + abi_ulong msg_lrpid; + abi_ulong __unused4; + abi_ulong __unused5; +}; + +static abi_long target_to_host_msqid_ds(struct msqid_ds *host_md, + abi_ulong target_addr) +{ + struct target_msqid_ds *target_md; + + if (target_to_host_ipc_perm(&host_md->msg_perm, target_addr)) { + return -TARGET_EFAULT; + } + if (!lock_user_struct(VERIFY_READ, target_md, target_addr, 1)) { + return -TARGET_EFAULT; + } + host_md->msg_stime =3D tswapal(target_md->msg_stime); + host_md->msg_rtime =3D tswapal(target_md->msg_rtime); + host_md->msg_ctime =3D tswapal(target_md->msg_ctime); + host_md->__msg_cbytes =3D tswapal(target_md->__msg_cbytes); + host_md->msg_qnum =3D tswapal(target_md->msg_qnum); + host_md->msg_qbytes =3D tswapal(target_md->msg_qbytes); + host_md->msg_lspid =3D tswapal(target_md->msg_lspid); + host_md->msg_lrpid =3D tswapal(target_md->msg_lrpid); + unlock_user_struct(target_md, target_addr, 0); + return 0; +} + +static abi_long host_to_target_msqid_ds(abi_ulong target_addr, + struct msqid_ds *host_md) +{ + struct target_msqid_ds *target_md; + + if (host_to_target_ipc_perm(target_addr, &host_md->msg_perm)) { + return -TARGET_EFAULT; + } + if (!lock_user_struct(VERIFY_WRITE, target_md, target_addr, 0)) { + return -TARGET_EFAULT; + } + target_md->msg_stime =3D tswapal(host_md->msg_stime); + target_md->msg_rtime =3D tswapal(host_md->msg_rtime); + target_md->msg_ctime =3D tswapal(host_md->msg_ctime); + target_md->__msg_cbytes =3D tswapal(host_md->__msg_cbytes); + target_md->msg_qnum =3D tswapal(host_md->msg_qnum); + target_md->msg_qbytes =3D tswapal(host_md->msg_qbytes); + target_md->msg_lspid =3D tswapal(host_md->msg_lspid); + target_md->msg_lrpid =3D tswapal(host_md->msg_lrpid); + unlock_user_struct(target_md, target_addr, 1); + return 0; +} + +struct target_msginfo { + int msgpool; + int msgmap; + int msgmax; + int msgmnb; + int msgmni; + int msgssz; + int msgtql; + unsigned short int msgseg; +}; + +static abi_long host_to_target_msginfo(abi_ulong target_addr, + struct msginfo *host_msginfo) +{ + struct target_msginfo *target_msginfo; + + if (!lock_user_struct(VERIFY_WRITE, target_msginfo, target_addr, 0)) { + return -TARGET_EFAULT; + } + __put_user(host_msginfo->msgpool, &target_msginfo->msgpool); + __put_user(host_msginfo->msgmap, &target_msginfo->msgmap); + __put_user(host_msginfo->msgmax, &target_msginfo->msgmax); + __put_user(host_msginfo->msgmnb, &target_msginfo->msgmnb); + __put_user(host_msginfo->msgmni, &target_msginfo->msgmni); + __put_user(host_msginfo->msgssz, &target_msginfo->msgssz); + __put_user(host_msginfo->msgtql, &target_msginfo->msgtql); + __put_user(host_msginfo->msgseg, &target_msginfo->msgseg); + unlock_user_struct(target_msginfo, target_addr, 1); + return 0; +} + +struct target_msgbuf { + abi_long mtype; + char mtext[1]; +}; + +static abi_long target_to_host_shmid_ds(struct shmid_ds *host_sd, + abi_ulong target_addr) +{ + struct target_shmid_ds *target_sd; + + if (target_to_host_ipc_perm(&host_sd->shm_perm, target_addr)) { + return -TARGET_EFAULT; + } + if (!lock_user_struct(VERIFY_READ, target_sd, target_addr, 1)) { + return -TARGET_EFAULT; + } + __get_user(host_sd->shm_segsz, &target_sd->shm_segsz); + __get_user(host_sd->shm_atime, &target_sd->shm_atime); + __get_user(host_sd->shm_dtime, &target_sd->shm_dtime); + __get_user(host_sd->shm_ctime, &target_sd->shm_ctime); + __get_user(host_sd->shm_cpid, &target_sd->shm_cpid); + __get_user(host_sd->shm_lpid, &target_sd->shm_lpid); + __get_user(host_sd->shm_nattch, &target_sd->shm_nattch); + unlock_user_struct(target_sd, target_addr, 0); + return 0; +} + +static abi_long host_to_target_shmid_ds(abi_ulong target_addr, + struct shmid_ds *host_sd) +{ + struct target_shmid_ds *target_sd; + + if (host_to_target_ipc_perm(target_addr, &host_sd->shm_perm)) { + return -TARGET_EFAULT; + } + if (!lock_user_struct(VERIFY_WRITE, target_sd, target_addr, 0)) { + return -TARGET_EFAULT; + } + __put_user(host_sd->shm_segsz, &target_sd->shm_segsz); + __put_user(host_sd->shm_atime, &target_sd->shm_atime); + __put_user(host_sd->shm_dtime, &target_sd->shm_dtime); + __put_user(host_sd->shm_ctime, &target_sd->shm_ctime); + __put_user(host_sd->shm_cpid, &target_sd->shm_cpid); + __put_user(host_sd->shm_lpid, &target_sd->shm_lpid); + __put_user(host_sd->shm_nattch, &target_sd->shm_nattch); + unlock_user_struct(target_sd, target_addr, 1); + return 0; +} + +struct target_shminfo { + abi_ulong shmmax; + abi_ulong shmmin; + abi_ulong shmmni; + abi_ulong shmseg; + abi_ulong shmall; +}; + +static abi_long host_to_target_shminfo(abi_ulong target_addr, + struct shminfo *host_shminfo) +{ + struct target_shminfo *target_shminfo; + + if (!lock_user_struct(VERIFY_WRITE, target_shminfo, target_addr, 0)) { + return -TARGET_EFAULT; + } + __put_user(host_shminfo->shmmax, &target_shminfo->shmmax); + __put_user(host_shminfo->shmmin, &target_shminfo->shmmin); + __put_user(host_shminfo->shmmni, &target_shminfo->shmmni); + __put_user(host_shminfo->shmseg, &target_shminfo->shmseg); + __put_user(host_shminfo->shmall, &target_shminfo->shmall); + unlock_user_struct(target_shminfo, target_addr, 1); + return 0; +} + +struct target_shm_info { + int used_ids; + abi_ulong shm_tot; + abi_ulong shm_rss; + abi_ulong shm_swp; + abi_ulong swap_attempts; + abi_ulong swap_successes; +}; + +static abi_long host_to_target_shm_info(abi_ulong target_addr, + struct shm_info *host_shm_info) +{ + struct target_shm_info *target_shm_info; + + if (!lock_user_struct(VERIFY_WRITE, target_shm_info, target_addr, 0)) { + return -TARGET_EFAULT; + } + __put_user(host_shm_info->used_ids, &target_shm_info->used_ids); + __put_user(host_shm_info->shm_tot, &target_shm_info->shm_tot); + __put_user(host_shm_info->shm_rss, &target_shm_info->shm_rss); + __put_user(host_shm_info->shm_swp, &target_shm_info->shm_swp); + __put_user(host_shm_info->swap_attempts, + &target_shm_info->swap_attempts); + __put_user(host_shm_info->swap_successes, + &target_shm_info->swap_successes); + unlock_user_struct(target_shm_info, target_addr, 1); + return 0; +} + +#ifndef TARGET_FORCE_SHMLBA +/* + * For most architectures, SHMLBA is the same as the page size; + * some architectures have larger values, in which case they should + * define TARGET_FORCE_SHMLBA and provide a target_shmlba() function. + * This corresponds to the kernel arch code defining __ARCH_FORCE_SHMLBA + * and defining its own value for SHMLBA. + * + * The kernel also permits SHMLBA to be set by the architecture to a + * value larger than the page size without setting __ARCH_FORCE_SHMLBA; + * this means that addresses are rounded to the large size if + * SHM_RND is set but addresses not aligned to that size are not rejected + * as long as they are at least page-aligned. Since the only architecture + * which uses this is ia64 this code doesn't provide for that oddity. + */ +static abi_ulong target_shmlba(CPUArchState *cpu_env) +{ + return TARGET_PAGE_SIZE; +} +#endif + + +SYSCALL_IMPL(msgctl) +{ + abi_long msgid =3D arg1; + int cmd =3D arg2 & 0xff; + abi_ulong ptr =3D arg3; + struct msqid_ds dsarg; + struct msginfo msginfo; + abi_long ret; + + switch (cmd) { + case IPC_STAT: + case IPC_SET: + case MSG_STAT: + if (target_to_host_msqid_ds(&dsarg, ptr)) { + return -TARGET_EFAULT; + } + ret =3D get_errno(msgctl(msgid, cmd, &dsarg)); + if (!is_error(ret) && host_to_target_msqid_ds(ptr, &dsarg)) { + return -TARGET_EFAULT; + } + return ret; + + case IPC_RMID: + return get_errno(msgctl(msgid, cmd, NULL)); + + case IPC_INFO: + case MSG_INFO: + ret =3D get_errno(msgctl(msgid, cmd, (struct msqid_ds *)&msginfo)); + if (host_to_target_msginfo(ptr, &msginfo)) { + return -TARGET_EFAULT; + } + return ret; + + default: + return -TARGET_EINVAL; + } +} + +SYSCALL_IMPL(msgget) +{ + return get_errno(msgget(arg1, arg2)); +} + +SYSCALL_IMPL(msgrcv) +{ + int msqid =3D arg1; + abi_ulong msgp =3D arg2; + abi_long msgsz =3D arg3; + abi_long msgtyp =3D arg4; + int msgflg =3D arg5; + struct target_msgbuf *target_mb; + char *target_mtext; + struct msgbuf *host_mb; + abi_long ret =3D 0; + + if (msgsz < 0) { + return -TARGET_EINVAL; + } + if (!lock_user_struct(VERIFY_WRITE, target_mb, msgp, 0)) { + return -TARGET_EFAULT; + } + + host_mb =3D g_try_malloc(msgsz + sizeof(long)); + if (!host_mb) { + ret =3D -TARGET_ENOMEM; + goto end; + } + ret =3D get_errno(safe_msgrcv(msqid, host_mb, msgsz, msgtyp, msgflg)); + + if (ret > 0) { + abi_ulong target_mtext_addr =3D msgp + sizeof(abi_ulong); + target_mtext =3D lock_user(VERIFY_WRITE, target_mtext_addr, ret, 0= ); + if (!target_mtext) { + ret =3D -TARGET_EFAULT; + goto end; + } + memcpy(target_mb->mtext, host_mb->mtext, ret); + unlock_user(target_mtext, target_mtext_addr, ret); + } + target_mb->mtype =3D tswapal(host_mb->mtype); + + end: + unlock_user_struct(target_mb, msgp, 1); + g_free(host_mb); + return ret; +} + +SYSCALL_IMPL(msgsnd) +{ + int msqid =3D arg1; + abi_ulong msgp =3D arg2; + abi_long msgsz =3D arg3; + int msgflg =3D arg4; + struct target_msgbuf *target_mb; + struct msgbuf *host_mb; + abi_long ret =3D 0; + + if (msgsz < 0) { + return -TARGET_EINVAL; + } + if (!lock_user_struct(VERIFY_READ, target_mb, msgp, 0)) { + return -TARGET_EFAULT; + } + host_mb =3D g_try_malloc(msgsz + sizeof(long)); + if (!host_mb) { + unlock_user_struct(target_mb, msgp, 0); + return -TARGET_ENOMEM; + } + + host_mb->mtype =3D (abi_long)tswapal(target_mb->mtype); + memcpy(host_mb->mtext, target_mb->mtext, msgsz); + ret =3D get_errno(safe_msgsnd(msqid, host_mb, msgsz, msgflg)); + + g_free(host_mb); + unlock_user_struct(target_mb, msgp, 0); + return ret; +} + +SYSCALL_IMPL(semctl) +{ + abi_long semid =3D arg1; + abi_long semnum =3D arg2; + int cmd =3D arg3 & 0xff; + abi_ulong target_arg =3D arg4; + union target_semun target_su =3D { .buf =3D target_arg }; + union semun arg; + struct semid_ds dsarg; + unsigned short *array =3D NULL; + struct seminfo seminfo; + abi_long ret, err; + + switch (cmd) { + case GETVAL: + case SETVAL: + /* + * In 64 bit cross-endian situations, we will erroneously pick up + * the wrong half of the union for the "val" element. To rectify + * this, the entire 8-byte structure is byteswapped, followed by + * a swap of the 4 byte val field. In other cases, the data is + * already in proper host byte order. + */ + if (sizeof(target_su.val) !=3D sizeof(target_su.buf)) { + target_su.buf =3D tswapal(target_su.buf); + arg.val =3D tswap32(target_su.val); + } else { + arg.val =3D target_su.val; + } + return get_errno(semctl(semid, semnum, cmd, arg)); + + case GETALL: + case SETALL: + err =3D target_to_host_semarray(semid, &array, target_su.array); + if (err) { + return err; + } + arg.array =3D array; + ret =3D get_errno(semctl(semid, semnum, cmd, arg)); + if (!is_error(ret)) { + err =3D host_to_target_semarray(semid, target_su.array, &array= ); + if (err) { + return err; + } + } + return ret; + + case IPC_STAT: + case IPC_SET: + case SEM_STAT: + err =3D target_to_host_semid_ds(&dsarg, target_su.buf); + if (err) { + return err; + } + arg.buf =3D &dsarg; + ret =3D get_errno(semctl(semid, semnum, cmd, arg)); + if (!is_error(ret)) { + err =3D host_to_target_semid_ds(target_su.buf, &dsarg); + if (err) { + return err; + } + } + return ret; + + case IPC_INFO: + case SEM_INFO: + arg.__buf =3D &seminfo; + ret =3D get_errno(semctl(semid, semnum, cmd, arg)); + if (!is_error(ret)) { + err =3D host_to_target_seminfo(target_su.__buf, &seminfo); + if (err) { + return err; + } + } + return ret; + + case IPC_RMID: + case GETPID: + case GETNCNT: + case GETZCNT: + return get_errno(semctl(semid, semnum, cmd, NULL)); + + default: + return -TARGET_EINVAL; + } +} + +SYSCALL_IMPL(semget) +{ + return get_errno(semget(arg1, arg2, arg3)); +} + +SYSCALL_IMPL(semop) +{ + abi_long semid =3D arg1; + abi_ulong ptr =3D arg2; + abi_ulong nsops =3D arg3; + struct sembuf sops[SEMOPM]; + + if (nsops > SEMOPM) { + return -TARGET_E2BIG; + } + if (target_to_host_sembuf(sops, ptr, nsops)) { + return -TARGET_EFAULT; + } + return get_errno(safe_semtimedop(semid, sops, nsops, NULL)); +} + +SYSCALL_IMPL(shmat) +{ + int shmid =3D arg1; + abi_ulong shmaddr =3D arg2; + int shmflg =3D arg3; + abi_ulong raddr; + void *host_raddr; + struct shmid_ds shm_info; + int i, ret; + abi_ulong shmlba; + + /* Find out the length of the shared memory segment. */ + ret =3D get_errno(shmctl(shmid, IPC_STAT, &shm_info)); + if (is_error(ret)) { + /* can't get length, bail out */ + return ret; + } + + /* Validate memory placement and alignment for the guest. */ + shmlba =3D target_shmlba(cpu_env); + if (shmaddr & (shmlba - 1)) { + if (shmflg & SHM_RND) { + shmaddr &=3D ~(shmlba - 1); + } else { + return -TARGET_EINVAL; + } + } + if (!guest_range_valid(shmaddr, shm_info.shm_segsz)) { + return -TARGET_EINVAL; + } + + mmap_lock(); + + if (shmaddr) { + host_raddr =3D shmat(shmid, (void *)g2h(shmaddr), shmflg); + } else { + /* In order to use the host shmat, we need to honor host SHMLBA. = */ + abi_ulong mmap_start =3D mmap_find_vma(0, shm_info.shm_segsz, + MAX(SHMLBA, shmlba)); + if (mmap_start =3D=3D -1) { + errno =3D ENOMEM; + host_raddr =3D (void *)-1; + } else { + host_raddr =3D shmat(shmid, g2h(mmap_start), shmflg | SHM_REMA= P); + } + } + if (host_raddr =3D=3D (void *)-1) { + mmap_unlock(); + return get_errno((intptr_t)host_raddr); + } + + raddr =3D h2g((uintptr_t)host_raddr); + page_set_flags(raddr, raddr + shm_info.shm_segsz, + PAGE_VALID | PAGE_READ | + (shmflg & SHM_RDONLY ? 0 : PAGE_WRITE)); + + for (i =3D 0; i < N_SHM_REGIONS; i++) { + if (!shm_regions[i].in_use) { + shm_regions[i].in_use =3D true; + shm_regions[i].start =3D raddr; + shm_regions[i].size =3D shm_info.shm_segsz; + break; + } + } + mmap_unlock(); + return raddr; +} + +SYSCALL_IMPL(shmctl) +{ + int shmid =3D arg1; + int cmd =3D arg2 & 0xff; + abi_ulong buf =3D arg3; + struct shmid_ds dsarg; + struct shminfo shminfo; + struct shm_info shm_info; + abi_long ret; + + switch (cmd) { + case IPC_STAT: + case IPC_SET: + case SHM_STAT: + if (target_to_host_shmid_ds(&dsarg, buf)) { + return -TARGET_EFAULT; + } + ret =3D get_errno(shmctl(shmid, cmd, &dsarg)); + if (!is_error(ret) && host_to_target_shmid_ds(buf, &dsarg)) { + return -TARGET_EFAULT; + } + return ret; + + case IPC_INFO: + ret =3D get_errno(shmctl(shmid, cmd, (struct shmid_ds *)&shminfo)); + if (!is_error(ret) && host_to_target_shminfo(buf, &shminfo)) { + return -TARGET_EFAULT; + } + return ret; + + case SHM_INFO: + ret =3D get_errno(shmctl(shmid, cmd, (struct shmid_ds *)&shm_info)= ); + if (!is_error(ret) && host_to_target_shm_info(buf, &shm_info)) { + return -TARGET_EFAULT; + } + return ret; + + case IPC_RMID: + case SHM_LOCK: + case SHM_UNLOCK: + return get_errno(shmctl(shmid, cmd, NULL)); + + default: + return -TARGET_EINVAL; + } +} + +SYSCALL_IMPL(shmdt) +{ + abi_ulong shmaddr =3D arg1; + abi_long ret; + int i; + + mmap_lock(); + + for (i =3D 0; i < N_SHM_REGIONS; ++i) { + if (shm_regions[i].in_use && shm_regions[i].start =3D=3D shmaddr) { + shm_regions[i].in_use =3D false; + page_set_flags(shmaddr, shmaddr + shm_regions[i].size, 0); + break; + } + } + ret =3D get_errno(shmdt(g2h(shmaddr))); + + mmap_unlock(); + + return ret; +} + +SYSCALL_IMPL(shmget) +{ + return get_errno(shmget(arg1, arg2, arg3)); +} + +#ifdef TARGET_NR_ipc +/* + * This differs from normal shmat in returning the result via a pointer. + * Here we have shifted that pointer to arg4. + */ +SYSCALL_IMPL(ipc_shmat) +{ + abi_long ret =3D impl_shmat(cpu_env, arg1, arg2, arg3, 0, 0, 0); + + if (is_error(ret)) { + return ret; + } + if (put_user_ual(ret, arg4)) { + return -TARGET_EFAULT; + } + return 0; +} + +static const SyscallDef def_ipc_shmat =3D { + .name =3D "shmat", + .impl =3D impl_ipc_shmat, + .arg_type =3D { ARG_DEC, ARG_PTR, ARG_HEX, ARG_PTR }, +}; + +/* These get defined later via syscall-defs.h. */ +static const SyscallDef def_semop; +static const SyscallDef def_semget; +static const SyscallDef def_semctl; +static const SyscallDef def_msgget; +static const SyscallDef def_msgsnd; +static const SyscallDef def_msgctl; +static const SyscallDef def_msgrcv; +static const SyscallDef def_shmdt; +static const SyscallDef def_shmget; +static const SyscallDef def_shmctl; + +/* + * Demultiplex the IPC syscall and shuffle the arguments around + * into the "normal" ordering. + */ +SYSCALL_ARGS(ipc) +{ + int call =3D extract32(in[0], 0, 16); + int version =3D extract32(in[0], 16, 16); + abi_long first =3D in[1]; + abi_long second =3D in[2]; + abi_long third =3D in[3]; + abi_ulong ptr =3D in[4]; + abi_long fifth =3D in[5]; + abi_ulong atptr; + + /* IPC_* and SHM_* command values are the same on all linux platforms = */ + switch (call) { + case IPCOP_semop: + out[0] =3D first; + out[1] =3D ptr; + out[2] =3D second; + return &def_semop; + + case IPCOP_semget: + out[0] =3D first; + out[1] =3D second; + out[2] =3D third; + return &def_semget; + + case IPCOP_semctl: + /* + * The semun argument to semctl is passed by value, + * so dereference the ptr argument. + */ + if (get_user_ual(atptr, ptr)) { + errno =3D EFAULT; + return NULL; + } + out[0] =3D first; + out[1] =3D second; + out[2] =3D third; + out[3] =3D atptr; + return &def_semctl; + + case IPCOP_msgget: + out[0] =3D first; + out[1] =3D second; + return &def_msgget; + + case IPCOP_msgsnd: + out[0] =3D first; + out[1] =3D ptr; + out[2] =3D second; + out[3] =3D third; + return &def_msgsnd; + + case IPCOP_msgctl: + out[0] =3D first; + out[1] =3D second; + out[2] =3D ptr; + return &def_msgctl; + + case IPCOP_msgrcv: + if (version =3D=3D 0) { + struct target_ipc_kludge { + abi_long msgp; + abi_long msgtyp; + } *tmp; + + if (!lock_user_struct(VERIFY_READ, tmp, ptr, 1)) { + errno =3D EFAULT; + return NULL; + } + out[0] =3D first; + out[1] =3D tswapal(tmp->msgp); + out[2] =3D second; + out[3] =3D tswapal(tmp->msgtyp); + out[4] =3D third; + unlock_user_struct(tmp, ptr, 0); + } else { + out[0] =3D first; + out[1] =3D ptr; + out[2] =3D second; + out[3] =3D fifth; + out[4] =3D third; + } + return &def_msgrcv; + + case IPCOP_shmat: + if (version =3D=3D 1) { + errno =3D EINVAL; + return NULL; + } + out[0] =3D first; + out[1] =3D ptr; + out[2] =3D second; + out[3] =3D third; + return &def_ipc_shmat; + + case IPCOP_shmdt: + out[0] =3D ptr; + return &def_shmdt; + + case IPCOP_shmget: + out[0] =3D first; + out[1] =3D second; + out[2] =3D third; + return &def_shmget; + + case IPCOP_shmctl: + out[0] =3D first; + out[1] =3D second; + out[2] =3D ptr; + return &def_shmctl; + + default: + /* Invalid syscall. Continue to impl_ipc for logging. */ + return def; + } +} + +SYSCALL_IMPL(ipc) +{ + int call =3D extract32(arg1, 0, 16); + int version =3D extract32(arg1, 16, 16); + + gemu_log("Unsupported ipc call: %d (version %d)\n", call, version); + return -TARGET_ENOSYS; +} +#endif diff --git a/linux-user/syscall.c b/linux-user/syscall.c index c49f8aebd2..ca345ffb4c 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -763,43 +763,6 @@ safe_syscall2(int, nanosleep, const struct timespec *,= req, safe_syscall4(int, clock_nanosleep, const clockid_t, clock, int, flags, const struct timespec *, req, struct timespec *, rem) #endif -#ifdef __NR_msgsnd -safe_syscall4(int, msgsnd, int, msgid, const void *, msgp, size_t, sz, - int, flags) -safe_syscall5(int, msgrcv, int, msgid, void *, msgp, size_t, sz, - long, msgtype, int, flags) -safe_syscall4(int, semtimedop, int, semid, struct sembuf *, tsops, - unsigned, nsops, const struct timespec *, timeout) -#else -/* This host kernel architecture uses a single ipc syscall; fake up - * wrappers for the sub-operations to hide this implementation detail. - * Annoyingly we can't include linux/ipc.h to get the constant definitions - * for the call parameter because some structs in there conflict with the - * sys/ipc.h ones. So we just define them here, and rely on them being - * the same for all host architectures. - */ -#define Q_SEMTIMEDOP 4 -#define Q_MSGSND 11 -#define Q_MSGRCV 12 -#define Q_IPCCALL(VERSION, OP) ((VERSION) << 16 | (OP)) - -safe_syscall6(int, ipc, int, call, long, first, long, second, long, third, - void *, ptr, long, fifth) -static int safe_msgsnd(int msgid, const void *msgp, size_t sz, int flags) -{ - return safe_ipc(Q_IPCCALL(0, Q_MSGSND), msgid, sz, flags, (void *)msgp= , 0); -} -static int safe_msgrcv(int msgid, void *msgp, size_t sz, long type, int fl= ags) -{ - return safe_ipc(Q_IPCCALL(1, Q_MSGRCV), msgid, sz, flags, msgp, type); -} -static int safe_semtimedop(int semid, struct sembuf *tsops, unsigned nsops, - const struct timespec *timeout) -{ - return safe_ipc(Q_IPCCALL(0, Q_SEMTIMEDOP), semid, nsops, 0, tsops, - (long)timeout); -} -#endif #if defined(TARGET_NR_mq_open) && defined(__NR_mq_open) safe_syscall5(int, mq_timedsend, int, mqdes, const char *, msg_ptr, size_t, len, unsigned, prio, const struct timespec *, timeou= t) @@ -3178,891 +3141,6 @@ static abi_long do_socketcall(int num, abi_ulong vp= tr) } #endif =20 -#define N_SHM_REGIONS 32 - -static struct shm_region { - abi_ulong start; - abi_ulong size; - bool in_use; -} shm_regions[N_SHM_REGIONS]; - -#ifndef TARGET_SEMID64_DS -/* asm-generic version of this struct */ -struct target_semid64_ds -{ - struct target_ipc_perm sem_perm; - abi_ulong sem_otime; -#if TARGET_ABI_BITS =3D=3D 32 - abi_ulong __unused1; -#endif - abi_ulong sem_ctime; -#if TARGET_ABI_BITS =3D=3D 32 - abi_ulong __unused2; -#endif - abi_ulong sem_nsems; - abi_ulong __unused3; - abi_ulong __unused4; -}; -#endif - -static inline abi_long target_to_host_ipc_perm(struct ipc_perm *host_ip, - abi_ulong target_addr) -{ - struct target_ipc_perm *target_ip; - struct target_semid64_ds *target_sd; - - if (!lock_user_struct(VERIFY_READ, target_sd, target_addr, 1)) - return -TARGET_EFAULT; - target_ip =3D &(target_sd->sem_perm); - host_ip->__key =3D tswap32(target_ip->__key); - host_ip->uid =3D tswap32(target_ip->uid); - host_ip->gid =3D tswap32(target_ip->gid); - host_ip->cuid =3D tswap32(target_ip->cuid); - host_ip->cgid =3D tswap32(target_ip->cgid); -#if defined(TARGET_ALPHA) || defined(TARGET_MIPS) || defined(TARGET_PPC) - host_ip->mode =3D tswap32(target_ip->mode); -#else - host_ip->mode =3D tswap16(target_ip->mode); -#endif -#if defined(TARGET_PPC) - host_ip->__seq =3D tswap32(target_ip->__seq); -#else - host_ip->__seq =3D tswap16(target_ip->__seq); -#endif - unlock_user_struct(target_sd, target_addr, 0); - return 0; -} - -static inline abi_long host_to_target_ipc_perm(abi_ulong target_addr, - struct ipc_perm *host_ip) -{ - struct target_ipc_perm *target_ip; - struct target_semid64_ds *target_sd; - - if (!lock_user_struct(VERIFY_WRITE, target_sd, target_addr, 0)) - return -TARGET_EFAULT; - target_ip =3D &(target_sd->sem_perm); - target_ip->__key =3D tswap32(host_ip->__key); - target_ip->uid =3D tswap32(host_ip->uid); - target_ip->gid =3D tswap32(host_ip->gid); - target_ip->cuid =3D tswap32(host_ip->cuid); - target_ip->cgid =3D tswap32(host_ip->cgid); -#if defined(TARGET_ALPHA) || defined(TARGET_MIPS) || defined(TARGET_PPC) - target_ip->mode =3D tswap32(host_ip->mode); -#else - target_ip->mode =3D tswap16(host_ip->mode); -#endif -#if defined(TARGET_PPC) - target_ip->__seq =3D tswap32(host_ip->__seq); -#else - target_ip->__seq =3D tswap16(host_ip->__seq); -#endif - unlock_user_struct(target_sd, target_addr, 1); - return 0; -} - -static inline abi_long target_to_host_semid_ds(struct semid_ds *host_sd, - abi_ulong target_addr) -{ - struct target_semid64_ds *target_sd; - - if (!lock_user_struct(VERIFY_READ, target_sd, target_addr, 1)) - return -TARGET_EFAULT; - if (target_to_host_ipc_perm(&(host_sd->sem_perm),target_addr)) - return -TARGET_EFAULT; - host_sd->sem_nsems =3D tswapal(target_sd->sem_nsems); - host_sd->sem_otime =3D tswapal(target_sd->sem_otime); - host_sd->sem_ctime =3D tswapal(target_sd->sem_ctime); - unlock_user_struct(target_sd, target_addr, 0); - return 0; -} - -static inline abi_long host_to_target_semid_ds(abi_ulong target_addr, - struct semid_ds *host_sd) -{ - struct target_semid64_ds *target_sd; - - if (!lock_user_struct(VERIFY_WRITE, target_sd, target_addr, 0)) - return -TARGET_EFAULT; - if (host_to_target_ipc_perm(target_addr,&(host_sd->sem_perm))) - return -TARGET_EFAULT; - target_sd->sem_nsems =3D tswapal(host_sd->sem_nsems); - target_sd->sem_otime =3D tswapal(host_sd->sem_otime); - target_sd->sem_ctime =3D tswapal(host_sd->sem_ctime); - unlock_user_struct(target_sd, target_addr, 1); - return 0; -} - -struct target_seminfo { - int semmap; - int semmni; - int semmns; - int semmnu; - int semmsl; - int semopm; - int semume; - int semusz; - int semvmx; - int semaem; -}; - -static inline abi_long host_to_target_seminfo(abi_ulong target_addr, - struct seminfo *host_seminfo) -{ - struct target_seminfo *target_seminfo; - if (!lock_user_struct(VERIFY_WRITE, target_seminfo, target_addr, 0)) - return -TARGET_EFAULT; - __put_user(host_seminfo->semmap, &target_seminfo->semmap); - __put_user(host_seminfo->semmni, &target_seminfo->semmni); - __put_user(host_seminfo->semmns, &target_seminfo->semmns); - __put_user(host_seminfo->semmnu, &target_seminfo->semmnu); - __put_user(host_seminfo->semmsl, &target_seminfo->semmsl); - __put_user(host_seminfo->semopm, &target_seminfo->semopm); - __put_user(host_seminfo->semume, &target_seminfo->semume); - __put_user(host_seminfo->semusz, &target_seminfo->semusz); - __put_user(host_seminfo->semvmx, &target_seminfo->semvmx); - __put_user(host_seminfo->semaem, &target_seminfo->semaem); - unlock_user_struct(target_seminfo, target_addr, 1); - return 0; -} - -union semun { - int val; - struct semid_ds *buf; - unsigned short *array; - struct seminfo *__buf; -}; - -union target_semun { - int val; - abi_ulong buf; - abi_ulong array; - abi_ulong __buf; -}; - -static inline abi_long target_to_host_semarray(int semid, unsigned short *= *host_array, - abi_ulong target_addr) -{ - int nsems; - unsigned short *array; - union semun semun; - struct semid_ds semid_ds; - int i, ret; - - semun.buf =3D &semid_ds; - - ret =3D semctl(semid, 0, IPC_STAT, semun); - if (ret =3D=3D -1) - return get_errno(ret); - - nsems =3D semid_ds.sem_nsems; - - *host_array =3D g_try_new(unsigned short, nsems); - if (!*host_array) { - return -TARGET_ENOMEM; - } - array =3D lock_user(VERIFY_READ, target_addr, - nsems*sizeof(unsigned short), 1); - if (!array) { - g_free(*host_array); - return -TARGET_EFAULT; - } - - for(i=3D0; imsg_perm),target_addr)) - return -TARGET_EFAULT; - host_md->msg_stime =3D tswapal(target_md->msg_stime); - host_md->msg_rtime =3D tswapal(target_md->msg_rtime); - host_md->msg_ctime =3D tswapal(target_md->msg_ctime); - host_md->__msg_cbytes =3D tswapal(target_md->__msg_cbytes); - host_md->msg_qnum =3D tswapal(target_md->msg_qnum); - host_md->msg_qbytes =3D tswapal(target_md->msg_qbytes); - host_md->msg_lspid =3D tswapal(target_md->msg_lspid); - host_md->msg_lrpid =3D tswapal(target_md->msg_lrpid); - unlock_user_struct(target_md, target_addr, 0); - return 0; -} - -static inline abi_long host_to_target_msqid_ds(abi_ulong target_addr, - struct msqid_ds *host_md) -{ - struct target_msqid_ds *target_md; - - if (!lock_user_struct(VERIFY_WRITE, target_md, target_addr, 0)) - return -TARGET_EFAULT; - if (host_to_target_ipc_perm(target_addr,&(host_md->msg_perm))) - return -TARGET_EFAULT; - target_md->msg_stime =3D tswapal(host_md->msg_stime); - target_md->msg_rtime =3D tswapal(host_md->msg_rtime); - target_md->msg_ctime =3D tswapal(host_md->msg_ctime); - target_md->__msg_cbytes =3D tswapal(host_md->__msg_cbytes); - target_md->msg_qnum =3D tswapal(host_md->msg_qnum); - target_md->msg_qbytes =3D tswapal(host_md->msg_qbytes); - target_md->msg_lspid =3D tswapal(host_md->msg_lspid); - target_md->msg_lrpid =3D tswapal(host_md->msg_lrpid); - unlock_user_struct(target_md, target_addr, 1); - return 0; -} - -struct target_msginfo { - int msgpool; - int msgmap; - int msgmax; - int msgmnb; - int msgmni; - int msgssz; - int msgtql; - unsigned short int msgseg; -}; - -static inline abi_long host_to_target_msginfo(abi_ulong target_addr, - struct msginfo *host_msginfo) -{ - struct target_msginfo *target_msginfo; - if (!lock_user_struct(VERIFY_WRITE, target_msginfo, target_addr, 0)) - return -TARGET_EFAULT; - __put_user(host_msginfo->msgpool, &target_msginfo->msgpool); - __put_user(host_msginfo->msgmap, &target_msginfo->msgmap); - __put_user(host_msginfo->msgmax, &target_msginfo->msgmax); - __put_user(host_msginfo->msgmnb, &target_msginfo->msgmnb); - __put_user(host_msginfo->msgmni, &target_msginfo->msgmni); - __put_user(host_msginfo->msgssz, &target_msginfo->msgssz); - __put_user(host_msginfo->msgtql, &target_msginfo->msgtql); - __put_user(host_msginfo->msgseg, &target_msginfo->msgseg); - unlock_user_struct(target_msginfo, target_addr, 1); - return 0; -} - -static inline abi_long do_msgctl(int msgid, int cmd, abi_long ptr) -{ - struct msqid_ds dsarg; - struct msginfo msginfo; - abi_long ret =3D -TARGET_EINVAL; - - cmd &=3D 0xff; - - switch (cmd) { - case IPC_STAT: - case IPC_SET: - case MSG_STAT: - if (target_to_host_msqid_ds(&dsarg,ptr)) - return -TARGET_EFAULT; - ret =3D get_errno(msgctl(msgid, cmd, &dsarg)); - if (host_to_target_msqid_ds(ptr,&dsarg)) - return -TARGET_EFAULT; - break; - case IPC_RMID: - ret =3D get_errno(msgctl(msgid, cmd, NULL)); - break; - case IPC_INFO: - case MSG_INFO: - ret =3D get_errno(msgctl(msgid, cmd, (struct msqid_ds *)&msginfo)); - if (host_to_target_msginfo(ptr, &msginfo)) - return -TARGET_EFAULT; - break; - } - - return ret; -} - -struct target_msgbuf { - abi_long mtype; - char mtext[1]; -}; - -static inline abi_long do_msgsnd(int msqid, abi_long msgp, - ssize_t msgsz, int msgflg) -{ - struct target_msgbuf *target_mb; - struct msgbuf *host_mb; - abi_long ret =3D 0; - - if (msgsz < 0) { - return -TARGET_EINVAL; - } - - if (!lock_user_struct(VERIFY_READ, target_mb, msgp, 0)) - return -TARGET_EFAULT; - host_mb =3D g_try_malloc(msgsz + sizeof(long)); - if (!host_mb) { - unlock_user_struct(target_mb, msgp, 0); - return -TARGET_ENOMEM; - } - host_mb->mtype =3D (abi_long) tswapal(target_mb->mtype); - memcpy(host_mb->mtext, target_mb->mtext, msgsz); - ret =3D get_errno(safe_msgsnd(msqid, host_mb, msgsz, msgflg)); - g_free(host_mb); - unlock_user_struct(target_mb, msgp, 0); - - return ret; -} - -static inline abi_long do_msgrcv(int msqid, abi_long msgp, - ssize_t msgsz, abi_long msgtyp, - int msgflg) -{ - struct target_msgbuf *target_mb; - char *target_mtext; - struct msgbuf *host_mb; - abi_long ret =3D 0; - - if (msgsz < 0) { - return -TARGET_EINVAL; - } - - if (!lock_user_struct(VERIFY_WRITE, target_mb, msgp, 0)) - return -TARGET_EFAULT; - - host_mb =3D g_try_malloc(msgsz + sizeof(long)); - if (!host_mb) { - ret =3D -TARGET_ENOMEM; - goto end; - } - ret =3D get_errno(safe_msgrcv(msqid, host_mb, msgsz, msgtyp, msgflg)); - - if (ret > 0) { - abi_ulong target_mtext_addr =3D msgp + sizeof(abi_ulong); - target_mtext =3D lock_user(VERIFY_WRITE, target_mtext_addr, ret, 0= ); - if (!target_mtext) { - ret =3D -TARGET_EFAULT; - goto end; - } - memcpy(target_mb->mtext, host_mb->mtext, ret); - unlock_user(target_mtext, target_mtext_addr, ret); - } - - target_mb->mtype =3D tswapal(host_mb->mtype); - -end: - if (target_mb) - unlock_user_struct(target_mb, msgp, 1); - g_free(host_mb); - return ret; -} - -static inline abi_long target_to_host_shmid_ds(struct shmid_ds *host_sd, - abi_ulong target_addr) -{ - struct target_shmid_ds *target_sd; - - if (!lock_user_struct(VERIFY_READ, target_sd, target_addr, 1)) - return -TARGET_EFAULT; - if (target_to_host_ipc_perm(&(host_sd->shm_perm), target_addr)) - return -TARGET_EFAULT; - __get_user(host_sd->shm_segsz, &target_sd->shm_segsz); - __get_user(host_sd->shm_atime, &target_sd->shm_atime); - __get_user(host_sd->shm_dtime, &target_sd->shm_dtime); - __get_user(host_sd->shm_ctime, &target_sd->shm_ctime); - __get_user(host_sd->shm_cpid, &target_sd->shm_cpid); - __get_user(host_sd->shm_lpid, &target_sd->shm_lpid); - __get_user(host_sd->shm_nattch, &target_sd->shm_nattch); - unlock_user_struct(target_sd, target_addr, 0); - return 0; -} - -static inline abi_long host_to_target_shmid_ds(abi_ulong target_addr, - struct shmid_ds *host_sd) -{ - struct target_shmid_ds *target_sd; - - if (!lock_user_struct(VERIFY_WRITE, target_sd, target_addr, 0)) - return -TARGET_EFAULT; - if (host_to_target_ipc_perm(target_addr, &(host_sd->shm_perm))) - return -TARGET_EFAULT; - __put_user(host_sd->shm_segsz, &target_sd->shm_segsz); - __put_user(host_sd->shm_atime, &target_sd->shm_atime); - __put_user(host_sd->shm_dtime, &target_sd->shm_dtime); - __put_user(host_sd->shm_ctime, &target_sd->shm_ctime); - __put_user(host_sd->shm_cpid, &target_sd->shm_cpid); - __put_user(host_sd->shm_lpid, &target_sd->shm_lpid); - __put_user(host_sd->shm_nattch, &target_sd->shm_nattch); - unlock_user_struct(target_sd, target_addr, 1); - return 0; -} - -struct target_shminfo { - abi_ulong shmmax; - abi_ulong shmmin; - abi_ulong shmmni; - abi_ulong shmseg; - abi_ulong shmall; -}; - -static inline abi_long host_to_target_shminfo(abi_ulong target_addr, - struct shminfo *host_shminfo) -{ - struct target_shminfo *target_shminfo; - if (!lock_user_struct(VERIFY_WRITE, target_shminfo, target_addr, 0)) - return -TARGET_EFAULT; - __put_user(host_shminfo->shmmax, &target_shminfo->shmmax); - __put_user(host_shminfo->shmmin, &target_shminfo->shmmin); - __put_user(host_shminfo->shmmni, &target_shminfo->shmmni); - __put_user(host_shminfo->shmseg, &target_shminfo->shmseg); - __put_user(host_shminfo->shmall, &target_shminfo->shmall); - unlock_user_struct(target_shminfo, target_addr, 1); - return 0; -} - -struct target_shm_info { - int used_ids; - abi_ulong shm_tot; - abi_ulong shm_rss; - abi_ulong shm_swp; - abi_ulong swap_attempts; - abi_ulong swap_successes; -}; - -static inline abi_long host_to_target_shm_info(abi_ulong target_addr, - struct shm_info *host_shm_i= nfo) -{ - struct target_shm_info *target_shm_info; - if (!lock_user_struct(VERIFY_WRITE, target_shm_info, target_addr, 0)) - return -TARGET_EFAULT; - __put_user(host_shm_info->used_ids, &target_shm_info->used_ids); - __put_user(host_shm_info->shm_tot, &target_shm_info->shm_tot); - __put_user(host_shm_info->shm_rss, &target_shm_info->shm_rss); - __put_user(host_shm_info->shm_swp, &target_shm_info->shm_swp); - __put_user(host_shm_info->swap_attempts, &target_shm_info->swap_attemp= ts); - __put_user(host_shm_info->swap_successes, &target_shm_info->swap_succe= sses); - unlock_user_struct(target_shm_info, target_addr, 1); - return 0; -} - -static inline abi_long do_shmctl(int shmid, int cmd, abi_long buf) -{ - struct shmid_ds dsarg; - struct shminfo shminfo; - struct shm_info shm_info; - abi_long ret =3D -TARGET_EINVAL; - - cmd &=3D 0xff; - - switch(cmd) { - case IPC_STAT: - case IPC_SET: - case SHM_STAT: - if (target_to_host_shmid_ds(&dsarg, buf)) - return -TARGET_EFAULT; - ret =3D get_errno(shmctl(shmid, cmd, &dsarg)); - if (host_to_target_shmid_ds(buf, &dsarg)) - return -TARGET_EFAULT; - break; - case IPC_INFO: - ret =3D get_errno(shmctl(shmid, cmd, (struct shmid_ds *)&shminfo)); - if (host_to_target_shminfo(buf, &shminfo)) - return -TARGET_EFAULT; - break; - case SHM_INFO: - ret =3D get_errno(shmctl(shmid, cmd, (struct shmid_ds *)&shm_info)= ); - if (host_to_target_shm_info(buf, &shm_info)) - return -TARGET_EFAULT; - break; - case IPC_RMID: - case SHM_LOCK: - case SHM_UNLOCK: - ret =3D get_errno(shmctl(shmid, cmd, NULL)); - break; - } - - return ret; -} - -#ifndef TARGET_FORCE_SHMLBA -/* For most architectures, SHMLBA is the same as the page size; - * some architectures have larger values, in which case they should - * define TARGET_FORCE_SHMLBA and provide a target_shmlba() function. - * This corresponds to the kernel arch code defining __ARCH_FORCE_SHMLBA - * and defining its own value for SHMLBA. - * - * The kernel also permits SHMLBA to be set by the architecture to a - * value larger than the page size without setting __ARCH_FORCE_SHMLBA; - * this means that addresses are rounded to the large size if - * SHM_RND is set but addresses not aligned to that size are not rejected - * as long as they are at least page-aligned. Since the only architecture - * which uses this is ia64 this code doesn't provide for that oddity. - */ -static inline abi_ulong target_shmlba(CPUArchState *cpu_env) -{ - return TARGET_PAGE_SIZE; -} -#endif - -static inline abi_ulong do_shmat(CPUArchState *cpu_env, - int shmid, abi_ulong shmaddr, int shmflg) -{ - abi_long raddr; - void *host_raddr; - struct shmid_ds shm_info; - int i,ret; - abi_ulong shmlba; - - /* find out the length of the shared memory segment */ - ret =3D get_errno(shmctl(shmid, IPC_STAT, &shm_info)); - if (is_error(ret)) { - /* can't get length, bail out */ - return ret; - } - - shmlba =3D target_shmlba(cpu_env); - - if (shmaddr & (shmlba - 1)) { - if (shmflg & SHM_RND) { - shmaddr &=3D ~(shmlba - 1); - } else { - return -TARGET_EINVAL; - } - } - if (!guest_range_valid(shmaddr, shm_info.shm_segsz)) { - return -TARGET_EINVAL; - } - - mmap_lock(); - - if (shmaddr) - host_raddr =3D shmat(shmid, (void *)g2h(shmaddr), shmflg); - else { - abi_ulong mmap_start; - - /* In order to use the host shmat, we need to honor host SHMLBA. = */ - mmap_start =3D mmap_find_vma(0, shm_info.shm_segsz, MAX(SHMLBA, sh= mlba)); - - if (mmap_start =3D=3D -1) { - errno =3D ENOMEM; - host_raddr =3D (void *)-1; - } else - host_raddr =3D shmat(shmid, g2h(mmap_start), shmflg | SHM_REMA= P); - } - - if (host_raddr =3D=3D (void *)-1) { - mmap_unlock(); - return get_errno((long)host_raddr); - } - raddr=3Dh2g((unsigned long)host_raddr); - - page_set_flags(raddr, raddr + shm_info.shm_segsz, - PAGE_VALID | PAGE_READ | - ((shmflg & SHM_RDONLY)? 0 : PAGE_WRITE)); - - for (i =3D 0; i < N_SHM_REGIONS; i++) { - if (!shm_regions[i].in_use) { - shm_regions[i].in_use =3D true; - shm_regions[i].start =3D raddr; - shm_regions[i].size =3D shm_info.shm_segsz; - break; - } - } - - mmap_unlock(); - return raddr; - -} - -static inline abi_long do_shmdt(abi_ulong shmaddr) -{ - int i; - abi_long rv; - - mmap_lock(); - - for (i =3D 0; i < N_SHM_REGIONS; ++i) { - if (shm_regions[i].in_use && shm_regions[i].start =3D=3D shmaddr) { - shm_regions[i].in_use =3D false; - page_set_flags(shmaddr, shmaddr + shm_regions[i].size, 0); - break; - } - } - rv =3D get_errno(shmdt(g2h(shmaddr))); - - mmap_unlock(); - - return rv; -} - -#ifdef TARGET_NR_ipc -/* ??? This only works with linear mappings. */ -/* do_ipc() must return target values and target errnos. */ -static abi_long do_ipc(CPUArchState *cpu_env, - unsigned int call, abi_long first, - abi_long second, abi_long third, - abi_long ptr, abi_long fifth) -{ - int version; - abi_long ret =3D 0; - - version =3D call >> 16; - call &=3D 0xffff; - - switch (call) { - case IPCOP_semop: - ret =3D do_semop(first, ptr, second); - break; - - case IPCOP_semget: - ret =3D get_errno(semget(first, second, third)); - break; - - case IPCOP_semctl: { - /* The semun argument to semctl is passed by value, so dereference= the - * ptr argument. */ - abi_ulong atptr; - get_user_ual(atptr, ptr); - ret =3D do_semctl(first, second, third, atptr); - break; - } - - case IPCOP_msgget: - ret =3D get_errno(msgget(first, second)); - break; - - case IPCOP_msgsnd: - ret =3D do_msgsnd(first, ptr, second, third); - break; - - case IPCOP_msgctl: - ret =3D do_msgctl(first, second, ptr); - break; - - case IPCOP_msgrcv: - switch (version) { - case 0: - { - struct target_ipc_kludge { - abi_long msgp; - abi_long msgtyp; - } *tmp; - - if (!lock_user_struct(VERIFY_READ, tmp, ptr, 1)) { - ret =3D -TARGET_EFAULT; - break; - } - - ret =3D do_msgrcv(first, tswapal(tmp->msgp), second, tswap= al(tmp->msgtyp), third); - - unlock_user_struct(tmp, ptr, 0); - break; - } - default: - ret =3D do_msgrcv(first, ptr, second, fifth, third); - } - break; - - case IPCOP_shmat: - switch (version) { - default: - { - abi_ulong raddr; - raddr =3D do_shmat(cpu_env, first, ptr, second); - if (is_error(raddr)) - return get_errno(raddr); - if (put_user_ual(raddr, third)) - return -TARGET_EFAULT; - break; - } - case 1: - ret =3D -TARGET_EINVAL; - break; - } - break; - case IPCOP_shmdt: - ret =3D do_shmdt(ptr); - break; - - case IPCOP_shmget: - /* IPC_* flag values are the same on all linux platforms */ - ret =3D get_errno(shmget(first, second, third)); - break; - - /* IPC_* and SHM_* command values are the same on all linux platforms */ - case IPCOP_shmctl: - ret =3D do_shmctl(first, second, ptr); - break; - default: - gemu_log("Unsupported ipc call: %d (version %d)\n", call, version); - ret =3D -TARGET_ENOSYS; - break; - } - return ret; -} -#endif - /* kernel structure types definitions */ =20 #define STRUCT(name, ...) STRUCT_ ## name, @@ -8451,54 +7529,6 @@ static abi_long do_syscall1(void *cpu_env, int num, = abi_long arg1, } } return ret; -#ifdef TARGET_NR_ipc - case TARGET_NR_ipc: - return do_ipc(cpu_env, arg1, arg2, arg3, arg4, arg5, arg6); -#endif -#ifdef TARGET_NR_semget - case TARGET_NR_semget: - return get_errno(semget(arg1, arg2, arg3)); -#endif -#ifdef TARGET_NR_semop - case TARGET_NR_semop: - return do_semop(arg1, arg2, arg3); -#endif -#ifdef TARGET_NR_semctl - case TARGET_NR_semctl: - return do_semctl(arg1, arg2, arg3, arg4); -#endif -#ifdef TARGET_NR_msgctl - case TARGET_NR_msgctl: - return do_msgctl(arg1, arg2, arg3); -#endif -#ifdef TARGET_NR_msgget - case TARGET_NR_msgget: - return get_errno(msgget(arg1, arg2)); -#endif -#ifdef TARGET_NR_msgrcv - case TARGET_NR_msgrcv: - return do_msgrcv(arg1, arg2, arg3, arg4, arg5); -#endif -#ifdef TARGET_NR_msgsnd - case TARGET_NR_msgsnd: - return do_msgsnd(arg1, arg2, arg3, arg4); -#endif -#ifdef TARGET_NR_shmget - case TARGET_NR_shmget: - return get_errno(shmget(arg1, arg2, arg3)); -#endif -#ifdef TARGET_NR_shmctl - case TARGET_NR_shmctl: - return do_shmctl(arg1, arg2, arg3); -#endif -#ifdef TARGET_NR_shmat - case TARGET_NR_shmat: - return do_shmat(cpu_env, arg1, arg2, arg3); -#endif -#ifdef TARGET_NR_shmdt - case TARGET_NR_shmdt: - return do_shmdt(arg1); -#endif case TARGET_NR_fsync: return get_errno(fsync(arg1)); case TARGET_NR_clone: @@ -11061,6 +10091,7 @@ static abi_long do_syscall1(void *cpu_env, int num,= abi_long arg1, int64_t arg5, int64_t arg6) =20 #include "syscall-file.inc.c" +#include "syscall-ipc.inc.c" =20 #undef SYSCALL_IMPL #undef SYSCALL_ARGS @@ -11094,6 +10125,7 @@ static const SyscallDef *syscall_table(int num) #define SYSCALL_DEF(NAME, ...) case TARGET_NR_##NAME: return &def_##NAME #define SYSCALL_DEF_ARGS(NAME, ...) SYSCALL_DEF(NAME) #define SYSCALL_DEF_FULL(NAME, ...) SYSCALL_DEF(NAME) +#define SYSCALL_TABLE =20 switch (num) { #include "syscall-defs.h" @@ -11103,6 +10135,7 @@ static const SyscallDef *syscall_table(int num) #undef SYSCALL_DEF #undef SYSCALL_DEF_ARGS #undef SYSCALL_DEF_FULL +#undef SYSCALL_TABLE } =20 abi_long do_syscall(void *cpu_env, int num, abi_long arg1, diff --git a/linux-user/strace.list b/linux-user/strace.list index bf239cb9a3..f99bd57c09 100644 --- a/linux-user/strace.list +++ b/linux-user/strace.list @@ -452,9 +452,6 @@ #ifdef TARGET_NR_io_submit { TARGET_NR_io_submit, "io_submit" , NULL, NULL, NULL }, #endif -#ifdef TARGET_NR_ipc -{ TARGET_NR_ipc, "ipc" , NULL, print_ipc, NULL }, -#endif #ifdef TARGET_NR_kcmp { TARGET_NR_kcmp, "kcmp" , NULL, NULL, NULL }, #endif @@ -608,18 +605,6 @@ #ifdef TARGET_NR_mremap { TARGET_NR_mremap, "mremap" , NULL, NULL, NULL }, #endif -#ifdef TARGET_NR_msgctl -{ TARGET_NR_msgctl, "msgctl" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_msgget -{ TARGET_NR_msgget, "msgget" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_msgrcv -{ TARGET_NR_msgrcv, "msgrcv" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_msgsnd -{ TARGET_NR_msgsnd, "msgsnd" , NULL, NULL, NULL }, -#endif #ifdef TARGET_NR_msync { TARGET_NR_msync, "msync" , NULL, NULL, NULL }, #endif @@ -917,9 +902,6 @@ #ifdef TARGET_NR_osf_settimeofday { TARGET_NR_osf_settimeofday, "osf_settimeofday" , NULL, NULL, NULL }, #endif -#ifdef TARGET_NR_osf_shmat -{ TARGET_NR_osf_shmat, "osf_shmat" , NULL, NULL, NULL }, -#endif #ifdef TARGET_NR_osf_signal { TARGET_NR_osf_signal, "osf_signal" , NULL, NULL, NULL }, #endif @@ -1184,18 +1166,6 @@ #ifdef TARGET_NR_select { TARGET_NR_select, "select" , NULL, NULL, NULL }, #endif -#ifdef TARGET_NR_semctl -{ TARGET_NR_semctl, "semctl" , NULL, print_semctl, NULL }, -#endif -#ifdef TARGET_NR_semget -{ TARGET_NR_semget, "semget" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_semop -{ TARGET_NR_semop, "semop" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_semtimedop -{ TARGET_NR_semtimedop, "semtimedop" , NULL, NULL, NULL }, -#endif #ifdef TARGET_NR_send { TARGET_NR_send, "send" , NULL, NULL, NULL }, #endif @@ -1323,18 +1293,6 @@ #ifdef TARGET_NR_sgetmask { TARGET_NR_sgetmask, "sgetmask" , NULL, NULL, NULL }, #endif -#ifdef TARGET_NR_shmat -{ TARGET_NR_shmat, "shmat" , NULL, NULL, print_syscall_ret_addr }, -#endif -#ifdef TARGET_NR_shmctl -{ TARGET_NR_shmctl, "shmctl" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_shmdt -{ TARGET_NR_shmdt, "shmdt" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_shmget -{ TARGET_NR_shmget, "shmget" , NULL, NULL, NULL }, -#endif #ifdef TARGET_NR_shutdown { TARGET_NR_shutdown, "shutdown" , NULL, NULL, NULL }, #endif --=20 2.17.1 From nobody Thu May 9 22:44:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1558298961; cv=none; d=zoho.com; s=zohoarc; b=bV3U2ZHl67riV+v4iSNbGICiOkyOS3t0B9/o7auBeIIneEW2wiBvJ8ED8gFmpyaLkJR/vtHXnE3aoyb1ypR/YkyMOOZmGVmh96RuxQZ41tQxbQm4yN+K5zBKizsXmpONbtIBnRUWElhWD3wqJ+qaVHwYDMaw9z+whOmFGb9/GQE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1558298961; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=o4Cy9KpSXJVO+i5TmvjoE8Way2fcEusxZ0oBwBxLiAg=; b=bL0QgRXoZCU3wtlsJfjXK7UPEvG+x/VxftMZGqHJCInE9+YyqDWx7thwXMA8uljLFIVvek9bAbAjY7CH/zyocHVnNUjUTdjK/gnW4n+OOL1TZfW75N+lZkao+LoGiglISKAURf0M94QCnMCxJzJGnaBGN8hZZj7DoA/NW2vtpdY= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1558298961168767.8466422549152; Sun, 19 May 2019 13:49:21 -0700 (PDT) Received: from localhost ([127.0.0.1]:53258 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSk0-0003pF-Tb for importer@patchew.org; Sun, 19 May 2019 16:49:08 -0400 Received: from eggs.gnu.org ([209.51.188.92]:50273) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSZ6-00033w-3X for qemu-devel@nongnu.org; Sun, 19 May 2019 16:37:54 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hSSZ3-0003hS-Nm for qemu-devel@nongnu.org; Sun, 19 May 2019 16:37:52 -0400 Received: from mail-pl1-x642.google.com ([2607:f8b0:4864:20::642]:39844) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hSSZ3-0003gO-EI for qemu-devel@nongnu.org; Sun, 19 May 2019 16:37:49 -0400 Received: by mail-pl1-x642.google.com with SMTP id g9so5708907plm.6 for ; Sun, 19 May 2019 13:37:49 -0700 (PDT) Received: from localhost.localdomain (97-113-13-231.tukw.qwest.net. [97.113.13.231]) by smtp.gmail.com with ESMTPSA id i7sm11397448pfo.19.2019.05.19.13.37.46 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 19 May 2019 13:37:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=o4Cy9KpSXJVO+i5TmvjoE8Way2fcEusxZ0oBwBxLiAg=; b=F1xJvdIFpvumBk/ySlZuqw0XRxRY6ZfNLveLW0AvHyJNvnL5W16xq+eDZX/bgy8piS ss5FHWYC2WeEsLR6NbKdRp/TncIXblzrgGxSlhHE1mcPdWMzb2pca7uc0g+EWKAgi3MG cKKQHJ5mIvCET3++Ep6E2zTKvG5tvNOA2mCdV9NJmuK/317ana0tvbe6SYEMIVD9DHzN lxnYtqvnjNGO4N/ehA9zbv/q2O55UNEL6UY9StW7uKKpH4pcV1EAq4wseZJgiTvdZ6Ux Wr4s4VM67vRO68v2g10r77NKZNLnk/rqA9cTCyq/rYucgIDjlAbsrmTg6iHdljfojZu2 Zv8w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=o4Cy9KpSXJVO+i5TmvjoE8Way2fcEusxZ0oBwBxLiAg=; b=WuAwVNtoUglNnw0YZrzS+X3TyW8yCOo1gLwKddrQYSH5+SJ+ehbVN+kwc1UKXT6veB mYBA5Sb2NVAAGxpU9hjEU6/fLOLfafVyr87DMwQuIr9/y3XalWs+WlPKtObGCxX1wex5 9gPg+bkR7IXfUfaPsBxyVkEJq9+WaRbJWRWnc/jnoEV5Uz1BkcV97BbYm3LymdRFSCkb 2MC+smIecbxLHnmURsBDF7HBC7VSm+r3rTkmKPVEQKHTwCP8NGNZYIRMK51Z8/mwSy8n iVd//Mnqm6dq3bfJPTtZJ/IWIopcEnDZfUXmA4YUpukzrzuqlBnLh33lCAYfAQ/soyVp WgcA== X-Gm-Message-State: APjAAAUeh11W7thSAdTTMdIZjFATrl4H/BdWHfoBLLJEixDK2qOze+b7 A+Ey9US0ID3MZOVqHzqcHLWe/5NBPok= X-Google-Smtp-Source: APXvYqzEiGn72FqtOfd7vSFmEPFh6Grj1TOaQF8dxhT3oV8vIDg7YacHq9wI4LxOBVo4NrfjFqKH3Q== X-Received: by 2002:a17:902:c85:: with SMTP id 5mr70134481plt.172.1558298267981; Sun, 19 May 2019 13:37:47 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sun, 19 May 2019 13:36:26 -0700 Message-Id: <20190519203726.20729-15-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190519203726.20729-1-richard.henderson@linaro.org> References: <20190519203726.20729-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::642 Subject: [Qemu-devel] [PATCH v7 14/74] linux-user: Split out memory syscalls X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: laurent@vivier.eu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" This includes mmap, mmap2, munmap, mlock, mlockall, munlock, munlockall, mprotect, mremap, msync. Signed-off-by: Richard Henderson --- linux-user/syscall-defs.h | 24 ++++++ linux-user/syscall.h | 2 + linux-user/strace.c | 55 ++----------- linux-user/syscall-mem.inc.c | 154 +++++++++++++++++++++++++++++++++++ linux-user/syscall.c | 119 +-------------------------- linux-user/strace.list | 33 -------- 6 files changed, 189 insertions(+), 198 deletions(-) create mode 100644 linux-user/syscall-mem.inc.c diff --git a/linux-user/syscall-defs.h b/linux-user/syscall-defs.h index 6d6349da01..88f433e998 100644 --- a/linux-user/syscall-defs.h +++ b/linux-user/syscall-defs.h @@ -20,6 +20,26 @@ SYSCALL_DEF(close, ARG_DEC); #ifdef TARGET_NR_ipc SYSCALL_DEF_ARGS(ipc, ARG_HEX, ARG_DEC, ARG_DEC, ARG_HEX, ARG_PTR, ARG_HEX= ); #endif +SYSCALL_DEF(mlock, ARG_PTR, ARG_DEC); +SYSCALL_DEF(mlockall, ARG_HEX); +#ifdef TARGET_NR_mmap +SYSCALL_DEF_FULL(mmap, .impl =3D impl_mmap, + .args =3D args_mmap, + .print_ret =3D print_syscall_ptr_ret, + .arg_type =3D { ARG_PTR, ARG_DEC, ARG_MMAPPROT, + ARG_MMAPFLAG, ARG_DEC, ARG_DEC }); +#endif +#ifdef TARGET_NR_mmap2 +SYSCALL_DEF_FULL(mmap2, .impl =3D impl_mmap, + .args =3D args_mmap2, + .print_ret =3D print_syscall_ptr_ret, + .arg_type =3D { ARG_PTR, ARG_DEC, ARG_MMAPPROT, + ARG_MMAPFLAG, ARG_DEC, ARG_DEC64 }); +#endif +SYSCALL_DEF(mprotect, ARG_PTR, ARG_DEC, ARG_MMAPPROT); +SYSCALL_DEF_FULL(mremap, .impl =3D impl_mremap, + .print_ret =3D print_syscall_ptr_ret, + .arg_type =3D { ARG_PTR, ARG_DEC, ARG_DEC, ARG_HEX, ARG_P= TR }); #if !defined(SYSCALL_TABLE) || defined(TARGET_NR_msgctl) SYSCALL_DEF(msgctl, ARG_DEC, ARG_DEC, ARG_PTR); #endif @@ -32,6 +52,10 @@ SYSCALL_DEF(msgrcv, ARG_DEC, ARG_PTR, ARG_DEC, ARG_DEC, = ARG_HEX); #if !defined(SYSCALL_TABLE) || defined(TARGET_NR_msgsnd) SYSCALL_DEF(msgsnd, ARG_DEC, ARG_PTR, ARG_DEC, ARG_HEX); #endif +SYSCALL_DEF(msync, ARG_PTR, ARG_DEC, ARG_HEX); +SYSCALL_DEF(munlock, ARG_PTR, ARG_DEC); +SYSCALL_DEF(munlockall); +SYSCALL_DEF(munmap, ARG_PTR, ARG_DEC); SYSCALL_DEF(name_to_handle_at, ARG_ATDIRFD, ARG_STR, ARG_PTR, ARG_PTR, ARG_ATFLAG); #ifdef TARGET_NR_open diff --git a/linux-user/syscall.h b/linux-user/syscall.h index 83f602f8e7..8175de4c31 100644 --- a/linux-user/syscall.h +++ b/linux-user/syscall.h @@ -58,6 +58,8 @@ typedef enum { /* These print as sets of flags. */ ARG_ATDIRFD, ARG_ATFLAG, + ARG_MMAPFLAG, + ARG_MMAPPROT, ARG_MODEFLAG, ARG_OPENFLAG, =20 diff --git a/linux-user/strace.c b/linux-user/strace.c index e1c4859a95..a767227ac1 100644 --- a/linux-user/strace.c +++ b/linux-user/strace.c @@ -801,7 +801,7 @@ UNUSED static struct flags umount2_flags[] =3D { FLAG_END, }; =20 -UNUSED static struct flags mmap_prot_flags[] =3D { +static struct flags const mmap_prot_flags[] =3D { FLAG_GENERIC(PROT_NONE), FLAG_GENERIC(PROT_EXEC), FLAG_GENERIC(PROT_READ), @@ -812,7 +812,7 @@ UNUSED static struct flags mmap_prot_flags[] =3D { FLAG_END, }; =20 -UNUSED static struct flags mmap_flags[] =3D { +static struct flags const mmap_flags[] =3D { FLAG_TARGET(MAP_SHARED), FLAG_TARGET(MAP_PRIVATE), FLAG_TARGET(MAP_ANONYMOUS), @@ -2362,51 +2362,6 @@ print_utimensat(const struct syscallname *name, } #endif =20 -#if defined(TARGET_NR_mmap) || defined(TARGET_NR_mmap2) -static void -print_mmap(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - print_syscall_prologue(name); - print_pointer(arg0, 0); - print_raw_param("%d", arg1, 0); - print_flags(mmap_prot_flags, arg2, 0); - print_flags(mmap_flags, arg3, 0); - print_raw_param("%d", arg4, 0); - print_raw_param("%#x", arg5, 1); - print_syscall_epilogue(name); -} -#define print_mmap2 print_mmap -#endif - -#ifdef TARGET_NR_mprotect -static void -print_mprotect(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - print_syscall_prologue(name); - print_pointer(arg0, 0); - print_raw_param("%d", arg1, 0); - print_flags(mmap_prot_flags, arg2, 1); - print_syscall_epilogue(name); -} -#endif - -#ifdef TARGET_NR_munmap -static void -print_munmap(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - print_syscall_prologue(name); - print_pointer(arg0, 0); - print_raw_param("%d", arg1, 1); - print_syscall_epilogue(name); -} -#endif - #ifdef TARGET_NR_futex static void print_futex_op(abi_long tflag, int last) { @@ -2613,6 +2568,12 @@ static void print_syscall_def1(const SyscallDef *def= , int64_t args[6]) case ARG_ATFLAG: len =3D add_flags(b, rest, at_file_flags, arg, false); break; + case ARG_MMAPFLAG: + len =3D add_flags(b, rest, mmap_flags, arg, false); + break; + case ARG_MMAPPROT: + len =3D add_flags(b, rest, mmap_prot_flags, arg, false); + break; case ARG_MODEFLAG: len =3D add_flags(b, rest, mode_flags, arg, true); break; diff --git a/linux-user/syscall-mem.inc.c b/linux-user/syscall-mem.inc.c new file mode 100644 index 0000000000..d2ce0cb8cc --- /dev/null +++ b/linux-user/syscall-mem.inc.c @@ -0,0 +1,154 @@ +/* + * Linux memory-related syscalls + * Copyright (c) 2003 Fabrice Bellard + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + */ + + +static bitmask_transtbl const mmap_flags_tbl[] =3D { + { TARGET_MAP_SHARED, TARGET_MAP_SHARED, MAP_SHARED, MAP_SHARED }, + { TARGET_MAP_PRIVATE, TARGET_MAP_PRIVATE, MAP_PRIVATE, MAP_PRIVATE }, + { TARGET_MAP_FIXED, TARGET_MAP_FIXED, MAP_FIXED, MAP_FIXED }, + { TARGET_MAP_ANONYMOUS, TARGET_MAP_ANONYMOUS, + MAP_ANONYMOUS, MAP_ANONYMOUS }, + { TARGET_MAP_GROWSDOWN, TARGET_MAP_GROWSDOWN, + MAP_GROWSDOWN, MAP_GROWSDOWN }, + { TARGET_MAP_DENYWRITE, TARGET_MAP_DENYWRITE, + MAP_DENYWRITE, MAP_DENYWRITE }, + { TARGET_MAP_EXECUTABLE, TARGET_MAP_EXECUTABLE, + MAP_EXECUTABLE, MAP_EXECUTABLE }, + { TARGET_MAP_LOCKED, TARGET_MAP_LOCKED, MAP_LOCKED, MAP_LOCKED }, + { TARGET_MAP_NORESERVE, TARGET_MAP_NORESERVE, + MAP_NORESERVE, MAP_NORESERVE }, + { TARGET_MAP_HUGETLB, TARGET_MAP_HUGETLB, MAP_HUGETLB, MAP_HUGETLB }, + /* + * MAP_STACK had been ignored by the kernel for quite some time. + * Recognize it for the target insofar as we do not want to pass + * it through to the host. + */ + { TARGET_MAP_STACK, TARGET_MAP_STACK, 0, 0 }, + { 0, 0, 0, 0 } +}; + + +SYSCALL_IMPL(mlock) +{ + return get_errno(mlock(g2h(arg1), arg2)); +} + +SYSCALL_IMPL(mlockall) +{ + int host_flag =3D 0; + if (arg1 & TARGET_MLOCKALL_MCL_CURRENT) { + host_flag |=3D MCL_CURRENT; + } + if (arg1 & TARGET_MLOCKALL_MCL_FUTURE) { + host_flag |=3D MCL_FUTURE; + } + return get_errno(mlockall(host_flag)); +} + +#if (defined(TARGET_I386) && defined(TARGET_ABI32)) || \ + (defined(TARGET_ARM) && defined(TARGET_ABI32)) || \ + defined(TARGET_M68K) || defined(TARGET_CRIS) || \ + defined(TARGET_MICROBLAZE) || defined(TARGET_S390X) +SYSCALL_ARGS(mmap) +{ + abi_ulong ptr =3D in[0]; + abi_long *v =3D lock_user(VERIFY_READ, ptr, 6 * sizeof(abi_long), 1); + if (v =3D=3D NULL) { + errno =3D EFAULT; + return NULL; + } + out[0] =3D tswapal(v[0]); + out[1] =3D tswapal(v[1]); + out[2] =3D tswapal(v[2]); + out[3] =3D tswapal(v[3]); + out[4] =3D tswapal(v[4]); + out[5] =3D tswapal(v[5]); + unlock_user(v, ptr, 0); + return def; +} +#else +# define args_mmap NULL +#endif + +SYSCALL_IMPL(mmap) +{ + int host_flags =3D target_to_host_bitmask(arg4, mmap_flags_tbl); + return get_errno(target_mmap(arg1, arg2, arg3, host_flags, arg5, arg6)= ); +} + +#ifdef TARGET_NR_mmap2 +/* + * Define mmap2 in terms of mmap. + * !!! Note that there is a fundamental problem here in that + * target_mmap has an offset parameter that is abi_ulong + * and not off_t. This means that we cannot actually pass + * through a 64-bit file offset as intended. + */ + +#ifndef MMAP_SHIFT +# define MMAP_SHIFT 12 +#endif + +SYSCALL_ARGS(mmap2) +{ + /* We have already assigned out[0-4]. */ + out[5] =3D (uint64_t)(abi_ulong)in[5] << MMAP_SHIFT; + return def; +} +#endif + +SYSCALL_IMPL(mprotect) +{ + CPUState *cpu =3D ENV_GET_CPU(cpu_env); + TaskState *ts =3D cpu->opaque; + + /* Special hack to detect libc making the stack executable. */ + if ((arg3 & PROT_GROWSDOWN) + && arg1 >=3D ts->info->stack_limit + && arg1 <=3D ts->info->start_stack) { + arg3 &=3D ~PROT_GROWSDOWN; + arg2 =3D arg2 + arg1 - ts->info->stack_limit; + arg1 =3D ts->info->stack_limit; + } + return get_errno(target_mprotect(arg1, arg2, arg3)); +} + +SYSCALL_IMPL(mremap) +{ + return get_errno(target_mremap(arg1, arg2, arg3, arg4, arg5)); +} + +SYSCALL_IMPL(msync) +{ + return get_errno(msync(g2h(arg1), arg2, arg3)); +} + +SYSCALL_IMPL(munlock) +{ + return get_errno(munlock(g2h(arg1), arg2)); +} + +SYSCALL_IMPL(munlockall) +{ + return get_errno(munlockall()); +} + +SYSCALL_IMPL(munmap) +{ + return get_errno(target_munmap(arg1, arg2)); +} diff --git a/linux-user/syscall.c b/linux-user/syscall.c index ca345ffb4c..876426dd9c 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -4183,29 +4183,6 @@ static const StructEntry struct_termios_def =3D { .align =3D { __alignof__(struct target_termios), __alignof__(struct ho= st_termios) }, }; =20 -static bitmask_transtbl mmap_flags_tbl[] =3D { - { TARGET_MAP_SHARED, TARGET_MAP_SHARED, MAP_SHARED, MAP_SHARED }, - { TARGET_MAP_PRIVATE, TARGET_MAP_PRIVATE, MAP_PRIVATE, MAP_PRIVATE }, - { TARGET_MAP_FIXED, TARGET_MAP_FIXED, MAP_FIXED, MAP_FIXED }, - { TARGET_MAP_ANONYMOUS, TARGET_MAP_ANONYMOUS, - MAP_ANONYMOUS, MAP_ANONYMOUS }, - { TARGET_MAP_GROWSDOWN, TARGET_MAP_GROWSDOWN, - MAP_GROWSDOWN, MAP_GROWSDOWN }, - { TARGET_MAP_DENYWRITE, TARGET_MAP_DENYWRITE, - MAP_DENYWRITE, MAP_DENYWRITE }, - { TARGET_MAP_EXECUTABLE, TARGET_MAP_EXECUTABLE, - MAP_EXECUTABLE, MAP_EXECUTABLE }, - { TARGET_MAP_LOCKED, TARGET_MAP_LOCKED, MAP_LOCKED, MAP_LOCKED }, - { TARGET_MAP_NORESERVE, TARGET_MAP_NORESERVE, - MAP_NORESERVE, MAP_NORESERVE }, - { TARGET_MAP_HUGETLB, TARGET_MAP_HUGETLB, MAP_HUGETLB, MAP_HUGETLB }, - /* MAP_STACK had been ignored by the kernel for quite some time. - Recognize it for the target insofar as we do not want to pass - it through to the host. */ - { TARGET_MAP_STACK, TARGET_MAP_STACK, 0, 0 }, - { 0, 0, 0, 0 } -}; - #if defined(TARGET_I386) =20 /* NOTE: there is really one LDT for all the threads */ @@ -5428,21 +5405,6 @@ static inline abi_long target_to_host_sigevent(struc= t sigevent *host_sevp, return 0; } =20 -#if defined(TARGET_NR_mlockall) -static inline int target_to_host_mlockall_arg(int arg) -{ - int result =3D 0; - - if (arg & TARGET_MLOCKALL_MCL_CURRENT) { - result |=3D MCL_CURRENT; - } - if (arg & TARGET_MLOCKALL_MCL_FUTURE) { - result |=3D MCL_FUTURE; - } - return result; -} -#endif - #if (defined(TARGET_NR_stat64) || defined(TARGET_NR_lstat64) || \ defined(TARGET_NR_fstat64) || defined(TARGET_NR_fstatat64) || \ defined(TARGET_NR_newfstatat)) @@ -7052,86 +7014,6 @@ static abi_long do_syscall1(void *cpu_env, int num, = abi_long arg1, ret =3D get_errno(reboot(arg1, arg2, arg3, NULL)); } return ret; -#ifdef TARGET_NR_mmap - case TARGET_NR_mmap: -#if (defined(TARGET_I386) && defined(TARGET_ABI32)) || \ - (defined(TARGET_ARM) && defined(TARGET_ABI32)) || \ - defined(TARGET_M68K) || defined(TARGET_CRIS) || defined(TARGET_MICROBL= AZE) \ - || defined(TARGET_S390X) - { - abi_ulong *v; - abi_ulong v1, v2, v3, v4, v5, v6; - if (!(v =3D lock_user(VERIFY_READ, arg1, 6 * sizeof(abi_ulong)= , 1))) - return -TARGET_EFAULT; - v1 =3D tswapal(v[0]); - v2 =3D tswapal(v[1]); - v3 =3D tswapal(v[2]); - v4 =3D tswapal(v[3]); - v5 =3D tswapal(v[4]); - v6 =3D tswapal(v[5]); - unlock_user(v, arg1, 0); - ret =3D get_errno(target_mmap(v1, v2, v3, - target_to_host_bitmask(v4, mmap_fl= ags_tbl), - v5, v6)); - } -#else - ret =3D get_errno(target_mmap(arg1, arg2, arg3, - target_to_host_bitmask(arg4, mmap_flag= s_tbl), - arg5, - arg6)); -#endif - return ret; -#endif -#ifdef TARGET_NR_mmap2 - case TARGET_NR_mmap2: -#ifndef MMAP_SHIFT -#define MMAP_SHIFT 12 -#endif - ret =3D target_mmap(arg1, arg2, arg3, - target_to_host_bitmask(arg4, mmap_flags_tbl), - arg5, arg6 << MMAP_SHIFT); - return get_errno(ret); -#endif - case TARGET_NR_munmap: - return get_errno(target_munmap(arg1, arg2)); - case TARGET_NR_mprotect: - { - TaskState *ts =3D cpu->opaque; - /* Special hack to detect libc making the stack executable. */ - if ((arg3 & PROT_GROWSDOWN) - && arg1 >=3D ts->info->stack_limit - && arg1 <=3D ts->info->start_stack) { - arg3 &=3D ~PROT_GROWSDOWN; - arg2 =3D arg2 + arg1 - ts->info->stack_limit; - arg1 =3D ts->info->stack_limit; - } - } - return get_errno(target_mprotect(arg1, arg2, arg3)); -#ifdef TARGET_NR_mremap - case TARGET_NR_mremap: - return get_errno(target_mremap(arg1, arg2, arg3, arg4, arg5)); -#endif - /* ??? msync/mlock/munlock are broken for softmmu. */ -#ifdef TARGET_NR_msync - case TARGET_NR_msync: - return get_errno(msync(g2h(arg1), arg2, arg3)); -#endif -#ifdef TARGET_NR_mlock - case TARGET_NR_mlock: - return get_errno(mlock(g2h(arg1), arg2)); -#endif -#ifdef TARGET_NR_munlock - case TARGET_NR_munlock: - return get_errno(munlock(g2h(arg1), arg2)); -#endif -#ifdef TARGET_NR_mlockall - case TARGET_NR_mlockall: - return get_errno(mlockall(target_to_host_mlockall_arg(arg1))); -#endif -#ifdef TARGET_NR_munlockall - case TARGET_NR_munlockall: - return get_errno(munlockall()); -#endif #ifdef TARGET_NR_truncate case TARGET_NR_truncate: if (!(p =3D lock_user_string(arg1))) @@ -10092,6 +9974,7 @@ static abi_long do_syscall1(void *cpu_env, int num, = abi_long arg1, =20 #include "syscall-file.inc.c" #include "syscall-ipc.inc.c" +#include "syscall-mem.inc.c" =20 #undef SYSCALL_IMPL #undef SYSCALL_ARGS diff --git a/linux-user/strace.list b/linux-user/strace.list index f99bd57c09..cc0bb10a7a 100644 --- a/linux-user/strace.list +++ b/linux-user/strace.list @@ -554,21 +554,6 @@ #ifdef TARGET_NR_mknodat { TARGET_NR_mknodat, "mknodat" , NULL, print_mknodat, NULL }, #endif -#ifdef TARGET_NR_mlock -{ TARGET_NR_mlock, "mlock" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_mlock2 -{ TARGET_NR_mlock2, "mlock2" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_mlockall -{ TARGET_NR_mlockall, "mlockall" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_mmap -{ TARGET_NR_mmap, "mmap" , NULL, print_mmap, print_syscall_ret_addr }, -#endif -#ifdef TARGET_NR_mmap2 -{ TARGET_NR_mmap2, "mmap2" , NULL, print_mmap2, print_syscall_ret_addr }, -#endif #ifdef TARGET_NR_modify_ldt { TARGET_NR_modify_ldt, "modify_ldt" , NULL, NULL, NULL }, #endif @@ -578,9 +563,6 @@ #ifdef TARGET_NR_move_pages { TARGET_NR_move_pages, "move_pages" , NULL, NULL, NULL }, #endif -#ifdef TARGET_NR_mprotect -{ TARGET_NR_mprotect, "mprotect" , NULL, print_mprotect, NULL }, -#endif #ifdef TARGET_NR_mpx { TARGET_NR_mpx, "mpx" , NULL, NULL, NULL }, #endif @@ -602,24 +584,9 @@ #ifdef TARGET_NR_mq_unlink { TARGET_NR_mq_unlink, "mq_unlink" , NULL, print_mq_unlink, NULL }, #endif -#ifdef TARGET_NR_mremap -{ TARGET_NR_mremap, "mremap" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_msync -{ TARGET_NR_msync, "msync" , NULL, NULL, NULL }, -#endif #ifdef TARGET_NR_multiplexer { TARGET_NR_multiplexer, "multiplexer" , NULL, NULL, NULL }, #endif -#ifdef TARGET_NR_munlock -{ TARGET_NR_munlock, "munlock" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_munlockall -{ TARGET_NR_munlockall, "munlockall" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_munmap -{ TARGET_NR_munmap, "munmap" , NULL, print_munmap, NULL }, -#endif #ifdef TARGET_NR_nanosleep { TARGET_NR_nanosleep, "nanosleep" , NULL, NULL, NULL }, #endif --=20 2.17.1 From nobody Thu May 9 22:44:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1558298767; cv=none; d=zoho.com; s=zohoarc; b=HntdE3oKw77EKiqIJp0sC7lwSvAV6NL/bTZpvPDbAnteKir7vjOfAAA4+bWaTDXtmbKccJCPqdEgTQVrU/GwyLGvM/mNuB2Md5/Bo4Rqh4VUw9or5/v5mpOoL3kUgXDQZPtfvC+fVBkCekzpIfnwSZ1PqYgJMdrHgjDYMyTOq2E= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1558298767; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=VSlxea5X8kmlG4BCCYdaO6spDVy0J4IfrRmHvvWJsEo=; b=U+iwB04vs9iTTsIHMXngaIqc9O6pnxisRzo8YV6C3cVWshH6JkQgrzV6z2iTZxCgbgcp2KWVEdZSu4V9IQKP416bHwqiHJF1VcQ+Fhx/hJSsmhZ7jl5dxSAzJ0Yia32iVaXBu7UZLj6YfW0XZU3FcG5g2BNtuvLWmG6zddLm/5I= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (209.51.188.17 [209.51.188.17]) by mx.zohomail.com with SMTPS id 1558298767167513.1977392093935; Sun, 19 May 2019 13:46:07 -0700 (PDT) Received: from localhost ([127.0.0.1]:53234 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSgv-00018F-Rv for importer@patchew.org; Sun, 19 May 2019 16:45:57 -0400 Received: from eggs.gnu.org ([209.51.188.92]:50275) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSZ6-000347-6c for qemu-devel@nongnu.org; Sun, 19 May 2019 16:37:53 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hSSZ4-0003id-PS for qemu-devel@nongnu.org; Sun, 19 May 2019 16:37:52 -0400 Received: from mail-pl1-x644.google.com ([2607:f8b0:4864:20::644]:35573) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hSSZ4-0003hq-JB for qemu-devel@nongnu.org; Sun, 19 May 2019 16:37:50 -0400 Received: by mail-pl1-x644.google.com with SMTP id p1so336283plo.2 for ; Sun, 19 May 2019 13:37:50 -0700 (PDT) Received: from localhost.localdomain (97-113-13-231.tukw.qwest.net. [97.113.13.231]) by smtp.gmail.com with ESMTPSA id i7sm11397448pfo.19.2019.05.19.13.37.48 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 19 May 2019 13:37:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=VSlxea5X8kmlG4BCCYdaO6spDVy0J4IfrRmHvvWJsEo=; b=h9mbQQ3SGTfIiYm6DeVYwSPJhUaB8QQBVG94ifShCK+mh+hBW7yDCIxug4QxQNRwtE 5n4KFaTt2nNUgT6++NfshS0weturRSOcJGQp8c5UHxko9TmrdeEnLbayqooSdX4SPHRi sp2xjIfb3WInVj5vUBSOX7G1YZN8GwSAnaiXImnMHlyn1lyZh/sr1tNKIu7c6TM9Xbjc 8nIRGRtDOLxNoDcfUnaOcCIaEtAwZG7c5SRQBsWkDPFRIR6/EduXcaf8OOdzPP3XPvcc yIgjCScjNkpUWUutc88dU4HtEtp1p3JgdSZXdb47hjE7D+G3QyLVFlPVJOYWBoNGzmLp 5+uQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=VSlxea5X8kmlG4BCCYdaO6spDVy0J4IfrRmHvvWJsEo=; b=ZAh6P6iK1EGuuyYK8ccvnlYLRyAXHcAF615HReNxyLPQTEVsDoXFt7VaGtStiVRpfL g2aV86Q+3z3YZKTASBz0yBPHemEYiCQHJqcdTZJx58e5vFUeWXcUPByrL3qy76EEvlGI 7TYBP7lBbRTrO92WyUEYjs9Y0clCN7wGv/l2JZOMfmRbDFOSFXYKQEH0lfyFxIsGFF1z Ao0fjhithkkiN3RMKNQZE9BtodmZl/8yjXAhJPZKZVVkMEX2q/5SOtGgLoWlKU84t7B7 duHx5kdY7ajKzDp2lH0SMHBtMfBnTi6wUMoJMwwfURDcVW5zPgBB7c3XaJmBGrsf5Zme IiuQ== X-Gm-Message-State: APjAAAVyF6WRKgfPJpZLrJ7tWbBu3SqP+/JHi3xWH8Z62LCXaju/00jL nKBXpK+kXHbReqzq+SZHdBjsV5fT+fM= X-Google-Smtp-Source: APXvYqztCFumxDkQltuLHOaBHvO51Ba8Q32k0VRxSQrFQ+MRgx0CuHlzAG0tD0zkrwESHoU4PFRlYg== X-Received: by 2002:a17:902:74c6:: with SMTP id f6mr13664060plt.335.1558298269373; Sun, 19 May 2019 13:37:49 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sun, 19 May 2019 13:36:27 -0700 Message-Id: <20190519203726.20729-16-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190519203726.20729-1-richard.henderson@linaro.org> References: <20190519203726.20729-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::644 Subject: [Qemu-devel] [PATCH v7 15/74] linux-user: Split out exit X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: laurent@vivier.eu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Richard Henderson --- linux-user/syscall-defs.h | 1 + linux-user/syscall-proc.inc.c | 61 +++++++++++++++++++++++++++++++++++ linux-user/syscall.c | 38 +--------------------- 3 files changed, 63 insertions(+), 37 deletions(-) create mode 100644 linux-user/syscall-proc.inc.c diff --git a/linux-user/syscall-defs.h b/linux-user/syscall-defs.h index 88f433e998..88aa1a6bfd 100644 --- a/linux-user/syscall-defs.h +++ b/linux-user/syscall-defs.h @@ -17,6 +17,7 @@ */ =20 SYSCALL_DEF(close, ARG_DEC); +SYSCALL_DEF(exit, ARG_DEC); #ifdef TARGET_NR_ipc SYSCALL_DEF_ARGS(ipc, ARG_HEX, ARG_DEC, ARG_DEC, ARG_HEX, ARG_PTR, ARG_HEX= ); #endif diff --git a/linux-user/syscall-proc.inc.c b/linux-user/syscall-proc.inc.c new file mode 100644 index 0000000000..96ad363c1a --- /dev/null +++ b/linux-user/syscall-proc.inc.c @@ -0,0 +1,61 @@ +/* + * Linux process related syscalls + * Copyright (c) 2003 Fabrice Bellard + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + */ + + +SYSCALL_IMPL(exit) +{ + CPUState *cpu =3D ENV_GET_CPU(cpu_env); + int status =3D arg1; + + /* + * In old applications this may be used to implement _exit(2). + * However in threaded applictions it is used for thread termination, + * and _exit_group is used for application termination. + * Do thread termination if we have more then one thread. + */ + if (block_signals()) { + return -TARGET_ERESTARTSYS; + } + + cpu_list_lock(); + + if (CPU_NEXT(first_cpu)) { + TaskState *ts; + + /* Remove the CPU from the list. */ + QTAILQ_REMOVE_RCU(&cpus, cpu, node); + + cpu_list_unlock(); + + ts =3D cpu->opaque; + if (ts->child_tidptr) { + put_user_u32(0, ts->child_tidptr); + sys_futex(g2h(ts->child_tidptr), FUTEX_WAKE, INT_MAX, + NULL, NULL, 0); + } + thread_cpu =3D NULL; + object_unref(OBJECT(cpu)); + g_free(ts); + rcu_unregister_thread(); + pthread_exit(NULL); + } + + cpu_list_unlock(); + preexit_cleanup(cpu_env, status); + _exit(status); +} diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 876426dd9c..c72d24aa76 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -5681,43 +5681,6 @@ static abi_long do_syscall1(void *cpu_env, int num, = abi_long arg1, void *p; =20 switch(num) { - case TARGET_NR_exit: - /* In old applications this may be used to implement _exit(2). - However in threaded applictions it is used for thread terminati= on, - and _exit_group is used for application termination. - Do thread termination if we have more then one thread. */ - - if (block_signals()) { - return -TARGET_ERESTARTSYS; - } - - cpu_list_lock(); - - if (CPU_NEXT(first_cpu)) { - TaskState *ts; - - /* Remove the CPU from the list. */ - QTAILQ_REMOVE_RCU(&cpus, cpu, node); - - cpu_list_unlock(); - - ts =3D cpu->opaque; - if (ts->child_tidptr) { - put_user_u32(0, ts->child_tidptr); - sys_futex(g2h(ts->child_tidptr), FUTEX_WAKE, INT_MAX, - NULL, NULL, 0); - } - thread_cpu =3D NULL; - object_unref(OBJECT(cpu)); - g_free(ts); - rcu_unregister_thread(); - pthread_exit(NULL); - } - - cpu_list_unlock(); - preexit_cleanup(cpu_env, arg1); - _exit(arg1); - return 0; /* avoid warning */ case TARGET_NR_brk: return do_brk(arg1); #ifdef TARGET_NR_fork @@ -9975,6 +9938,7 @@ static abi_long do_syscall1(void *cpu_env, int num, a= bi_long arg1, #include "syscall-file.inc.c" #include "syscall-ipc.inc.c" #include "syscall-mem.inc.c" +#include "syscall-proc.inc.c" =20 #undef SYSCALL_IMPL #undef SYSCALL_ARGS --=20 2.17.1 From nobody Thu May 9 22:44:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1558299006; cv=none; d=zoho.com; s=zohoarc; b=ZYzJL+qI2TybaiQkQQrpVThw5MEe/pDL52A03RsMFrz8v6pJ+YZpKlxQd2OX43bqE1djhp7N3NCsCrheNgQM1kHqwdkfbZUjWkn0cnZElvmv2WXsyVS3DlH8Q0Lmf6HglycsrEnqmjH0ma7j9UHRXZYFmsiQ6Du9Cb0rohkvoXU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1558299006; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=mCaCI2Aj5tC2IpfdxPu1UNH/KS+6aMoVb/BQvf6d4j4=; b=fRpJ/d/OQU7kO7FCQ06X4OuYZtSCnTEkVCZ/ceWjo+FEGYQUQTg50RewSutNUtFtDaj4YrQfLAah6uu6rAt6PR/WfN3hClsr64n6D9piVzxAERll7hQIWprJVrTfrQEw3tY7mfmBnH1TIUq1FUwEfDF6CDxmIpa8/FRicjo8ia8= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1558299006136900.4373790359149; Sun, 19 May 2019 13:50:06 -0700 (PDT) Received: from localhost ([127.0.0.1]:53262 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSkq-0004SB-0W for importer@patchew.org; Sun, 19 May 2019 16:50:00 -0400 Received: from eggs.gnu.org ([209.51.188.92]:50303) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSZ8-000395-AH for qemu-devel@nongnu.org; Sun, 19 May 2019 16:37:56 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hSSZ6-0003kf-CI for qemu-devel@nongnu.org; Sun, 19 May 2019 16:37:54 -0400 Received: from mail-pl1-x642.google.com ([2607:f8b0:4864:20::642]:44234) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hSSZ6-0003jY-42 for qemu-devel@nongnu.org; Sun, 19 May 2019 16:37:52 -0400 Received: by mail-pl1-x642.google.com with SMTP id c5so5690537pll.11 for ; Sun, 19 May 2019 13:37:52 -0700 (PDT) Received: from localhost.localdomain (97-113-13-231.tukw.qwest.net. [97.113.13.231]) by smtp.gmail.com with ESMTPSA id i7sm11397448pfo.19.2019.05.19.13.37.49 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 19 May 2019 13:37:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=mCaCI2Aj5tC2IpfdxPu1UNH/KS+6aMoVb/BQvf6d4j4=; b=Kmei6DvMOhI+sXk4Bjs7SeJuH3jJYoD7ED4pYajTKSF/tghvhB/LFLnN1MZNmgGdpW tTGnhJvRO37FaGg4tWGT0unzkfueIqkyngEiUQkeE6vbg2TjPh3+rdujhZeluv0KzlFP kxD8Pbw3LM6yagoniOknL9d+ZfidIikCyKFk3BJxHT/EDixK/GvFcLXUgykk9q2GwSxC UVoYdMtQoDlk3dUCYvbPZKRUXfcfA3mhOBtZWbpIX6aHBgxzBEEQzH1GAgbp6digMePk GDFeqfa34hXbV8YaifR8UHw/U6vtn2Twma/dnYxXYsji9jChZ3o3JXnlpZuyhBV3dtLz Vg+Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=mCaCI2Aj5tC2IpfdxPu1UNH/KS+6aMoVb/BQvf6d4j4=; b=sPrOEMa7SFglPf84Nch8QGqDyfvKmpOXG1a1PU/L3OukWYjrrhZQg/DQ0a4nWUor3m 76yHqtEiDplu2VeJeJnqiD7IhD/zDP2Ll9wBGSFmG7IZCGoW1nqVzg4sg1CJ0yryaEjx 5nXsCrIa/HlBtnbx1yIRpK/vmJSdos60hwoDXjW1jNdo0EuflyVuyZ8bxtz/jIqaceMt 1nPX8p/rmR3huxgBR7sZjkyAYlNtM/qd2TcphFxZPsXBcWurEkwOUbaZBHuN01N5G7dd UX7inOieZYXdzvaTEfzq32knUAjIE+v0EcDQng8Ear6oNiXdMUVqQLPCRj5ZhC6yateF OKew== X-Gm-Message-State: APjAAAVVUO/XJaS85ilSEn+rir/h7C7QuUo5VuY9I5/9a6dEF8HzktO4 Qoj8e0prXgC2XIXqbo3eQy+/wbSa9dA= X-Google-Smtp-Source: APXvYqziRbqHqaagx1ucYz4rcZFqBUBHu2fMiu2dTNkb/Zy2cQZjvvAObU8FP3QnCcHELMRYWde8HA== X-Received: by 2002:a17:902:2bc9:: with SMTP id l67mr35897710plb.171.1558298270873; Sun, 19 May 2019 13:37:50 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sun, 19 May 2019 13:36:28 -0700 Message-Id: <20190519203726.20729-17-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190519203726.20729-1-richard.henderson@linaro.org> References: <20190519203726.20729-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::642 Subject: [Qemu-devel] [PATCH v7 16/74] linux-user: Split out brk X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: laurent@vivier.eu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Richard Henderson --- linux-user/syscall-defs.h | 3 ++ linux-user/strace.c | 35 -------------- linux-user/syscall-mem.inc.c | 90 ++++++++++++++++++++++++++++++++++ linux-user/syscall.c | 93 ------------------------------------ linux-user/strace.list | 3 -- 5 files changed, 93 insertions(+), 131 deletions(-) diff --git a/linux-user/syscall-defs.h b/linux-user/syscall-defs.h index 88aa1a6bfd..c3ed22ff16 100644 --- a/linux-user/syscall-defs.h +++ b/linux-user/syscall-defs.h @@ -16,6 +16,9 @@ * along with this program; if not, see . */ =20 +SYSCALL_DEF_FULL(brk, .impl =3D impl_brk, + .print_ret =3D print_syscall_ptr_ret, + .arg_type =3D { ARG_PTR }); SYSCALL_DEF(close, ARG_DEC); SYSCALL_DEF(exit, ARG_DEC); #ifdef TARGET_NR_ipc diff --git a/linux-user/strace.c b/linux-user/strace.c index a767227ac1..0a2c6764db 100644 --- a/linux-user/strace.c +++ b/linux-user/strace.c @@ -604,29 +604,6 @@ print_execve(const struct syscallname *name, * Variants for the return value output function */ =20 -static void -print_syscall_ret_addr(const struct syscallname *name, abi_long ret) -{ - const char *errstr =3D NULL; - - if (ret < 0) { - errstr =3D target_strerror(-ret); - } - if (errstr) { - gemu_log(" =3D -1 errno=3D%d (%s)\n", (int)-ret, errstr); - } else { - gemu_log(" =3D 0x" TARGET_ABI_FMT_lx "\n", ret); - } -} - -#if 0 /* currently unused */ -static void -print_syscall_ret_raw(struct syscallname *name, abi_long ret) -{ - gemu_log(" =3D 0x" TARGET_ABI_FMT_lx "\n", ret); -} -#endif - #ifdef TARGET_NR__newselect static void print_syscall_ret_newselect(const struct syscallname *name, abi_long ret) @@ -1168,18 +1145,6 @@ print_access(const struct syscallname *name, } #endif =20 -#ifdef TARGET_NR_brk -static void -print_brk(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - print_syscall_prologue(name); - print_pointer(arg0, 1); - print_syscall_epilogue(name); -} -#endif - #ifdef TARGET_NR_chdir static void print_chdir(const struct syscallname *name, diff --git a/linux-user/syscall-mem.inc.c b/linux-user/syscall-mem.inc.c index d2ce0cb8cc..17ba8e3d97 100644 --- a/linux-user/syscall-mem.inc.c +++ b/linux-user/syscall-mem.inc.c @@ -42,6 +42,96 @@ static bitmask_transtbl const mmap_flags_tbl[] =3D { { 0, 0, 0, 0 } }; =20 +static abi_ulong target_brk; +static abi_ulong target_original_brk; +static abi_ulong brk_page; + +void target_set_brk(abi_ulong new_brk) +{ + target_original_brk =3D target_brk =3D HOST_PAGE_ALIGN(new_brk); + brk_page =3D HOST_PAGE_ALIGN(target_brk); +} + +/* do_brk() must return target values and target errnos. */ +abi_long do_brk(abi_ulong new_brk) +{ + abi_long mapped_addr; + abi_ulong new_alloc_size; + + if (!new_brk) { + return target_brk; + } + if (new_brk < target_original_brk) { + return target_brk; + } + + /* + * If the new brk is less than the highest page reserved to the + * target heap allocation, set it and we're almost done... + */ + if (new_brk <=3D brk_page) { + /* + * Heap contents are initialized to zero, + * as for anonymous mapped pages. + */ + if (new_brk > target_brk) { + memset(g2h(target_brk), 0, new_brk - target_brk); + } + target_brk =3D new_brk; + return target_brk; + } + + /* + * We need to allocate more memory after the brk... Note that + * we don't use MAP_FIXED because that will map over the top of + * any existing mapping (like the one with the host libc or qemu + * itself); instead we treat "mapped but at wrong address" as + * a failure and unmap again. + */ + new_alloc_size =3D HOST_PAGE_ALIGN(new_brk - brk_page); + mapped_addr =3D get_errno(target_mmap(brk_page, new_alloc_size, + PROT_READ | PROT_WRITE, + MAP_ANON | MAP_PRIVATE, 0, 0)); + + if (mapped_addr =3D=3D brk_page) { + /* + * Heap contents are initialized to zero, as for anonymous + * mapped pages. Technically the new pages are already + * initialized to zero since they *are* anonymous mapped + * pages, however we have to take care with the contents that + * come from the remaining part of the previous page: it may + * contains garbage data due to a previous heap usage (grown + * then shrunken). + */ + memset(g2h(target_brk), 0, brk_page - target_brk); + + target_brk =3D new_brk; + brk_page =3D HOST_PAGE_ALIGN(target_brk); + return target_brk; + } else if (mapped_addr !=3D -1) { + /* + * Mapped but at wrong address, meaning there wasn't actually + * enough space for this brk. + */ + target_munmap(mapped_addr, new_alloc_size); + mapped_addr =3D -1; + } + +#if defined(TARGET_ALPHA) + /* + * We (partially) emulate OSF/1 on Alpha, which requires we + * return a proper errno, not an unchanged brk value. + */ + return -TARGET_ENOMEM; +#endif + /* For everything else, return the previous break. */ + return target_brk; +} + +SYSCALL_IMPL(brk) +{ + return do_brk(arg1); +} =20 SYSCALL_IMPL(mlock) { diff --git a/linux-user/syscall.c b/linux-user/syscall.c index c72d24aa76..4c9953a7ab 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -820,97 +820,6 @@ static inline int host_to_target_sock_type(int host_ty= pe) return target_type; } =20 -static abi_ulong target_brk; -static abi_ulong target_original_brk; -static abi_ulong brk_page; - -void target_set_brk(abi_ulong new_brk) -{ - target_original_brk =3D target_brk =3D HOST_PAGE_ALIGN(new_brk); - brk_page =3D HOST_PAGE_ALIGN(target_brk); -} - -//#define DEBUGF_BRK(message, args...) do { fprintf(stderr, (message), ## = args); } while (0) -#define DEBUGF_BRK(message, args...) - -/* do_brk() must return target values and target errnos. */ -abi_long do_brk(abi_ulong new_brk) -{ - abi_long mapped_addr; - abi_ulong new_alloc_size; - - DEBUGF_BRK("do_brk(" TARGET_ABI_FMT_lx ") -> ", new_brk); - - if (!new_brk) { - DEBUGF_BRK(TARGET_ABI_FMT_lx " (!new_brk)\n", target_brk); - return target_brk; - } - if (new_brk < target_original_brk) { - DEBUGF_BRK(TARGET_ABI_FMT_lx " (new_brk < target_original_brk)\n", - target_brk); - return target_brk; - } - - /* If the new brk is less than the highest page reserved to the - * target heap allocation, set it and we're almost done... */ - if (new_brk <=3D brk_page) { - /* Heap contents are initialized to zero, as for anonymous - * mapped pages. */ - if (new_brk > target_brk) { - memset(g2h(target_brk), 0, new_brk - target_brk); - } - target_brk =3D new_brk; - DEBUGF_BRK(TARGET_ABI_FMT_lx " (new_brk <=3D brk_page)\n", target_= brk); - return target_brk; - } - - /* We need to allocate more memory after the brk... Note that - * we don't use MAP_FIXED because that will map over the top of - * any existing mapping (like the one with the host libc or qemu - * itself); instead we treat "mapped but at wrong address" as - * a failure and unmap again. - */ - new_alloc_size =3D HOST_PAGE_ALIGN(new_brk - brk_page); - mapped_addr =3D get_errno(target_mmap(brk_page, new_alloc_size, - PROT_READ|PROT_WRITE, - MAP_ANON|MAP_PRIVATE, 0, 0)); - - if (mapped_addr =3D=3D brk_page) { - /* Heap contents are initialized to zero, as for anonymous - * mapped pages. Technically the new pages are already - * initialized to zero since they *are* anonymous mapped - * pages, however we have to take care with the contents that - * come from the remaining part of the previous page: it may - * contains garbage data due to a previous heap usage (grown - * then shrunken). */ - memset(g2h(target_brk), 0, brk_page - target_brk); - - target_brk =3D new_brk; - brk_page =3D HOST_PAGE_ALIGN(target_brk); - DEBUGF_BRK(TARGET_ABI_FMT_lx " (mapped_addr =3D=3D brk_page)\n", - target_brk); - return target_brk; - } else if (mapped_addr !=3D -1) { - /* Mapped but at wrong address, meaning there wasn't actually - * enough space for this brk. - */ - target_munmap(mapped_addr, new_alloc_size); - mapped_addr =3D -1; - DEBUGF_BRK(TARGET_ABI_FMT_lx " (mapped_addr !=3D -1)\n", target_br= k); - } - else { - DEBUGF_BRK(TARGET_ABI_FMT_lx " (otherwise)\n", target_brk); - } - -#if defined(TARGET_ALPHA) - /* We (partially) emulate OSF/1 on Alpha, which requires we - return a proper errno, not an unchanged brk value. */ - return -TARGET_ENOMEM; -#endif - /* For everything else, return the previous break. */ - return target_brk; -} - static inline abi_long copy_from_user_fdset(fd_set *fds, abi_ulong target_fds_addr, int n) @@ -5681,8 +5590,6 @@ static abi_long do_syscall1(void *cpu_env, int num, a= bi_long arg1, void *p; =20 switch(num) { - case TARGET_NR_brk: - return do_brk(arg1); #ifdef TARGET_NR_fork case TARGET_NR_fork: return get_errno(do_fork(cpu_env, TARGET_SIGCHLD, 0, 0, 0, 0)); diff --git a/linux-user/strace.list b/linux-user/strace.list index cc0bb10a7a..aff6d1d73d 100644 --- a/linux-user/strace.list +++ b/linux-user/strace.list @@ -49,9 +49,6 @@ #ifdef TARGET_NR_break { TARGET_NR_break, "break" , NULL, NULL, NULL }, #endif -#ifdef TARGET_NR_brk -{ TARGET_NR_brk, "brk" , NULL, print_brk, print_syscall_ret_addr }, -#endif #ifdef TARGET_NR_cachectl { TARGET_NR_cachectl, "cachectl" , NULL, NULL, NULL }, #endif --=20 2.17.1 From nobody Thu May 9 22:44:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1558299161; cv=none; d=zoho.com; s=zohoarc; b=LPlhsZF41hhy+Uvx6A8r3wJg8iDWB6hF/OZzSVY6i/SAolPMbZwjVxVgURv+73ACkSrePr5MJNaY7K71zyCIF2/rYEVOLCjatCR2F4hNqkeo56D8U4ipe2XGq/6JX+DqmYKVdW5MHPEtStzLGc9BOSgz/hYKls2w9BG1kvTtBkE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1558299161; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=GeKcB8ORGxpti1PxzjsIlQCW/aF1Bi0ns/PGPDEyR6E=; b=hK2ZHqecpVDxd3Hr3+TRgMyJhWAmzKMlLEr1L+MtfVPS9aMIPg8c3bURy/dJ3ZUVJTN2ppAwMmDJw4TOC9I4nGjoOxOdefGT0XHDnWHWOOsfUPSAUMrR1DBovlRysQp7syyDewhLW0vbtJOWSM4fBZP1SU/NB5x8oeThJPA0O2M= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (209.51.188.17 [209.51.188.17]) by mx.zohomail.com with SMTPS id 1558299161049692.6043163157107; Sun, 19 May 2019 13:52:41 -0700 (PDT) Received: from localhost ([127.0.0.1]:53314 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSnF-0006cR-MG for importer@patchew.org; Sun, 19 May 2019 16:52:29 -0400 Received: from eggs.gnu.org ([209.51.188.92]:50341) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSZA-0003BM-VP for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:00 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hSSZ8-0003mt-9n for qemu-devel@nongnu.org; Sun, 19 May 2019 16:37:56 -0400 Received: from mail-pg1-x541.google.com ([2607:f8b0:4864:20::541]:34651) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hSSZ8-0003lk-0F for qemu-devel@nongnu.org; Sun, 19 May 2019 16:37:54 -0400 Received: by mail-pg1-x541.google.com with SMTP id c13so5747823pgt.1 for ; Sun, 19 May 2019 13:37:53 -0700 (PDT) Received: from localhost.localdomain (97-113-13-231.tukw.qwest.net. [97.113.13.231]) by smtp.gmail.com with ESMTPSA id i7sm11397448pfo.19.2019.05.19.13.37.51 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 19 May 2019 13:37:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=GeKcB8ORGxpti1PxzjsIlQCW/aF1Bi0ns/PGPDEyR6E=; b=j92yXq+7FpToCWsunOJcSUVYTj0LBNI4AtXiBchZS+sPxaAoFyVQWQ6BP//+QsjE4N uXhHm0qau38fw3qjruOkX+x7lKsvTfAx+adSBvXKesSDYgL3TzETDFduujC6V/e9MMk2 YsyJJAAI3mClXpEiR/h5H3JhkplBQH0Ps8vCrjNQgeltIabmBmJRbq5L31OAQEPFpujm f9TsrriPIMNrxcCnAW8Isj4hZ0whIWqbMyA46bqxT2CtnXCmXp305bT2P1X9e5UC7Od8 V4hUurt8uSbDG3a2T5iZkAnFFHB2sgNV9KOD8q+NXJXVxeDh/a1bOeVVEEwGsU9GGYld ND/Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=GeKcB8ORGxpti1PxzjsIlQCW/aF1Bi0ns/PGPDEyR6E=; b=ZIeinpWJjTc+aod2faaaDgUKsTO0S3F3t+84Tphp7xls+vQVjI7o66i/viB6yBnYqg k3siQgPHNUmRFp7e0MXl/YDzTq0mVRkqOKXlf0xA6rbZq9fSUO/Lp4No2mjtf/unuLR1 eklkAe8LNXottAsosSoHE3JJuvPHBvIaxJ0r5BUBKSOPDQJNBkGiDdqvjW7g+Stre9a5 ykwFI84Xu0y1NNhFvQSFNC15973Ms+6Z22hVpEzqd+51bFJLDVKpfgLWy1GA/BRW4ZLs EwUlicGrxnBD0W/vsfYP/lW4xR6jhwwAwY3yliSi4DSEIcUsrnFrLeSd/ZWTuBeWnMSc C5QA== X-Gm-Message-State: APjAAAXfkPWgqVGrJOl48kuDw9ZkvRssZoPqK4eAYVTZoNu2w9nQQHdI q695jjoSRHeRNtyPjtMBQs+RUmq6uAs= X-Google-Smtp-Source: APXvYqz+UXIGEGik239hFb4nTDu5nDOHzl6XBt983KQD2zWtQbwIW2lax8HtXhXGYNZIo2q1ZGzLcg== X-Received: by 2002:a62:b40a:: with SMTP id h10mr68782323pfn.216.1558298272127; Sun, 19 May 2019 13:37:52 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sun, 19 May 2019 13:36:29 -0700 Message-Id: <20190519203726.20729-18-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190519203726.20729-1-richard.henderson@linaro.org> References: <20190519203726.20729-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::541 Subject: [Qemu-devel] [PATCH v7 17/74] linux-user: Split out clone, fork, vfork X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: laurent@vivier.eu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Rename do_fork to do_clone, since that is what it does. Signed-off-by: Richard Henderson --- linux-user/syscall-defs.h | 8 ++ linux-user/syscall.h | 1 + linux-user/strace.c | 36 +---- linux-user/syscall-proc.inc.c | 259 ++++++++++++++++++++++++++++++++++ linux-user/syscall.c | 220 ----------------------------- linux-user/strace.list | 9 -- 6 files changed, 272 insertions(+), 261 deletions(-) diff --git a/linux-user/syscall-defs.h b/linux-user/syscall-defs.h index c3ed22ff16..6f6f77927b 100644 --- a/linux-user/syscall-defs.h +++ b/linux-user/syscall-defs.h @@ -19,8 +19,12 @@ SYSCALL_DEF_FULL(brk, .impl =3D impl_brk, .print_ret =3D print_syscall_ptr_ret, .arg_type =3D { ARG_PTR }); +SYSCALL_DEF_ARGS(clone, ARG_CLONEFLAG, ARG_PTR, ARG_PTR, ARG_PTR, ARG_PTR); SYSCALL_DEF(close, ARG_DEC); SYSCALL_DEF(exit, ARG_DEC); +#ifdef TARGET_NR_fork +SYSCALL_DEF(fork); +#endif #ifdef TARGET_NR_ipc SYSCALL_DEF_ARGS(ipc, ARG_HEX, ARG_DEC, ARG_DEC, ARG_HEX, ARG_PTR, ARG_HEX= ); #endif @@ -110,5 +114,9 @@ SYSCALL_DEF(shmdt, ARG_PTR); #if !defined(SYSCALL_TABLE) || defined(TARGET_NR_shmget) SYSCALL_DEF(shmget, ARG_DEC, ARG_DEC, ARG_HEX); #endif +#ifdef TARGET_NR_vfork +/* Emulate vfork() with fork(). */ +SYSCALL_DEF_FULL(vfork, .impl =3D impl_fork); +#endif SYSCALL_DEF(write, ARG_DEC, ARG_PTR, ARG_DEC); SYSCALL_DEF(writev, ARG_DEC, ARG_PTR, ARG_DEC); diff --git a/linux-user/syscall.h b/linux-user/syscall.h index 8175de4c31..f75cd3ddd0 100644 --- a/linux-user/syscall.h +++ b/linux-user/syscall.h @@ -58,6 +58,7 @@ typedef enum { /* These print as sets of flags. */ ARG_ATDIRFD, ARG_ATFLAG, + ARG_CLONEFLAG, ARG_MMAPFLAG, ARG_MMAPPROT, ARG_MODEFLAG, diff --git a/linux-user/strace.c b/linux-user/strace.c index 0a2c6764db..842136e425 100644 --- a/linux-user/strace.c +++ b/linux-user/strace.c @@ -813,7 +813,7 @@ static struct flags const mmap_flags[] =3D { FLAG_END, }; =20 -UNUSED static struct flags clone_flags[] =3D { +static struct flags const clone_flags[] =3D { FLAG_GENERIC(CLONE_VM), FLAG_GENERIC(CLONE_FS), FLAG_GENERIC(CLONE_FILES), @@ -1195,37 +1195,6 @@ print_clock_adjtime(const struct syscallname *name, } #endif =20 -#ifdef TARGET_NR_clone -static void do_print_clone(unsigned int flags, abi_ulong newsp, - abi_ulong parent_tidptr, target_ulong newtls, - abi_ulong child_tidptr) -{ - print_flags(clone_flags, flags, 0); - print_raw_param("child_stack=3D0x" TARGET_ABI_FMT_lx, newsp, 0); - print_raw_param("parent_tidptr=3D0x" TARGET_ABI_FMT_lx, parent_tidptr,= 0); - print_raw_param("tls=3D0x" TARGET_ABI_FMT_lx, newtls, 0); - print_raw_param("child_tidptr=3D0x" TARGET_ABI_FMT_lx, child_tidptr, 1= ); -} - -static void -print_clone(const struct syscallname *name, - abi_long arg1, abi_long arg2, abi_long arg3, - abi_long arg4, abi_long arg5, abi_long arg6) -{ - print_syscall_prologue(name); -#if defined(TARGET_MICROBLAZE) - do_print_clone(arg1, arg2, arg4, arg6, arg5); -#elif defined(TARGET_CLONE_BACKWARDS) - do_print_clone(arg1, arg2, arg3, arg4, arg5); -#elif defined(TARGET_CLONE_BACKWARDS2) - do_print_clone(arg2, arg1, arg3, arg5, arg4); -#else - do_print_clone(arg1, arg2, arg3, arg5, arg4); -#endif - print_syscall_epilogue(name); -} -#endif - #ifdef TARGET_NR_creat static void print_creat(const struct syscallname *name, @@ -2533,6 +2502,9 @@ static void print_syscall_def1(const SyscallDef *def,= int64_t args[6]) case ARG_ATFLAG: len =3D add_flags(b, rest, at_file_flags, arg, false); break; + case ARG_CLONEFLAG: + len =3D add_flags(b, rest, clone_flags, arg, false); + break; case ARG_MMAPFLAG: len =3D add_flags(b, rest, mmap_flags, arg, false); break; diff --git a/linux-user/syscall-proc.inc.c b/linux-user/syscall-proc.inc.c index 96ad363c1a..9eda2b2ca2 100644 --- a/linux-user/syscall-proc.inc.c +++ b/linux-user/syscall-proc.inc.c @@ -16,6 +16,258 @@ * along with this program; if not, see . */ =20 +#ifndef CLONE_IO +#define CLONE_IO 0x80000000 /* Clone io context */ +#endif + +/* + * We can't directly call the host clone syscall, because this will + * badly confuse libc (breaking mutexes, for example). So we must + * divide clone flags into: + * * flag combinations that look like pthread_create() + * * flag combinations that look like fork() + * * flags we can implement within QEMU itself + * * flags we can't support and will return an error for + * + * For thread creation, all these flags must be present; for + * fork, none must be present. + */ +#define CLONE_THREAD_FLAGS \ + (CLONE_VM | CLONE_FS | CLONE_FILES | \ + CLONE_SIGHAND | CLONE_THREAD | CLONE_SYSVSEM) + +/* + * These flags are ignored: + * CLONE_DETACHED is now ignored by the kernel; + * CLONE_IO is just an optimisation hint to the I/O scheduler + */ +#define CLONE_IGNORED_FLAGS \ + (CLONE_DETACHED | CLONE_IO) + +/* Flags for fork which we can implement within QEMU itself */ +#define CLONE_OPTIONAL_FORK_FLAGS \ + (CLONE_SETTLS | CLONE_PARENT_SETTID | \ + CLONE_CHILD_CLEARTID | CLONE_CHILD_SETTID) + +/* Flags for thread creation which we can implement within QEMU itself */ +#define CLONE_OPTIONAL_THREAD_FLAGS \ + (CLONE_SETTLS | CLONE_PARENT_SETTID | \ + CLONE_CHILD_CLEARTID | CLONE_CHILD_SETTID | CLONE_PARENT) + +#define CLONE_INVALID_FORK_FLAGS \ + (~(CSIGNAL | CLONE_OPTIONAL_FORK_FLAGS | CLONE_IGNORED_FLAGS)) + +#define CLONE_INVALID_THREAD_FLAGS \ + (~(CSIGNAL | CLONE_THREAD_FLAGS | CLONE_OPTIONAL_THREAD_FLAGS | \ + CLONE_IGNORED_FLAGS)) + +/* + * CLONE_VFORK is special cased early in do_fork(). The other flag bits + * have almost all been allocated. We cannot support any of + * CLONE_NEWNS, CLONE_NEWCGROUP, CLONE_NEWUTS, CLONE_NEWIPC, + * CLONE_NEWUSER, CLONE_NEWPID, CLONE_NEWNET, CLONE_PTRACE, CLONE_UNTRACED. + * The checks against the invalid thread masks above will catch these. + * (The one remaining unallocated bit is 0x1000 which used to be CLONE_PID= .) + */ + +/** + * do_clone: + * Arguments as for clone(2), returns target errnos. + */ +static abi_long do_clone(CPUArchState *env, unsigned int flags, + abi_ulong newsp, abi_ulong parent_tidptr, + abi_ulong child_tidptr, target_ulong newtls) +{ + CPUState *cpu =3D ENV_GET_CPU(env); + abi_long ret; + TaskState *ts; + CPUState *new_cpu; + CPUArchState *new_env; + sigset_t sigmask; + + flags &=3D ~CLONE_IGNORED_FLAGS; + + /* Emulate vfork() with fork() */ + if (flags & CLONE_VFORK) { + flags &=3D ~(CLONE_VFORK | CLONE_VM); + } + + if (flags & CLONE_VM) { + /* If CLONE_VM, we consider it a new thread. */ + TaskState *parent_ts =3D (TaskState *)cpu->opaque; + new_thread_info info; + pthread_attr_t attr; + + if (((flags & CLONE_THREAD_FLAGS) !=3D CLONE_THREAD_FLAGS) || + (flags & CLONE_INVALID_THREAD_FLAGS)) { + return -TARGET_EINVAL; + } + + ts =3D g_new0(TaskState, 1); + init_task_state(ts); + + /* Grab a mutex so that thread setup appears atomic. */ + pthread_mutex_lock(&clone_lock); + + /* Create a new CPU instance. */ + new_env =3D cpu_copy(env); + + /* Init regs that differ from the parent. */ + cpu_clone_regs_child(new_env, newsp); + cpu_clone_regs_parent(env); + new_cpu =3D ENV_GET_CPU(new_env); + new_cpu->opaque =3D ts; + ts->bprm =3D parent_ts->bprm; + ts->info =3D parent_ts->info; + ts->signal_mask =3D parent_ts->signal_mask; + + if (flags & CLONE_CHILD_CLEARTID) { + ts->child_tidptr =3D child_tidptr; + } + + if (flags & CLONE_SETTLS) { + cpu_set_tls(new_env, newtls); + } + + memset(&info, 0, sizeof(info)); + pthread_mutex_init(&info.mutex, NULL); + pthread_mutex_lock(&info.mutex); + pthread_cond_init(&info.cond, NULL); + info.env =3D new_env; + if (flags & CLONE_CHILD_SETTID) { + info.child_tidptr =3D child_tidptr; + } + if (flags & CLONE_PARENT_SETTID) { + info.parent_tidptr =3D parent_tidptr; + } + + ret =3D pthread_attr_init(&attr); + ret =3D pthread_attr_setstacksize(&attr, NEW_STACK_SIZE); + ret =3D pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED= ); + + /* + * It is not safe to deliver signals until the child has finished + * initializing, so temporarily block all signals. + */ + sigfillset(&sigmask); + sigprocmask(SIG_BLOCK, &sigmask, &info.sigmask); + + /* + * If this is our first additional thread, we need to ensure we + * generate code for parallel execution and flush old translations. + */ + if (!parallel_cpus) { + parallel_cpus =3D true; + tb_flush(cpu); + } + + ret =3D pthread_create(&info.thread, &attr, clone_func, &info); + /* TODO: Free new CPU state if thread creation failed. */ + + sigprocmask(SIG_SETMASK, &info.sigmask, NULL); + pthread_attr_destroy(&attr); + if (ret =3D=3D 0) { + /* Wait for the child to initialize. */ + pthread_cond_wait(&info.cond, &info.mutex); + ret =3D info.tid; + } else { + ret =3D host_to_target_errno(ret); + } + pthread_mutex_unlock(&info.mutex); + pthread_cond_destroy(&info.cond); + pthread_mutex_destroy(&info.mutex); + pthread_mutex_unlock(&clone_lock); + } else { + /* If no CLONE_VM, we consider it a fork. */ + if (flags & CLONE_INVALID_FORK_FLAGS) { + return -TARGET_EINVAL; + } + + /* We can't support custom termination signals. */ + if ((flags & CSIGNAL) !=3D TARGET_SIGCHLD) { + return -TARGET_EINVAL; + } + + if (block_signals()) { + return -TARGET_ERESTARTSYS; + } + + fork_start(); + ret =3D fork(); + if (ret =3D=3D 0) { + /* Child Process. */ + cpu_clone_regs_child(env, newsp); + fork_end(1); + /* + * There is a race condition here. The parent process could + * theoretically read the TID in the child process before the + * child tid is set. This would require using either ptrace + * (not implemented) or having *_tidptr to point at a shared + * memory mapping. We can't repeat the spinlock hack used + * above because the child process gets its own copy of the lo= ck. + */ + if (flags & CLONE_CHILD_SETTID) { + put_user_u32(sys_gettid(), child_tidptr); + } + if (flags & CLONE_PARENT_SETTID) { + put_user_u32(sys_gettid(), parent_tidptr); + } + ts =3D (TaskState *)cpu->opaque; + if (flags & CLONE_SETTLS) { + cpu_set_tls(env, newtls); + } + if (flags & CLONE_CHILD_CLEARTID) { + ts->child_tidptr =3D child_tidptr; + } + } else { + cpu_clone_regs_parent(env); + fork_end(0); + ret =3D get_errno(ret); + } + } + return ret; +} + +#if defined(TARGET_MICROBLAZE) || \ + defined(TARGET_CLONE_BACKWARDS) || \ + defined(TARGET_CLONE_BACKWARDS2) +SYSCALL_ARGS(clone) +{ + /* + * Linux manages to have three "standard" orderings for its + * arguments to clone(); the BACKWARDS and BACKWARDS2 defines + * match the kernel's CONFIG_CLONE_* settings. + * Microblaze is further special in that it uses a sixth + * implicit argument to clone for the TLS pointer. + * + * Standardize on the non-BACKWARDS ordering. + */ +# if defined(TARGET_MICROBLAZE) + /* We have already assigned out[0-1]. */ + out[2] =3D in[3]; + out[3] =3D in[4]; + out[4] =3D in[5]; +# elif defined(TARGET_CLONE_BACKWARDS) + /* We have already assigned out[0-2]. */ + out[3] =3D in[4]; + out[4] =3D in[3]; +# elif defined(TARGET_CLONE_BACKWARDS2) + /* We have already assigned out[2-4]. */ + out[0] =3D in[1]; + out[1] =3D in[0]; +# else +# error Missing case +# endif + return def; +} +#else +#define args_clone NULL +#endif + +SYSCALL_IMPL(clone) +{ + return do_clone(cpu_env, arg1, arg2, arg3, arg4, arg5); +} =20 SYSCALL_IMPL(exit) { @@ -59,3 +311,10 @@ SYSCALL_IMPL(exit) preexit_cleanup(cpu_env, status); _exit(status); } + +#if defined(TARGET_NR_fork) || defined(TARGET_NR_vfork) +SYSCALL_IMPL(fork) +{ + return do_clone(cpu_env, TARGET_SIGCHLD, 0, 0, 0, 0); +} +#endif diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 4c9953a7ab..26140ebb2f 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -110,57 +110,6 @@ #include "fd-trans.h" #include "syscall.h" =20 -#ifndef CLONE_IO -#define CLONE_IO 0x80000000 /* Clone io context */ -#endif - -/* We can't directly call the host clone syscall, because this will - * badly confuse libc (breaking mutexes, for example). So we must - * divide clone flags into: - * * flag combinations that look like pthread_create() - * * flag combinations that look like fork() - * * flags we can implement within QEMU itself - * * flags we can't support and will return an error for - */ -/* For thread creation, all these flags must be present; for - * fork, none must be present. - */ -#define CLONE_THREAD_FLAGS \ - (CLONE_VM | CLONE_FS | CLONE_FILES | \ - CLONE_SIGHAND | CLONE_THREAD | CLONE_SYSVSEM) - -/* These flags are ignored: - * CLONE_DETACHED is now ignored by the kernel; - * CLONE_IO is just an optimisation hint to the I/O scheduler - */ -#define CLONE_IGNORED_FLAGS \ - (CLONE_DETACHED | CLONE_IO) - -/* Flags for fork which we can implement within QEMU itself */ -#define CLONE_OPTIONAL_FORK_FLAGS \ - (CLONE_SETTLS | CLONE_PARENT_SETTID | \ - CLONE_CHILD_CLEARTID | CLONE_CHILD_SETTID) - -/* Flags for thread creation which we can implement within QEMU itself */ -#define CLONE_OPTIONAL_THREAD_FLAGS \ - (CLONE_SETTLS | CLONE_PARENT_SETTID | \ - CLONE_CHILD_CLEARTID | CLONE_CHILD_SETTID | CLONE_PARENT) - -#define CLONE_INVALID_FORK_FLAGS \ - (~(CSIGNAL | CLONE_OPTIONAL_FORK_FLAGS | CLONE_IGNORED_FLAGS)) - -#define CLONE_INVALID_THREAD_FLAGS \ - (~(CSIGNAL | CLONE_THREAD_FLAGS | CLONE_OPTIONAL_THREAD_FLAGS | \ - CLONE_IGNORED_FLAGS)) - -/* CLONE_VFORK is special cased early in do_fork(). The other flag bits - * have almost all been allocated. We cannot support any of - * CLONE_NEWNS, CLONE_NEWCGROUP, CLONE_NEWUTS, CLONE_NEWIPC, - * CLONE_NEWUSER, CLONE_NEWPID, CLONE_NEWNET, CLONE_PTRACE, CLONE_UNTRACED. - * The checks against the invalid thread masks above will catch these. - * (The one remaining unallocated bit is 0x1000 which used to be CLONE_PID= .) - */ - /* Define DEBUG_ERESTARTSYS to force every syscall to be restarted * once. This exercises the codepaths for restart. */ @@ -4450,148 +4399,6 @@ static void *clone_func(void *arg) return NULL; } =20 -/* do_fork() Must return host values and target errnos (unlike most - do_*() functions). */ -static int do_fork(CPUArchState *env, unsigned int flags, abi_ulong newsp, - abi_ulong parent_tidptr, target_ulong newtls, - abi_ulong child_tidptr) -{ - CPUState *cpu =3D ENV_GET_CPU(env); - int ret; - TaskState *ts; - CPUState *new_cpu; - CPUArchState *new_env; - sigset_t sigmask; - - flags &=3D ~CLONE_IGNORED_FLAGS; - - /* Emulate vfork() with fork() */ - if (flags & CLONE_VFORK) - flags &=3D ~(CLONE_VFORK | CLONE_VM); - - if (flags & CLONE_VM) { - TaskState *parent_ts =3D (TaskState *)cpu->opaque; - new_thread_info info; - pthread_attr_t attr; - - if (((flags & CLONE_THREAD_FLAGS) !=3D CLONE_THREAD_FLAGS) || - (flags & CLONE_INVALID_THREAD_FLAGS)) { - return -TARGET_EINVAL; - } - - ts =3D g_new0(TaskState, 1); - init_task_state(ts); - - /* Grab a mutex so that thread setup appears atomic. */ - pthread_mutex_lock(&clone_lock); - - /* we create a new CPU instance. */ - new_env =3D cpu_copy(env); - /* Init regs that differ from the parent. */ - cpu_clone_regs_child(new_env, newsp); - cpu_clone_regs_parent(env); - new_cpu =3D ENV_GET_CPU(new_env); - new_cpu->opaque =3D ts; - ts->bprm =3D parent_ts->bprm; - ts->info =3D parent_ts->info; - ts->signal_mask =3D parent_ts->signal_mask; - - if (flags & CLONE_CHILD_CLEARTID) { - ts->child_tidptr =3D child_tidptr; - } - - if (flags & CLONE_SETTLS) { - cpu_set_tls (new_env, newtls); - } - - memset(&info, 0, sizeof(info)); - pthread_mutex_init(&info.mutex, NULL); - pthread_mutex_lock(&info.mutex); - pthread_cond_init(&info.cond, NULL); - info.env =3D new_env; - if (flags & CLONE_CHILD_SETTID) { - info.child_tidptr =3D child_tidptr; - } - if (flags & CLONE_PARENT_SETTID) { - info.parent_tidptr =3D parent_tidptr; - } - - ret =3D pthread_attr_init(&attr); - ret =3D pthread_attr_setstacksize(&attr, NEW_STACK_SIZE); - ret =3D pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED= ); - /* It is not safe to deliver signals until the child has finished - initializing, so temporarily block all signals. */ - sigfillset(&sigmask); - sigprocmask(SIG_BLOCK, &sigmask, &info.sigmask); - - /* If this is our first additional thread, we need to ensure we - * generate code for parallel execution and flush old translations. - */ - if (!parallel_cpus) { - parallel_cpus =3D true; - tb_flush(cpu); - } - - ret =3D pthread_create(&info.thread, &attr, clone_func, &info); - /* TODO: Free new CPU state if thread creation failed. */ - - sigprocmask(SIG_SETMASK, &info.sigmask, NULL); - pthread_attr_destroy(&attr); - if (ret =3D=3D 0) { - /* Wait for the child to initialize. */ - pthread_cond_wait(&info.cond, &info.mutex); - ret =3D info.tid; - } else { - ret =3D -1; - } - pthread_mutex_unlock(&info.mutex); - pthread_cond_destroy(&info.cond); - pthread_mutex_destroy(&info.mutex); - pthread_mutex_unlock(&clone_lock); - } else { - /* if no CLONE_VM, we consider it is a fork */ - if (flags & CLONE_INVALID_FORK_FLAGS) { - return -TARGET_EINVAL; - } - - /* We can't support custom termination signals */ - if ((flags & CSIGNAL) !=3D TARGET_SIGCHLD) { - return -TARGET_EINVAL; - } - - if (block_signals()) { - return -TARGET_ERESTARTSYS; - } - - fork_start(); - ret =3D fork(); - if (ret =3D=3D 0) { - /* Child Process. */ - cpu_clone_regs_child(env, newsp); - fork_end(1); - /* There is a race condition here. The parent process could - theoretically read the TID in the child process before the = child - tid is set. This would require using either ptrace - (not implemented) or having *_tidptr to point at a shared m= emory - mapping. We can't repeat the spinlock hack used above beca= use - the child process gets its own copy of the lock. */ - if (flags & CLONE_CHILD_SETTID) - put_user_u32(sys_gettid(), child_tidptr); - if (flags & CLONE_PARENT_SETTID) - put_user_u32(sys_gettid(), parent_tidptr); - ts =3D (TaskState *)cpu->opaque; - if (flags & CLONE_SETTLS) - cpu_set_tls (env, newtls); - if (flags & CLONE_CHILD_CLEARTID) - ts->child_tidptr =3D child_tidptr; - } else { - cpu_clone_regs_parent(env); - fork_end(0); - } - } - return ret; -} - /* warning : doesn't handle linux specific flags... */ static int target_to_host_fcntl_cmd(int cmd) { @@ -5590,10 +5397,6 @@ static abi_long do_syscall1(void *cpu_env, int num, = abi_long arg1, void *p; =20 switch(num) { -#ifdef TARGET_NR_fork - case TARGET_NR_fork: - return get_errno(do_fork(cpu_env, TARGET_SIGCHLD, 0, 0, 0, 0)); -#endif #ifdef TARGET_NR_waitpid case TARGET_NR_waitpid: { @@ -7283,23 +7086,6 @@ static abi_long do_syscall1(void *cpu_env, int num, = abi_long arg1, return ret; case TARGET_NR_fsync: return get_errno(fsync(arg1)); - case TARGET_NR_clone: - /* Linux manages to have three different orderings for its - * arguments to clone(); the BACKWARDS and BACKWARDS2 defines - * match the kernel's CONFIG_CLONE_* settings. - * Microblaze is further special in that it uses a sixth - * implicit argument to clone for the TLS pointer. - */ -#if defined(TARGET_MICROBLAZE) - ret =3D get_errno(do_fork(cpu_env, arg1, arg2, arg4, arg6, arg5)); -#elif defined(TARGET_CLONE_BACKWARDS) - ret =3D get_errno(do_fork(cpu_env, arg1, arg2, arg3, arg4, arg5)); -#elif defined(TARGET_CLONE_BACKWARDS2) - ret =3D get_errno(do_fork(cpu_env, arg2, arg1, arg3, arg5, arg4)); -#else - ret =3D get_errno(do_fork(cpu_env, arg1, arg2, arg3, arg5, arg4)); -#endif - return ret; #ifdef __NR_exit_group /* new thread calls */ case TARGET_NR_exit_group: @@ -8170,12 +7956,6 @@ static abi_long do_syscall1(void *cpu_env, int num, = abi_long arg1, } #endif #endif -#ifdef TARGET_NR_vfork - case TARGET_NR_vfork: - return get_errno(do_fork(cpu_env, - CLONE_VFORK | CLONE_VM | TARGET_SIGCHLD, - 0, 0, 0, 0)); -#endif #ifdef TARGET_NR_ugetrlimit case TARGET_NR_ugetrlimit: { diff --git a/linux-user/strace.list b/linux-user/strace.list index aff6d1d73d..76d983a882 100644 --- a/linux-user/strace.list +++ b/linux-user/strace.list @@ -91,9 +91,6 @@ #ifdef TARGET_NR_clock_settime { TARGET_NR_clock_settime, "clock_settime" , NULL, NULL, NULL }, #endif -#ifdef TARGET_NR_clone -{ TARGET_NR_clone, "clone" , NULL, print_clone, NULL }, -#endif #ifdef TARGET_NR_connect { TARGET_NR_connect, "connect" , "%s(%d,%#x,%d)", NULL, NULL }, #endif @@ -220,9 +217,6 @@ #ifdef TARGET_NR_flock { TARGET_NR_flock, "flock" , NULL, NULL, NULL }, #endif -#ifdef TARGET_NR_fork -{ TARGET_NR_fork, "fork" , "%s()", NULL, NULL }, -#endif #ifdef TARGET_NR_fremovexattr { TARGET_NR_fremovexattr, "fremovexattr" , NULL, NULL, NULL }, #endif @@ -1485,9 +1479,6 @@ #ifdef TARGET_NR_utrap_install { TARGET_NR_utrap_install, "utrap_install" , NULL, NULL, NULL }, #endif -#ifdef TARGET_NR_vfork -{ TARGET_NR_vfork, "vfork" , NULL, NULL, NULL }, -#endif #ifdef TARGET_NR_vhangup { TARGET_NR_vhangup, "vhangup" , NULL, NULL, NULL }, #endif --=20 2.17.1 From nobody Thu May 9 22:44:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1558299203; cv=none; d=zoho.com; s=zohoarc; b=dsHGcxI0ES9FY3oENlJTr5+7Q1yjTAAQOjMMcKpCOwPdZRZbQdASKlas3aI5lTTinszxJQsN3tjAzmsV+XsU2bBNkyhjIeJ07Peoq68PIW7p7Zw0PpCMvCDeIaf2MwiwhVuwydgcncCmqU8sBikxFkwZT+Lfh4qLHsMbk9PjD0M= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1558299203; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=TKsC4B9qYWzPZIuweTYnPJXABDEFDxi0xaFzoRYmNLs=; b=fZsow0kk+KUpKC/G9MXjTHkBQpEDMv7SWxP8sEYb3mg7rsUTNd9vxAJz6UiRwwIE9McETrKbf3/9nO5gCOWgUsUPn329HDG6aTBGv1VNcJgRLzlShid9E5SczqDfr0+TeGK1fuAS/iJl0JOJ4AosD59RnxF1nwImzp4WTlIPeuU= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (209.51.188.17 [209.51.188.17]) by mx.zohomail.com with SMTPS id 1558299203200690.3594826355636; Sun, 19 May 2019 13:53:23 -0700 (PDT) Received: from localhost ([127.0.0.1]:53316 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSnx-0007AW-Up for importer@patchew.org; Sun, 19 May 2019 16:53:14 -0400 Received: from eggs.gnu.org ([209.51.188.92]:50326) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSZA-0003AT-6J for qemu-devel@nongnu.org; Sun, 19 May 2019 16:37:57 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hSSZ8-0003nP-Nr for qemu-devel@nongnu.org; Sun, 19 May 2019 16:37:56 -0400 Received: from mail-pf1-x441.google.com ([2607:f8b0:4864:20::441]:41972) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hSSZ8-0003mZ-Gk for qemu-devel@nongnu.org; Sun, 19 May 2019 16:37:54 -0400 Received: by mail-pf1-x441.google.com with SMTP id q17so6155886pfq.8 for ; Sun, 19 May 2019 13:37:54 -0700 (PDT) Received: from localhost.localdomain (97-113-13-231.tukw.qwest.net. [97.113.13.231]) by smtp.gmail.com with ESMTPSA id i7sm11397448pfo.19.2019.05.19.13.37.52 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 19 May 2019 13:37:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=TKsC4B9qYWzPZIuweTYnPJXABDEFDxi0xaFzoRYmNLs=; b=QEGzqTQgB0lQhcnAdwwRtHKJaLqFPQpn9L/wlIuumvZu9JoVG5Tql9UDF00cHto77b mgH4Ps2qOrrfjQo7EdYarpcGJPjugBWAIUvk+lxxxZAz0A8L2/I2pThd1bojPGDmBl+k SimJBBrLfAWIsC0kwf1bVB/Awu92Da78pDsZ8u9tebkmq4dyaJch//29c6P7pjOxl1om ZNJgLerKNwcHdueonc4cjH7g/chVmJN4KuKjz9GMkL/kF0w5YACrjqAp/plU7b1Lp0K6 ljS8Xb5rCB0nb+uT9dJZiEw9rjOOouA2Kncw2b9F4v4ldUMSXTKwDFLg/9vf+YH5uAx3 Lpkw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=TKsC4B9qYWzPZIuweTYnPJXABDEFDxi0xaFzoRYmNLs=; b=WUzClJnH++pcbjROB54H4jFOphqrXsYczfXm9jv555+MdtiLobYHJZT3OjqCKmWlkP +7bTVI3Xj0rDgvhuuRoU3MdZ7TOx4yoeV1t5K0l2fLV7esgYboIl3RZQEQ/c6pLtaH0h rxn5zJg1cSRncrfzrWvEr7kQGZqrbUtiytjXebe5H9ERZUmSRaQkW8TvOz7Brfs0mepk RChfwbPbobjc8WVW9qbsizsLaJ+weACQa3K7gxNT4zebW1vlsRggomlt/mhBCGkNoXxW wuZ5Lp52obdm3JZWcYyhWGJj/5GXe8xHLgBwwuk2QuyB0yyf0boHiZGPQ389Td/6PTn3 RZag== X-Gm-Message-State: APjAAAVZJGYLgtA3DmlahlviUwXyy+rtNa4DoBtfiPGDdTNFxXh9AK/V NDgAucl0CdslGbab6qiwLWgo23yPN5Q= X-Google-Smtp-Source: APXvYqxHdDw/syQVaHDn/5PlfBv8KpdtyaaSKll0vir7oTedUTTWKLdHb0/X5uPPsaoZaJbBrcsExQ== X-Received: by 2002:a65:6559:: with SMTP id a25mr47361736pgw.33.1558298273296; Sun, 19 May 2019 13:37:53 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sun, 19 May 2019 13:36:30 -0700 Message-Id: <20190519203726.20729-19-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190519203726.20729-1-richard.henderson@linaro.org> References: <20190519203726.20729-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::441 Subject: [Qemu-devel] [PATCH v7 18/74] linux-user: Split out wait4, waitid, waitpid X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: laurent@vivier.eu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Note that waitid is universally provided and need not be conditional. Signed-off-by: Richard Henderson --- linux-user/syscall-defs.h | 5 ++ linux-user/syscall-proc.inc.c | 88 +++++++++++++++++++++++++++++++++++ linux-user/syscall.c | 67 -------------------------- linux-user/strace.list | 9 ---- 4 files changed, 93 insertions(+), 76 deletions(-) diff --git a/linux-user/syscall-defs.h b/linux-user/syscall-defs.h index 6f6f77927b..a84050a318 100644 --- a/linux-user/syscall-defs.h +++ b/linux-user/syscall-defs.h @@ -118,5 +118,10 @@ SYSCALL_DEF(shmget, ARG_DEC, ARG_DEC, ARG_HEX); /* Emulate vfork() with fork(). */ SYSCALL_DEF_FULL(vfork, .impl =3D impl_fork); #endif +SYSCALL_DEF(wait4, ARG_DEC, ARG_PTR, ARG_HEX, ARG_PTR); +SYSCALL_DEF(waitid, ARG_HEX, ARG_DEC, ARG_PTR, ARG_HEX); +#ifdef TARGET_NR_waitpid +SYSCALL_DEF(waitpid, ARG_DEC, ARG_PTR, ARG_HEX); +#endif SYSCALL_DEF(write, ARG_DEC, ARG_PTR, ARG_DEC); SYSCALL_DEF(writev, ARG_DEC, ARG_PTR, ARG_DEC); diff --git a/linux-user/syscall-proc.inc.c b/linux-user/syscall-proc.inc.c index 9eda2b2ca2..7c647f36d7 100644 --- a/linux-user/syscall-proc.inc.c +++ b/linux-user/syscall-proc.inc.c @@ -318,3 +318,91 @@ SYSCALL_IMPL(fork) return do_clone(cpu_env, TARGET_SIGCHLD, 0, 0, 0, 0); } #endif + +/* + * Map host to target signal numbers for the wait family of syscalls. + * Assume all other status bits are the same. + */ +int host_to_target_waitstatus(int status) +{ + if (WIFSIGNALED(status)) { + return host_to_target_signal(WTERMSIG(status)) | (status & ~0x7f); + } + if (WIFSTOPPED(status)) { + return (host_to_target_signal(WSTOPSIG(status)) << 8) + | (status & 0xff); + } + return status; +} + +SYSCALL_IMPL(wait4) +{ + int status; + pid_t pid =3D arg1; + abi_ulong status_ptr =3D arg2; + int options =3D arg3; + abi_ulong target_rusage =3D arg4; + struct rusage rusage; + struct rusage *rusage_ptr =3D target_rusage ? &rusage : NULL; + abi_long ret; + + ret =3D get_errno(safe_wait4(pid, &status, options, rusage_ptr)); + if (!is_error(ret)) { + if (status_ptr && ret) { + status =3D host_to_target_waitstatus(status); + if (put_user_s32(status, status_ptr)) { + return -TARGET_EFAULT; + } + } + if (target_rusage) { + abi_long err =3D host_to_target_rusage(target_rusage, &rusage); + if (err) { + ret =3D err; + } + } + } + return ret; +} + +SYSCALL_IMPL(waitid) +{ + idtype_t idtype =3D arg1; + id_t id =3D arg2; + abi_ulong target_info =3D arg3; + int options =3D arg4; + siginfo_t info, *info_ptr =3D target_info ? &info : NULL; + abi_long ret; + + info.si_pid =3D 0; + ret =3D get_errno(safe_waitid(idtype, id, info_ptr, options, NULL)); + if (!is_error(ret) && target_info && info.si_pid !=3D 0) { + target_siginfo_t *p =3D lock_user(VERIFY_WRITE, target_info, + sizeof(target_siginfo_t), 0); + if (!p) { + return -TARGET_EFAULT; + } + host_to_target_siginfo(p, &info); + unlock_user(p, target_info, sizeof(target_siginfo_t)); + } + return ret; +} + +#ifdef TARGET_NR_waitpid +SYSCALL_IMPL(waitpid) +{ + pid_t pid =3D arg1; + abi_ulong target_status =3D arg2; + int options =3D arg3; + int status; + abi_long ret; + + ret =3D get_errno(safe_wait4(pid, &status, options, NULL)); + if (!is_error(ret) + && target_status + && ret + && put_user_s32(host_to_target_waitstatus(status), target_status))= { + return -TARGET_EFAULT; + } + return ret; +} +#endif diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 26140ebb2f..bdb0d45d9a 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -5271,20 +5271,6 @@ static abi_long do_signalfd4(int fd, abi_long mask, = int flags) } #endif =20 -/* Map host to target signal numbers for the wait family of syscalls. - Assume all other status bits are the same. */ -int host_to_target_waitstatus(int status) -{ - if (WIFSIGNALED(status)) { - return host_to_target_signal(WTERMSIG(status)) | (status & ~0x7f); - } - if (WIFSTOPPED(status)) { - return (host_to_target_signal(WSTOPSIG(status)) << 8) - | (status & 0xff); - } - return status; -} - #define TIMER_MAGIC 0x0caf0000 #define TIMER_MAGIC_MASK 0xffff0000 =20 @@ -5397,32 +5383,6 @@ static abi_long do_syscall1(void *cpu_env, int num, = abi_long arg1, void *p; =20 switch(num) { -#ifdef TARGET_NR_waitpid - case TARGET_NR_waitpid: - { - int status; - ret =3D get_errno(safe_wait4(arg1, &status, arg3, 0)); - if (!is_error(ret) && arg2 && ret - && put_user_s32(host_to_target_waitstatus(status), arg2)) - return -TARGET_EFAULT; - } - return ret; -#endif -#ifdef TARGET_NR_waitid - case TARGET_NR_waitid: - { - siginfo_t info; - info.si_pid =3D 0; - ret =3D get_errno(safe_waitid(arg1, arg2, &info, arg4, NULL)); - if (!is_error(ret) && arg3 && info.si_pid !=3D 0) { - if (!(p =3D lock_user(VERIFY_WRITE, arg3, sizeof(target_si= ginfo_t), 0))) - return -TARGET_EFAULT; - host_to_target_siginfo(p, &info); - unlock_user(p, arg3, sizeof(target_siginfo_t)); - } - } - return ret; -#endif #ifdef TARGET_NR_creat /* not on alpha */ case TARGET_NR_creat: if (!(p =3D lock_user_string(arg1))) @@ -7022,33 +6982,6 @@ static abi_long do_syscall1(void *cpu_env, int num, = abi_long arg1, return do_syscall(cpu_env, arg1 & 0xffff, arg2, arg3, arg4, arg5, arg6, arg7, arg8, 0); #endif - case TARGET_NR_wait4: - { - int status; - abi_long status_ptr =3D arg2; - struct rusage rusage, *rusage_ptr; - abi_ulong target_rusage =3D arg4; - abi_long rusage_err; - if (target_rusage) - rusage_ptr =3D &rusage; - else - rusage_ptr =3D NULL; - ret =3D get_errno(safe_wait4(arg1, &status, arg3, rusage_ptr)); - if (!is_error(ret)) { - if (status_ptr && ret) { - status =3D host_to_target_waitstatus(status); - if (put_user_s32(status, status_ptr)) - return -TARGET_EFAULT; - } - if (target_rusage) { - rusage_err =3D host_to_target_rusage(target_rusage, &r= usage); - if (rusage_err) { - ret =3D rusage_err; - } - } - } - } - return ret; #ifdef TARGET_NR_swapoff case TARGET_NR_swapoff: if (!(p =3D lock_user_string(arg1))) diff --git a/linux-user/strace.list b/linux-user/strace.list index 76d983a882..759b35458e 100644 --- a/linux-user/strace.list +++ b/linux-user/strace.list @@ -1494,15 +1494,6 @@ #ifdef TARGET_NR_vserver { TARGET_NR_vserver, "vserver" , NULL, NULL, NULL }, #endif -#ifdef TARGET_NR_wait4 -{ TARGET_NR_wait4, "wait4" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_waitid -{ TARGET_NR_waitid, "waitid" , "%s(%#x,%d,%p,%#x)", NULL, NULL }, -#endif -#ifdef TARGET_NR_waitpid -{ TARGET_NR_waitpid, "waitpid" , "%s(%d,%p,%#x)", NULL, NULL }, -#endif #ifdef TARGET_NR_utimensat { TARGET_NR_utimensat, "utimensat", NULL, print_utimensat, NULL }, #endif --=20 2.17.1 From nobody Thu May 9 22:44:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1558299380; cv=none; d=zoho.com; s=zohoarc; b=EaoWOFPAxPr92/lg+/Wdsi3djaTGdv846EbojzDrofBNozisrIfxp1dMWjJCdaC8SjlY4j54azYsrOYPAADZbfPy6kAKTffTBTH69HYJsTpvQM8P6gBccrUXGGSVd7W1rYfAI0dRd3bg9MkAmLI2dx3e+rqQ34pTjiBteUSLhBw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1558299380; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=ivbPF9AA08UpYLCiKojYQPTAvKrugZNh3dcbIM2DPu8=; b=Z4q6G12uSS9pWVyGMKeTey/lvXRdsTNZygBnP1uygczsAUOhMvVRlvNRJms7CYhfMP48LHNm30Oa9T5Z67b/PEx8bG/C78ZKaUYrqG/NuaiXd7t86sazEWVShZEmL6/cgMDyST/p/TkyEPSok2axXU8vzC5q/4253fc3btNn/e4= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (209.51.188.17 [209.51.188.17]) by mx.zohomail.com with SMTPS id 1558299380758546.3109546260555; Sun, 19 May 2019 13:56:20 -0700 (PDT) Received: from localhost ([127.0.0.1]:53374 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSqq-000178-HG for importer@patchew.org; Sun, 19 May 2019 16:56:12 -0400 Received: from eggs.gnu.org ([209.51.188.92]:50348) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSZB-0003Be-9R for qemu-devel@nongnu.org; Sun, 19 May 2019 16:37:58 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hSSZA-0003pH-Av for qemu-devel@nongnu.org; Sun, 19 May 2019 16:37:57 -0400 Received: from mail-pg1-x542.google.com ([2607:f8b0:4864:20::542]:43808) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hSSZA-0003oM-56 for qemu-devel@nongnu.org; Sun, 19 May 2019 16:37:56 -0400 Received: by mail-pg1-x542.google.com with SMTP id t22so5725712pgi.10 for ; Sun, 19 May 2019 13:37:56 -0700 (PDT) Received: from localhost.localdomain (97-113-13-231.tukw.qwest.net. [97.113.13.231]) by smtp.gmail.com with ESMTPSA id i7sm11397448pfo.19.2019.05.19.13.37.53 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 19 May 2019 13:37:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=ivbPF9AA08UpYLCiKojYQPTAvKrugZNh3dcbIM2DPu8=; b=SEGoWLAg+RZ4riZbIc9naxcWLRTzjediGWpq+QTz2q69v76H7vtAdmobl0AGbDZdoI MaGzazjNCp4ynnWbZItcjih5THmw/jn2+9wY8iLQ4YrqdfClw1SlkwkLAfPDhQbZ7v9L 88CrbuuuVAEo6g//NygY64sQOKlLLwnNIC+dw4gaLWju+cxxPq0sQqjW32LAL1qz78ca /X14LNquJlWDSmmHYJlU6uEwAC97etaUIJp8O8mZj3Gg3C4VCO2moZEPfZivYkSMg/It e8UsBBR2Vvmkq9FLGG63ndnoq6Bg431KBrwaYnmSo3p/WGQmoW6uNgKyWtcSsa0bEYUy G3sQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=ivbPF9AA08UpYLCiKojYQPTAvKrugZNh3dcbIM2DPu8=; b=Q0cp8bvm7KlfLfL1YaK42JC16p+KNZwPP1kJyhslKBoYy9vaQOpXCwWSGcsZ1iezeS EWqAMCX6BtK3f8YittEaxz8p+aoAanLsqfTI+V5wIy+4JaOP8p6MoDF/FzU0y4om7vqG K6QPvsWm10CmlVGgO6dJemm5b1xWqiWej+baBSRW0s5J9HMP3KxNGWhNiRsfoWictVa1 +4zwzUQR78W9ZtTgava4aqJsbzH38EXapoPC3ibh4gQEB3nPL+6I1dKqA4nkHvbXPGgn 3SNOslEjOtgJ68BZWgC9W9FH3DhNygBUhjYfRHaKcnXn35Z0PYc8j9gExv/1w1u0AG+m GcWw== X-Gm-Message-State: APjAAAUMHd+W/t2omA5JDvCRIgOKIhPlBGcQjlhd04fKfA2e9EPK3Z7B VBFBnGXRgyAE0fkLVIUmSpgJpR0YKsM= X-Google-Smtp-Source: APXvYqxIGTBrg7G8je7P/IoNYuvdq60tbKOD27NbsfReN8nFlGdSa5GxWchyIyfzmPh3MXS3+ZxN0g== X-Received: by 2002:a62:d205:: with SMTP id c5mr75464414pfg.219.1558298274771; Sun, 19 May 2019 13:37:54 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sun, 19 May 2019 13:36:31 -0700 Message-Id: <20190519203726.20729-20-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190519203726.20729-1-richard.henderson@linaro.org> References: <20190519203726.20729-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::542 Subject: [Qemu-devel] [PATCH v7 19/74] linux-user: Implement rusage argument to waitid X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: laurent@vivier.eu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" The kernel interface, which we are supposed to be implementing, takes a fifth argument: an rusage pointer akin to wait4. Signed-off-by: Richard Henderson --- linux-user/syscall-defs.h | 2 +- linux-user/syscall-proc.inc.c | 27 +++++++++++++++++++-------- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/linux-user/syscall-defs.h b/linux-user/syscall-defs.h index a84050a318..f099d98fa3 100644 --- a/linux-user/syscall-defs.h +++ b/linux-user/syscall-defs.h @@ -119,7 +119,7 @@ SYSCALL_DEF(shmget, ARG_DEC, ARG_DEC, ARG_HEX); SYSCALL_DEF_FULL(vfork, .impl =3D impl_fork); #endif SYSCALL_DEF(wait4, ARG_DEC, ARG_PTR, ARG_HEX, ARG_PTR); -SYSCALL_DEF(waitid, ARG_HEX, ARG_DEC, ARG_PTR, ARG_HEX); +SYSCALL_DEF(waitid, ARG_HEX, ARG_DEC, ARG_PTR, ARG_HEX, ARG_PTR); #ifdef TARGET_NR_waitpid SYSCALL_DEF(waitpid, ARG_DEC, ARG_PTR, ARG_HEX); #endif diff --git a/linux-user/syscall-proc.inc.c b/linux-user/syscall-proc.inc.c index 7c647f36d7..b7304b7a42 100644 --- a/linux-user/syscall-proc.inc.c +++ b/linux-user/syscall-proc.inc.c @@ -370,19 +370,30 @@ SYSCALL_IMPL(waitid) id_t id =3D arg2; abi_ulong target_info =3D arg3; int options =3D arg4; + abi_ulong target_rusage =3D arg5; siginfo_t info, *info_ptr =3D target_info ? &info : NULL; + struct rusage rusage; + struct rusage *rusage_ptr =3D target_rusage ? &rusage : NULL; abi_long ret; =20 info.si_pid =3D 0; - ret =3D get_errno(safe_waitid(idtype, id, info_ptr, options, NULL)); - if (!is_error(ret) && target_info && info.si_pid !=3D 0) { - target_siginfo_t *p =3D lock_user(VERIFY_WRITE, target_info, - sizeof(target_siginfo_t), 0); - if (!p) { - return -TARGET_EFAULT; + ret =3D get_errno(safe_waitid(idtype, id, info_ptr, options, rusage_pt= r)); + if (!is_error(ret)) { + if (target_info && info.si_pid !=3D 0) { + target_siginfo_t *p =3D lock_user(VERIFY_WRITE, target_info, + sizeof(target_siginfo_t), 0); + if (!p) { + return -TARGET_EFAULT; + } + host_to_target_siginfo(p, &info); + unlock_user(p, target_info, sizeof(target_siginfo_t)); + } + if (target_rusage) { + abi_long err =3D host_to_target_rusage(target_rusage, &rusage); + if (err) { + ret =3D err; + } } - host_to_target_siginfo(p, &info); - unlock_user(p, target_info, sizeof(target_siginfo_t)); } return ret; } --=20 2.17.1 From nobody Thu May 9 22:44:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1558299331; cv=none; d=zoho.com; s=zohoarc; b=oeApMaFUmcuM3F21968gZJ9Fb+9S88JG6mSt4i+dI3hJqLhZrmjD/Jn+DDlOJxNJj5aX8VRNMHOvR/njNU62LwCqS7yKeFm0VJgn1xaHFLmrqJCRclQ8BvdrAgZUdNHT5ca0ytN7VZtG2hZ6Df9n08+icJk4fRZXZpiRINVcwQY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1558299331; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=NM8YohXjNmh5aO/78Xnvs2un3+sKv0xFoH3Xe6VAfyY=; b=lhp1Gjz7CSL6sFBGgouHC+Cs8R+leGpeYb27ifp0C6MV9JXxSC1JAI0P7vlYJPBZ2CyN/ukN6ERsAVdapf1HvA3kxmFdErGqgEBJLqtGGKLMalt86kTAKl8JcOR9XSIIT6G4GKM7NEira097/0Qi6+ZCSbAgEX+NLbS/PT6FPjs= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (209.51.188.17 [209.51.188.17]) by mx.zohomail.com with SMTPS id 1558299330965707.0693086255403; Sun, 19 May 2019 13:55:30 -0700 (PDT) Received: from localhost ([127.0.0.1]:53339 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSq4-0000Pw-FU for importer@patchew.org; Sun, 19 May 2019 16:55:24 -0400 Received: from eggs.gnu.org ([209.51.188.92]:50369) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSZC-0003DB-Ab for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:00 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hSSZB-0003qW-89 for qemu-devel@nongnu.org; Sun, 19 May 2019 16:37:58 -0400 Received: from mail-pg1-x543.google.com ([2607:f8b0:4864:20::543]:38179) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hSSZB-0003pY-1A for qemu-devel@nongnu.org; Sun, 19 May 2019 16:37:57 -0400 Received: by mail-pg1-x543.google.com with SMTP id j26so5740758pgl.5 for ; Sun, 19 May 2019 13:37:56 -0700 (PDT) Received: from localhost.localdomain (97-113-13-231.tukw.qwest.net. [97.113.13.231]) by smtp.gmail.com with ESMTPSA id i7sm11397448pfo.19.2019.05.19.13.37.54 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 19 May 2019 13:37:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=NM8YohXjNmh5aO/78Xnvs2un3+sKv0xFoH3Xe6VAfyY=; b=jUuFL8+PmCYyXNNWJMqmhoYeb3XOWwsea+DvhQ+2Px1BxVUrdCGROdI+MKDNF24Htn AXNk48XnhF0Y5fa5YZ6PBcLZ9JxlftTDpW+nszdOHE0O+FtR5/34W08QiDJZM9svpk1e g5QY3SFFoeYARGkXrgLVdxhcWC9GwhEZYeNiVeIzQ+uE/WeWM0UwmLpNFGuPZjMx/i5D AMrx1aMqPnV0u0G4wZtQkbeSyJgwaeKOFCtUFIjOMmNEkJwEoGry7aOPwfmubtNhhoZ/ n/Q66jMVqqCrhuAN640+/uFv6WSCvIatyh8nYjJVbPUiSAQvbIo1V5eHq06dOFhtNvHI iEsA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=NM8YohXjNmh5aO/78Xnvs2un3+sKv0xFoH3Xe6VAfyY=; b=f9HTqn4Whxt5gm7AFTRyYMNAx/cvy/fzajunX4WiR6oTmMlt/JG5x7gV8GJ5cgFQMV 46tOt6rmDvGubdnB1pg6MTdzt+ef7sAyjXf6u0J6d7iaq9VctmZ9fzsV+jbaK7r1yoYn JDaufWjztqPz+r3DvZDpuEydk4NVwUXeP3eoIf6Q71oIwkD2vrpbej582o/xSnVFCdvm CD5ACXsWQRxWqGyj+ApQMMwCKAShtIC74/Eaf0EoYmvcw849JPhueyKFnc/1gbGeuasx Wwgt8VPD3kR5owWDCoFZQn24Te2DpXdWQ5CWwNfiXbzT3xvLJizluZAtI0umPOskLonn cecA== X-Gm-Message-State: APjAAAU5b/7yJNesN76PlLwr2941MGmLewkMeybU7p2vK44ScN+ULttM pNA302QZpyoXkf638GqNNV3U9pEg45I= X-Google-Smtp-Source: APXvYqx9YGDKzVM77sSuLk+eiKaKf6T+5Si2jYsKvOSO/hSh6AZGqokii5h7i48fsmxYK8BgepV05g== X-Received: by 2002:a63:d150:: with SMTP id c16mr71006064pgj.439.1558298275860; Sun, 19 May 2019 13:37:55 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sun, 19 May 2019 13:36:32 -0700 Message-Id: <20190519203726.20729-21-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190519203726.20729-1-richard.henderson@linaro.org> References: <20190519203726.20729-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::543 Subject: [Qemu-devel] [PATCH v7 20/74] linux-user: Split out creat X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: laurent@vivier.eu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Richard Henderson --- linux-user/syscall-defs.h | 3 +++ linux-user/strace.c | 13 ------------- linux-user/syscall-file.inc.c | 16 ++++++++++++++++ linux-user/syscall.c | 9 --------- linux-user/strace.list | 3 --- 5 files changed, 19 insertions(+), 25 deletions(-) diff --git a/linux-user/syscall-defs.h b/linux-user/syscall-defs.h index f099d98fa3..de7a99f0c6 100644 --- a/linux-user/syscall-defs.h +++ b/linux-user/syscall-defs.h @@ -21,6 +21,9 @@ SYSCALL_DEF_FULL(brk, .impl =3D impl_brk, .arg_type =3D { ARG_PTR }); SYSCALL_DEF_ARGS(clone, ARG_CLONEFLAG, ARG_PTR, ARG_PTR, ARG_PTR, ARG_PTR); SYSCALL_DEF(close, ARG_DEC); +#ifdef TARGET_NR_creat +SYSCALL_DEF(creat, ARG_STR, ARG_MODEFLAG); +#endif SYSCALL_DEF(exit, ARG_DEC); #ifdef TARGET_NR_fork SYSCALL_DEF(fork); diff --git a/linux-user/strace.c b/linux-user/strace.c index 842136e425..640a80f32b 100644 --- a/linux-user/strace.c +++ b/linux-user/strace.c @@ -1195,19 +1195,6 @@ print_clock_adjtime(const struct syscallname *name, } #endif =20 -#ifdef TARGET_NR_creat -static void -print_creat(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - print_syscall_prologue(name); - print_string(arg0, 0); - print_file_mode(arg1, 1); - print_syscall_epilogue(name); -} -#endif - #ifdef TARGET_NR_execv static void print_execv(const struct syscallname *name, diff --git a/linux-user/syscall-file.inc.c b/linux-user/syscall-file.inc.c index dd44d5b804..9b966ad627 100644 --- a/linux-user/syscall-file.inc.c +++ b/linux-user/syscall-file.inc.c @@ -24,6 +24,22 @@ SYSCALL_IMPL(close) return get_errno(close(fd)); } =20 +#ifdef TARGET_NR_creat +SYSCALL_IMPL(creat) +{ + char *p =3D lock_user_string(arg1); + abi_long ret; + + if (!p) { + return -TARGET_EFAULT; + } + ret =3D get_errno(creat(p, arg2)); + fd_trans_unregister(ret); + unlock_user(p, arg1, 0); + return ret; +} +#endif + /* * Helpers for do_openat, manipulating /proc/self/foo. */ diff --git a/linux-user/syscall.c b/linux-user/syscall.c index bdb0d45d9a..491e1d7cfb 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -5383,15 +5383,6 @@ static abi_long do_syscall1(void *cpu_env, int num, = abi_long arg1, void *p; =20 switch(num) { -#ifdef TARGET_NR_creat /* not on alpha */ - case TARGET_NR_creat: - if (!(p =3D lock_user_string(arg1))) - return -TARGET_EFAULT; - ret =3D get_errno(creat(p, arg2)); - fd_trans_unregister(ret); - unlock_user(p, arg1, 0); - return ret; -#endif #ifdef TARGET_NR_link case TARGET_NR_link: { diff --git a/linux-user/strace.list b/linux-user/strace.list index 759b35458e..41f8f8d0d0 100644 --- a/linux-user/strace.list +++ b/linux-user/strace.list @@ -94,9 +94,6 @@ #ifdef TARGET_NR_connect { TARGET_NR_connect, "connect" , "%s(%d,%#x,%d)", NULL, NULL }, #endif -#ifdef TARGET_NR_creat -{ TARGET_NR_creat, "creat" , NULL, print_creat, NULL }, -#endif #ifdef TARGET_NR_create_module { TARGET_NR_create_module, "create_module" , NULL, NULL, NULL }, #endif --=20 2.17.1 From nobody Thu May 9 22:44:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1558299558; cv=none; d=zoho.com; s=zohoarc; b=K/Dtmk/9Sc/zekWjQVyVV6fbbILmTzaJfOQ7LbTZAfEq0Tbya89eqwJiTE8A9WvL0+yLlMEYmao6cheNscBUadGwFtp3RcdlVFCFLREDAGpHujbGgbssDgVd3FWgKVg0ECWPaA9rkM2Ei/Jgm1fd0q2wPuyLWL5kp4FIw2pqgm0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1558299558; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=3+YujhkwUcm32OaJhXi3plbLKoShJGj44pRi7jq0BsI=; b=GvLHBKz/BtyCUMQ88UycdjG6fYZbKbryl9eW6tZHAYNHkc5TOTJAo3Phn7bI26VoNri6aH+Qqpl7n7t7Vu/OwGLnOhxwJdaJMGKK7VIp4/nmnfnhZz5FH1Vfch2XTxq3lAHvVMGP7Ruf3nvOHpXWFh2uWZiBh4FDTcxTO/Z+qJg= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1558299558000471.5530126829086; Sun, 19 May 2019 13:59:18 -0700 (PDT) Received: from localhost ([127.0.0.1]:53398 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSStj-0003dZ-M2 for importer@patchew.org; Sun, 19 May 2019 16:59:11 -0400 Received: from eggs.gnu.org ([209.51.188.92]:50403) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSZD-0003Ie-Q0 for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:01 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hSSZC-0003sB-Fo for qemu-devel@nongnu.org; Sun, 19 May 2019 16:37:59 -0400 Received: from mail-pl1-x642.google.com ([2607:f8b0:4864:20::642]:46927) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hSSZC-0003rG-9L for qemu-devel@nongnu.org; Sun, 19 May 2019 16:37:58 -0400 Received: by mail-pl1-x642.google.com with SMTP id r18so5698617pls.13 for ; Sun, 19 May 2019 13:37:58 -0700 (PDT) Received: from localhost.localdomain (97-113-13-231.tukw.qwest.net. [97.113.13.231]) by smtp.gmail.com with ESMTPSA id i7sm11397448pfo.19.2019.05.19.13.37.55 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 19 May 2019 13:37:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=3+YujhkwUcm32OaJhXi3plbLKoShJGj44pRi7jq0BsI=; b=whhRNYqLCqx77nzPXcgF2akJz9cqL77znkgo40u5v7pMuGbyH4MZ7ZpSyyTvW7ffxn Gq8qIHPRfG86I9UdVpQXIEDmYPZXRAuhGUY+yUtlH8bQvvE/0h/XoLumLp12sw61GjtB U8XTDKJ52B7H00PR7p0gnqsuoPjgOulqgODL7d9jdh8LndwCqsiIuOjTNYLpsnmpNaeP 2hMknugMygzAtE8C4dveJMVKuTb812QfOKapbBh45D5+qOqtAZu4qxaI7yq7B3lwbYHk LCVXRE1tg/yPspaRCejZILgy9ORxtU3Djj84JSQDQAwdt3iaSWSwE7DPuk2V0ay2OLb0 hwGw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=3+YujhkwUcm32OaJhXi3plbLKoShJGj44pRi7jq0BsI=; b=Xc/YG95coRIDWIq5A+VO8kpZOWB9+ETQv9mmrPkF5xkmJ+K3mWrW0Do7wiw3XhxdJy ouSwgCUtBXt8Ar1JA3fzTgkGyRRDK55OJgrNRwBxZ2jqdHxRn2zmKmq1Z/Y6l10HBCSl WEbEXGG4Z4LliQW6G4FkopVItAtwbdx0R9rUsCz3lIuoJRxRZ6b19vRoiKPkizBSaKT5 yjjw4yTUidZbrhuYGXl4hxmJfgFsYpLGR9YIpsxrCQpiwHv3v5ztyNkck6+jbWgR8RmK 0gUmp74cuxnWLBPv9oBITknlACzEutlGXLwmFSBOi4tNnCZxUU1vJ+Fg3gHmSejg20dT mtcg== X-Gm-Message-State: APjAAAXw1sSEFThHilmbi8TrTsAL3z0XA6smh92a/LLpbgSE+9ygeYCf llaWoh/Tf2NZ8xewwVCElSeSPKl6jvE= X-Google-Smtp-Source: APXvYqwmPsNNWmifxAgZFf87k9hqOGgUdLmBagvn+XEM4ASacN3t69mWQbkeomtC2WUAc2iqOkfe+Q== X-Received: by 2002:a17:902:59c3:: with SMTP id d3mr1083084plj.273.1558298277044; Sun, 19 May 2019 13:37:57 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sun, 19 May 2019 13:36:33 -0700 Message-Id: <20190519203726.20729-22-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190519203726.20729-1-richard.henderson@linaro.org> References: <20190519203726.20729-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::642 Subject: [Qemu-devel] [PATCH v7 21/74] linux-user: Split out link, linkat X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: laurent@vivier.eu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Note that linkat is universally provided. Signed-off-by: Richard Henderson --- linux-user/syscall-defs.h | 4 ++++ linux-user/strace.c | 29 ----------------------------- linux-user/syscall-file.inc.c | 28 ++++++++++++++++++++++++++++ linux-user/syscall.c | 32 -------------------------------- linux-user/strace.list | 6 ------ 5 files changed, 32 insertions(+), 67 deletions(-) diff --git a/linux-user/syscall-defs.h b/linux-user/syscall-defs.h index de7a99f0c6..41dd887dbc 100644 --- a/linux-user/syscall-defs.h +++ b/linux-user/syscall-defs.h @@ -31,6 +31,10 @@ SYSCALL_DEF(fork); #ifdef TARGET_NR_ipc SYSCALL_DEF_ARGS(ipc, ARG_HEX, ARG_DEC, ARG_DEC, ARG_HEX, ARG_PTR, ARG_HEX= ); #endif +#ifdef TARGET_NR_link +SYSCALL_DEF(link, ARG_STR, ARG_STR); +#endif +SYSCALL_DEF(linkat, ARG_ATDIRFD, ARG_STR, ARG_ATDIRFD, ARG_STR, ARG_ATFLAG= ); SYSCALL_DEF(mlock, ARG_PTR, ARG_DEC); SYSCALL_DEF(mlockall, ARG_HEX); #ifdef TARGET_NR_mmap diff --git a/linux-user/strace.c b/linux-user/strace.c index 640a80f32b..feb8ec7c09 100644 --- a/linux-user/strace.c +++ b/linux-user/strace.c @@ -1369,35 +1369,6 @@ print_futimesat(const struct syscallname *name, } #endif =20 -#ifdef TARGET_NR_link -static void -print_link(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - print_syscall_prologue(name); - print_string(arg0, 0); - print_string(arg1, 1); - print_syscall_epilogue(name); -} -#endif - -#ifdef TARGET_NR_linkat -static void -print_linkat(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - print_syscall_prologue(name); - print_at_dirfd(arg0, 0); - print_string(arg1, 0); - print_at_dirfd(arg2, 0); - print_string(arg3, 0); - print_flags(at_file_flags, arg4, 1); - print_syscall_epilogue(name); -} -#endif - #ifdef TARGET_NR__llseek static void print__llseek(const struct syscallname *name, diff --git a/linux-user/syscall-file.inc.c b/linux-user/syscall-file.inc.c index 9b966ad627..440ff5ed14 100644 --- a/linux-user/syscall-file.inc.c +++ b/linux-user/syscall-file.inc.c @@ -40,6 +40,34 @@ SYSCALL_IMPL(creat) } #endif =20 +static abi_long do_linkat(int olddirfd, abi_ulong target_oldpath, + int newdirfd, abi_ulong target_newpath, + int flags) +{ + char *oldpath =3D lock_user_string(target_oldpath); + char *newpath =3D lock_user_string(target_newpath); + abi_long ret =3D -TARGET_EFAULT; + + if (oldpath && newpath) { + ret =3D get_errno(linkat(olddirfd, oldpath, newdirfd, newpath, fla= gs)); + } + unlock_user(oldpath, target_oldpath, 0); + unlock_user(newpath, target_newpath, 0); + return ret; +} + +#ifdef TARGET_NR_link +SYSCALL_IMPL(link) +{ + return do_linkat(AT_FDCWD, arg1, AT_FDCWD, arg2, 0); +} +#endif + +SYSCALL_IMPL(linkat) +{ + return do_linkat(arg1, arg2, arg3, arg4, arg5); +} + /* * Helpers for do_openat, manipulating /proc/self/foo. */ diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 491e1d7cfb..865129df9e 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -5383,38 +5383,6 @@ static abi_long do_syscall1(void *cpu_env, int num, = abi_long arg1, void *p; =20 switch(num) { -#ifdef TARGET_NR_link - case TARGET_NR_link: - { - void * p2; - p =3D lock_user_string(arg1); - p2 =3D lock_user_string(arg2); - if (!p || !p2) - ret =3D -TARGET_EFAULT; - else - ret =3D get_errno(link(p, p2)); - unlock_user(p2, arg2, 0); - unlock_user(p, arg1, 0); - } - return ret; -#endif -#if defined(TARGET_NR_linkat) - case TARGET_NR_linkat: - { - void * p2 =3D NULL; - if (!arg2 || !arg4) - return -TARGET_EFAULT; - p =3D lock_user_string(arg2); - p2 =3D lock_user_string(arg4); - if (!p || !p2) - ret =3D -TARGET_EFAULT; - else - ret =3D get_errno(linkat(arg1, p, arg3, p2, arg5)); - unlock_user(p, arg2, 0); - unlock_user(p2, arg4, 0); - } - return ret; -#endif #ifdef TARGET_NR_unlink case TARGET_NR_unlink: if (!(p =3D lock_user_string(arg1))) diff --git a/linux-user/strace.list b/linux-user/strace.list index 41f8f8d0d0..f3c54cec69 100644 --- a/linux-user/strace.list +++ b/linux-user/strace.list @@ -461,12 +461,6 @@ #ifdef TARGET_NR_lgetxattr { TARGET_NR_lgetxattr, "lgetxattr" , NULL, NULL, NULL }, #endif -#ifdef TARGET_NR_link -{ TARGET_NR_link, "link" , NULL, print_link, NULL }, -#endif -#ifdef TARGET_NR_linkat -{ TARGET_NR_linkat, "linkat" , NULL, print_linkat, NULL }, -#endif #ifdef TARGET_NR_Linux { TARGET_NR_Linux, "Linux" , NULL, NULL, NULL }, #endif --=20 2.17.1 From nobody Thu May 9 22:44:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1558299988; cv=none; d=zoho.com; s=zohoarc; b=dvIuVcLuJyka2VfhC9qYDB3ypuS+x/D1gP9n6g9Bm4NqtYfMZZkFq2xPnNBwH0w+Fx+7cmPwa8ou0/4Bq7hYsEyrEebIIV825e3qhbf+nKi3aB4p5VlaWAczTC4Sn5Y4gqTvoOtB6t1g6MHWgnQam1kjnlDZv1mzNfkjEl3WEZ8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1558299988; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=H4vQIA+B5PMSizbcnaZO+HK/zsI+Heqt+lO8dDvIHmE=; b=ok/vnrKPGQH2KNgHG9CAqdTyYhiZp5DdgiHs02Q00T9HRaA2rd3hzkimcgIaQRB0Wy2NeF0mL1Nkx8nAZ8uLwT7wNYJOinogrwuMhcgdCok5UEhiAu445CgW2lkEuqfM+wTg+CqHWDW+VY287oaGo9t0SmSPrC50M3Fguy4xvXc= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (209.51.188.17 [209.51.188.17]) by mx.zohomail.com with SMTPS id 155829998839522.450962389261576; Sun, 19 May 2019 14:06:28 -0700 (PDT) Received: from localhost ([127.0.0.1]:53522 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hST0f-0001aC-Rm for importer@patchew.org; Sun, 19 May 2019 17:06:21 -0400 Received: from eggs.gnu.org ([209.51.188.92]:50421) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSZF-0003JD-6b for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:02 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hSSZD-0003uG-RA for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:01 -0400 Received: from mail-pl1-x642.google.com ([2607:f8b0:4864:20::642]:36600) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hSSZD-0003t0-IC for qemu-devel@nongnu.org; Sun, 19 May 2019 16:37:59 -0400 Received: by mail-pl1-x642.google.com with SMTP id d21so5723736plr.3 for ; Sun, 19 May 2019 13:37:59 -0700 (PDT) Received: from localhost.localdomain (97-113-13-231.tukw.qwest.net. [97.113.13.231]) by smtp.gmail.com with ESMTPSA id i7sm11397448pfo.19.2019.05.19.13.37.57 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 19 May 2019 13:37:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=H4vQIA+B5PMSizbcnaZO+HK/zsI+Heqt+lO8dDvIHmE=; b=nACouiip8p+PlsU6WPVxFUhzvBWGxmsSE4WlYsnUrnPAJCG7bxnmI7C3A4X1p6kvHM /hu1V+GNRJqJb2i5vHj5DcwV+PkzRBNdYIdn2MJdHWaNue+fNEv3mXBY5lEVhhh+pFeZ wao1yG2zYRQAC/d+yh92oPHvegNRGVqO5Jrr9KBSCkdRnBOonXB3VHteftuN8i4qyQcK AKlvaNy9cwp5v1wuKzQBTfpwD0ULEDm8zY4k3xzPtlq8bAG7R0fdv+SjIU2jmejygj6i 2eHnRhRrwevU9pnUCK0JpVzUlOvd58UP888m+NoCCs7ELRQGRt9Wbtq6DpRX0g7qcDax Wvtw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=H4vQIA+B5PMSizbcnaZO+HK/zsI+Heqt+lO8dDvIHmE=; b=p+u0Eieu1BG8P8hOyXL5Fo7MQFDyv4ZAsT71ApyQO9949vZiQaqsgUcCXV7FtGSFLW YraHbOQznizbuyIjLf6hBVFJoYjph7nRXrSdp6C5zMdEBpb86Kz4GBkvs4N29eNSIQH7 8IPiBLpngauTdZJ9/GljJEOvHmw2mFp9gNEj2GGHmp07l+H/zeZ022Tf6fSJZxcXBsAP /YeqBn/M0VLpyS/5wXjpKpC7WYvuZL0Q64PbeF08dY3q+xE/Ve4wg5xm9nbGh+Jh6qx7 C6uRUn4xjX16K6zM+0GbuUfRKWdigdxpfSqCOwTMf+/6MwvjZZJKEKhiehqa19Dx3cjq znMw== X-Gm-Message-State: APjAAAWp5gyiWSs8Yv7FACqwrFk/icdj4K5xZlmZMxmLp3WvciMCIYrW c9VD5DNhKF7wWqIcQ8UqIpcJyJ3fvNo= X-Google-Smtp-Source: APXvYqz3xuzyYYeRKGnw4pR8cCVIxg78fQnnc5EUNUnxjx7z4zlUIxX3USiFGyJnM+D8PsRxguVFXA== X-Received: by 2002:a17:902:70c6:: with SMTP id l6mr54071306plt.84.1558298278338; Sun, 19 May 2019 13:37:58 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sun, 19 May 2019 13:36:34 -0700 Message-Id: <20190519203726.20729-23-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190519203726.20729-1-richard.henderson@linaro.org> References: <20190519203726.20729-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::642 Subject: [Qemu-devel] [PATCH v7 22/74] linux-user: Split out unlink, unlinkat, rmdir X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: laurent@vivier.eu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Note that unlinkat is universally provided. Implement rmdir in terms of unlinkat. Signed-off-by: Richard Henderson --- linux-user/syscall-defs.h | 7 ++++++ linux-user/syscall.h | 1 + linux-user/strace.c | 43 ++++------------------------------- linux-user/syscall-file.inc.c | 32 ++++++++++++++++++++++++++ linux-user/syscall.c | 24 ------------------- linux-user/strace.list | 9 -------- 6 files changed, 44 insertions(+), 72 deletions(-) diff --git a/linux-user/syscall-defs.h b/linux-user/syscall-defs.h index 41dd887dbc..78d3f600eb 100644 --- a/linux-user/syscall-defs.h +++ b/linux-user/syscall-defs.h @@ -98,6 +98,9 @@ SYSCALL_DEF(readlink, ARG_STR, ARG_PTR, ARG_DEC); SYSCALL_DEF(readlinkat, ARG_ATDIRFD, ARG_STR, ARG_PTR, ARG_DEC); #endif SYSCALL_DEF(readv, ARG_DEC, ARG_PTR, ARG_DEC); +#ifdef TARGET_NR_rmdir +SYSCALL_DEF(rmdir, ARG_STR); +#endif #if !defined(SYSCALL_TABLE) || defined(TARGET_NR_semctl) SYSCALL_DEF(semctl, ARG_DEC, ARG_DEC, ARG_DEC, ARG_HEX); #endif @@ -121,6 +124,10 @@ SYSCALL_DEF(shmdt, ARG_PTR); #if !defined(SYSCALL_TABLE) || defined(TARGET_NR_shmget) SYSCALL_DEF(shmget, ARG_DEC, ARG_DEC, ARG_HEX); #endif +#ifdef TARGET_NR_unlink +SYSCALL_DEF(unlink, ARG_STR); +#endif +SYSCALL_DEF(unlinkat, ARG_ATDIRFD, ARG_STR, ARG_UNLINKATFLAG); #ifdef TARGET_NR_vfork /* Emulate vfork() with fork(). */ SYSCALL_DEF_FULL(vfork, .impl =3D impl_fork); diff --git a/linux-user/syscall.h b/linux-user/syscall.h index f75cd3ddd0..bdc4d653c4 100644 --- a/linux-user/syscall.h +++ b/linux-user/syscall.h @@ -63,6 +63,7 @@ typedef enum { ARG_MMAPPROT, ARG_MODEFLAG, ARG_OPENFLAG, + ARG_UNLINKATFLAG, =20 /* These are interpreted as pointers. */ ARG_PTR, diff --git a/linux-user/strace.c b/linux-user/strace.c index feb8ec7c09..9ac0b859da 100644 --- a/linux-user/strace.c +++ b/linux-user/strace.c @@ -684,7 +684,7 @@ static struct flags const at_file_flags[] =3D { FLAG_END, }; =20 -UNUSED static struct flags unlinkat_flags[] =3D { +static struct flags const unlinkat_flags[] =3D { #ifdef AT_REMOVEDIR FLAG_GENERIC(AT_REMOVEDIR), #endif @@ -1810,18 +1810,6 @@ print_mkdirat(const struct syscallname *name, } #endif =20 -#ifdef TARGET_NR_rmdir -static void -print_rmdir(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - print_syscall_prologue(name); - print_string(arg0, 0); - print_syscall_epilogue(name); -} -#endif - #ifdef TARGET_NR_rt_sigaction static void print_rt_sigaction(const struct syscallname *name, @@ -2187,32 +2175,6 @@ print_umount2(const struct syscallname *name, } #endif =20 -#ifdef TARGET_NR_unlink -static void -print_unlink(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - print_syscall_prologue(name); - print_string(arg0, 1); - print_syscall_epilogue(name); -} -#endif - -#ifdef TARGET_NR_unlinkat -static void -print_unlinkat(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - print_syscall_prologue(name); - print_at_dirfd(arg0, 0); - print_string(arg1, 0); - print_flags(unlinkat_flags, arg2, 1); - print_syscall_epilogue(name); -} -#endif - #ifdef TARGET_NR_utime static void print_utime(const struct syscallname *name, @@ -2475,6 +2437,9 @@ static void print_syscall_def1(const SyscallDef *def,= int64_t args[6]) case ARG_OPENFLAG: len =3D add_open_flags(b, rest, arg); break; + case ARG_UNLINKATFLAG: + len =3D add_flags(b, rest, unlinkat_flags, arg, true); + break; case ARG_PTR: len =3D add_pointer(b, rest, arg); break; diff --git a/linux-user/syscall-file.inc.c b/linux-user/syscall-file.inc.c index 440ff5ed14..5acd8ecc10 100644 --- a/linux-user/syscall-file.inc.c +++ b/linux-user/syscall-file.inc.c @@ -662,6 +662,38 @@ SYSCALL_IMPL(readlinkat) } #endif =20 +static abi_long do_unlinkat(int dirfd, abi_ulong target_path, int flags) +{ + char *p =3D lock_user_string(target_path); + abi_long ret; + + if (!p) { + return -TARGET_EFAULT; + } + ret =3D get_errno(unlinkat(dirfd, p, flags)); + unlock_user(p, target_path, 0); + return ret; +} + +#ifdef TARGET_NR_unlink +SYSCALL_IMPL(unlink) +{ + return do_unlinkat(AT_FDCWD, arg1, 0); +} +#endif + +#ifdef TARGET_NR_rmdir +SYSCALL_IMPL(rmdir) +{ + return do_unlinkat(AT_FDCWD, arg1, AT_REMOVEDIR); +} +#endif + +SYSCALL_IMPL(unlinkat) +{ + return do_unlinkat(arg1, arg2, arg3); +} + SYSCALL_IMPL(write) { int fd =3D arg1; diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 865129df9e..53e108b614 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -5383,22 +5383,6 @@ static abi_long do_syscall1(void *cpu_env, int num, = abi_long arg1, void *p; =20 switch(num) { -#ifdef TARGET_NR_unlink - case TARGET_NR_unlink: - if (!(p =3D lock_user_string(arg1))) - return -TARGET_EFAULT; - ret =3D get_errno(unlink(p)); - unlock_user(p, arg1, 0); - return ret; -#endif -#if defined(TARGET_NR_unlinkat) - case TARGET_NR_unlinkat: - if (!(p =3D lock_user_string(arg2))) - return -TARGET_EFAULT; - ret =3D get_errno(unlinkat(arg1, p, arg3)); - unlock_user(p, arg2, 0); - return ret; -#endif case TARGET_NR_execve: { char **argp, **envp; @@ -5790,14 +5774,6 @@ static abi_long do_syscall1(void *cpu_env, int num, = abi_long arg1, ret =3D get_errno(mkdirat(arg1, p, arg3)); unlock_user(p, arg2, 0); return ret; -#endif -#ifdef TARGET_NR_rmdir - case TARGET_NR_rmdir: - if (!(p =3D lock_user_string(arg1))) - return -TARGET_EFAULT; - ret =3D get_errno(rmdir(p)); - unlock_user(p, arg1, 0); - return ret; #endif case TARGET_NR_dup: ret =3D get_errno(dup(arg1)); diff --git a/linux-user/strace.list b/linux-user/strace.list index f3c54cec69..f08ddaddac 100644 --- a/linux-user/strace.list +++ b/linux-user/strace.list @@ -527,9 +527,6 @@ #ifdef TARGET_NR_mkdirat { TARGET_NR_mkdirat, "mkdirat" , NULL, print_mkdirat, NULL }, #endif -#ifdef TARGET_NR_rmdir -{ TARGET_NR_rmdir, "rmdir" , NULL, print_rmdir, NULL }, -#endif #ifdef TARGET_NR_mknod { TARGET_NR_mknod, "mknod" , NULL, print_mknod, NULL }, #endif @@ -1425,12 +1422,6 @@ #ifdef TARGET_NR_uname { TARGET_NR_uname, "uname" , "%s(%p)", NULL, NULL }, #endif -#ifdef TARGET_NR_unlink -{ TARGET_NR_unlink, "unlink" , NULL, print_unlink, NULL }, -#endif -#ifdef TARGET_NR_unlinkat -{ TARGET_NR_unlinkat, "unlinkat" , NULL, print_unlinkat, NULL }, -#endif #ifdef TARGET_NR_unshare { TARGET_NR_unshare, "unshare" , NULL, NULL, NULL }, #endif --=20 2.17.1 From nobody Thu May 9 22:44:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1558299531; cv=none; d=zoho.com; s=zohoarc; b=dcXWdoMzIm/jPQIXLPXl6hVe/xnrJtQclVQYqs34Xz9RlZBI3adtsvR/8OwXxLKzVXUVmoB/VxD1V9qZ/gOhqu5CKsFMYjn2FRAKmRLvKWEX6vZvPeSHdbl3tmmRGwJkMsmjH8gCQMvvjkw/S+IdWTlm7dvBvx/+mX7Fy4fN4CY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1558299531; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=FtdYKl9zJgpOHr5aJ0qnR6xTcabKx8Fz/s3C+R4+JHc=; b=aXedRHTf9W8PgE/OrTaUXMmheQt4D0usFr5Fp43TA5SwcA5R0d1zKfXWM3wkcDkfllSI0VMuP+LqccOlCsw+LvEseWZcxRwSJWWYSZvofVZ1jYcg4sTFrncXAAovC8tl1iPjVmW14FaZvDTadwjHxpIlnPFbUYsY4HHsXJ0Qx5I= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (209.51.188.17 [209.51.188.17]) by mx.zohomail.com with SMTPS id 1558299531382879.4378090090796; Sun, 19 May 2019 13:58:51 -0700 (PDT) Received: from localhost ([127.0.0.1]:53394 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSsw-00030X-4L for importer@patchew.org; Sun, 19 May 2019 16:58:22 -0400 Received: from eggs.gnu.org ([209.51.188.92]:50441) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSZG-0003LS-If for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:04 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hSSZF-0003vs-0e for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:02 -0400 Received: from mail-pl1-x643.google.com ([2607:f8b0:4864:20::643]:45099) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hSSZE-0003uw-OF for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:00 -0400 Received: by mail-pl1-x643.google.com with SMTP id a5so5687509pls.12 for ; Sun, 19 May 2019 13:38:00 -0700 (PDT) Received: from localhost.localdomain (97-113-13-231.tukw.qwest.net. [97.113.13.231]) by smtp.gmail.com with ESMTPSA id i7sm11397448pfo.19.2019.05.19.13.37.58 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 19 May 2019 13:37:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=FtdYKl9zJgpOHr5aJ0qnR6xTcabKx8Fz/s3C+R4+JHc=; b=lc7yjcylh2ktAOsBbrksTXSHofdMS8y1fJpErjwgKKALi4DoeDrZFdwiJLtnRwogqq uzKXHDiNWlSDk9jmcN4Jbnlmq2TJGB61+m5EkYbqFsrUxBFSqsOr51y+kiJ7hqMmLRmT SaiiZuAySvjyr+deD3lpveSxGvx/0e6BXfarRBo6ABOIiIcCDUCBqHE30kwcB3PUgJo7 zCmrpG1pFr8y8USr19n0hFqanfYdEJgN0LKvTx50QeaZSODE4cN8PWWgKNku2WD3R+zd zO/7jYK+qJm8k6HfPTxSAuSYqIYmHaFCKgwstAhMtS1EHkXUppOuuWfcqM9ES2F6lCxi cH9Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=FtdYKl9zJgpOHr5aJ0qnR6xTcabKx8Fz/s3C+R4+JHc=; b=cqThUV6YuUowWv3ccn2kPvqkPbecRhT/KcGdnopNrsVUUMT/N+oJyp+j4/a1AE26Zh 0vkmZxZg/EuOdz6/jlL8E21RdZUMXbgtaCwq9Y1QplNF+h5rrjr+ohxIrswhOLcU4Gle UKFihEVOj5uyW2DhzEpFw3WmoWqInvh11rlCQ/z7A3KCzLGe7JoxadCkxHpK01aiDWd2 nQN0Q/lRcoPz18aEYyI3z2sOy65muho79YTQz05uqFxtwdzqKwqY37oXgzbgAW2Oq1Jk tBWGvPTGsw6H/YIUzyQs8tnka5EmKahFNIjblnBAJwHOb8jH9hJ9wNy3hCq7AkhUdnjU pOvA== X-Gm-Message-State: APjAAAVFfYxnQufVgbyd/F1AGyBVrDFGYym2lbduK8MqlJVu7PFQdyZ+ vx8N3lpZV8izEivIz0K77r98DvU2DWE= X-Google-Smtp-Source: APXvYqzCVhJMTT5Zn3KVouE8P+0XIj4FtYblzR0qSAVFTSsBqGn0j779ornc1e6vDRaBdAfXn3oVhQ== X-Received: by 2002:a17:902:b941:: with SMTP id h1mr13225338pls.289.1558298279505; Sun, 19 May 2019 13:37:59 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sun, 19 May 2019 13:36:35 -0700 Message-Id: <20190519203726.20729-24-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190519203726.20729-1-richard.henderson@linaro.org> References: <20190519203726.20729-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::643 Subject: [Qemu-devel] [PATCH v7 23/74] linux-user: Split out execve X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: laurent@vivier.eu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Richard Henderson --- linux-user/syscall-defs.h | 1 + linux-user/strace.c | 32 ---------- linux-user/syscall-proc.inc.c | 110 ++++++++++++++++++++++++++++++++++ linux-user/syscall.c | 97 ------------------------------ linux-user/strace.list | 3 - 5 files changed, 111 insertions(+), 132 deletions(-) diff --git a/linux-user/syscall-defs.h b/linux-user/syscall-defs.h index 78d3f600eb..58fef48666 100644 --- a/linux-user/syscall-defs.h +++ b/linux-user/syscall-defs.h @@ -25,6 +25,7 @@ SYSCALL_DEF(close, ARG_DEC); SYSCALL_DEF(creat, ARG_STR, ARG_MODEFLAG); #endif SYSCALL_DEF(exit, ARG_DEC); +SYSCALL_DEF(execve, ARG_STR, ARG_PTR, ARG_PTR); #ifdef TARGET_NR_fork SYSCALL_DEF(fork); #endif diff --git a/linux-user/strace.c b/linux-user/strace.c index 9ac0b859da..9d6c765715 100644 --- a/linux-user/strace.c +++ b/linux-user/strace.c @@ -568,38 +568,6 @@ print_newselect(const struct syscallname *name, } #endif =20 -static void -print_execve(const struct syscallname *name, - abi_long arg1, abi_long arg2, abi_long arg3, - abi_long arg4, abi_long arg5, abi_long arg6) -{ - abi_ulong arg_ptr_addr; - char *s; - - if (!(s =3D lock_user_string(arg1))) - return; - gemu_log("%s(\"%s\",{", name->name, s); - unlock_user(s, arg1, 0); - - for (arg_ptr_addr =3D arg2; ; arg_ptr_addr +=3D sizeof(abi_ulong)) { - abi_ulong *arg_ptr, arg_addr; - - arg_ptr =3D lock_user(VERIFY_READ, arg_ptr_addr, sizeof(abi_ulong)= , 1); - if (!arg_ptr) - return; - arg_addr =3D tswapal(*arg_ptr); - unlock_user(arg_ptr, arg_ptr_addr, 0); - if (!arg_addr) - break; - if ((s =3D lock_user_string(arg_addr))) { - gemu_log("\"%s\",", s); - unlock_user(s, arg_addr, 0); - } - } - - gemu_log("NULL})"); -} - /* * Variants for the return value output function */ diff --git a/linux-user/syscall-proc.inc.c b/linux-user/syscall-proc.inc.c index b7304b7a42..66ad768551 100644 --- a/linux-user/syscall-proc.inc.c +++ b/linux-user/syscall-proc.inc.c @@ -269,6 +269,116 @@ SYSCALL_IMPL(clone) return do_clone(cpu_env, arg1, arg2, arg3, arg4, arg5); } =20 +SYSCALL_IMPL(execve) +{ + char **argp, **envp; + int argc, envc; + abi_ulong gp; + abi_ulong guest_path =3D arg1; + abi_ulong guest_argp =3D arg2; + abi_ulong guest_envp =3D arg3; + abi_ulong addr; + char **q, *p; + int total_size =3D 0; + abi_long ret =3D -TARGET_EFAULT; + + argc =3D 0; + for (gp =3D guest_argp; gp; gp +=3D sizeof(abi_ulong)) { + if (get_user_ual(addr, gp)) { + goto execve_nofree; + } + if (!addr) { + break; + } + argc++; + } + envc =3D 0; + for (gp =3D guest_envp; gp; gp +=3D sizeof(abi_ulong)) { + if (get_user_ual(addr, gp)) { + goto execve_nofree; + } + if (!addr) { + break; + } + envc++; + } + + argp =3D g_new0(char *, argc + 1); + envp =3D g_new0(char *, envc + 1); + + for (gp =3D guest_argp, q =3D argp; gp; gp +=3D sizeof(abi_ulong), q++= ) { + char *this_q; + + if (get_user_ual(addr, gp)) { + goto execve_free; + } + if (!addr) { + break; + } + this_q =3D lock_user_string(addr); + if (!this_q) { + goto execve_free; + } + *q =3D this_q; + total_size +=3D strlen(this_q) + 1; + } + + for (gp =3D guest_envp, q =3D envp; gp; gp +=3D sizeof(abi_ulong), q++= ) { + char *this_q; + + if (get_user_ual(addr, gp)) { + goto execve_free; + } + if (!addr) { + break; + } + this_q =3D lock_user_string(addr); + if (!this_q) { + goto execve_free; + } + *q =3D this_q; + total_size +=3D strlen(this_q) + 1; + } + + p =3D lock_user_string(guest_path); + if (!p) { + goto execve_free; + } + + /* + * Although execve() is not an interruptible syscall it is + * a special case where we must use the safe_syscall wrapper: + * if we allow a signal to happen before we make the host + * syscall then we will 'lose' it, because at the point of + * execve the process leaves QEMU's control. So we use the + * safe syscall wrapper to ensure that we either take the + * signal as a guest signal, or else it does not happen + * before the execve completes and makes it the other + * program's problem. + */ + ret =3D get_errno(safe_execve(p, argp, envp)); + unlock_user(p, guest_path, 0); + + execve_free: + for (gp =3D guest_argp, q =3D argp; *q; gp +=3D sizeof(abi_ulong), q++= ) { + if (get_user_ual(addr, gp) || !addr) { + break; + } + unlock_user(*q, addr, 0); + } + for (gp =3D guest_envp, q =3D envp; *q; gp +=3D sizeof(abi_ulong), q++= ) { + if (get_user_ual(addr, gp) || !addr) { + break; + } + unlock_user(*q, addr, 0); + } + g_free(argp); + g_free(envp); + + execve_nofree: + return ret; +} + SYSCALL_IMPL(exit) { CPUState *cpu =3D ENV_GET_CPU(cpu_env); diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 53e108b614..a00df1162f 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -5383,103 +5383,6 @@ static abi_long do_syscall1(void *cpu_env, int num,= abi_long arg1, void *p; =20 switch(num) { - case TARGET_NR_execve: - { - char **argp, **envp; - int argc, envc; - abi_ulong gp; - abi_ulong guest_argp; - abi_ulong guest_envp; - abi_ulong addr; - char **q; - int total_size =3D 0; - - argc =3D 0; - guest_argp =3D arg2; - for (gp =3D guest_argp; gp; gp +=3D sizeof(abi_ulong)) { - if (get_user_ual(addr, gp)) - return -TARGET_EFAULT; - if (!addr) - break; - argc++; - } - envc =3D 0; - guest_envp =3D arg3; - for (gp =3D guest_envp; gp; gp +=3D sizeof(abi_ulong)) { - if (get_user_ual(addr, gp)) - return -TARGET_EFAULT; - if (!addr) - break; - envc++; - } - - argp =3D g_new0(char *, argc + 1); - envp =3D g_new0(char *, envc + 1); - - for (gp =3D guest_argp, q =3D argp; gp; - gp +=3D sizeof(abi_ulong), q++) { - if (get_user_ual(addr, gp)) - goto execve_efault; - if (!addr) - break; - if (!(*q =3D lock_user_string(addr))) - goto execve_efault; - total_size +=3D strlen(*q) + 1; - } - *q =3D NULL; - - for (gp =3D guest_envp, q =3D envp; gp; - gp +=3D sizeof(abi_ulong), q++) { - if (get_user_ual(addr, gp)) - goto execve_efault; - if (!addr) - break; - if (!(*q =3D lock_user_string(addr))) - goto execve_efault; - total_size +=3D strlen(*q) + 1; - } - *q =3D NULL; - - if (!(p =3D lock_user_string(arg1))) - goto execve_efault; - /* Although execve() is not an interruptible syscall it is - * a special case where we must use the safe_syscall wrapper: - * if we allow a signal to happen before we make the host - * syscall then we will 'lose' it, because at the point of - * execve the process leaves QEMU's control. So we use the - * safe syscall wrapper to ensure that we either take the - * signal as a guest signal, or else it does not happen - * before the execve completes and makes it the other - * program's problem. - */ - ret =3D get_errno(safe_execve(p, argp, envp)); - unlock_user(p, arg1, 0); - - goto execve_end; - - execve_efault: - ret =3D -TARGET_EFAULT; - - execve_end: - for (gp =3D guest_argp, q =3D argp; *q; - gp +=3D sizeof(abi_ulong), q++) { - if (get_user_ual(addr, gp) - || !addr) - break; - unlock_user(*q, addr, 0); - } - for (gp =3D guest_envp, q =3D envp; *q; - gp +=3D sizeof(abi_ulong), q++) { - if (get_user_ual(addr, gp) - || !addr) - break; - unlock_user(*q, addr, 0); - } - - g_free(argp); - g_free(envp); - } - return ret; case TARGET_NR_chdir: if (!(p =3D lock_user_string(arg1))) return -TARGET_EFAULT; diff --git a/linux-user/strace.list b/linux-user/strace.list index f08ddaddac..39e5c5b1aa 100644 --- a/linux-user/strace.list +++ b/linux-user/strace.list @@ -139,9 +139,6 @@ #ifdef TARGET_NR_execv { TARGET_NR_execv, "execv" , NULL, print_execv, NULL }, #endif -#ifdef TARGET_NR_execve -{ TARGET_NR_execve, "execve" , NULL, print_execve, NULL }, -#endif #ifdef TARGET_NR_execveat { TARGET_NR_execveat, "execveat" , NULL, NULL, NULL }, #endif --=20 2.17.1 From nobody Thu May 9 22:44:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1558299344; cv=none; d=zoho.com; s=zohoarc; b=JN/lgLPL5N6CgpLhrsoIzVy+s5X9997jHXcbBXPzH3zUJT1lUFGq1DQrP7suR1+lk5Inj5awpzEpJm4XKV+FxrWY5jKwP2yLNjLv//bYf7nTHMMj1padX9XevYosglRdd8L3PgeW64ip2POH7kxzZ+uphLhJKD6Fcr5GvGd2HJI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1558299344; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=CUstonr/slKQsOp95jk6g1WJFMbRRVPH2v9t0llMUoM=; b=heEuiZ0Ph0mDcaOfjCAcddSF1JHQ2vEQhALC3o15jAxsmx5PRHuTYjujw8E7eRjSa0WK9UbJBSFZ0S+C+1yLNnQuq65YldtRHvts/pH+a2hFR4yet2CyVBNgsXPJ1mRmm5TcruJ/CExwxBoJLIMFV4gITOsfWhY5YQ9Tar3U6hA= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (209.51.188.17 [209.51.188.17]) by mx.zohomail.com with SMTPS id 1558299344717750.5690991795111; Sun, 19 May 2019 13:55:44 -0700 (PDT) Received: from localhost ([127.0.0.1]:53348 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSqI-0000ZO-H5 for importer@patchew.org; Sun, 19 May 2019 16:55:38 -0400 Received: from eggs.gnu.org ([209.51.188.92]:50452) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSZH-0003MX-Mo for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:04 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hSSZG-0003xg-Jq for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:03 -0400 Received: from mail-pg1-x542.google.com ([2607:f8b0:4864:20::542]:45523) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hSSZG-0003wx-D8 for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:02 -0400 Received: by mail-pg1-x542.google.com with SMTP id i21so5720909pgi.12 for ; Sun, 19 May 2019 13:38:02 -0700 (PDT) Received: from localhost.localdomain (97-113-13-231.tukw.qwest.net. [97.113.13.231]) by smtp.gmail.com with ESMTPSA id i7sm11397448pfo.19.2019.05.19.13.37.59 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 19 May 2019 13:37:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=CUstonr/slKQsOp95jk6g1WJFMbRRVPH2v9t0llMUoM=; b=gztWdzs8chvklwyvFRigzSUIlJ58+409oA0pFmMX6kvHD9UoGLi2aYp4xSZ/QLsCT/ i5zUc8HPJWhG/PYEU6ecEV5qVWGkWb9pbEC5/cEDUD7ZOm4u4YuFAX229/1RZSJzXlN4 0GTMknJR+PtwwAnChPiQHqeT0Xs6g5tadTlFrvpPk/gvRDjv0c3FQnaKNrIXllJbI4ez Tr/8g7PLp8/nH1AKxCC95sYOPwiouWzUjTnxleY2DHDoa2zsgC9iFzkMmI2EesYmKWU8 5udxp5Mrm2YpXNK3LNlTIPtzv5cOlfGq8nohVMkQ8oM0rrp5fsjVRaO0Qt/Dvl92AO2r 3T1A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=CUstonr/slKQsOp95jk6g1WJFMbRRVPH2v9t0llMUoM=; b=RiFXru9AUxYSzsxWT8S9aZDK8eru46tGarQW8GY0uMhLNBB+m9iY12Gz2oqrc9aCOq wU2DfyE7ULReTQ30Vc6YSfwYeqckNSpLcYmKu5hjfvDfpon6CErd/BfC7FP/jlw7D+0C YmKoGSbGrzOefrbXI2w8WowAuTwZyso0kTlZDPG+mBgUaMYMV2AhytqkCrsbO/S6nodR CM/maWuUj4SvXahaP+AJ3hDbzUDH0IFwQo8OeeQvYfQa0zkAcgwulrcEpTVd5PO48eV/ Uh06xRNuwuI36YRotM3lilCVJ6VtbXVJnNYLeUCQ1sQuzYMN5nuAzKaoQiyR4PAsVVDR Yssw== X-Gm-Message-State: APjAAAUTdpwAVxoS5+QEMaUm3vdcWfZnT/9WK835ehJfAH50Jkd5Sbal L2D29lzdXQ9KKFlG8ENrvjytQfBsw4A= X-Google-Smtp-Source: APXvYqwXLgCQ/UOuHmUq+tqKf1FtwWeOBoUur30aXwKUjdUx/bcyqH8mguvl6XKPWYIM9tRX7wTpQw== X-Received: by 2002:a63:4c15:: with SMTP id z21mr27665675pga.395.1558298281198; Sun, 19 May 2019 13:38:01 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sun, 19 May 2019 13:36:36 -0700 Message-Id: <20190519203726.20729-25-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190519203726.20729-1-richard.henderson@linaro.org> References: <20190519203726.20729-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::542 Subject: [Qemu-devel] [PATCH v7 24/74] linux-user: Implement execveat X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: laurent@vivier.eu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" A trivial extension to our current execve implementation to support the new(ish) syscall. Signed-off-by: Richard Henderson --- linux-user/syscall-defs.h | 1 + linux-user/syscall-proc.inc.c | 19 ++++++++++++++----- linux-user/syscall.c | 3 ++- linux-user/strace.list | 3 --- 4 files changed, 17 insertions(+), 9 deletions(-) diff --git a/linux-user/syscall-defs.h b/linux-user/syscall-defs.h index 58fef48666..392bd1579c 100644 --- a/linux-user/syscall-defs.h +++ b/linux-user/syscall-defs.h @@ -26,6 +26,7 @@ SYSCALL_DEF(creat, ARG_STR, ARG_MODEFLAG); #endif SYSCALL_DEF(exit, ARG_DEC); SYSCALL_DEF(execve, ARG_STR, ARG_PTR, ARG_PTR); +SYSCALL_DEF(execveat, ARG_ATDIRFD, ARG_STR, ARG_PTR, ARG_PTR, ARG_ATFLAG); #ifdef TARGET_NR_fork SYSCALL_DEF(fork); #endif diff --git a/linux-user/syscall-proc.inc.c b/linux-user/syscall-proc.inc.c index 66ad768551..fd114d1f03 100644 --- a/linux-user/syscall-proc.inc.c +++ b/linux-user/syscall-proc.inc.c @@ -269,14 +269,13 @@ SYSCALL_IMPL(clone) return do_clone(cpu_env, arg1, arg2, arg3, arg4, arg5); } =20 -SYSCALL_IMPL(execve) +static abi_long do_execveat(int dirfd, abi_ulong guest_path, + abi_ulong guest_argp, abi_ulong guest_envp, + int flags) { char **argp, **envp; int argc, envc; abi_ulong gp; - abi_ulong guest_path =3D arg1; - abi_ulong guest_argp =3D arg2; - abi_ulong guest_envp =3D arg3; abi_ulong addr; char **q, *p; int total_size =3D 0; @@ -356,7 +355,7 @@ SYSCALL_IMPL(execve) * before the execve completes and makes it the other * program's problem. */ - ret =3D get_errno(safe_execve(p, argp, envp)); + ret =3D get_errno(safe_execveat(dirfd, p, argp, envp, flags)); unlock_user(p, guest_path, 0); =20 execve_free: @@ -379,6 +378,16 @@ SYSCALL_IMPL(execve) return ret; } =20 +SYSCALL_IMPL(execve) +{ + return do_execveat(AT_FDCWD, arg1, arg2, arg3, 0); +} + +SYSCALL_IMPL(execveat) +{ + return do_execveat(arg1, arg2, arg3, arg4, arg5); +} + SYSCALL_IMPL(exit) { CPUState *cpu =3D ENV_GET_CPU(cpu_env); diff --git a/linux-user/syscall.c b/linux-user/syscall.c index a00df1162f..affcd81273 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -672,7 +672,8 @@ safe_syscall4(pid_t, wait4, pid_t, pid, int *, status, = int, options, \ struct rusage *, rusage) safe_syscall5(int, waitid, idtype_t, idtype, id_t, id, siginfo_t *, infop,= \ int, options, struct rusage *, rusage) -safe_syscall3(int, execve, const char *, filename, char **, argv, char **,= envp) +safe_syscall5(int, execveat, int, dirfd, const char *, filename, + char **, argv, char **, envp, int, flags) safe_syscall6(int, pselect6, int, nfds, fd_set *, readfds, fd_set *, write= fds, \ fd_set *, exceptfds, struct timespec *, timeout, void *, sig) safe_syscall5(int, ppoll, struct pollfd *, ufds, unsigned int, nfds, diff --git a/linux-user/strace.list b/linux-user/strace.list index 39e5c5b1aa..c6bb475728 100644 --- a/linux-user/strace.list +++ b/linux-user/strace.list @@ -139,9 +139,6 @@ #ifdef TARGET_NR_execv { TARGET_NR_execv, "execv" , NULL, print_execv, NULL }, #endif -#ifdef TARGET_NR_execveat -{ TARGET_NR_execveat, "execveat" , NULL, NULL, NULL }, -#endif #ifdef TARGET_NR_exec_with_loader { TARGET_NR_exec_with_loader, "exec_with_loader" , NULL, NULL, NULL }, #endif --=20 2.17.1 From nobody Thu May 9 22:44:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1558299686; cv=none; d=zoho.com; s=zohoarc; b=bQuxM8TYyXz95r5LdYsfEEE8j8qQYPFwjrF1nGIDfqD7fhD53SFJVBWu66avqn73FgFS1ImN3NyzKdDJrwCdFfw9xWuFosp7xstJSDTewtdXF0rp3dBNR2UGfNcRTQ+XYw8KDCA9V3WQLDpyiRXin4jTfiaQPlQ6YR8etN5SG7A= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1558299686; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=F+fKej9fPmaDrSPzKASFQtBx9UbES7Ex48WVScqi++Y=; b=nNjUKki5ugXopkYoPRTloBkNdO8q1xEDA2nAVnhqU09qsRi6DHNZHScT33TGsmKCfVqkl0OAMFIBZMQPV45BYqAf+tzfHq9gMHvAi/uNoft3JvvrNxx4z+GwMgiIA19rvEwNEAEfhFq119jS3bDuwLHCBS8eTr6jH2Vp3+clW5A= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (209.51.188.17 [209.51.188.17]) by mx.zohomail.com with SMTPS id 155829968683182.42454637933099; Sun, 19 May 2019 14:01:26 -0700 (PDT) Received: from localhost ([127.0.0.1]:53450 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSvo-0005Xl-J0 for importer@patchew.org; Sun, 19 May 2019 17:01:20 -0400 Received: from eggs.gnu.org ([209.51.188.92]:50468) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSZI-0003No-Ro for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:05 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hSSZH-0003z2-Os for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:04 -0400 Received: from mail-pf1-x443.google.com ([2607:f8b0:4864:20::443]:42916) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hSSZH-0003y7-IH for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:03 -0400 Received: by mail-pf1-x443.google.com with SMTP id 13so6157230pfw.9 for ; Sun, 19 May 2019 13:38:03 -0700 (PDT) Received: from localhost.localdomain (97-113-13-231.tukw.qwest.net. [97.113.13.231]) by smtp.gmail.com with ESMTPSA id i7sm11397448pfo.19.2019.05.19.13.38.01 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 19 May 2019 13:38:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=F+fKej9fPmaDrSPzKASFQtBx9UbES7Ex48WVScqi++Y=; b=AyIGZgacVo1RSvmJgHsjrxMNdHL0qO6O7OQoHEIjI6sQOu1zg1i8IuMjvWUDjcCCGO yW/1kZUtgIhqnnlF5WbemkE/r0epfOs0FbhBW8lbtEA6aK42VKZOHGlhBVUnu8CLCUoJ Di/UinbDRth9n8uSqEMu4N+9OxNqet3+w9pns9w5KdAXGJQOGwd0xtvU/6CFhkvhSrWT Bpi7hvMEI2Zb3QdWZko78kSNgewVZENWmqhwNRTe+c3wUj1I3B7tusF4XA6opr1xTpbO shNs8SmS7BN5Oihg0fqJsLQ4PNtI1LSJm4yTHg0qOhji1sDU4gyqvpQhIA6q0MUh6CC6 T4yQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=F+fKej9fPmaDrSPzKASFQtBx9UbES7Ex48WVScqi++Y=; b=Ry2QXvOqb6LQl2ZWr6omxRW9LiE/5rrVTRNJfRdFtdAcDDdiN//1CBrozlq5IikZpL zlhnLsJalazoBbX1geDvTxBgFaMrrNstohyxFnabe0MA9La23Cg37ehEur+MdwS7WnmP YPjDL/KUSCOOUHwP7qD44iZBe6bq60wqz7KmUR3qbOIfwBVmKeLb2KQ/dfqM+yXayb2d 8Ll5OaojnuWXuTmCu6y6aJA6iNGSps0urjh4VHh6TdfQM3lvq59wy9kJpRAIF6LTqFJF qUUZjLmTnpdzMWRDNHSQ6tlANO6DfEAHm0NobkNrcE+uuSMFvf24icAlKRMVzIGeYn5w 888w== X-Gm-Message-State: APjAAAVQOY94pO0utIt/w07+A8ZWa/7l6CUDWUzbJiPCUW/PB0xMek/p Azo9Z3HxgBUMzdcwx+3GoEAzXTlHLtI= X-Google-Smtp-Source: APXvYqyJCY2nR0ZQQtVLHkL0GjYYLfqIhte6lhILpp06gc3oX0Sdh8iN0NVGyyEG2uGk+Fsg0yq9Zw== X-Received: by 2002:a63:d354:: with SMTP id u20mr22999650pgi.129.1558298282395; Sun, 19 May 2019 13:38:02 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sun, 19 May 2019 13:36:37 -0700 Message-Id: <20190519203726.20729-26-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190519203726.20729-1-richard.henderson@linaro.org> References: <20190519203726.20729-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::443 Subject: [Qemu-devel] [PATCH v7 25/74] linux-user: Split out chdir X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: laurent@vivier.eu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Note that chdir is universally provided. Signed-off-by: Richard Henderson --- linux-user/syscall-defs.h | 1 + linux-user/strace.c | 12 ------------ linux-user/syscall-file.inc.c | 14 ++++++++++++++ linux-user/syscall.c | 6 ------ linux-user/strace.list | 3 --- 5 files changed, 15 insertions(+), 21 deletions(-) diff --git a/linux-user/syscall-defs.h b/linux-user/syscall-defs.h index 392bd1579c..3fad9d51f0 100644 --- a/linux-user/syscall-defs.h +++ b/linux-user/syscall-defs.h @@ -19,6 +19,7 @@ SYSCALL_DEF_FULL(brk, .impl =3D impl_brk, .print_ret =3D print_syscall_ptr_ret, .arg_type =3D { ARG_PTR }); +SYSCALL_DEF(chdir, ARG_STR); SYSCALL_DEF_ARGS(clone, ARG_CLONEFLAG, ARG_PTR, ARG_PTR, ARG_PTR, ARG_PTR); SYSCALL_DEF(close, ARG_DEC); #ifdef TARGET_NR_creat diff --git a/linux-user/strace.c b/linux-user/strace.c index 9d6c765715..b234274034 100644 --- a/linux-user/strace.c +++ b/linux-user/strace.c @@ -1113,18 +1113,6 @@ print_access(const struct syscallname *name, } #endif =20 -#ifdef TARGET_NR_chdir -static void -print_chdir(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - print_syscall_prologue(name); - print_string(arg0, 1); - print_syscall_epilogue(name); -} -#endif - #ifdef TARGET_NR_chroot static void print_chroot(const struct syscallname *name, diff --git a/linux-user/syscall-file.inc.c b/linux-user/syscall-file.inc.c index 5acd8ecc10..76637fe71b 100644 --- a/linux-user/syscall-file.inc.c +++ b/linux-user/syscall-file.inc.c @@ -16,6 +16,20 @@ * along with this program; if not, see . */ =20 +SYSCALL_IMPL(chdir) +{ + abi_ulong target_path =3D arg1; + char *p =3D lock_user_string(target_path); + abi_long ret; + + if (!p) { + return -TARGET_EFAULT; + } + ret =3D get_errno(chdir(p)); + unlock_user(p, target_path, 0); + return ret; +} + SYSCALL_IMPL(close) { int fd =3D arg1; diff --git a/linux-user/syscall.c b/linux-user/syscall.c index affcd81273..0bf5901014 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -5384,12 +5384,6 @@ static abi_long do_syscall1(void *cpu_env, int num, = abi_long arg1, void *p; =20 switch(num) { - case TARGET_NR_chdir: - if (!(p =3D lock_user_string(arg1))) - return -TARGET_EFAULT; - ret =3D get_errno(chdir(p)); - unlock_user(p, arg1, 0); - return ret; #ifdef TARGET_NR_time case TARGET_NR_time: { diff --git a/linux-user/strace.list b/linux-user/strace.list index c6bb475728..3f79159b63 100644 --- a/linux-user/strace.list +++ b/linux-user/strace.list @@ -61,9 +61,6 @@ #ifdef TARGET_NR_capset { TARGET_NR_capset, "capset" , "%s(%p,%p)", NULL, NULL }, #endif -#ifdef TARGET_NR_chdir -{ TARGET_NR_chdir, "chdir" , NULL, print_chdir, NULL }, -#endif #ifdef TARGET_NR_chmod { TARGET_NR_chmod, "chmod" , NULL, print_chmod, NULL }, #endif --=20 2.17.1 From nobody Thu May 9 22:44:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1558302090; cv=none; d=zoho.com; s=zohoarc; b=NSCoSHp5Y1k7wBZ+5xQkLidZJIWRWkLQ1inxwzsUjddRbefanlYLEbdfJEVCXM+75AcnbUJBax6LIqU3786u3DlVyB+lqugFCGYSTLd5UxSZoT2NNJU8Oyk+YTLUa5MK+EiXuCWIK/+UC8ApmyXkPB5Iu+XBgZwpMM4WxEXLJiw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1558302090; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=D7GWj/lXqLo0o5VRDqbo6Uitm8MC1Kjd/6DUhBjIuPo=; b=EG2gfY3/2xG7EkLPR6VtiHZewnFY48t0RTeVsmN2XOY/m9vpZPZdg1TVFZwJdGzyyitdMfPjfiHXbDyH5X9jDeHvK1UjvNWexvXVzY1FdUpQDy2Tj88i5F3DZp+/BB7qoC4xY3zXpB5xWVYekRAhuvfkTMXXvVSHpqrtd7ODm/o= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (209.51.188.17 [209.51.188.17]) by mx.zohomail.com with SMTPS id 1558302090202178.77111016438982; Sun, 19 May 2019 14:41:30 -0700 (PDT) Received: from localhost ([127.0.0.1]:53548 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hST3L-0004HU-S0 for importer@patchew.org; Sun, 19 May 2019 17:09:07 -0400 Received: from eggs.gnu.org ([209.51.188.92]:50486) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSZK-0003Pi-Ip for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:07 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hSSZJ-00041B-Dh for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:06 -0400 Received: from mail-pf1-x444.google.com ([2607:f8b0:4864:20::444]:34264) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hSSZJ-00040H-76 for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:05 -0400 Received: by mail-pf1-x444.google.com with SMTP id n19so6182715pfa.1 for ; Sun, 19 May 2019 13:38:05 -0700 (PDT) Received: from localhost.localdomain (97-113-13-231.tukw.qwest.net. [97.113.13.231]) by smtp.gmail.com with ESMTPSA id i7sm11397448pfo.19.2019.05.19.13.38.02 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 19 May 2019 13:38:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=D7GWj/lXqLo0o5VRDqbo6Uitm8MC1Kjd/6DUhBjIuPo=; b=TZDbAixztVBkqw7lKtMXBgrdRBWHWKYzgjNlobC63Oyqzic4+0AFnhNHmPqTg0KqVp tAhqpbYNlYIuYy+dkurt+px0Z9k5E9Dye+MomeyFA3GZLE8W1Rs4gy+a02aldCXc7oRe hwTsgckJAro6rmOLrFYRSm6+pdwbNafgu0hmn8VuqXFFJKXLqffUNfT6tJ/YhGFWrKrR faLcJM4auzgxvMTSUken3DqYxhMLgwlcU21+PRB8VAyImXQGG5G8SxK9cP3jClrLogD+ ESJopDhEHrIykxXwmLjjM5j9gK35EeESvDhLcv+BuK6bEuiRJGlE8Q0XSM4NAh+5cg7Y iTDw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=D7GWj/lXqLo0o5VRDqbo6Uitm8MC1Kjd/6DUhBjIuPo=; b=MY189kc+NencyN0i6fCyOgHXA34PSKkVO4nv0dWRllwcG80ynSCyWf50RLuEvDk3cG l38IE/5cRGgj7myanzPIFlw41BWmiIe3HaPbiUZzDt5WkqYklFkzFPKkl+0raLSQHUJw ZhvJyR/9GiSMzWRuQoJkML6+lsE2kqN5XXKAFG+O/TtS1iW5SC+TdOxR92ljBXT2G0ym Zoe7cqMqp4L5X/6FLIBx1976Ndr1o1qa8NWDIe9EpOy1/TkrQMc+9nN/xoAJvc917ez2 0VyV+2DD2kCsyT5GcJH5SHU50L0A0ChSMFQXyaaoG8WdLaB4qiHgIK45h7eeiLiCaH1I yxOg== X-Gm-Message-State: APjAAAUhZDQB84bymJOie0ciC+j+xXXyDCaxDo8VJiECCD36JfkK5qEh sz0MnmwHCUcPQ1a6duUPKJn4jveYPmY= X-Google-Smtp-Source: APXvYqwg3BdZH0jgOk0ACbjlldPECE0nfwJjiHU3eBzT5hdMCQNlRSCQZ24fS/q6XOlPkduwHuQmnw== X-Received: by 2002:aa7:951c:: with SMTP id b28mr57475214pfp.99.1558298283888; Sun, 19 May 2019 13:38:03 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sun, 19 May 2019 13:36:38 -0700 Message-Id: <20190519203726.20729-27-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190519203726.20729-1-richard.henderson@linaro.org> References: <20190519203726.20729-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::444 Subject: [Qemu-devel] [PATCH v7 26/74] linux-user: Split out time X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: laurent@vivier.eu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Richard Henderson --- linux-user/syscall-defs.h | 3 +++ linux-user/syscall-time.inc.c | 32 ++++++++++++++++++++++++++++++++ linux-user/syscall.c | 13 +------------ linux-user/strace.list | 3 --- 4 files changed, 36 insertions(+), 15 deletions(-) create mode 100644 linux-user/syscall-time.inc.c diff --git a/linux-user/syscall-defs.h b/linux-user/syscall-defs.h index 3fad9d51f0..9950b73e76 100644 --- a/linux-user/syscall-defs.h +++ b/linux-user/syscall-defs.h @@ -127,6 +127,9 @@ SYSCALL_DEF(shmdt, ARG_PTR); #if !defined(SYSCALL_TABLE) || defined(TARGET_NR_shmget) SYSCALL_DEF(shmget, ARG_DEC, ARG_DEC, ARG_HEX); #endif +#ifdef TARGET_NR_time +SYSCALL_DEF(time, ARG_PTR); +#endif #ifdef TARGET_NR_unlink SYSCALL_DEF(unlink, ARG_STR); #endif diff --git a/linux-user/syscall-time.inc.c b/linux-user/syscall-time.inc.c new file mode 100644 index 0000000000..14fec88e47 --- /dev/null +++ b/linux-user/syscall-time.inc.c @@ -0,0 +1,32 @@ +/* + * Linux time related syscalls + * Copyright (c) 2003 Fabrice Bellard + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + */ + +#ifdef TARGET_NR_time +SYSCALL_IMPL(time) +{ + time_t host_time; + abi_long ret =3D get_errno(time(&host_time)); + + if (!is_error(ret) + && arg1 + && put_user_sal(host_time, arg1)) { + return -TARGET_EFAULT; + } + return ret; +} +#endif diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 0bf5901014..ea89734706 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -5384,18 +5384,6 @@ static abi_long do_syscall1(void *cpu_env, int num, = abi_long arg1, void *p; =20 switch(num) { -#ifdef TARGET_NR_time - case TARGET_NR_time: - { - time_t host_time; - ret =3D get_errno(time(&host_time)); - if (!is_error(ret) - && arg1 - && put_user_sal(host_time, arg1)) - return -TARGET_EFAULT; - } - return ret; -#endif #ifdef TARGET_NR_mknod case TARGET_NR_mknod: if (!(p =3D lock_user_string(arg1))) @@ -9392,6 +9380,7 @@ static abi_long do_syscall1(void *cpu_env, int num, a= bi_long arg1, #include "syscall-ipc.inc.c" #include "syscall-mem.inc.c" #include "syscall-proc.inc.c" +#include "syscall-time.inc.c" =20 #undef SYSCALL_IMPL #undef SYSCALL_ARGS diff --git a/linux-user/strace.list b/linux-user/strace.list index 3f79159b63..95706a696b 100644 --- a/linux-user/strace.list +++ b/linux-user/strace.list @@ -1350,9 +1350,6 @@ #ifdef TARGET_NR_tgkill { TARGET_NR_tgkill, "tgkill" , NULL, print_tgkill, NULL }, #endif -#ifdef TARGET_NR_time -{ TARGET_NR_time, "time" , NULL, NULL, NULL }, -#endif #ifdef TARGET_NR_timer_create { TARGET_NR_timer_create, "timer_create" , NULL, NULL, NULL }, #endif --=20 2.17.1 From nobody Thu May 9 22:44:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1558299924; cv=none; d=zoho.com; s=zohoarc; b=S9EAEX89uoA0/ysvEKvMoiqPto1YD3K1qDH44r+eA9W1NkNEmLnHRTmAZx4lai5dWFS/wmOxiMIAZ35UUVVepeSx/X9RmfrkOHxJ/qvj1qQos8YJkky0HC9ulbA1R4fTwcicggjLayXKHYoHVGbjFmF8M1C4otl25eVa1ElhyXU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1558299924; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=fRvp/VN2Xlfqmt4nKVHNXMxYTCjiSrkuQdi+a73ymGo=; b=UDetHMAcolfUSJQnZfPTIzmBklpN5dXiB43bNXPsIei1IkMglR1DvvUOJIox7qWsvXbcnMprfr7dl/IIGNwiYeSaiB+uiyO3B/jEGTBWFurd1B3QVlPP3lVtZMhbF/MJz0/OJRAGz+35GRTCalhtI/peq0qQn0t7A81O4gAo4EI= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (209.51.188.17 [209.51.188.17]) by mx.zohomail.com with SMTPS id 155829992448473.7276765645297; Sun, 19 May 2019 14:05:24 -0700 (PDT) Received: from localhost ([127.0.0.1]:53485 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSze-0000d1-74 for importer@patchew.org; Sun, 19 May 2019 17:05:18 -0400 Received: from eggs.gnu.org ([209.51.188.92]:50501) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSZL-0003TC-WA for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:09 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hSSZK-00042Z-P9 for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:07 -0400 Received: from mail-pf1-x444.google.com ([2607:f8b0:4864:20::444]:44491) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hSSZK-00041r-J9 for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:06 -0400 Received: by mail-pf1-x444.google.com with SMTP id g9so6148914pfo.11 for ; Sun, 19 May 2019 13:38:06 -0700 (PDT) Received: from localhost.localdomain (97-113-13-231.tukw.qwest.net. [97.113.13.231]) by smtp.gmail.com with ESMTPSA id i7sm11397448pfo.19.2019.05.19.13.38.03 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 19 May 2019 13:38:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=fRvp/VN2Xlfqmt4nKVHNXMxYTCjiSrkuQdi+a73ymGo=; b=saXIpHPF2AKzen0wYa8bg8Wg7/NPOHshxt0TUVYcXLf1To1FkBuGZ6HTgamFMDGvci PQfF4jY9aPDPL0kHQQmMpl2PVOM7GzNd6zFE9UZbU39JGbvey/AcgVIJhKP9+gMqZiLJ XeR3QA4lXotuv92ui6yEKoYuXScDTKgClGo/V+TzRLUeRXAAte/l6PLTr8koly2Mf5vf 3/3xZmzyZWc4n42ET7VZrW/2tUs25C6ereWlDFq9Bg8c+JMKGfRtt4wm/3EI+0ijuetT ETL632AGiMr0Nadu52EBg87eLH3cfmjH4431/z3/8dQGB9LCQSKVx6AEpIDpWIp05yUI b4+w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=fRvp/VN2Xlfqmt4nKVHNXMxYTCjiSrkuQdi+a73ymGo=; b=Xif5altTVZ9E5QcvKpeKpXo9JluiBYe63tLvbYVJtvpBmyZZfMX2oTtyFEGmVrFaRm ITL0mjiygw0CXifXsltZHK9K7GnNaSP4/JJq7CJ4UIJcH1clgh4/Ozhh/mKtjY2AUTwX nq/SsovkWC+0TuvgbsJDfcC0htYIfHb66PL4JaVSS5GwtberqAzgXCEqvW8mImljTmYy M46fgEL6tahyR7aHxaR34Ml4iWwCjjv2DqzrIBdRFtp0dCJM/qmFGUcDXBTSz274ClWv bHagwlTKvfAr2tM8/Df+UUn7NZQN0gTSrsg65Zopmepj5NRsaMJSM5bY0nxXAPWnihrN qw6g== X-Gm-Message-State: APjAAAUDfgM46Y+gBbY0O21Vuby7Zp6T/icyHVjxyLs6OmDHX+Xhwe8e LLl2Xs15z6H0sVr8QRqX6XnRCzUrptE= X-Google-Smtp-Source: APXvYqze9d3JDpIbdy1mVHJfyB6DxyobkyOky0PKiqLL5/pwoL9MzPY9zPyYGDsj2cqZSZ4GGQF5MA== X-Received: by 2002:a62:38cc:: with SMTP id f195mr76083842pfa.15.1558298285319; Sun, 19 May 2019 13:38:05 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sun, 19 May 2019 13:36:39 -0700 Message-Id: <20190519203726.20729-28-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190519203726.20729-1-richard.henderson@linaro.org> References: <20190519203726.20729-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::444 Subject: [Qemu-devel] [PATCH v7 27/74] linux-user: Split out mknod, mknodat X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: laurent@vivier.eu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Note that mknodat is universally provided. Signed-off-by: Richard Henderson --- linux-user/syscall-defs.h | 4 ++++ linux-user/strace.c | 39 ----------------------------------- linux-user/syscall-file.inc.c | 26 +++++++++++++++++++++++ linux-user/syscall.c | 16 -------------- linux-user/strace.list | 6 ------ 5 files changed, 30 insertions(+), 61 deletions(-) diff --git a/linux-user/syscall-defs.h b/linux-user/syscall-defs.h index 9950b73e76..b5951e6911 100644 --- a/linux-user/syscall-defs.h +++ b/linux-user/syscall-defs.h @@ -38,6 +38,10 @@ SYSCALL_DEF_ARGS(ipc, ARG_HEX, ARG_DEC, ARG_DEC, ARG_HEX= , ARG_PTR, ARG_HEX); SYSCALL_DEF(link, ARG_STR, ARG_STR); #endif SYSCALL_DEF(linkat, ARG_ATDIRFD, ARG_STR, ARG_ATDIRFD, ARG_STR, ARG_ATFLAG= ); +#ifdef TARGET_NR_mknod +SYSCALL_DEF(mknod, ARG_STR, ARG_MODEFLAG, ARG_HEX); +#endif +SYSCALL_DEF(mknodat, ARG_ATDIRFD, ARG_STR, ARG_MODEFLAG, ARG_HEX); SYSCALL_DEF(mlock, ARG_PTR, ARG_DEC); SYSCALL_DEF(mlockall, ARG_HEX); #ifdef TARGET_NR_mmap diff --git a/linux-user/strace.c b/linux-user/strace.c index b234274034..c70c06d965 100644 --- a/linux-user/strace.c +++ b/linux-user/strace.c @@ -1923,45 +1923,6 @@ print_syslog(const struct syscallname *name, } #endif =20 -#ifdef TARGET_NR_mknod -static void -print_mknod(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - int hasdev =3D (arg1 & (S_IFCHR|S_IFBLK)); - - print_syscall_prologue(name); - print_string(arg0, 0); - print_file_mode(arg1, (hasdev =3D=3D 0)); - if (hasdev) { - print_raw_param("makedev(%d", major(arg2), 0); - print_raw_param("%d)", minor(arg2), 1); - } - print_syscall_epilogue(name); -} -#endif - -#ifdef TARGET_NR_mknodat -static void -print_mknodat(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - int hasdev =3D (arg2 & (S_IFCHR|S_IFBLK)); - - print_syscall_prologue(name); - print_at_dirfd(arg0, 0); - print_string(arg1, 0); - print_file_mode(arg2, (hasdev =3D=3D 0)); - if (hasdev) { - print_raw_param("makedev(%d", major(arg3), 0); - print_raw_param("%d)", minor(arg3), 1); - } - print_syscall_epilogue(name); -} -#endif - #ifdef TARGET_NR_mq_open static void print_mq_open(const struct syscallname *name, diff --git a/linux-user/syscall-file.inc.c b/linux-user/syscall-file.inc.c index 76637fe71b..3adb629124 100644 --- a/linux-user/syscall-file.inc.c +++ b/linux-user/syscall-file.inc.c @@ -82,6 +82,32 @@ SYSCALL_IMPL(linkat) return do_linkat(arg1, arg2, arg3, arg4, arg5); } =20 +static abi_long do_mknodat(int dirfd, abi_ulong target_path, + mode_t mode, dev_t dev) +{ + char *p =3D lock_user_string(target_path); + abi_long ret; + + if (!p) { + return -TARGET_EFAULT; + } + ret =3D get_errno(mknodat(dirfd, p, mode, dev)); + unlock_user(p, target_path, 0); + return ret; +} + +#ifdef TARGET_NR_mknod +SYSCALL_IMPL(mknod) +{ + return do_mknodat(AT_FDCWD, arg1, arg2, arg3); +} +#endif + +SYSCALL_IMPL(mknodat) +{ + return do_mknodat(arg1, arg2, arg3, arg4); +} + /* * Helpers for do_openat, manipulating /proc/self/foo. */ diff --git a/linux-user/syscall.c b/linux-user/syscall.c index ea89734706..18163f558c 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -5384,22 +5384,6 @@ static abi_long do_syscall1(void *cpu_env, int num, = abi_long arg1, void *p; =20 switch(num) { -#ifdef TARGET_NR_mknod - case TARGET_NR_mknod: - if (!(p =3D lock_user_string(arg1))) - return -TARGET_EFAULT; - ret =3D get_errno(mknod(p, arg2, arg3)); - unlock_user(p, arg1, 0); - return ret; -#endif -#if defined(TARGET_NR_mknodat) - case TARGET_NR_mknodat: - if (!(p =3D lock_user_string(arg2))) - return -TARGET_EFAULT; - ret =3D get_errno(mknodat(arg1, p, arg3, arg4)); - unlock_user(p, arg2, 0); - return ret; -#endif #ifdef TARGET_NR_chmod case TARGET_NR_chmod: if (!(p =3D lock_user_string(arg1))) diff --git a/linux-user/strace.list b/linux-user/strace.list index 95706a696b..f56d9acf76 100644 --- a/linux-user/strace.list +++ b/linux-user/strace.list @@ -518,12 +518,6 @@ #ifdef TARGET_NR_mkdirat { TARGET_NR_mkdirat, "mkdirat" , NULL, print_mkdirat, NULL }, #endif -#ifdef TARGET_NR_mknod -{ TARGET_NR_mknod, "mknod" , NULL, print_mknod, NULL }, -#endif -#ifdef TARGET_NR_mknodat -{ TARGET_NR_mknodat, "mknodat" , NULL, print_mknodat, NULL }, -#endif #ifdef TARGET_NR_modify_ldt { TARGET_NR_modify_ldt, "modify_ldt" , NULL, NULL, NULL }, #endif --=20 2.17.1 From nobody Thu May 9 22:44:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1558299383; cv=none; d=zoho.com; s=zohoarc; b=gV8pfXsvONntbXuygjazCp3REH3Kw6PiL7X1Cs31UtEGGBeViBZLI83q7b9V+BdVGc3siwVUwNjENUgzD72m2Dt6pDgln/zeTRVSXga1xOLEdxDoaDRik3IS9enRIAV8OGHKc9dYWp7dpnCzB+GsnmzzklLK539zuYIt+d5/Sww= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1558299383; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=1sQg+P8lShstSTQHyJ7jNTozkqlGpcD4AM3YYr8dTII=; b=gS/8WOYB7HiPCsy9f719PalMNpuz8qSTGru6bgKny0ohBXSqu0UxODbMiVGltKHi/DCZHAzatSlh2Aw3VXBDkMT4TG3hYuSkC4bXA/zyrIokcG18b/qLbIs6MwQkk9ycmAzw1M4MgNix+vjTysVEUMCxwGBNYRlqJrRCEdmExmk= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (209.51.188.17 [209.51.188.17]) by mx.zohomail.com with SMTPS id 155829938363923.237438562843295; Sun, 19 May 2019 13:56:23 -0700 (PDT) Received: from localhost ([127.0.0.1]:53376 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSqv-0001B8-BR for importer@patchew.org; Sun, 19 May 2019 16:56:17 -0400 Received: from eggs.gnu.org ([209.51.188.92]:50514) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSZN-0003UN-2v for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:12 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hSSZL-00043d-RG for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:09 -0400 Received: from mail-pl1-x642.google.com ([2607:f8b0:4864:20::642]:41408) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hSSZL-000431-Je for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:07 -0400 Received: by mail-pl1-x642.google.com with SMTP id f12so5707086plt.8 for ; Sun, 19 May 2019 13:38:07 -0700 (PDT) Received: from localhost.localdomain (97-113-13-231.tukw.qwest.net. [97.113.13.231]) by smtp.gmail.com with ESMTPSA id i7sm11397448pfo.19.2019.05.19.13.38.05 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 19 May 2019 13:38:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=1sQg+P8lShstSTQHyJ7jNTozkqlGpcD4AM3YYr8dTII=; b=vAxbTJLT9BXhkiEJCEGyKGl8j7CT9eSVY5wjTULP9AeeXtBs84F7LZPWXrSokxv9p/ D2eFuMuL4jViPFYIvjUyLxxImxybgijNJjWy5ECOlnL/0J0AjEFMbxuKByEWPz9Ndluh Ec04vZjE98kXYnS9KochhkEfOuhTOKjX8381fFT4754W7YiUxxNymHf2/YbRnTZU4AXd b5C+AkbBIsKf2vHsUMDKyksJ/0g1O2JGifvxJLFTfPxJYAYVcBBA3q/87zkR2GIV14Oo xuPDf7JxctcGG9LV9KGEG+fa7cDacPzCj0aYBZfXapz17BQ2ekVB5BkDTy7ZR1KJNxgd 0g3Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=1sQg+P8lShstSTQHyJ7jNTozkqlGpcD4AM3YYr8dTII=; b=Z+u+HNIIERViHwoD0uPnf9PFKvHpc6GlHwAkhJRcQ5CTBdhqpy6U7Nt3ROxb+bRGuZ 0rwVWgGN74tuJcdwAONh4VbzzsMWLYlZqf7KllDMy2b//+10ErApR5Gndv/ko036x+C1 Hj8iER5Wiuj11q54vPXT97A+YYz2BS7M5tAfAWxvPEGsY9b04FiO5LY+FoG+UH2eflJV VmWzkzcBYBf+W8fuWNFkUo+9c3DT0hg+vbf/hmBaSuj3zr/HFWk/PMBhYfCOJY0Bbjm0 PXz6X2aoUFiogX2ITeObXhZSQqhvaoTDAlqV0owjHWiiPOuE8ECRyccAVT4bDWP29bA1 wizA== X-Gm-Message-State: APjAAAU9+L9azPtyRFHGuN1eQeNxQDYiWLvg2nleXjBU2kyiDZR6MuEK WKu0HKf7JMzAYTOjCuApLNSCENfyxtE= X-Google-Smtp-Source: APXvYqylSbE2oCWfqOZ+ciGaVoUwDDjhiydbUmmFipHJwTdL7QyH6lCIvf90GsApC55vcvrIpclbUA== X-Received: by 2002:a17:902:bd95:: with SMTP id q21mr35435241pls.159.1558298286396; Sun, 19 May 2019 13:38:06 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sun, 19 May 2019 13:36:40 -0700 Message-Id: <20190519203726.20729-29-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190519203726.20729-1-richard.henderson@linaro.org> References: <20190519203726.20729-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::642 Subject: [Qemu-devel] [PATCH v7 28/74] linux-user: Split out chmod, fchmod, fchmodat X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: laurent@vivier.eu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Note that fchmodat is universally provided. Signed-off-by: Richard Henderson --- linux-user/syscall-defs.h | 5 +++++ linux-user/strace.c | 28 ---------------------------- linux-user/syscall-file.inc.c | 30 ++++++++++++++++++++++++++++++ linux-user/syscall.c | 18 ------------------ linux-user/strace.list | 9 --------- 5 files changed, 35 insertions(+), 55 deletions(-) diff --git a/linux-user/syscall-defs.h b/linux-user/syscall-defs.h index b5951e6911..3ddf8aa0e3 100644 --- a/linux-user/syscall-defs.h +++ b/linux-user/syscall-defs.h @@ -20,6 +20,9 @@ SYSCALL_DEF_FULL(brk, .impl =3D impl_brk, .print_ret =3D print_syscall_ptr_ret, .arg_type =3D { ARG_PTR }); SYSCALL_DEF(chdir, ARG_STR); +#ifdef TARGET_NR_chmod +SYSCALL_DEF(chmod, ARG_STR, ARG_MODEFLAG); +#endif SYSCALL_DEF_ARGS(clone, ARG_CLONEFLAG, ARG_PTR, ARG_PTR, ARG_PTR, ARG_PTR); SYSCALL_DEF(close, ARG_DEC); #ifdef TARGET_NR_creat @@ -28,6 +31,8 @@ SYSCALL_DEF(creat, ARG_STR, ARG_MODEFLAG); SYSCALL_DEF(exit, ARG_DEC); SYSCALL_DEF(execve, ARG_STR, ARG_PTR, ARG_PTR); SYSCALL_DEF(execveat, ARG_ATDIRFD, ARG_STR, ARG_PTR, ARG_PTR, ARG_ATFLAG); +SYSCALL_DEF(fchmod, ARG_DEC, ARG_MODEFLAG); +SYSCALL_DEF(fchmodat, ARG_ATDIRFD, ARG_STR, ARG_MODEFLAG); #ifdef TARGET_NR_fork SYSCALL_DEF(fork); #endif diff --git a/linux-user/strace.c b/linux-user/strace.c index c70c06d965..4771badeb5 100644 --- a/linux-user/strace.c +++ b/linux-user/strace.c @@ -1125,19 +1125,6 @@ print_chroot(const struct syscallname *name, } #endif =20 -#ifdef TARGET_NR_chmod -static void -print_chmod(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - print_syscall_prologue(name); - print_string(arg0, 0); - print_file_mode(arg1, 1); - print_syscall_epilogue(name); -} -#endif - #ifdef TARGET_NR_clock_adjtime static void print_clock_adjtime(const struct syscallname *name, @@ -1179,21 +1166,6 @@ print_faccessat(const struct syscallname *name, } #endif =20 -#ifdef TARGET_NR_fchmodat -static void -print_fchmodat(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - print_syscall_prologue(name); - print_at_dirfd(arg0, 0); - print_string(arg1, 0); - print_file_mode(arg2, 0); - print_flags(at_file_flags, arg3, 1); - print_syscall_epilogue(name); -} -#endif - #ifdef TARGET_NR_fchownat static void print_fchownat(const struct syscallname *name, diff --git a/linux-user/syscall-file.inc.c b/linux-user/syscall-file.inc.c index 3adb629124..fb64d5bd1d 100644 --- a/linux-user/syscall-file.inc.c +++ b/linux-user/syscall-file.inc.c @@ -30,6 +30,26 @@ SYSCALL_IMPL(chdir) return ret; } =20 +static abi_long do_fchmodat(int dirfd, abi_ulong target_path, mode_t mode) +{ + char *p =3D lock_user_string(target_path); + abi_long ret; + + if (!p) { + return -TARGET_EFAULT; + } + ret =3D get_errno(fchmodat(dirfd, p, mode, 0)); + unlock_user(p, target_path, 0); + return ret; +} + +#ifdef TARGET_NR_chmod +SYSCALL_IMPL(chmod) +{ + return do_fchmodat(AT_FDCWD, arg1, arg2); +} +#endif + SYSCALL_IMPL(close) { int fd =3D arg1; @@ -54,6 +74,16 @@ SYSCALL_IMPL(creat) } #endif =20 +SYSCALL_IMPL(fchmod) +{ + return get_errno(fchmod(arg1, arg2)); +} + +SYSCALL_IMPL(fchmodat) +{ + return do_fchmodat(arg1, arg2, arg3); +} + static abi_long do_linkat(int olddirfd, abi_ulong target_oldpath, int newdirfd, abi_ulong target_newpath, int flags) diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 18163f558c..3c0de73aa4 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -5384,14 +5384,6 @@ static abi_long do_syscall1(void *cpu_env, int num, = abi_long arg1, void *p; =20 switch(num) { -#ifdef TARGET_NR_chmod - case TARGET_NR_chmod: - if (!(p =3D lock_user_string(arg1))) - return -TARGET_EFAULT; - ret =3D get_errno(chmod(p, arg2)); - unlock_user(p, arg1, 0); - return ret; -#endif #ifdef TARGET_NR_lseek case TARGET_NR_lseek: return get_errno(lseek(arg1, arg2, arg3)); @@ -6463,16 +6455,6 @@ static abi_long do_syscall1(void *cpu_env, int num, = abi_long arg1, #ifdef TARGET_NR_ftruncate case TARGET_NR_ftruncate: return get_errno(ftruncate(arg1, arg2)); -#endif - case TARGET_NR_fchmod: - return get_errno(fchmod(arg1, arg2)); -#if defined(TARGET_NR_fchmodat) - case TARGET_NR_fchmodat: - if (!(p =3D lock_user_string(arg2))) - return -TARGET_EFAULT; - ret =3D get_errno(fchmodat(arg1, p, arg3, 0)); - unlock_user(p, arg2, 0); - return ret; #endif case TARGET_NR_getpriority: /* Note that negative values are valid for getpriority, so we must diff --git a/linux-user/strace.list b/linux-user/strace.list index f56d9acf76..0906aba812 100644 --- a/linux-user/strace.list +++ b/linux-user/strace.list @@ -61,9 +61,6 @@ #ifdef TARGET_NR_capset { TARGET_NR_capset, "capset" , "%s(%p,%p)", NULL, NULL }, #endif -#ifdef TARGET_NR_chmod -{ TARGET_NR_chmod, "chmod" , NULL, print_chmod, NULL }, -#endif #ifdef TARGET_NR_chown { TARGET_NR_chown, "chown" , NULL, NULL, NULL }, #endif @@ -169,12 +166,6 @@ #ifdef TARGET_NR_fchdir { TARGET_NR_fchdir, "fchdir" , NULL, NULL, NULL }, #endif -#ifdef TARGET_NR_fchmod -{ TARGET_NR_fchmod, "fchmod" , "%s(%d,%#o)", NULL, NULL }, -#endif -#ifdef TARGET_NR_fchmodat -{ TARGET_NR_fchmodat, "fchmodat" , NULL, print_fchmodat, NULL }, -#endif #ifdef TARGET_NR_fchown { TARGET_NR_fchown, "fchown" , "%s(%d,%d,%d)", NULL, NULL }, #endif --=20 2.17.1 From nobody Thu May 9 22:44:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1558300378; cv=none; d=zoho.com; s=zohoarc; b=MCrSexuRk2v4O5mTlQiuSU4FZtpRb10EMpD/oHnMnYlWOby/SkoLTVYCuKqOVqK0GmlZ9ymJmfsRy0+1KkUSDT68t3w6pTB/5jxYovKNsc/XYel83E76LFQl0smMw3skJFvnRxoG6nKQqNvWNSBcUijL6pGXYXo+qO5GqC5ZILo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1558300378; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=Fr+Y83wJgizEP7CnBu6nXSORIZtVsEotOiuWEaOuuHQ=; b=EOKSw/Efux8o7F+UYohj2Q2PXzHx1XhKl0h+2dJaE4o7K2/zYMMQJ66ybR8BjI3OiZVNLen5nN+trlCi+/nH8T4e8U0FENtnkuFzteP0jk2ektyTtkJEzKtVv+pNDZAYLGj1aoTQwsFC7VS41enmfxTdqivchdQ/mGBu1VFsF5I= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (209.51.188.17 [209.51.188.17]) by mx.zohomail.com with SMTPS id 1558300378698517.6041869954671; Sun, 19 May 2019 14:12:58 -0700 (PDT) Received: from localhost ([127.0.0.1]:53617 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hST6y-0007uW-G9 for importer@patchew.org; Sun, 19 May 2019 17:12:52 -0400 Received: from eggs.gnu.org ([209.51.188.92]:50539) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSZP-0003Uz-Ps for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:13 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hSSZM-00044x-Vb for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:11 -0400 Received: from mail-pl1-x644.google.com ([2607:f8b0:4864:20::644]:33534) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hSSZM-00044C-Mh for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:08 -0400 Received: by mail-pl1-x644.google.com with SMTP id y3so5734937plp.0 for ; Sun, 19 May 2019 13:38:08 -0700 (PDT) Received: from localhost.localdomain (97-113-13-231.tukw.qwest.net. [97.113.13.231]) by smtp.gmail.com with ESMTPSA id i7sm11397448pfo.19.2019.05.19.13.38.06 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 19 May 2019 13:38:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=Fr+Y83wJgizEP7CnBu6nXSORIZtVsEotOiuWEaOuuHQ=; b=DN+SZarK91Y4XHtFwUYdxqzhozTXefEyZ2fINNxGFOWw/Ggjwa4GgCqEt63vBTYfsd cqD1+5SXiGEJAng1nBCQ7X7aiu61iXl084tiqNjpXAELKKm24NkMZFMQjPFBE7tHI4vi mJWXUknNq5hsFdYuDSbX2RvJbjpgijNogsYGPJRAb1+kys7NgKQjOIOm7BKeW/NnXDAD RAuoo4m66u9xSCVpA5TB2mP0Dm17bjFJJ3fdycSTAliwt4PK8kZXXXJvhB7os7MShrll 1S4mOHAqXJaRSyUzHXgG2cj31JCighBlEvZaOWMd698U1dakntjF2wff7Q/WLv7oY4q1 fwKw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=Fr+Y83wJgizEP7CnBu6nXSORIZtVsEotOiuWEaOuuHQ=; b=ul9NCu0OOKOEt4aMikvoXXmuhFxiNssfurfFybevS+IcHPdlTbDWiWG5MtnDaa/8u5 fjPjkYqKq+eWKJ6h1cbkI5tckMhMxMO5TRsoLKsjdHbf1IGHhzH12ukHK5r/E5Ni4YGc h137jCN/NAG2RkDjRNqpufvTTqv2HndsGAUbjvuojMKekDbR9Bi56QUHmZoxD8hRvJu3 oCCT4Coc16+i0xQt+qcFu/rUXalrhzU5h2fPp/yZ8bZUEQ5yTMKaBHOtG4NRDLc/fCLU AO5XL4dCIKQmUWiJxywMmMydD3TfSXdTYtGJztCkB21GM/uwfpyaFKPH8OPZ+Se2MJBR 53Cg== X-Gm-Message-State: APjAAAVu+nRfgBH+jMocVM3e2W7Zgyi/IHXv9MMqdAqOhOGrS7Me659d 6Q/iqc8p7L7H6Ka06Cr84oFD/2pvh7c= X-Google-Smtp-Source: APXvYqyuM6aunL+QLvpCCuRO1g140QFq/4dkTkhIrJ5QRKjdu27Hko4ECIV8KwGS+rclZXo+vLoLPQ== X-Received: by 2002:a17:902:15c5:: with SMTP id a5mr72386863plh.39.1558298287474; Sun, 19 May 2019 13:38:07 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sun, 19 May 2019 13:36:41 -0700 Message-Id: <20190519203726.20729-30-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190519203726.20729-1-richard.henderson@linaro.org> References: <20190519203726.20729-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::644 Subject: [Qemu-devel] [PATCH v7 29/74] linux-user: Split out lseek, llseek X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: laurent@vivier.eu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Canonicalise the target syscall name on llseek (new kernels) instead of _llseek (old kernels). Always use host lseek(3) rather than attempting to use the host llseek(2). Signed-off-by: Richard Henderson --- linux-user/syscall-defs.h | 6 ++++++ linux-user/syscall.h | 1 + linux-user/strace.c | 39 +++++++++++++++-------------------- linux-user/syscall-file.inc.c | 36 ++++++++++++++++++++++++++++++++ linux-user/syscall.c | 32 ++-------------------------- linux-user/strace.list | 6 ------ 6 files changed, 62 insertions(+), 58 deletions(-) diff --git a/linux-user/syscall-defs.h b/linux-user/syscall-defs.h index 3ddf8aa0e3..3453e7afdf 100644 --- a/linux-user/syscall-defs.h +++ b/linux-user/syscall-defs.h @@ -43,6 +43,12 @@ SYSCALL_DEF_ARGS(ipc, ARG_HEX, ARG_DEC, ARG_DEC, ARG_HEX= , ARG_PTR, ARG_HEX); SYSCALL_DEF(link, ARG_STR, ARG_STR); #endif SYSCALL_DEF(linkat, ARG_ATDIRFD, ARG_STR, ARG_ATDIRFD, ARG_STR, ARG_ATFLAG= ); +#ifdef TARGET_NR_lseek +SYSCALL_DEF(lseek, ARG_DEC, ARG_DEC, ARG_LSEEKWHENCE); +#endif +#ifdef TARGET_NR_llseek +SYSCALL_DEF_ARGS(llseek, ARG_DEC, ARG_DEC, ARG_PTR, ARG_LSEEKWHENCE); +#endif #ifdef TARGET_NR_mknod SYSCALL_DEF(mknod, ARG_STR, ARG_MODEFLAG, ARG_HEX); #endif diff --git a/linux-user/syscall.h b/linux-user/syscall.h index bdc4d653c4..c16c0a3f1e 100644 --- a/linux-user/syscall.h +++ b/linux-user/syscall.h @@ -64,6 +64,7 @@ typedef enum { ARG_MODEFLAG, ARG_OPENFLAG, ARG_UNLINKATFLAG, + ARG_LSEEKWHENCE, =20 /* These are interpreted as pointers. */ ARG_PTR, diff --git a/linux-user/strace.c b/linux-user/strace.c index 4771badeb5..a4d7b397b4 100644 --- a/linux-user/strace.c +++ b/linux-user/strace.c @@ -934,6 +934,20 @@ print_open_flags(abi_long flags, int last) gemu_log("%s%s", buf, get_comma(last)); } =20 +static int add_lseek_whence(char *buf, int size, int whence) +{ + switch (whence) { + case SEEK_SET: + return snprintf(buf, size, "SEEK_SET"); + case SEEK_CUR: + return snprintf(buf, size, "SEEK_CUR"); + case SEEK_END: + return snprintf(buf, size, "SEEK_END"); + default: + return snprintf(buf, size, "%#x", whence); + } +} + static void print_syscall_prologue(const struct syscallname *sc) { @@ -1297,28 +1311,6 @@ print_futimesat(const struct syscallname *name, } #endif =20 -#ifdef TARGET_NR__llseek -static void -print__llseek(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - const char *whence =3D "UNKNOWN"; - print_syscall_prologue(name); - print_raw_param("%d", arg0, 0); - print_raw_param("%ld", arg1, 0); - print_raw_param("%ld", arg2, 0); - print_pointer(arg3, 0); - switch(arg4) { - case SEEK_SET: whence =3D "SEEK_SET"; break; - case SEEK_CUR: whence =3D "SEEK_CUR"; break; - case SEEK_END: whence =3D "SEEK_END"; break; - } - gemu_log("%s",whence); - print_syscall_epilogue(name); -} -#endif - #if defined(TARGET_NR_socket) static void print_socket(const struct syscallname *name, @@ -2329,6 +2321,9 @@ static void print_syscall_def1(const SyscallDef *def,= int64_t args[6]) case ARG_UNLINKATFLAG: len =3D add_flags(b, rest, unlinkat_flags, arg, true); break; + case ARG_LSEEKWHENCE: + len =3D add_lseek_whence(b, rest, arg); + break; case ARG_PTR: len =3D add_pointer(b, rest, arg); break; diff --git a/linux-user/syscall-file.inc.c b/linux-user/syscall-file.inc.c index fb64d5bd1d..e267adec1e 100644 --- a/linux-user/syscall-file.inc.c +++ b/linux-user/syscall-file.inc.c @@ -112,6 +112,42 @@ SYSCALL_IMPL(linkat) return do_linkat(arg1, arg2, arg3, arg4, arg5); } =20 +#ifdef TARGET_NR_lseek +SYSCALL_IMPL(lseek) +{ + return get_errno(lseek(arg1, arg2, arg3)); +} +#endif + +#ifdef TARGET_NR_llseek +SYSCALL_ARGS(llseek) +{ + /* The parts for offset are *always* in big-endian order. */ + abi_ulong lo =3D in[2], hi =3D in[1]; + out[1] =3D (((uint64_t)hi << (TARGET_ABI_BITS - 1)) << 1) | lo; + out[2] =3D in[3]; + out[3] =3D in[4]; + return def; +} + +SYSCALL_IMPL(llseek) +{ + int fd =3D arg1; + int64_t offset =3D arg2; + abi_ulong target_res =3D arg3; + int whence =3D arg4; + + off_t res =3D lseek(fd, offset, whence); + + if (res =3D=3D -1) { + return get_errno(-1); + } else if (put_user_s64(res, target_res)) { + return -TARGET_EFAULT; + } + return 0; +} +#endif + static abi_long do_mknodat(int dirfd, abi_ulong target_path, mode_t mode, dev_t dev) { diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 3c0de73aa4..9eff91d67e 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -192,8 +192,8 @@ static type name (type1 arg1,type2 arg2,type3 arg3,type= 4 arg4,type5 arg5, \ #endif =20 /* Newer kernel ports have llseek() instead of _llseek() */ -#if defined(TARGET_NR_llseek) && !defined(TARGET_NR__llseek) -#define TARGET_NR__llseek TARGET_NR_llseek +#if !defined(TARGET_NR_llseek) && defined(TARGET_NR__llseek) +#define TARGET_NR_llseek TARGET_NR__llseek #endif =20 #define __NR_sys_gettid __NR_gettid @@ -217,10 +217,6 @@ _syscall3(int, sys_getdents, uint, fd, struct linux_di= rent *, dirp, uint, count) (defined(TARGET_NR_getdents64) && defined(__NR_getdents64)) _syscall3(int, sys_getdents64, uint, fd, struct linux_dirent64 *, dirp, ui= nt, count); #endif -#if defined(TARGET_NR__llseek) && defined(__NR_llseek) -_syscall5(int, _llseek, uint, fd, ulong, hi, ulong, lo, - loff_t *, res, uint, wh); -#endif _syscall3(int, sys_rt_sigqueueinfo, pid_t, pid, int, sig, siginfo_t *, uin= fo) _syscall4(int, sys_rt_tgsigqueueinfo, pid_t, pid, pid_t, tid, int, sig, siginfo_t *, uinfo) @@ -5384,10 +5380,6 @@ static abi_long do_syscall1(void *cpu_env, int num, = abi_long arg1, void *p; =20 switch(num) { -#ifdef TARGET_NR_lseek - case TARGET_NR_lseek: - return get_errno(lseek(arg1, arg2, arg3)); -#endif #if defined(TARGET_NR_getxpid) && defined(TARGET_ALPHA) /* Alpha specific */ case TARGET_NR_getxpid: @@ -6886,26 +6878,6 @@ static abi_long do_syscall1(void *cpu_env, int num, = abi_long arg1, return get_errno(fchdir(arg1)); case TARGET_NR_personality: return get_errno(personality(arg1)); -#ifdef TARGET_NR__llseek /* Not on alpha */ - case TARGET_NR__llseek: - { - int64_t res; -#if !defined(__NR_llseek) - res =3D lseek(arg1, ((uint64_t)arg2 << 32) | (abi_ulong)arg3, = arg5); - if (res =3D=3D -1) { - ret =3D get_errno(res); - } else { - ret =3D 0; - } -#else - ret =3D get_errno(_llseek(arg1, arg2, arg3, &res, arg5)); -#endif - if ((ret =3D=3D 0) && put_user_s64(res, arg4)) { - return -TARGET_EFAULT; - } - } - return ret; -#endif #ifdef TARGET_NR_getdents case TARGET_NR_getdents: #ifdef EMULATE_GETDENTS_WITH_GETDENTS diff --git a/linux-user/strace.list b/linux-user/strace.list index 0906aba812..fb37c72a1f 100644 --- a/linux-user/strace.list +++ b/linux-user/strace.list @@ -455,9 +455,6 @@ #ifdef TARGET_NR_llistxattr { TARGET_NR_llistxattr, "llistxattr" , NULL, NULL, NULL }, #endif -#ifdef TARGET_NR__llseek -{ TARGET_NR__llseek, "_llseek" , NULL, print__llseek, NULL }, -#endif #ifdef TARGET_NR_lock { TARGET_NR_lock, "lock" , NULL, NULL, NULL }, #endif @@ -467,9 +464,6 @@ #ifdef TARGET_NR_lremovexattr { TARGET_NR_lremovexattr, "lremovexattr" , NULL, NULL, NULL }, #endif -#ifdef TARGET_NR_lseek -{ TARGET_NR_lseek, "lseek" , NULL, NULL, NULL }, -#endif #ifdef TARGET_NR_lsetxattr { TARGET_NR_lsetxattr, "lsetxattr" , NULL, NULL, NULL }, #endif --=20 2.17.1 From nobody Thu May 9 22:44:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1558299523; cv=none; d=zoho.com; s=zohoarc; b=cQbuK0WA+kXesGrWUJRwbT1lW1lYYZf+QTbsBIbBz7efmPClKo6LhKs5AvIjV9wV27+nlirrT3aCtqCk7RWmQpu1ro8FA57YBWm+vO13YufGNR7wX614SfCamtk7e42BK33LxesyJIf9f7lKfWdM5hwdqQFlE+SOvglHOgLcq/Y= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1558299523; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=O0n99AE5tNLgI5sw9XY04BuwTLwo+9pblzvHaGIq2Io=; b=F4DblCjtB6sezBDM3h46ygIi+fGsEcgC2xKcDhUuPQt7CyqyRszEzuHsKp2gD9Vlf9S5NwarPXIT+0rGsK98mY3MaFX/Ds6siIKtSjGMIE8h2AQzRI8GuwKW9K1GRYOwi//Kjpd8fBoeu26gJB/A3n2bTudLwRaLx8JJ/RmcJI8= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (209.51.188.17 [209.51.188.17]) by mx.zohomail.com with SMTPS id 1558299523456981.762787664537; Sun, 19 May 2019 13:58:43 -0700 (PDT) Received: from localhost ([127.0.0.1]:53396 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSt8-0003BD-2Y for importer@patchew.org; Sun, 19 May 2019 16:58:34 -0400 Received: from eggs.gnu.org ([209.51.188.92]:50537) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSZP-0003Ux-Pq for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:12 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hSSZO-00046X-1n for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:11 -0400 Received: from mail-pl1-x642.google.com ([2607:f8b0:4864:20::642]:35574) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hSSZN-00045Z-SC for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:09 -0400 Received: by mail-pl1-x642.google.com with SMTP id p1so336469plo.2 for ; Sun, 19 May 2019 13:38:09 -0700 (PDT) Received: from localhost.localdomain (97-113-13-231.tukw.qwest.net. [97.113.13.231]) by smtp.gmail.com with ESMTPSA id i7sm11397448pfo.19.2019.05.19.13.38.07 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 19 May 2019 13:38:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=O0n99AE5tNLgI5sw9XY04BuwTLwo+9pblzvHaGIq2Io=; b=KDyaYmLeMB/Lq790sWs17F/wY9hB5NqTGzlcS7bVGZbIg9MYUjVb989BAFRRIFW/we FyYXn+8izZQ2c1QP+wPD5EuEqSRxDh5rSnU/PY6POtKptC8mcGG5oLDMXZVkJTZfMR1Q p8gTcpdONvb2iL+uttUKRnUNEF/dlc+1SJ/reitNFLIj5kYHatkF2mCh0yE1DB/yg+Xa PkLzJ+rQAqdrqpDTCPt/nYLFQ5RmmzcYJK9qp/CLXuamq2FMN+iBk+fQT/B7PZqaxlK7 T9s/DAGhjrQdRcaycjSDVv1wO1yj9xd1TMdxkvJbY8qSKTSVAaosenku+0EE0RXFRcX/ mDpA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=O0n99AE5tNLgI5sw9XY04BuwTLwo+9pblzvHaGIq2Io=; b=qpWZeMGg6WyGW9pK1zxejP110y9n7ig8E6Qowny99wL58dhKc9dIxYRTk1Bti6fWeh NghTvFzQ2039S+IClIYzUDN4esPuKlAu2dbTUu5uMcYABDY5f8FInMeOrirrfLFu1cUW U432Wnkgn2G0PAlNSsf4TGrSvQvQaQr3zt+qFaa4k6ru/LuhahixElQxApMAmNwU+p+u VaS63saTdqxPnB2wMcoR51BsUdywUa4xBRrCUXJoPm4GQkTLQIvKTSW1Y2yg/mXjbMrF +vkd0eC+pEsP4Tvq4uYcSkQOLwrxvOBRj5yWqBEvVjMYy7lQMARr23Blav1Rhyw0y+Uc 30Iw== X-Gm-Message-State: APjAAAWf+eZuxuYz7RF5vcdSAT7xO1qJshHTtaNbxlxn5SwKzjbAZT1D rWV1wrOnTxfemfYboCiUJR2f5s4uu18= X-Google-Smtp-Source: APXvYqzkRNeC86Vn6e3yr7jx9LErbIZci9s71FmGiD9QG2DNX4uGogZU7eJByWIj2Z+KTn5l17fatg== X-Received: by 2002:a17:902:7617:: with SMTP id k23mr28206500pll.175.1558298288656; Sun, 19 May 2019 13:38:08 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sun, 19 May 2019 13:36:42 -0700 Message-Id: <20190519203726.20729-31-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190519203726.20729-1-richard.henderson@linaro.org> References: <20190519203726.20729-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::642 Subject: [Qemu-devel] [PATCH v7 30/74] linux-user: Split out getpid, getppid, getxpid X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: laurent@vivier.eu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Richard Henderson --- linux-user/syscall-defs.h | 9 +++++++++ linux-user/syscall-proc.inc.c | 23 +++++++++++++++++++++++ linux-user/syscall.c | 14 -------------- linux-user/strace.list | 9 --------- 4 files changed, 32 insertions(+), 23 deletions(-) diff --git a/linux-user/syscall-defs.h b/linux-user/syscall-defs.h index 3453e7afdf..d163bbf409 100644 --- a/linux-user/syscall-defs.h +++ b/linux-user/syscall-defs.h @@ -36,6 +36,15 @@ SYSCALL_DEF(fchmodat, ARG_ATDIRFD, ARG_STR, ARG_MODEFLAG= ); #ifdef TARGET_NR_fork SYSCALL_DEF(fork); #endif +#ifdef TARGET_NR_getpid +SYSCALL_DEF(getpid); +#endif +#ifdef TARGET_NR_getppid +SYSCALL_DEF(getppid); +#endif +#ifdef TARGET_NR_getxpid +SYSCALL_DEF(getxpid); +#endif #ifdef TARGET_NR_ipc SYSCALL_DEF_ARGS(ipc, ARG_HEX, ARG_DEC, ARG_DEC, ARG_HEX, ARG_PTR, ARG_HEX= ); #endif diff --git a/linux-user/syscall-proc.inc.c b/linux-user/syscall-proc.inc.c index fd114d1f03..4d8d385b38 100644 --- a/linux-user/syscall-proc.inc.c +++ b/linux-user/syscall-proc.inc.c @@ -438,6 +438,29 @@ SYSCALL_IMPL(fork) } #endif =20 +#ifdef TARGET_NR_getpid +SYSCALL_IMPL(getpid) +{ + return getpid(); +} +#endif + +#ifdef TARGET_NR_getppid +SYSCALL_IMPL(getppid) +{ + return getppid(); +} +#endif + +#ifdef TARGET_NR_getxpid +SYSCALL_IMPL(getxpid) +{ + /* Alpha specific */ + cpu_env->ir[IR_A4] =3D getppid(); + return getpid(); +} +#endif + /* * Map host to target signal numbers for the wait family of syscalls. * Assume all other status bits are the same. diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 9eff91d67e..29ea56deee 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -5380,16 +5380,6 @@ static abi_long do_syscall1(void *cpu_env, int num, = abi_long arg1, void *p; =20 switch(num) { -#if defined(TARGET_NR_getxpid) && defined(TARGET_ALPHA) - /* Alpha specific */ - case TARGET_NR_getxpid: - ((CPUAlphaState *)cpu_env)->ir[IR_A4] =3D getppid(); - return get_errno(getpid()); -#endif -#ifdef TARGET_NR_getpid - case TARGET_NR_getpid: - return get_errno(getpid()); -#endif case TARGET_NR_mount: { /* need to look at the data field */ @@ -5721,10 +5711,6 @@ static abi_long do_syscall1(void *cpu_env, int num, = abi_long arg1, return ret; } #endif -#ifdef TARGET_NR_getppid /* not on alpha */ - case TARGET_NR_getppid: - return get_errno(getppid()); -#endif #ifdef TARGET_NR_getpgrp case TARGET_NR_getpgrp: return get_errno(getpgrp()); diff --git a/linux-user/strace.list b/linux-user/strace.list index fb37c72a1f..3e898ea307 100644 --- a/linux-user/strace.list +++ b/linux-user/strace.list @@ -298,15 +298,9 @@ #ifdef TARGET_NR_getpgrp { TARGET_NR_getpgrp, "getpgrp" , NULL, NULL, NULL }, #endif -#ifdef TARGET_NR_getpid -{ TARGET_NR_getpid, "getpid" , "%s()", NULL, NULL }, -#endif #ifdef TARGET_NR_getpmsg { TARGET_NR_getpmsg, "getpmsg" , NULL, NULL, NULL }, #endif -#ifdef TARGET_NR_getppid -{ TARGET_NR_getppid, "getppid" , "%s()", NULL, NULL }, -#endif #ifdef TARGET_NR_getpriority { TARGET_NR_getpriority, "getpriority", "%s(%#x,%#x)", NULL, NULL }, #endif @@ -365,9 +359,6 @@ #ifdef TARGET_NR_getxgid { TARGET_NR_getxgid, "getxgid" , NULL, NULL, NULL }, #endif -#ifdef TARGET_NR_getxpid -{ TARGET_NR_getxpid, "getxpid" , NULL, NULL, NULL }, -#endif #ifdef TARGET_NR_getxuid { TARGET_NR_getxuid, "getxuid" , NULL, NULL, NULL }, #endif --=20 2.17.1 From nobody Thu May 9 22:44:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1558299702; cv=none; d=zoho.com; s=zohoarc; b=lu/4zPhHXKO8XQ9xwpV/FZarhvGiGf3uq73hcAaESSrZvj4iSv6XvBhjSse/9efv8+4Kiy3+O9hNcRLuEWoBXodbXVAjLuiPnJketPlorUW5AzFsy7l7snkJhHOh4iAM5dO/tE5o/ABh3K2p5S38WtpsfbLhd2WOCGXufglQlRg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1558299702; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=9Z3useuzztxYfCeDiCfuyQXw+fak2amXB2su9Sfs8mg=; b=gSgyqsfZH61s7xmGarj5NY+U6VSq/INof0OhuZOaDJyybtW8NO960pZr8LP9VLYNMNxN3pcigepBAIuwYD59G0l0mLyPtsJseY0omlW8h+GEoD27ITvIJE5TCUKjgHfchHbpgIQjCHFOtYl0+wecCUiIsHXmVgTAFwr/1275TwI= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (209.51.188.17 [209.51.188.17]) by mx.zohomail.com with SMTPS id 1558299702367602.9709566475863; Sun, 19 May 2019 14:01:42 -0700 (PDT) Received: from localhost ([127.0.0.1]:53454 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSw4-0005sA-5f for importer@patchew.org; Sun, 19 May 2019 17:01:36 -0400 Received: from eggs.gnu.org ([209.51.188.92]:50568) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSZT-0003X3-HG for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:18 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hSSZQ-00049X-HK for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:14 -0400 Received: from mail-pl1-x643.google.com ([2607:f8b0:4864:20::643]:35575) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hSSZP-000471-QR for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:11 -0400 Received: by mail-pl1-x643.google.com with SMTP id p1so336479plo.2 for ; Sun, 19 May 2019 13:38:10 -0700 (PDT) Received: from localhost.localdomain (97-113-13-231.tukw.qwest.net. [97.113.13.231]) by smtp.gmail.com with ESMTPSA id i7sm11397448pfo.19.2019.05.19.13.38.08 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 19 May 2019 13:38:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=9Z3useuzztxYfCeDiCfuyQXw+fak2amXB2su9Sfs8mg=; b=mPZtMxnCs5H13UhWV/nYpwBKyqzbAKant19NkKg2wWlvfuMcwP0JO88J1xRoHKCvY2 tPwW38EU9gWuMhioCd4UXG8tkAKYkMAa7W0OwCa0N+ZvP2j9a/6F5HihPR7+1FaLx8JD dCnUWGzOywUKHnVXY3zikG0Z44XdaZl6DADVI0eoaW1nsz9gvITMMKP1ATgpY5oEzKkw gRRDVxC8iRuirAkeVdE4WENwgLWbFsacL+zeK4nmGz6qFvyDyE5tqoL6U966QZrvWa25 9ygk7nJgylfEZWKysXG9m1IgQbo1HFFxzOgn3Sabgnoe9Qn7lithEC8jei8uEt6G9O6Y vq9Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=9Z3useuzztxYfCeDiCfuyQXw+fak2amXB2su9Sfs8mg=; b=QMEB2YICtTkuunfm5fw19Foh3Op+HDdCyRqNwRtmE9L+LJybRDmcL9EA18N0oy2O7N B/vB9Ob/TlIXb1bZtIk+AzRPtuKfP5DfjECA43SwVJ5NdfBlmfeVgRwGfHj0gTiLtrXn TdMfauTMtTsAaZqhjEOyAmTcu/WY3h4dIxkLD7gj++wKQZAeAT065xStvWHiPmAKIMq2 5XLNdb3iCzxIDYQ8yo2c+BZ3fejm1iPVnQxe52zDaZKDAgdoxEINXVvi+EjFXXVWti96 KInMDgEgBqJ7tQ5XoKOrLJRvE0/DS3zMNp+0uxq+O8WLPRat46HWp/sAO/ZX/6iN0eJc g/kw== X-Gm-Message-State: APjAAAXsNRSV77yNW9V89AOfIqiWzBgRQqzdQ2L1Rro7qgMbVN904NrB /AkPxjvkyq1S39HqzrghP45YIknsPbY= X-Google-Smtp-Source: APXvYqyGHZUHuRwszwyfwgoCAJMjBP+VdtaF7ZSBSuVL2kmuVa1lS7vewwO6Mlnvm0uGvi/gYy9Rbw== X-Received: by 2002:a17:902:e409:: with SMTP id ci9mr61761083plb.103.1558298289784; Sun, 19 May 2019 13:38:09 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sun, 19 May 2019 13:36:43 -0700 Message-Id: <20190519203726.20729-32-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190519203726.20729-1-richard.henderson@linaro.org> References: <20190519203726.20729-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::643 Subject: [Qemu-devel] [PATCH v7 31/74] linux-user: Split out mount X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: laurent@vivier.eu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Richard Henderson --- linux-user/syscall-defs.h | 1 + linux-user/syscall.h | 1 + linux-user/strace.c | 21 +++---------- linux-user/syscall-file.inc.c | 48 ++++++++++++++++++++++++++++++ linux-user/syscall.c | 55 ----------------------------------- linux-user/strace.list | 3 -- 6 files changed, 54 insertions(+), 75 deletions(-) diff --git a/linux-user/syscall-defs.h b/linux-user/syscall-defs.h index d163bbf409..2b331c6a6d 100644 --- a/linux-user/syscall-defs.h +++ b/linux-user/syscall-defs.h @@ -78,6 +78,7 @@ SYSCALL_DEF_FULL(mmap2, .impl =3D impl_mmap, .arg_type =3D { ARG_PTR, ARG_DEC, ARG_MMAPPROT, ARG_MMAPFLAG, ARG_DEC, ARG_DEC64 }); #endif +SYSCALL_DEF(mount, ARG_STR, ARG_STR, ARG_STR, ARG_MOUNTFLAG, ARG_PTR); SYSCALL_DEF(mprotect, ARG_PTR, ARG_DEC, ARG_MMAPPROT); SYSCALL_DEF_FULL(mremap, .impl =3D impl_mremap, .print_ret =3D print_syscall_ptr_ret, diff --git a/linux-user/syscall.h b/linux-user/syscall.h index c16c0a3f1e..35dd3e5fa3 100644 --- a/linux-user/syscall.h +++ b/linux-user/syscall.h @@ -62,6 +62,7 @@ typedef enum { ARG_MMAPFLAG, ARG_MMAPPROT, ARG_MODEFLAG, + ARG_MOUNTFLAG, ARG_OPENFLAG, ARG_UNLINKATFLAG, ARG_LSEEKWHENCE, diff --git a/linux-user/strace.c b/linux-user/strace.c index a4d7b397b4..a99ab46b97 100644 --- a/linux-user/strace.c +++ b/linux-user/strace.c @@ -708,7 +708,7 @@ static struct flags const open_flags[] =3D { FLAG_END, }; =20 -UNUSED static struct flags mount_flags[] =3D { +static struct flags const mount_flags[] =3D { #ifdef MS_BIND FLAG_GENERIC(MS_BIND), #endif @@ -2015,22 +2015,6 @@ print_symlinkat(const struct syscallname *name, } #endif =20 -#ifdef TARGET_NR_mount -static void -print_mount(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - print_syscall_prologue(name); - print_string(arg0, 0); - print_string(arg1, 0); - print_string(arg2, 0); - print_flags(mount_flags, arg3, 0); - print_pointer(arg4, 1); - print_syscall_epilogue(name); -} -#endif - #ifdef TARGET_NR_umount static void print_umount(const struct syscallname *name, @@ -2315,6 +2299,9 @@ static void print_syscall_def1(const SyscallDef *def,= int64_t args[6]) case ARG_MODEFLAG: len =3D add_flags(b, rest, mode_flags, arg, true); break; + case ARG_MOUNTFLAG: + len =3D add_flags(b, rest, mount_flags, arg, true); + break; case ARG_OPENFLAG: len =3D add_open_flags(b, rest, arg); break; diff --git a/linux-user/syscall-file.inc.c b/linux-user/syscall-file.inc.c index e267adec1e..4fc12512c2 100644 --- a/linux-user/syscall-file.inc.c +++ b/linux-user/syscall-file.inc.c @@ -174,6 +174,54 @@ SYSCALL_IMPL(mknodat) return do_mknodat(arg1, arg2, arg3, arg4); } =20 +SYSCALL_IMPL(mount) +{ + abi_ulong target_src =3D arg1; + abi_ulong target_tgt =3D arg2; + abi_ulong target_fst =3D arg3; + abi_ulong mountflags =3D arg4; + abi_ulong target_data =3D arg5; + char *p_src =3D NULL, *p_tgt =3D NULL, *p_fst =3D NULL, *p_data =3D NU= LL; + abi_long ret =3D -TARGET_EFAULT; + + if (target_src) { + p_src =3D lock_user_string(target_src); + if (!p_src) { + goto exit0; + } + } + + p_tgt =3D lock_user_string(target_tgt); + if (!p_tgt) { + goto exit1; + } + + if (target_fst) { + p_fst =3D lock_user_string(target_fst); + if (!p_fst) { + goto exit2; + } + } + + /* + * FIXME - arg5 should be locked, but it isn't clear how to + * do that since it's not guaranteed to be a NULL-terminated + * string. + */ + if (target_data) { + p_data =3D g2h(target_data); + } + ret =3D get_errno(mount(p_src, p_tgt, p_fst, mountflags, p_data)); + + unlock_user(p_fst, target_fst, 0); + exit2: + unlock_user(p_tgt, target_tgt, 0); + exit1: + unlock_user(p_src, target_src, 0); + exit0: + return ret; +} + /* * Helpers for do_openat, manipulating /proc/self/foo. */ diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 29ea56deee..c826c65317 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -5380,61 +5380,6 @@ static abi_long do_syscall1(void *cpu_env, int num, = abi_long arg1, void *p; =20 switch(num) { - case TARGET_NR_mount: - { - /* need to look at the data field */ - void *p2, *p3; - - if (arg1) { - p =3D lock_user_string(arg1); - if (!p) { - return -TARGET_EFAULT; - } - } else { - p =3D NULL; - } - - p2 =3D lock_user_string(arg2); - if (!p2) { - if (arg1) { - unlock_user(p, arg1, 0); - } - return -TARGET_EFAULT; - } - - if (arg3) { - p3 =3D lock_user_string(arg3); - if (!p3) { - if (arg1) { - unlock_user(p, arg1, 0); - } - unlock_user(p2, arg2, 0); - return -TARGET_EFAULT; - } - } else { - p3 =3D NULL; - } - - /* FIXME - arg5 should be locked, but it isn't clear how to - * do that since it's not guaranteed to be a NULL-terminated - * string. - */ - if (!arg5) { - ret =3D mount(p, p2, p3, (unsigned long)arg4, NULL); - } else { - ret =3D mount(p, p2, p3, (unsigned long)arg4, g2h(arg5)); - } - ret =3D get_errno(ret); - - if (arg1) { - unlock_user(p, arg1, 0); - } - unlock_user(p2, arg2, 0); - if (arg3) { - unlock_user(p3, arg3, 0); - } - } - return ret; #ifdef TARGET_NR_umount case TARGET_NR_umount: if (!(p =3D lock_user_string(arg1))) diff --git a/linux-user/strace.list b/linux-user/strace.list index 3e898ea307..9b4024d94f 100644 --- a/linux-user/strace.list +++ b/linux-user/strace.list @@ -497,9 +497,6 @@ #ifdef TARGET_NR_modify_ldt { TARGET_NR_modify_ldt, "modify_ldt" , NULL, NULL, NULL }, #endif -#ifdef TARGET_NR_mount -{ TARGET_NR_mount, "mount" , NULL, print_mount, NULL }, -#endif #ifdef TARGET_NR_move_pages { TARGET_NR_move_pages, "move_pages" , NULL, NULL, NULL }, #endif --=20 2.17.1 From nobody Thu May 9 22:44:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1558299877; cv=none; d=zoho.com; s=zohoarc; b=K8TW7Df8eTxMWVkVbcBmNdOvmOny3wXRR6Z0qH1DDczaq1vyJWaX8uADIY4R1a6wF8ebyQ13FW7KBpBl/ODjPYAaHMptuMDBXR9XQ+2SatfG3nmlBE7p0UKHSMvqEr3paBXLUHAZ3/iut924giwAv94GtNdkBkLpXnBHEt1trls= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1558299877; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=FcVdmu4jJhr5SxGI0pZ6zduAqhixd7w4CsRDiK5ssJ4=; b=FziC6Q6aA0VSzBNzC9yWEqjOWsTv2wtcLdsSbSHEWrin2eN+2Tx2sWwraYtNGmNSjZfz3m+mXxm7KMdazAfC27ikhC1smML+vbjzEM7dxhTNKJPYKPtGIzE6+5j8zU2xs3FEqL+/Y2b0J2PVhQfTz+4UTr0l6huogdzuzqHGUJg= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (209.51.188.17 [209.51.188.17]) by mx.zohomail.com with SMTPS id 1558299877601335.444053318575; Sun, 19 May 2019 14:04:37 -0700 (PDT) Received: from localhost ([127.0.0.1]:53477 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSyt-0008PG-BZ for importer@patchew.org; Sun, 19 May 2019 17:04:31 -0400 Received: from eggs.gnu.org ([209.51.188.92]:50595) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSZX-0003X6-9y for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:20 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hSSZV-0004G0-Cp for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:19 -0400 Received: from mail-pl1-x641.google.com ([2607:f8b0:4864:20::641]:37617) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hSSZR-00048V-Ln for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:14 -0400 Received: by mail-pl1-x641.google.com with SMTP id p15so5718925pll.4 for ; Sun, 19 May 2019 13:38:12 -0700 (PDT) Received: from localhost.localdomain (97-113-13-231.tukw.qwest.net. [97.113.13.231]) by smtp.gmail.com with ESMTPSA id i7sm11397448pfo.19.2019.05.19.13.38.09 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 19 May 2019 13:38:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=FcVdmu4jJhr5SxGI0pZ6zduAqhixd7w4CsRDiK5ssJ4=; b=NBW1rsdsAeQKQIkAPkswlg4vV1I2Kbo3HgNVFCXApRyVXSWDtkETS0tSGyGyDszXR8 if1vF1uhZlttD332RE0c7rukzIPQWMUKRP0jg0c+qxnwJ8E3o9T57lK9aAMhPaI6YXYk 6QfWm4U1YyEMdt3Mhvom0Qqh1fcgxGHpBJkOtyIzS9wtzBrg0y4DXS8ws2yetw2z0fLZ eFBtBn+59JWJ5RYYswooOvP2qAfe1Z/EIAG3kaB7wuZy6ETBsdU0rs1QYfb591exX9vZ BXx/D22pLlA/Zffd8DdPGI4zIw+d1YgMIUSnDQe9IjUX8KY9PjPBzTAE7oy/2p/PnX/+ MI4g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=FcVdmu4jJhr5SxGI0pZ6zduAqhixd7w4CsRDiK5ssJ4=; b=rG/++Ko6a9HrEGm0g7wXseI9/iBD/odUnKRMrydU6/R9tV7et9LNYxTWQwDW4MB+Ut pDQrWrBoPIBfMRuhnNRklPt2f61OGR0fYt9QI6d7fuvQ+2oHU11yhOAYXmpgv+sCfW/t +byJGo2gVpfQQOpJi8d1tyWcl6BQ71lp32za0PB2KvuTjj+8KH0Y11JNkNp71cv2ZGUM b+HwIXMnsWfaWjNrf07QzX+eHVvu1i8Zamtmjkh12tV6mnWKS7YS4OKnPmOhIwK1qd5G lAeFkftKseMU/MIptFO8lgE3vWE5Bx623nQ/aLdZhpCst+ZyLflPV3pCoyTWfzSx1wXT Hx9g== X-Gm-Message-State: APjAAAVzsCszWrY9Sk1ms56VktlVukBHMacqiJqrVLQ+CJqjvxzUfi/3 v/ZDX7XutkUnS+vw7WFh0UfzeKC/Tc8= X-Google-Smtp-Source: APXvYqzXupgeOwSmKGSnNucrIKVtWzK/DHQ/mcuSBlFwaZ9sWV4gz1+CadnHg+kTuZZKZHL2KLDvPA== X-Received: by 2002:a17:902:e00a:: with SMTP id ca10mr73329060plb.18.1558298290948; Sun, 19 May 2019 13:38:10 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sun, 19 May 2019 13:36:44 -0700 Message-Id: <20190519203726.20729-33-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190519203726.20729-1-richard.henderson@linaro.org> References: <20190519203726.20729-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::641 Subject: [Qemu-devel] [PATCH v7 32/74] linux-user: Split out umount, umount2 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: laurent@vivier.eu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Note that umount2 is unconditionally available. Signed-off-by: Richard Henderson --- linux-user/syscall-defs.h | 4 ++++ linux-user/syscall.h | 1 + linux-user/strace.c | 30 ++++-------------------------- linux-user/syscall-file.inc.c | 25 +++++++++++++++++++++++++ linux-user/syscall.c | 16 ---------------- linux-user/strace.list | 6 ------ 6 files changed, 34 insertions(+), 48 deletions(-) diff --git a/linux-user/syscall-defs.h b/linux-user/syscall-defs.h index 2b331c6a6d..0d8da0c6d6 100644 --- a/linux-user/syscall-defs.h +++ b/linux-user/syscall-defs.h @@ -155,6 +155,10 @@ SYSCALL_DEF(shmget, ARG_DEC, ARG_DEC, ARG_HEX); #ifdef TARGET_NR_time SYSCALL_DEF(time, ARG_PTR); #endif +#ifdef TARGET_NR_umount +SYSCALL_DEF(umount, ARG_STR); +#endif +SYSCALL_DEF(umount2, ARG_STR, ARG_UMOUNTFLAG); #ifdef TARGET_NR_unlink SYSCALL_DEF(unlink, ARG_STR); #endif diff --git a/linux-user/syscall.h b/linux-user/syscall.h index 35dd3e5fa3..3c936b648a 100644 --- a/linux-user/syscall.h +++ b/linux-user/syscall.h @@ -64,6 +64,7 @@ typedef enum { ARG_MODEFLAG, ARG_MOUNTFLAG, ARG_OPENFLAG, + ARG_UMOUNTFLAG, ARG_UNLINKATFLAG, ARG_LSEEKWHENCE, =20 diff --git a/linux-user/strace.c b/linux-user/strace.c index a99ab46b97..278d235ae6 100644 --- a/linux-user/strace.c +++ b/linux-user/strace.c @@ -733,7 +733,7 @@ static struct flags const mount_flags[] =3D { FLAG_END, }; =20 -UNUSED static struct flags umount2_flags[] =3D { +static struct flags const umount2_flags[] =3D { #ifdef MNT_FORCE FLAG_GENERIC(MNT_FORCE), #endif @@ -2015,31 +2015,6 @@ print_symlinkat(const struct syscallname *name, } #endif =20 -#ifdef TARGET_NR_umount -static void -print_umount(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - print_syscall_prologue(name); - print_string(arg0, 1); - print_syscall_epilogue(name); -} -#endif - -#ifdef TARGET_NR_umount2 -static void -print_umount2(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - print_syscall_prologue(name); - print_string(arg0, 0); - print_flags(umount2_flags, arg1, 1); - print_syscall_epilogue(name); -} -#endif - #ifdef TARGET_NR_utime static void print_utime(const struct syscallname *name, @@ -2305,6 +2280,9 @@ static void print_syscall_def1(const SyscallDef *def,= int64_t args[6]) case ARG_OPENFLAG: len =3D add_open_flags(b, rest, arg); break; + case ARG_UMOUNTFLAG: + len =3D add_flags(b, rest, umount2_flags, arg, false); + break; case ARG_UNLINKATFLAG: len =3D add_flags(b, rest, unlinkat_flags, arg, true); break; diff --git a/linux-user/syscall-file.inc.c b/linux-user/syscall-file.inc.c index 4fc12512c2..345b4cb421 100644 --- a/linux-user/syscall-file.inc.c +++ b/linux-user/syscall-file.inc.c @@ -816,6 +816,31 @@ SYSCALL_IMPL(readlinkat) } #endif =20 +static abi_long do_umount2(abi_ulong target_path, int flags) +{ + char *p =3D lock_user_string(target_path); + abi_long ret; + + if (!p) { + return -TARGET_EFAULT; + } + ret =3D get_errno(umount2(p, flags)); + unlock_user(p, target_path, 0); + return ret; +} + +#ifdef TARGET_NR_umount +SYSCALL_IMPL(umount) +{ + return do_umount2(arg1, 0); +} +#endif + +SYSCALL_IMPL(umount2) +{ + return do_umount2(arg1, arg2); +} + static abi_long do_unlinkat(int dirfd, abi_ulong target_path, int flags) { char *p =3D lock_user_string(target_path); diff --git a/linux-user/syscall.c b/linux-user/syscall.c index c826c65317..f3e03f535d 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -5380,14 +5380,6 @@ static abi_long do_syscall1(void *cpu_env, int num, = abi_long arg1, void *p; =20 switch(num) { -#ifdef TARGET_NR_umount - case TARGET_NR_umount: - if (!(p =3D lock_user_string(arg1))) - return -TARGET_EFAULT; - ret =3D get_errno(umount(p)); - unlock_user(p, arg1, 0); - return ret; -#endif #ifdef TARGET_NR_stime /* not on alpha */ case TARGET_NR_stime: { @@ -5608,14 +5600,6 @@ static abi_long do_syscall1(void *cpu_env, int num, = abi_long arg1, unlock_user(p, arg1, 0); } return ret; -#ifdef TARGET_NR_umount2 - case TARGET_NR_umount2: - if (!(p =3D lock_user_string(arg1))) - return -TARGET_EFAULT; - ret =3D get_errno(umount2(p, arg2)); - unlock_user(p, arg1, 0); - return ret; -#endif case TARGET_NR_ioctl: return do_ioctl(arg1, arg2, arg3); #ifdef TARGET_NR_fcntl diff --git a/linux-user/strace.list b/linux-user/strace.list index 9b4024d94f..973a4c9209 100644 --- a/linux-user/strace.list +++ b/linux-user/strace.list @@ -1368,12 +1368,6 @@ #ifdef TARGET_NR_umask { TARGET_NR_umask, "umask" , "%s(%#o)", NULL, NULL }, #endif -#ifdef TARGET_NR_umount -{ TARGET_NR_umount, "umount" , NULL, print_umount, NULL }, -#endif -#ifdef TARGET_NR_umount2 -{ TARGET_NR_umount2, "umount2" , NULL, print_umount2, NULL }, -#endif #ifdef TARGET_NR_uname { TARGET_NR_uname, "uname" , "%s(%p)", NULL, NULL }, #endif --=20 2.17.1 From nobody Thu May 9 22:44:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1558302094; cv=none; d=zoho.com; s=zohoarc; b=M3GsjakSQQiJKsMvle+gAUXmh/ueNmSEDHLDrIBbthzIAe2U3FtsuvZzXQ5eYPz3PrJRF0L/hdMzw3tPPFSuHMVKCdc2SjiogyZfTvxH15U5027JCt1VS54Cu7jBnclR9f0Nj8NrqWl1WrpXm+/ydEIGrTzR8H9a8kLzGST8vdE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1558302094; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=+9S8A+10b/scYDuW511dsngcQtz7czOu50I+GmgaCmA=; b=JupnRSrg0m7HW2ShBrG1EhMBkizJ1HPBnc8znr5ulRQCeQecGDvVGZRty9n1KAFgiDBRXyBGsAsudrE76p2NR7Z/GxKQnDnww9Fbx/Hqai0iSqpMCxriTRGYIprmafzQTfLjjUFN/em9MY6RKkARpXYjLrz7VxdebyTdrs6PffY= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (209.51.188.17 [209.51.188.17]) by mx.zohomail.com with SMTPS id 1558302094836846.1539008408269; Sun, 19 May 2019 14:41:34 -0700 (PDT) Received: from localhost ([127.0.0.1]:53643 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hST9V-0001kU-Rr for importer@patchew.org; Sun, 19 May 2019 17:15:29 -0400 Received: from eggs.gnu.org ([209.51.188.92]:50594) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSZX-0003X5-9b for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:20 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hSSZV-0004GD-Ej for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:19 -0400 Received: from mail-pl1-x642.google.com ([2607:f8b0:4864:20::642]:36602) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hSSZS-00049v-MS for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:15 -0400 Received: by mail-pl1-x642.google.com with SMTP id d21so5723866plr.3 for ; Sun, 19 May 2019 13:38:13 -0700 (PDT) Received: from localhost.localdomain (97-113-13-231.tukw.qwest.net. [97.113.13.231]) by smtp.gmail.com with ESMTPSA id i7sm11397448pfo.19.2019.05.19.13.38.10 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 19 May 2019 13:38:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=+9S8A+10b/scYDuW511dsngcQtz7czOu50I+GmgaCmA=; b=YO4yH7DU920V0heupxU9QywCSVUahP0gLIg7yLjjMPtbyThCfZU8jFR412OquWGB1o mWMCzJCXEGzqo2g5woL+FAc9Cqt9Y22wJKtEu6Sb3p8/Du+FwbQpOKHxowxmyH7ArVNm QIT3yYDNRJ1J3nB1MGdm9Jd55YAdAt6pnuXT/ZK63meevKYeEmKHXJf4WyObb34NRFoL V3/hUUX1HF7k2JjzRCiNk5fjxpl6gzFuPE7swOTOuUP6oFKwU0t7Vk9+S2j7LANRMWoa JaM6Flp4wSqrPZyCFNUpIfaixcUoP3gZGdunaU1PLQ8qzwdor49EOvJxI6O46vPhod4t jY6w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=+9S8A+10b/scYDuW511dsngcQtz7czOu50I+GmgaCmA=; b=tLCuBPSZitNurlMwOTzpkUzDe3QL71Z3K8nDgxiT068TkmFf9uXglheUkHJgmVf9ib dWCntov0p6vIoXKxiwfi0kzTaOtOx41oZMJF9jrJTegdH5XgIaUI3oXOwZgiZrFeIUdR j70aFs5D436DRenR9Szyiogxk/wdhuitl0fwKxoO2sJmA6+jFROWaBazR6F4EOLisxFa MS5OT6zBAo9CzTbCENSv800kpJhAJ274zusw0mbcTgyz6IFBPyult9qyYFxWZq12IWWw eJi6aaioDMxk4q4GhL/agxzk7FlW2H5G5vuOwOwpoutjBQVeSYx/IiDkvmsiyGVGg+Tt hvaw== X-Gm-Message-State: APjAAAU1f+W4rAWw0v6qjBDKwb0KziCGnCN5cDyOBwnWxj+wRD5IyO6B jd97q+FMExxXGtcEkFWBluv3YnQHpTU= X-Google-Smtp-Source: APXvYqxHv1lMAeNl7shVdbq2wOi7APtYiOx420pq1KyVIUNQlYtYO5kCdokBgV54STjSdyeHkVzyKA== X-Received: by 2002:a17:902:8b8a:: with SMTP id ay10mr63346806plb.74.1558298292191; Sun, 19 May 2019 13:38:12 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sun, 19 May 2019 13:36:45 -0700 Message-Id: <20190519203726.20729-34-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190519203726.20729-1-richard.henderson@linaro.org> References: <20190519203726.20729-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::642 Subject: [Qemu-devel] [PATCH v7 33/74] linux-user: Split out stime X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: laurent@vivier.eu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Richard Henderson --- linux-user/syscall-defs.h | 3 +++ linux-user/syscall-time.inc.c | 12 ++++++++++++ linux-user/syscall.c | 9 --------- linux-user/strace.list | 3 --- 4 files changed, 15 insertions(+), 12 deletions(-) diff --git a/linux-user/syscall-defs.h b/linux-user/syscall-defs.h index 0d8da0c6d6..6ca82af397 100644 --- a/linux-user/syscall-defs.h +++ b/linux-user/syscall-defs.h @@ -152,6 +152,9 @@ SYSCALL_DEF(shmdt, ARG_PTR); #if !defined(SYSCALL_TABLE) || defined(TARGET_NR_shmget) SYSCALL_DEF(shmget, ARG_DEC, ARG_DEC, ARG_HEX); #endif +#ifdef TARGET_NR_stime +SYSCALL_DEF(stime, ARG_PTR); +#endif #ifdef TARGET_NR_time SYSCALL_DEF(time, ARG_PTR); #endif diff --git a/linux-user/syscall-time.inc.c b/linux-user/syscall-time.inc.c index 14fec88e47..d1fb72bde0 100644 --- a/linux-user/syscall-time.inc.c +++ b/linux-user/syscall-time.inc.c @@ -16,6 +16,18 @@ * along with this program; if not, see . */ =20 +#ifdef TARGET_NR_stime +SYSCALL_IMPL(stime) +{ + time_t host_time; + + if (get_user_sal(host_time, arg1)) { + return -TARGET_EFAULT; + } + return get_errno(stime(&host_time)); +} +#endif + #ifdef TARGET_NR_time SYSCALL_IMPL(time) { diff --git a/linux-user/syscall.c b/linux-user/syscall.c index f3e03f535d..ae56ecbbc7 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -5380,15 +5380,6 @@ static abi_long do_syscall1(void *cpu_env, int num, = abi_long arg1, void *p; =20 switch(num) { -#ifdef TARGET_NR_stime /* not on alpha */ - case TARGET_NR_stime: - { - time_t host_time; - if (get_user_sal(host_time, arg1)) - return -TARGET_EFAULT; - return get_errno(stime(&host_time)); - } -#endif #ifdef TARGET_NR_alarm /* not on alpha */ case TARGET_NR_alarm: return alarm(arg1); diff --git a/linux-user/strace.list b/linux-user/strace.list index 973a4c9209..d0646b9424 100644 --- a/linux-user/strace.list +++ b/linux-user/strace.list @@ -1254,9 +1254,6 @@ #ifdef TARGET_NR_statfs64 { TARGET_NR_statfs64, "statfs64" , NULL, print_statfs64, NULL }, #endif -#ifdef TARGET_NR_stime -{ TARGET_NR_stime, "stime" , NULL, NULL, NULL }, -#endif #ifdef TARGET_NR_streams1 { TARGET_NR_streams1, "streams1" , NULL, NULL, NULL }, #endif --=20 2.17.1 From nobody Thu May 9 22:44:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1558300089; cv=none; d=zoho.com; s=zohoarc; b=GQ7d2os10iZDZNVFL5fiBttc6wFweJoHam1d/cGt3jhMRlF48BjLrojDpzw2upeKU8sVPe8A4xK9J3+cva5MaR/lnKy8PDkCLcsy46kuK6qwz6ZE+yUZKCV0CJPiW/wjvSnr9lUxk6/thbogg8yQk0V+vM2Ls49NlYY/7qI244E= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1558300089; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=zGbVnBZ7x7Ulj+gsvlvNaeMFujeF8l5vm6cHIrbAA7c=; b=i0oSJkL8vbtVaixSV1a6AzOgd/vizvHSiqu5DWLL7R4o4PP5JAZEn/zQDe0Mh6evM0YlRxBM4FiZWA9Qs60ynvaI6TUb9Sl5CcVOdOkJuwA3yLwu84l5xhyKWkF6Kg704z4aOvX9m22qSGUWoo4/sDhn6uSTXv5AQhuk92elkuA= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (209.51.188.17 [209.51.188.17]) by mx.zohomail.com with SMTPS id 155830008899994.06193360904831; Sun, 19 May 2019 14:08:08 -0700 (PDT) Received: from localhost ([127.0.0.1]:53542 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hST2K-0003Om-EK for importer@patchew.org; Sun, 19 May 2019 17:08:04 -0400 Received: from eggs.gnu.org ([209.51.188.92]:50635) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSZb-0003b4-33 for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:24 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hSSZX-0004I8-9k for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:21 -0400 Received: from mail-pf1-x441.google.com ([2607:f8b0:4864:20::441]:34960) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hSSZT-0004BC-Ho for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:17 -0400 Received: by mail-pf1-x441.google.com with SMTP id t87so6175238pfa.2 for ; Sun, 19 May 2019 13:38:14 -0700 (PDT) Received: from localhost.localdomain (97-113-13-231.tukw.qwest.net. [97.113.13.231]) by smtp.gmail.com with ESMTPSA id i7sm11397448pfo.19.2019.05.19.13.38.12 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 19 May 2019 13:38:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=zGbVnBZ7x7Ulj+gsvlvNaeMFujeF8l5vm6cHIrbAA7c=; b=u4vBdPKixyBIqFlT8YlHC5VIlOngyb5q7cjyC+o8gfIuqzEG8w2crdWj/NDd3DRc+M 6ng+lrb0c1+8G+UaVeWUjmF85CB2VEF33yuSUKX17+VOaPEC0c6hThwZF9Qk2b7Bs7bn eVXY9iBg3685j6UGcpSU/KzYQweyjjdW4DP9J8hXhxyuJyTuFueMvUgt6zt1mNHg01Eo 08EQgG4nO/6hqBZP/AOvV4cUfCC4Ar3b6w6KAOyFxOQ3Coj7KjrXUa1v7pPPbFAuMcvE 7Vsx/dRxl9RMs3bSutzkMN8fFWWPYHjVjNjXhim7DwgfLeAPm/TIPUPlHUeK6mrrMDHV MJFw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=zGbVnBZ7x7Ulj+gsvlvNaeMFujeF8l5vm6cHIrbAA7c=; b=GXwdLJ7tmH9UUdim/9sB0PNv8DJe6oeYHeOxo9a30zF2i0YkGIF+8qy/CXa1Ky7OdK zKbk+gwrmw3SeavcnjYS3wGTIshZLeZGFd7pHoPJ5pauTOJLMNCU7cx1498Ih036PJsT yB7E70VyDNsKIWYCb/5iLA1vh2zCftNV/i0KKU7UeOeuwXym4AK1G7IPBDiYIQdxSPZw yNVBhboUu87NjToSioGrAAbS2ShMQG9JMVXUYHrjWET8jSnxOKTfjzgYig42RZNcD+R6 BvE9kzElIrxJHBOJjO3AUqt7uPQo4xlAXD70PyfYt/wXrnyMgtBjHQknSuYmTCqWqLp+ TDFA== X-Gm-Message-State: APjAAAU3tU/RJMSgs7m1bCBFKgW6xvwP+2FGjG6amX09F56c92y4ct7d Hq/UXPaCOag36r+4yyzUkWlf0Hy3F7I= X-Google-Smtp-Source: APXvYqyHcH9cKLsE0kIopki8dHiQsrPBjnCJYCTjweHB8FSBH4Gdy0yla21N4fPjtG+OUBbjPglMzw== X-Received: by 2002:a63:6ac1:: with SMTP id f184mr72583935pgc.25.1558298293401; Sun, 19 May 2019 13:38:13 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sun, 19 May 2019 13:36:46 -0700 Message-Id: <20190519203726.20729-35-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190519203726.20729-1-richard.henderson@linaro.org> References: <20190519203726.20729-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::441 Subject: [Qemu-devel] [PATCH v7 34/74] linux-user: Split out alarm, pause X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: laurent@vivier.eu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Richard Henderson --- linux-user/syscall-defs.h | 6 ++++++ linux-user/syscall-sig.inc.c | 36 ++++++++++++++++++++++++++++++++++++ linux-user/syscall.c | 12 +----------- linux-user/strace.list | 6 ------ 4 files changed, 43 insertions(+), 17 deletions(-) create mode 100644 linux-user/syscall-sig.inc.c diff --git a/linux-user/syscall-defs.h b/linux-user/syscall-defs.h index 6ca82af397..9d0dd7457b 100644 --- a/linux-user/syscall-defs.h +++ b/linux-user/syscall-defs.h @@ -16,6 +16,9 @@ * along with this program; if not, see . */ =20 +#ifdef TARGET_NR_alarm +SYSCALL_DEF(alarm, ARG_DEC); +#endif SYSCALL_DEF_FULL(brk, .impl =3D impl_brk, .print_ret =3D print_syscall_ptr_ret, .arg_type =3D { ARG_PTR }); @@ -106,6 +109,9 @@ SYSCALL_DEF(open, ARG_STR, ARG_OPENFLAG, ARG_MODEFLAG); #endif SYSCALL_DEF(openat, ARG_ATDIRFD, ARG_STR, ARG_OPENFLAG, ARG_MODEFLAG); SYSCALL_DEF(open_by_handle_at, ARG_DEC, ARG_PTR, ARG_OPENFLAG); +#ifdef TARGET_NR_pause +SYSCALL_DEF(pause); +#endif SYSCALL_DEF_FULL(pread64, .impl =3D impl_pread64, .args =3D args_pread64_pwrite64, .arg_type =3D { ARG_DEC, ARG_PTR, ARG_DEC, ARG_DEC64 }); diff --git a/linux-user/syscall-sig.inc.c b/linux-user/syscall-sig.inc.c new file mode 100644 index 0000000000..f4e43eb00e --- /dev/null +++ b/linux-user/syscall-sig.inc.c @@ -0,0 +1,36 @@ +/* + * Linux signal related syscalls + * Copyright (c) 2003 Fabrice Bellard + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + */ + +#ifdef TARGET_NR_alarm +SYSCALL_IMPL(alarm) +{ + return alarm(arg1); +} +#endif + +#ifdef TARGET_NR_pause +SYSCALL_IMPL(pause) +{ + if (!block_signals()) { + CPUState *cpu =3D ENV_GET_CPU(cpu_env); + TaskState *ts =3D cpu->opaque; + sigsuspend(&ts->signal_mask); + } + return -TARGET_EINTR; +} +#endif diff --git a/linux-user/syscall.c b/linux-user/syscall.c index ae56ecbbc7..96e77ea38f 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -5380,17 +5380,6 @@ static abi_long do_syscall1(void *cpu_env, int num, = abi_long arg1, void *p; =20 switch(num) { -#ifdef TARGET_NR_alarm /* not on alpha */ - case TARGET_NR_alarm: - return alarm(arg1); -#endif -#ifdef TARGET_NR_pause /* not on alpha */ - case TARGET_NR_pause: - if (!block_signals()) { - sigsuspend(&((TaskState *)cpu->opaque)->signal_mask); - } - return -TARGET_EINTR; -#endif #ifdef TARGET_NR_utime case TARGET_NR_utime: { @@ -9224,6 +9213,7 @@ static abi_long do_syscall1(void *cpu_env, int num, a= bi_long arg1, #include "syscall-ipc.inc.c" #include "syscall-mem.inc.c" #include "syscall-proc.inc.c" +#include "syscall-sig.inc.c" #include "syscall-time.inc.c" =20 #undef SYSCALL_IMPL diff --git a/linux-user/strace.list b/linux-user/strace.list index d0646b9424..2a65457c76 100644 --- a/linux-user/strace.list +++ b/linux-user/strace.list @@ -25,9 +25,6 @@ #ifdef TARGET_NR_afs_syscall { TARGET_NR_afs_syscall, "afs_syscall" , NULL, NULL, NULL }, #endif -#ifdef TARGET_NR_alarm -{ TARGET_NR_alarm, "alarm" , NULL, NULL, NULL }, -#endif #ifdef TARGET_NR_aplib { TARGET_NR_aplib, "aplib" , NULL, NULL, NULL }, #endif @@ -872,9 +869,6 @@ #ifdef TARGET_NR_osf_waitid { TARGET_NR_osf_waitid, "osf_waitid" , NULL, NULL, NULL }, #endif -#ifdef TARGET_NR_pause -{ TARGET_NR_pause, "pause" , NULL, NULL, NULL }, -#endif #ifdef TARGET_NR_pciconfig_iobase { TARGET_NR_pciconfig_iobase, "pciconfig_iobase" , NULL, NULL, NULL }, #endif --=20 2.17.1 From nobody Thu May 9 22:44:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1558299563; cv=none; d=zoho.com; s=zohoarc; b=BOwopO52nUhRFTUwSk6Lfz7Zx1EBJQVUQG9baAqIl2+C3dBIcn6S4iDplooWo+K/uvtMxXTmunLW4AiZ501iuiSV2tkg10O7iYafaEiICHdYs1Z69q4lhgayHUAfcWpSFfkMqsqQbOPOkHmBTCQ+tyH4s5quEaFVSKrQ4iuCWfc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1558299563; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=sa+0LXisYlSy7hSoDzn8UpDJzstJJhbCNrudoztrV7E=; b=bRlN2mqn/8QzBtruIQiUOeSo2A2/OSqW8TN52EnDDXfr8sdsGGLI4SXiAtDTpBTbFyttXMepOvQ35H4DdgFf5n7xa//1sbcpXPv0o4Kw5X3CqkV1/ff9MsRsFTrawQRk8EtH/FHyYY/BEegEbGcr3oOCqN9GyfxU4XS58Vvto14= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (209.51.188.17 [209.51.188.17]) by mx.zohomail.com with SMTPS id 1558299563152892.865148834196; Sun, 19 May 2019 13:59:23 -0700 (PDT) Received: from localhost ([127.0.0.1]:53400 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSto-0003hU-Vt for importer@patchew.org; Sun, 19 May 2019 16:59:17 -0400 Received: from eggs.gnu.org ([209.51.188.92]:50643) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSZc-0003cV-CZ for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:26 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hSSZX-0004IY-Cv for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:23 -0400 Received: from mail-pg1-x543.google.com ([2607:f8b0:4864:20::543]:44713) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hSSZV-0004DQ-EZ for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:19 -0400 Received: by mail-pg1-x543.google.com with SMTP id z16so5723961pgv.11 for ; Sun, 19 May 2019 13:38:15 -0700 (PDT) Received: from localhost.localdomain (97-113-13-231.tukw.qwest.net. [97.113.13.231]) by smtp.gmail.com with ESMTPSA id i7sm11397448pfo.19.2019.05.19.13.38.13 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 19 May 2019 13:38:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=sa+0LXisYlSy7hSoDzn8UpDJzstJJhbCNrudoztrV7E=; b=LEkc0h/QBHXlunyBD5L1PGRREg/PpgacaQCnfm6Pb2aEp74rXBRynD4UHPCxhSyEbB Dp87VmOwvYQ5mAT2BiRevBudd7xG8a0TKIQje/zopsn9ujWGqV8tHZ2+/X1GsFcSVmcT gDeAzwCNLxrqsDnD01gMKYTTwSGtvX9vTwvzrZ+fktzTY2SC8EoPLehdwdu6O7RDr7x3 4ywgsAHCfjSpZn096jVLVB6aXwG8Mw3744d6ATUjXHSH92t3Liip+DkjhNMeP/ub62NF E0X3NiyUr3MDLTiuzKroE2qTlDFqrO3r9Wt8pezLMidFjGkIgcDNtw/6++Uax30FvRf9 QZNA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=sa+0LXisYlSy7hSoDzn8UpDJzstJJhbCNrudoztrV7E=; b=SRAHsCASa5RiuaqYmfeZ02zaT/8tX9uK+5XrzX6o5i5cwSJPx7T4Pe44ppVlU1H1F6 eo9TsX+f2FkpObhS78JIAFOu/e2dXq4NyBZO23nsUQjoEETGgj3SdNTOivQQday4PvC6 gxpoQ5dMidBeUtJ2zUIyOV+f4SMTm6+nkAlyjrqJTggpXCbbtYKFvj5WGumThPIksod/ hU994HHMoce8bmnPvkE74AXGUnv48ya593q7lHBPyqGsFLdeOCnVpTRiAL/YftOfzRnh vkcvlzZ0A4Ko9b2UXI99I1k5Ft9rKNWJqqAp9Q5+Fnxl9XJnT3+XpSDNB8Ks4cKneDRR aP7g== X-Gm-Message-State: APjAAAXw5OV+7gQHtnmcu2YgsyZJkEofOiuG2IJl7yVnQR/RPkJFahil pRpcIKmyVenzXEEtVaGwzzp+/aEM8Q4= X-Google-Smtp-Source: APXvYqyDnlb7ZcxDcW40gyrfYyjBdyW6LSzwcLY3Fa+ozbuHGew5Sib0Dsg0hb3K1vfLbeecXzsrQw== X-Received: by 2002:a65:5cca:: with SMTP id b10mr71647708pgt.444.1558298294442; Sun, 19 May 2019 13:38:14 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sun, 19 May 2019 13:36:47 -0700 Message-Id: <20190519203726.20729-36-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190519203726.20729-1-richard.henderson@linaro.org> References: <20190519203726.20729-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::543 Subject: [Qemu-devel] [PATCH v7 35/74] linux-user: Split out utime, utimes, futimesat X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: laurent@vivier.eu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Richard Henderson --- linux-user/syscall-defs.h | 9 ++++ linux-user/strace.c | 41 --------------- linux-user/syscall-file.inc.c | 95 +++++++++++++++++++++++++++++++++++ linux-user/syscall.c | 63 ----------------------- linux-user/strace.list | 9 ---- 5 files changed, 104 insertions(+), 113 deletions(-) diff --git a/linux-user/syscall-defs.h b/linux-user/syscall-defs.h index 9d0dd7457b..2767e335d8 100644 --- a/linux-user/syscall-defs.h +++ b/linux-user/syscall-defs.h @@ -36,6 +36,9 @@ SYSCALL_DEF(execve, ARG_STR, ARG_PTR, ARG_PTR); SYSCALL_DEF(execveat, ARG_ATDIRFD, ARG_STR, ARG_PTR, ARG_PTR, ARG_ATFLAG); SYSCALL_DEF(fchmod, ARG_DEC, ARG_MODEFLAG); SYSCALL_DEF(fchmodat, ARG_ATDIRFD, ARG_STR, ARG_MODEFLAG); +#ifdef TARGET_NR_futimesat +SYSCALL_DEF(futimesat, ARG_ATDIRFD, ARG_STR, ARG_PTR); +#endif #ifdef TARGET_NR_fork SYSCALL_DEF(fork); #endif @@ -172,6 +175,12 @@ SYSCALL_DEF(umount2, ARG_STR, ARG_UMOUNTFLAG); SYSCALL_DEF(unlink, ARG_STR); #endif SYSCALL_DEF(unlinkat, ARG_ATDIRFD, ARG_STR, ARG_UNLINKATFLAG); +#ifdef TARGET_NR_utime +SYSCALL_DEF(utime, ARG_STR, ARG_PTR); +#endif +#ifdef TARGET_NR_utimes +SYSCALL_DEF(utimes, ARG_STR, ARG_PTR); +#endif #ifdef TARGET_NR_vfork /* Emulate vfork() with fork(). */ SYSCALL_DEF_FULL(vfork, .impl =3D impl_fork); diff --git a/linux-user/strace.c b/linux-user/strace.c index 278d235ae6..3a7a5c30ec 100644 --- a/linux-user/strace.c +++ b/linux-user/strace.c @@ -1296,21 +1296,6 @@ print_fcntl(const struct syscallname *name, #endif =20 =20 -#ifdef TARGET_NR_futimesat -static void -print_futimesat(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - print_syscall_prologue(name); - print_at_dirfd(arg0, 0); - print_string(arg1, 0); - print_timeval(arg2, 0); - print_timeval(arg2 + sizeof (struct target_timeval), 1); - print_syscall_epilogue(name); -} -#endif - #if defined(TARGET_NR_socket) static void print_socket(const struct syscallname *name, @@ -2015,32 +2000,6 @@ print_symlinkat(const struct syscallname *name, } #endif =20 -#ifdef TARGET_NR_utime -static void -print_utime(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - print_syscall_prologue(name); - print_string(arg0, 0); - print_pointer(arg1, 1); - print_syscall_epilogue(name); -} -#endif - -#ifdef TARGET_NR_utimes -static void -print_utimes(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - print_syscall_prologue(name); - print_string(arg0, 0); - print_pointer(arg1, 1); - print_syscall_epilogue(name); -} -#endif - #ifdef TARGET_NR_utimensat static void print_utimensat(const struct syscallname *name, diff --git a/linux-user/syscall-file.inc.c b/linux-user/syscall-file.inc.c index 345b4cb421..42e5cd2dc1 100644 --- a/linux-user/syscall-file.inc.c +++ b/linux-user/syscall-file.inc.c @@ -84,6 +84,38 @@ SYSCALL_IMPL(fchmodat) return do_fchmodat(arg1, arg2, arg3); } =20 +#ifdef TARGET_NR_futimesat +SYSCALL_IMPL(futimesat) +{ + int dirfd =3D arg1; + abi_ulong target_path =3D arg2; + abi_ulong target_tv =3D arg3; + struct timeval *tvp, tv[2]; + char *p; + abi_long ret; + + if (target_tv) { + if (copy_from_user_timeval(&tv[0], target_tv) + || copy_from_user_timeval(&tv[1], + target_tv + + sizeof(struct target_timeval))) { + return -TARGET_EFAULT; + } + tvp =3D tv; + } else { + tvp =3D NULL; + } + + p =3D lock_user_string(target_path); + if (!p) { + return -TARGET_EFAULT; + } + ret =3D get_errno(futimesat(dirfd, path(p), tvp)); + unlock_user(p, target_path, 0); + return ret; +} +#endif + static abi_long do_linkat(int olddirfd, abi_ulong target_oldpath, int newdirfd, abi_ulong target_newpath, int flags) @@ -873,6 +905,69 @@ SYSCALL_IMPL(unlinkat) return do_unlinkat(arg1, arg2, arg3); } =20 +#ifdef TARGET_NR_utime +SYSCALL_IMPL(utime) +{ + abi_ulong target_path =3D arg1; + abi_ulong target_times =3D arg2; + struct utimbuf tbuf, *host_tbuf; + struct target_utimbuf *target_tbuf; + char *p; + abi_long ret; + + if (target_times) { + if (!lock_user_struct(VERIFY_READ, target_tbuf, target_times, 1)) { + return -TARGET_EFAULT; + } + tbuf.actime =3D tswapal(target_tbuf->actime); + tbuf.modtime =3D tswapal(target_tbuf->modtime); + unlock_user_struct(target_tbuf, arg2, 0); + host_tbuf =3D &tbuf; + } else { + host_tbuf =3D NULL; + } + + p =3D lock_user_string(target_path); + if (!p) { + return -TARGET_EFAULT; + } + ret =3D get_errno(utime(p, host_tbuf)); + unlock_user(p, target_path, 0); + return ret; +} +#endif + +#ifdef TARGET_NR_utimes +SYSCALL_IMPL(utimes) +{ + abi_ulong target_path =3D arg1; + abi_ulong target_tv =3D arg2; + struct timeval *tvp, tv[2]; + char *p; + abi_long ret; + + if (target_tv) { + if (copy_from_user_timeval(&tv[0], target_tv) + || copy_from_user_timeval(&tv[1], + target_tv + + sizeof(struct target_timeval))) { + return -TARGET_EFAULT; + } + tvp =3D tv; + } else { + tvp =3D NULL; + } + + p =3D lock_user_string(target_path); + if (!p) { + return -TARGET_EFAULT; + } + ret =3D get_errno(utimes(p, tvp)); + unlock_user(p, target_path, 0); + return ret; +} +#endif + SYSCALL_IMPL(write) { int fd =3D arg1; diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 96e77ea38f..f66acbf27c 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -5380,69 +5380,6 @@ static abi_long do_syscall1(void *cpu_env, int num, = abi_long arg1, void *p; =20 switch(num) { -#ifdef TARGET_NR_utime - case TARGET_NR_utime: - { - struct utimbuf tbuf, *host_tbuf; - struct target_utimbuf *target_tbuf; - if (arg2) { - if (!lock_user_struct(VERIFY_READ, target_tbuf, arg2, 1)) - return -TARGET_EFAULT; - tbuf.actime =3D tswapal(target_tbuf->actime); - tbuf.modtime =3D tswapal(target_tbuf->modtime); - unlock_user_struct(target_tbuf, arg2, 0); - host_tbuf =3D &tbuf; - } else { - host_tbuf =3D NULL; - } - if (!(p =3D lock_user_string(arg1))) - return -TARGET_EFAULT; - ret =3D get_errno(utime(p, host_tbuf)); - unlock_user(p, arg1, 0); - } - return ret; -#endif -#ifdef TARGET_NR_utimes - case TARGET_NR_utimes: - { - struct timeval *tvp, tv[2]; - if (arg2) { - if (copy_from_user_timeval(&tv[0], arg2) - || copy_from_user_timeval(&tv[1], - arg2 + sizeof(struct target_= timeval))) - return -TARGET_EFAULT; - tvp =3D tv; - } else { - tvp =3D NULL; - } - if (!(p =3D lock_user_string(arg1))) - return -TARGET_EFAULT; - ret =3D get_errno(utimes(p, tvp)); - unlock_user(p, arg1, 0); - } - return ret; -#endif -#if defined(TARGET_NR_futimesat) - case TARGET_NR_futimesat: - { - struct timeval *tvp, tv[2]; - if (arg3) { - if (copy_from_user_timeval(&tv[0], arg3) - || copy_from_user_timeval(&tv[1], - arg3 + sizeof(struct target_= timeval))) - return -TARGET_EFAULT; - tvp =3D tv; - } else { - tvp =3D NULL; - } - if (!(p =3D lock_user_string(arg2))) { - return -TARGET_EFAULT; - } - ret =3D get_errno(futimesat(arg1, path(p), tvp)); - unlock_user(p, arg2, 0); - } - return ret; -#endif #ifdef TARGET_NR_access case TARGET_NR_access: if (!(p =3D lock_user_string(arg1))) { diff --git a/linux-user/strace.list b/linux-user/strace.list index 2a65457c76..3f92224b55 100644 --- a/linux-user/strace.list +++ b/linux-user/strace.list @@ -226,9 +226,6 @@ #ifdef TARGET_NR_futex { TARGET_NR_futex, "futex" , NULL, print_futex, NULL }, #endif -#ifdef TARGET_NR_futimesat -{ TARGET_NR_futimesat, "futimesat" , NULL, print_futimesat, NULL }, -#endif #ifdef TARGET_NR_getcpu { TARGET_NR_getcpu, "getcpu" , "%s(%p,%d)", NULL, NULL }, #endif @@ -1392,12 +1389,6 @@ #ifdef TARGET_NR_ustat { TARGET_NR_ustat, "ustat" , "%s(%#x,%p)", NULL, NULL }, #endif -#ifdef TARGET_NR_utime -{ TARGET_NR_utime, "utime" , NULL, print_utime, NULL }, -#endif -#ifdef TARGET_NR_utimes -{ TARGET_NR_utimes, "utimes" , NULL, print_utimes, NULL }, -#endif #ifdef TARGET_NR_utrap_install { TARGET_NR_utrap_install, "utrap_install" , NULL, NULL, NULL }, #endif --=20 2.17.1 From nobody Thu May 9 22:44:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1558300258; cv=none; d=zoho.com; s=zohoarc; b=aXa2M30DvVSksbc8jf6KZPPra5oQV7hMSqN/9W94HPI7jcLI9hhZ8u50+lqxrRNxxZL+vFtlWhtHVx/Xv4qXey2ieHnpG7ttcp2VgVF08Dd3IsOAbGt9OkvQLgymuoKndBBRLnZVPSHmbEBzzpAk0HPit/K1Sz3iDBeFHgp4tI4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1558300258; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=RSrci5Zj8IDwkVKyxa0LFWqGkMUNuHHhltz/gMocb2g=; b=cIJiotVZJPnQDwb+ZP4Isnsu8QicBeSlYMlpVVd8FBY8XzF9L8cfDU4D6uQEvgd3cETmoZDV3eXJEE1Ej26WZZ3OQSMbi1JkIDh/uQ8oFyp4EtYq7zArtaAhn5bG2dWu4hduf5U4rPltc69U2KfKEWkKb6R5Nn7o7fI2DbOYbVU= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (209.51.188.17 [209.51.188.17]) by mx.zohomail.com with SMTPS id 1558300258950471.722027990558; Sun, 19 May 2019 14:10:58 -0700 (PDT) Received: from localhost ([127.0.0.1]:53599 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hST4z-0005nL-K4 for importer@patchew.org; Sun, 19 May 2019 17:10:49 -0400 Received: from eggs.gnu.org ([209.51.188.92]:50642) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSZc-0003cU-CZ for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:26 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hSSZZ-0004Kt-92 for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:23 -0400 Received: from mail-pl1-x641.google.com ([2607:f8b0:4864:20::641]:45099) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hSSZX-0004F6-9f for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:20 -0400 Received: by mail-pl1-x641.google.com with SMTP id a5so5687657pls.12 for ; Sun, 19 May 2019 13:38:16 -0700 (PDT) Received: from localhost.localdomain (97-113-13-231.tukw.qwest.net. [97.113.13.231]) by smtp.gmail.com with ESMTPSA id i7sm11397448pfo.19.2019.05.19.13.38.14 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 19 May 2019 13:38:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=RSrci5Zj8IDwkVKyxa0LFWqGkMUNuHHhltz/gMocb2g=; b=jDdO0zc2XOPVrgHNM7q3palvQ30e3PDzRDXcePaLqRdKym7cLd/LjwZG688coSBiDH uhPpWTjODsh5mhOWQBcN4VnB+PnRHeE/zGifzcRVu0yIOk5t2DAsX6UNFUtKqWVnBI0e 1umbfEqqJnQ1FdgLO/wH3NC60ltA6G2HX3yeHsdQoDq3vjgriqgHJIG9DsE5istdSWKg KvT2nm0jxrN7+OKsHkN+uzIn6IEivAqeS1imme5WHtTaM18gkB+QUDF/4t6RzP2J814f l30i1GJRYTzQPvmOW12bA2y8C9tn953vOADKHtdurdxHBqDE2FSsTn4J0AWKzOagBDu5 OGnQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=RSrci5Zj8IDwkVKyxa0LFWqGkMUNuHHhltz/gMocb2g=; b=S8qtEUhfE0CyhO+ja31G+a9sHtc1wkgjQaEjae/Gf6WvBXAufMhoj2S6SkuksvfgLz j95DNW6ALLXy0M0h8gWI+fnz2ic0zMvT6pkxCEW0W++JSRKFbLnX6i41I9BHnuCdDEz1 xE+XvpQS0bqEs5fjKjQrDxM3mIUV2M9wTHPMEkUrp02jZowciU+zGIq0U5bkFrd4CQ07 Jr5rDnhO84Tqmhd8LZhzRBGEfGWTTqqC+YAtJ0iUCLG73c685HTY4BHDGWMRSezOvX2w cAMGMxXcRRGo73iBta0R1sO+2FK63EF42Pfo5IFOgmgJJ8SBkGwB3B7ThJHtPK8zapjJ yaBQ== X-Gm-Message-State: APjAAAUSiNeMLCWCnpuHzqdQE5VCEf1m+RLXDzsqASNV60vbKhEcQFgw fdPY1jexUkR9aTJhXDI7OgF9tYQpmco= X-Google-Smtp-Source: APXvYqyg33KigYZdisgsLHMaEcrvljDSGOptpKvJFbcNdKMwErkuChYRydfSBxlLKkBKLJMSJt+77Q== X-Received: by 2002:a17:902:4e:: with SMTP id 72mr19186217pla.80.1558298295592; Sun, 19 May 2019 13:38:15 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sun, 19 May 2019 13:36:48 -0700 Message-Id: <20190519203726.20729-37-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190519203726.20729-1-richard.henderson@linaro.org> References: <20190519203726.20729-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::641 Subject: [Qemu-devel] [PATCH v7 36/74] linux-user: Split out access, faccessat X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: laurent@vivier.eu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Note that faccessat is unconditionally available. Signed-off-by: Richard Henderson --- linux-user/syscall-defs.h | 4 ++++ linux-user/syscall.h | 1 + linux-user/strace.c | 33 ++++----------------------------- linux-user/syscall-file.inc.c | 25 +++++++++++++++++++++++++ linux-user/syscall.c | 18 ------------------ linux-user/strace.list | 6 ------ 6 files changed, 34 insertions(+), 53 deletions(-) diff --git a/linux-user/syscall-defs.h b/linux-user/syscall-defs.h index 2767e335d8..39e3ae3c21 100644 --- a/linux-user/syscall-defs.h +++ b/linux-user/syscall-defs.h @@ -16,6 +16,9 @@ * along with this program; if not, see . */ =20 +#ifdef TARGET_NR_access +SYSCALL_DEF(access, ARG_STR, ARG_ACCESSFLAG); +#endif #ifdef TARGET_NR_alarm SYSCALL_DEF(alarm, ARG_DEC); #endif @@ -34,6 +37,7 @@ SYSCALL_DEF(creat, ARG_STR, ARG_MODEFLAG); SYSCALL_DEF(exit, ARG_DEC); SYSCALL_DEF(execve, ARG_STR, ARG_PTR, ARG_PTR); SYSCALL_DEF(execveat, ARG_ATDIRFD, ARG_STR, ARG_PTR, ARG_PTR, ARG_ATFLAG); +SYSCALL_DEF(faccessat, ARG_ATDIRFD, ARG_STR, ARG_ACCESSFLAG); SYSCALL_DEF(fchmod, ARG_DEC, ARG_MODEFLAG); SYSCALL_DEF(fchmodat, ARG_ATDIRFD, ARG_STR, ARG_MODEFLAG); #ifdef TARGET_NR_futimesat diff --git a/linux-user/syscall.h b/linux-user/syscall.h index 3c936b648a..84a52b2d9a 100644 --- a/linux-user/syscall.h +++ b/linux-user/syscall.h @@ -57,6 +57,7 @@ typedef enum { =20 /* These print as sets of flags. */ ARG_ATDIRFD, + ARG_ACCESSFLAG, ARG_ATFLAG, ARG_CLONEFLAG, ARG_MMAPFLAG, diff --git a/linux-user/strace.c b/linux-user/strace.c index 3a7a5c30ec..c42abc2f08 100644 --- a/linux-user/strace.c +++ b/linux-user/strace.c @@ -634,7 +634,7 @@ print_syscall_ret_adjtimex(const struct syscallname *na= me, abi_long ret) gemu_log("\n"); } =20 -UNUSED static struct flags access_flags[] =3D { +static struct flags const access_flags[] =3D { FLAG_GENERIC(F_OK), FLAG_GENERIC(R_OK), FLAG_GENERIC(W_OK), @@ -1114,19 +1114,6 @@ print_accept(const struct syscallname *name, } #endif =20 -#ifdef TARGET_NR_access -static void -print_access(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - print_syscall_prologue(name); - print_string(arg0, 0); - print_flags(access_flags, arg1, 1); - print_syscall_epilogue(name); -} -#endif - #ifdef TARGET_NR_chroot static void print_chroot(const struct syscallname *name, @@ -1165,21 +1152,6 @@ print_execv(const struct syscallname *name, } #endif =20 -#ifdef TARGET_NR_faccessat -static void -print_faccessat(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - print_syscall_prologue(name); - print_at_dirfd(arg0, 0); - print_string(arg1, 0); - print_flags(access_flags, arg2, 0); - print_flags(at_file_flags, arg3, 1); - print_syscall_epilogue(name); -} -#endif - #ifdef TARGET_NR_fchownat static void print_fchownat(const struct syscallname *name, @@ -2218,6 +2190,9 @@ static void print_syscall_def1(const SyscallDef *def,= int64_t args[6]) case ARG_ATDIRFD: len =3D add_atdirfd(b, rest, arg); break; + case ARG_ACCESSFLAG: + len =3D add_flags(b, rest, access_flags, arg, false); + break; case ARG_ATFLAG: len =3D add_flags(b, rest, at_file_flags, arg, false); break; diff --git a/linux-user/syscall-file.inc.c b/linux-user/syscall-file.inc.c index 42e5cd2dc1..5e276d13bc 100644 --- a/linux-user/syscall-file.inc.c +++ b/linux-user/syscall-file.inc.c @@ -16,6 +16,26 @@ * along with this program; if not, see . */ =20 +static abi_long do_faccessat(int dirfd, abi_ulong target_path, int mode) +{ + char *p =3D lock_user_string(target_path); + abi_long ret; + + if (!p) { + return -TARGET_EFAULT; + } + ret =3D get_errno(faccessat(dirfd, p, mode, 0)); + unlock_user(p, target_path, 0); + return ret; +} + +#ifdef TARGET_NR_access +SYSCALL_IMPL(access) +{ + return do_faccessat(AT_FDCWD, arg1, arg2); +} +#endif + SYSCALL_IMPL(chdir) { abi_ulong target_path =3D arg1; @@ -74,6 +94,11 @@ SYSCALL_IMPL(creat) } #endif =20 +SYSCALL_IMPL(faccessat) +{ + return do_faccessat(arg1, arg2, arg3); +} + SYSCALL_IMPL(fchmod) { return get_errno(fchmod(arg1, arg2)); diff --git a/linux-user/syscall.c b/linux-user/syscall.c index f66acbf27c..b5ade974a7 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -5380,24 +5380,6 @@ static abi_long do_syscall1(void *cpu_env, int num, = abi_long arg1, void *p; =20 switch(num) { -#ifdef TARGET_NR_access - case TARGET_NR_access: - if (!(p =3D lock_user_string(arg1))) { - return -TARGET_EFAULT; - } - ret =3D get_errno(access(path(p), arg2)); - unlock_user(p, arg1, 0); - return ret; -#endif -#if defined(TARGET_NR_faccessat) && defined(__NR_faccessat) - case TARGET_NR_faccessat: - if (!(p =3D lock_user_string(arg2))) { - return -TARGET_EFAULT; - } - ret =3D get_errno(faccessat(arg1, p, arg3, 0)); - unlock_user(p, arg2, 0); - return ret; -#endif #ifdef TARGET_NR_nice /* not on alpha */ case TARGET_NR_nice: return get_errno(nice(arg1)); diff --git a/linux-user/strace.list b/linux-user/strace.list index 3f92224b55..80b9220e89 100644 --- a/linux-user/strace.list +++ b/linux-user/strace.list @@ -9,9 +9,6 @@ #ifdef TARGET_NR_accept4 { TARGET_NR_accept4, "accept4" , NULL, NULL, NULL }, #endif -#ifdef TARGET_NR_access -{ TARGET_NR_access, "access" , NULL, print_access, NULL }, -#endif #ifdef TARGET_NR_acct { TARGET_NR_acct, "acct" , NULL, NULL, NULL }, #endif @@ -142,9 +139,6 @@ #ifdef TARGET_NR_exit_group { TARGET_NR_exit_group, "exit_group" , "%s(%d)\n", NULL, NULL }, #endif -#ifdef TARGET_NR_faccessat -{ TARGET_NR_faccessat, "faccessat" , NULL, print_faccessat, NULL }, -#endif #ifdef TARGET_NR_fadvise64 { TARGET_NR_fadvise64, "fadvise64" , NULL, NULL, NULL }, #endif --=20 2.17.1 From nobody Thu May 9 22:44:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1558300042; cv=none; d=zoho.com; s=zohoarc; b=RuVPmnZBnPMk7SPKsc3C9fqDjo7buwf47r1d02+olco0bwCk+DAe1eHPimd2SAtMnpKuWUJQa37UxGmPIsulQVm991e6FubvOEBjOiiTzBVJSAqIa05/BFlzdKwIU7rLyy6GhXBkuzeVEn7QjOnPw1/mk3ffQoYSXndJ/EtmSUc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1558300042; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=Fe7E5QRFjEHLy1d+AjizcpNZcZxNIdj6eQS1u8xiwio=; b=a9j0rfhcG2Zhfu7Q5AzBJPXi9wmw/srqPKq02BWgVgMFKdh5MMh8XosIaV9et0xLKcK6BVcWGvxnJAiu+fwbQBCpyguh5drQNPiRvGWaJTI+FoUQxkvBlDhXEOOEEMa+MB80QIYrHjioOFvTt0ECiiYTFMQKedavXB6o68XthpM= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (209.51.188.17 [209.51.188.17]) by mx.zohomail.com with SMTPS id 1558300042538224.88006392495322; Sun, 19 May 2019 14:07:22 -0700 (PDT) Received: from localhost ([127.0.0.1]:53534 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hST1Y-0002fw-88 for importer@patchew.org; Sun, 19 May 2019 17:07:16 -0400 Received: from eggs.gnu.org ([209.51.188.92]:50641) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSZc-0003cT-CP for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:25 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hSSZZ-0004Ky-9G for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:23 -0400 Received: from mail-pl1-x642.google.com ([2607:f8b0:4864:20::642]:46928) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hSSZX-0004GK-Aj for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:20 -0400 Received: by mail-pl1-x642.google.com with SMTP id r18so5698795pls.13 for ; Sun, 19 May 2019 13:38:18 -0700 (PDT) Received: from localhost.localdomain (97-113-13-231.tukw.qwest.net. [97.113.13.231]) by smtp.gmail.com with ESMTPSA id i7sm11397448pfo.19.2019.05.19.13.38.15 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 19 May 2019 13:38:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=Fe7E5QRFjEHLy1d+AjizcpNZcZxNIdj6eQS1u8xiwio=; b=JxCQ5vv6JneusoOCcHuWwJwAtEJ75qJqIWbtzgPlH9Eh4Ffz5r0hXmE2pKPnd1vDGO DnE1Y4qjWIDJZ8vCdmyDiA3taIhIG8YaixMXkqx94v9TwUJVprG33zKRgIKCOeDkhIVq X+Om79IvXcBrEkf43Eyj/ox8oOoQ0eJG1sSfX4z3L9YJyba1Bfu/+pT+kI67x2Gi3WOf 0rZqs8K8wPtvEESqtoa9iS4lxH1wRr+gjO/p6pfJ7xn7kvoEBpdSIGaFq/wO4WNiFKr1 TBmEIjUv722dVTlClRhpgm+1eETvmK0wo2o28jxmd+PL4DCEnVeXGj/JRVs6OIsgd9FP sN2A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=Fe7E5QRFjEHLy1d+AjizcpNZcZxNIdj6eQS1u8xiwio=; b=fGEmgQkroXS2M/3578ctTTv/YOQBGtGxkrsjiP5inkKmEiCOuBeeVYd/UhbsRTTKSK GinBazdhLFnWpgc1HCylkEE4XzoBecLbElu5FgrrWGN/LK0qgxZMBLt3bQ+wGuZyrZVz 2vITs8lTD9ZEuo9A2rq3kGHbApCZhM+K/NU8LhT7uJOY0LCf5W6CEIfU9bjNhGiw/EX/ BIb73JrzzX16HHuKCz4ms18apiBO5oi6o/AHDaU66n6UW+EimVUGqwP4q+/R5slvssRX hgM2WPd4Gn/0OKEKVox5Nk47wIidaeq0pfl/Fh6wRZQXoI/kMkSZCp6DULNN0E+MCZfS s4Pw== X-Gm-Message-State: APjAAAXMhovQ7LtsvNT3+tgMZaf013Y8d1EwoCk9CeqBhqJV0z4JuY33 N1hfUF6jfkCiUpw/Fcrla5Be6EkrE6k= X-Google-Smtp-Source: APXvYqyQZBPK6pQ40xRQonpT6t4LssLVE44wc96yjhKlNBchpa6s3bXBRiTGkB9H9ZF57dJ9g2oYww== X-Received: by 2002:a17:902:bd46:: with SMTP id b6mr10558681plx.173.1558298296924; Sun, 19 May 2019 13:38:16 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sun, 19 May 2019 13:36:49 -0700 Message-Id: <20190519203726.20729-38-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190519203726.20729-1-richard.henderson@linaro.org> References: <20190519203726.20729-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::642 Subject: [Qemu-devel] [PATCH v7 37/74] linux-user: Split out nice X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: laurent@vivier.eu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Richard Henderson --- linux-user/syscall-defs.h | 3 +++ linux-user/syscall-proc.inc.c | 7 +++++++ linux-user/syscall.c | 4 ---- linux-user/strace.list | 3 --- 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/linux-user/syscall-defs.h b/linux-user/syscall-defs.h index 39e3ae3c21..860754aaca 100644 --- a/linux-user/syscall-defs.h +++ b/linux-user/syscall-defs.h @@ -111,6 +111,9 @@ SYSCALL_DEF(munlockall); SYSCALL_DEF(munmap, ARG_PTR, ARG_DEC); SYSCALL_DEF(name_to_handle_at, ARG_ATDIRFD, ARG_STR, ARG_PTR, ARG_PTR, ARG_ATFLAG); +#ifdef TARGET_NR_nice +SYSCALL_DEF(nice, ARG_DEC); +#endif #ifdef TARGET_NR_open SYSCALL_DEF(open, ARG_STR, ARG_OPENFLAG, ARG_MODEFLAG); #endif diff --git a/linux-user/syscall-proc.inc.c b/linux-user/syscall-proc.inc.c index 4d8d385b38..e29c2ede25 100644 --- a/linux-user/syscall-proc.inc.c +++ b/linux-user/syscall-proc.inc.c @@ -461,6 +461,13 @@ SYSCALL_IMPL(getxpid) } #endif =20 +#ifdef TARGET_NR_nice +SYSCALL_IMPL(nice) +{ + return get_errno(nice(arg1)); +} +#endif + /* * Map host to target signal numbers for the wait family of syscalls. * Assume all other status bits are the same. diff --git a/linux-user/syscall.c b/linux-user/syscall.c index b5ade974a7..6d30e8ff2f 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -5380,10 +5380,6 @@ static abi_long do_syscall1(void *cpu_env, int num, = abi_long arg1, void *p; =20 switch(num) { -#ifdef TARGET_NR_nice /* not on alpha */ - case TARGET_NR_nice: - return get_errno(nice(arg1)); -#endif case TARGET_NR_sync: sync(); return 0; diff --git a/linux-user/strace.list b/linux-user/strace.list index 80b9220e89..3161546afc 100644 --- a/linux-user/strace.list +++ b/linux-user/strace.list @@ -527,9 +527,6 @@ #ifdef TARGET_NR_nfsservctl { TARGET_NR_nfsservctl, "nfsservctl" , NULL, NULL, NULL }, #endif -#ifdef TARGET_NR_nice -{ TARGET_NR_nice, "nice" , NULL, NULL, NULL }, -#endif #ifdef TARGET_NR_old_adjtimex { TARGET_NR_old_adjtimex, "old_adjtimex" , NULL, NULL, NULL }, #endif --=20 2.17.1 From nobody Thu May 9 22:44:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1558299742; cv=none; d=zoho.com; s=zohoarc; b=fCGYPma61dbtjndDQ9YUESZMlJ9sTsxbdy2OwrCXfjphsT6T70LCTbNOHv7NQw3PacKRR2Rybf0r2vVFHlGi1KgAJ2ek0TRnrG2+YtuwzSAVjbNKY9fq0kz0cnOa+SkXHPLEPi4z2z7fDSh2VNIWykDPFzYdr10039tClc1P4kw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1558299742; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=trhc0Rc4LDpLHBX/8qxpTfKaIrV8kdNRhDojH/u1TVk=; b=bE0P7fhxHI9BHzkpFVhFjfPZOi173x8fyqqkwWLQaBUx5I5k2VtE/gR0m2+Yo4AzhHr7I7y/Mq6uP86oig8/I9X1E04K9vQiqqKvIiyFZxreOk/TTXpl+rN67U8bhiLWDxB6L75ZpLdWblOiMlPoSTqYc4dmZ8M1kAJkXqL3Exk= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (209.51.188.17 [209.51.188.17]) by mx.zohomail.com with SMTPS id 1558299742182591.1593101723975; Sun, 19 May 2019 14:02:22 -0700 (PDT) Received: from localhost ([127.0.0.1]:53458 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSwi-0006YR-1k for importer@patchew.org; Sun, 19 May 2019 17:02:16 -0400 Received: from eggs.gnu.org ([209.51.188.92]:50701) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSZe-0003eR-CE for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:27 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hSSZd-0004P4-1T for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:26 -0400 Received: from mail-pf1-x441.google.com ([2607:f8b0:4864:20::441]:37550) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hSSZZ-0004He-7N for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:23 -0400 Received: by mail-pf1-x441.google.com with SMTP id g3so6171662pfi.4 for ; Sun, 19 May 2019 13:38:19 -0700 (PDT) Received: from localhost.localdomain (97-113-13-231.tukw.qwest.net. [97.113.13.231]) by smtp.gmail.com with ESMTPSA id i7sm11397448pfo.19.2019.05.19.13.38.16 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 19 May 2019 13:38:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=trhc0Rc4LDpLHBX/8qxpTfKaIrV8kdNRhDojH/u1TVk=; b=VcrrAraR3P2FH/TyydTN4gf6E4HL1lu8TIAS/7Mfkdzh/z9NZK0sA3XGseQhRyAA49 Ey4Pr9FJa5//qsilaJ0hI2O7uNITkYxutxP3x2SIah5gCZuxQeBsr0ZWXFnd5eJNKrGQ takqHHTh/tdqUWu8L4TAusVtB3bUTNT89F1kOzFbAbSJWkJEv+/6kXlBoW/dLvpQDIz4 K7DUhFUwpgZpzFkOs/wzOchMC4wj+iytwdiEICeY/DiEJSrVDSkxdmnhJ/ebgXlR++wR zcARnZSYAJZNbN4sRfaRwgJGyExFOJGMJpytcTl75zpYahzn3bie6Gzicem/DfiUpgzS /KNw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=trhc0Rc4LDpLHBX/8qxpTfKaIrV8kdNRhDojH/u1TVk=; b=nWfkZYs0OSfe2NJKuorfY/otK9SL56bQprnm8fwPwvmXvffPM8mhpRs2MoZuY882Bz zIZw/AI0EfcXESNGW7NTbaB+LM/sb68dnUHKZY+2kriwgj2Iwcc5VcSCYpJqS0ScEfWB /YtdFH5pMLo7Wxt4y28B58Y/5q1Ss24o/4U1Eb7WH/ghGXdHBEyKocJ3l2HmGpWZWPv+ WkzFb0durPic9Nwtvj7jaw5ZhtfRA4a8kNoj/+Jv7tMTwil/KZTO7hrODNGPWH990nUR uBd4JYde0PK2SHgrYw5WoXILBUb0t/tIZJX7UNXR+Ey+a8l6DeXAN4+8hrapNwtJajmH T/LQ== X-Gm-Message-State: APjAAAUaRoIo1OdXXGZzN0QrEMHiScVx5H0Zqck1ZjCsjYrIJHZpoC1H iSA1k29InSKAq5lOUM06lXsvwFmvl5g= X-Google-Smtp-Source: APXvYqyHXyGV4nWVN8OGbAKf1nkwmbGU44qoJ8mwnWMQj5J7z5IVaaQnkhVhYtRoiw5dN0jWmZ5oJA== X-Received: by 2002:a63:2124:: with SMTP id h36mr70764891pgh.186.1558298298098; Sun, 19 May 2019 13:38:18 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sun, 19 May 2019 13:36:50 -0700 Message-Id: <20190519203726.20729-39-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190519203726.20729-1-richard.henderson@linaro.org> References: <20190519203726.20729-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::441 Subject: [Qemu-devel] [PATCH v7 38/74] linux-user: Split out sync, syncfs X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: laurent@vivier.eu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Note that syncfs is universally available. If !CONFIG_SYNCFS, provide our own syscall replacement. Signed-off-by: Richard Henderson --- linux-user/syscall-defs.h | 2 ++ linux-user/syscall-file.inc.c | 11 +++++++++++ linux-user/syscall.c | 20 ++++++++++++-------- linux-user/strace.list | 6 ------ 4 files changed, 25 insertions(+), 14 deletions(-) diff --git a/linux-user/syscall-defs.h b/linux-user/syscall-defs.h index 860754aaca..497fbdba66 100644 --- a/linux-user/syscall-defs.h +++ b/linux-user/syscall-defs.h @@ -171,6 +171,8 @@ SYSCALL_DEF(shmget, ARG_DEC, ARG_DEC, ARG_HEX); #ifdef TARGET_NR_stime SYSCALL_DEF(stime, ARG_PTR); #endif +SYSCALL_DEF(sync); +SYSCALL_DEF(syncfs, ARG_DEC); #ifdef TARGET_NR_time SYSCALL_DEF(time, ARG_PTR); #endif diff --git a/linux-user/syscall-file.inc.c b/linux-user/syscall-file.inc.c index 5e276d13bc..9f3cf7221a 100644 --- a/linux-user/syscall-file.inc.c +++ b/linux-user/syscall-file.inc.c @@ -873,6 +873,17 @@ SYSCALL_IMPL(readlinkat) } #endif =20 +SYSCALL_IMPL(sync) +{ + sync(); + return 0; +} + +SYSCALL_IMPL(syncfs) +{ + return get_errno(syncfs(arg1)); +} + static abi_long do_umount2(abi_ulong target_path, int flags) { char *p =3D lock_user_string(target_path); diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 6d30e8ff2f..d612dade23 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -199,6 +199,15 @@ static type name (type1 arg1,type2 arg2,type3 arg3,typ= e4 arg4,type5 arg5, \ #define __NR_sys_gettid __NR_gettid _syscall0(int, sys_gettid) =20 +/* + * These definitions produce an ENOSYS from the host kernel. + * Performing a bogus syscall is easier than boilerplating + * the replacement functions here in C. + */ +#ifndef __NR_syncfs +#define __NR_syncfs -1 +#endif + /* For the 64-bit guest on 32-bit host case we must emulate * getdents using getdents64, because otherwise the host * might hand us back more dirent records than we can fit @@ -254,11 +263,13 @@ _syscall3(int, ioprio_set, int, which, int, who, int,= ioprio) #if defined(TARGET_NR_getrandom) && defined(__NR_getrandom) _syscall3(int, getrandom, void *, buf, size_t, buflen, unsigned int, flags) #endif - #if defined(TARGET_NR_kcmp) && defined(__NR_kcmp) _syscall5(int, kcmp, pid_t, pid1, pid_t, pid2, int, type, unsigned long, idx1, unsigned long, idx2) #endif +#ifndef CONFIG_SYNCFS +_syscall1(int, syncfs, int, fd) +#endif =20 static bitmask_transtbl fcntl_flags_tbl[] =3D { { TARGET_O_ACCMODE, TARGET_O_WRONLY, O_ACCMODE, O_WRONLY, }, @@ -5380,13 +5391,6 @@ static abi_long do_syscall1(void *cpu_env, int num, = abi_long arg1, void *p; =20 switch(num) { - case TARGET_NR_sync: - sync(); - return 0; -#if defined(TARGET_NR_syncfs) && defined(CONFIG_SYNCFS) - case TARGET_NR_syncfs: - return get_errno(syncfs(arg1)); -#endif case TARGET_NR_kill: return get_errno(safe_kill(arg1, target_to_host_signal(arg2))); #ifdef TARGET_NR_rename diff --git a/linux-user/strace.list b/linux-user/strace.list index 3161546afc..749bdce638 100644 --- a/linux-user/strace.list +++ b/linux-user/strace.list @@ -1260,12 +1260,6 @@ #ifdef TARGET_NR_symlinkat { TARGET_NR_symlinkat, "symlinkat", NULL, print_symlinkat, NULL }, #endif -#ifdef TARGET_NR_sync -{ TARGET_NR_sync, "sync" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_syncfs -{ TARGET_NR_syncfs, "syncfs" , "%s(%d)", NULL, NULL }, -#endif #ifdef TARGET_NR_syscall { TARGET_NR_syscall, "syscall" , NULL, NULL, NULL }, #endif --=20 2.17.1 From nobody Thu May 9 22:44:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1558300868; cv=none; d=zoho.com; s=zohoarc; b=bWXjcAMsTeP6nPCwEy+lHFqOTOZ3PgWZkqLLupR6SQNZeUpscDjKHmcKGtrasftU24wTuzW3WtCS9WzvBNhSjz33j37P3+gLlT7SgBW6cbxP1ensC9zRtEO73h92Zida7vll6/7NecNTDZo7NcFNjsoYpnOju+3Z6n+fdSU60P0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1558300868; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=eI/OxnXRIKB57lBoz21sGaC914M6dhfbjsRtukHRXg0=; b=VMV3CMWSl6GFprRPLavzfp0TJ/Hy1vPkt4XfVnPDNfIBkewevTScMwgBOjpf0dY39cI8KPz7ZrzfUzQobo/QUVI80Vk8DM9wh4GkcOk2/zD2YZPKOx9ZmoJ69MzqD4BcyPLUMSzRxacxDr753tinaHAy7UfFfukXtvZaj2ip6Z0= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1558300868385685.6035954828192; Sun, 19 May 2019 14:21:08 -0700 (PDT) Received: from localhost ([127.0.0.1]:53753 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSTEq-0006kB-Uw for importer@patchew.org; Sun, 19 May 2019 17:21:01 -0400 Received: from eggs.gnu.org ([209.51.188.92]:50731) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSZe-0003ej-TX for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:29 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hSSZd-0004Pc-D0 for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:26 -0400 Received: from mail-pl1-x644.google.com ([2607:f8b0:4864:20::644]:36604) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hSSZd-0004JI-22 for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:25 -0400 Received: by mail-pl1-x644.google.com with SMTP id d21so5723921plr.3 for ; Sun, 19 May 2019 13:38:20 -0700 (PDT) Received: from localhost.localdomain (97-113-13-231.tukw.qwest.net. [97.113.13.231]) by smtp.gmail.com with ESMTPSA id i7sm11397448pfo.19.2019.05.19.13.38.18 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 19 May 2019 13:38:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=eI/OxnXRIKB57lBoz21sGaC914M6dhfbjsRtukHRXg0=; b=Fp+vjFA70/upaz/6v2na2w+I8bC7wlOghToH3FGqz/d874uotH+AiOsNFA4+tHKtFV eoe5hEx4sHdWvma1nP8tbhUYVqb39Biyr/xVPd8NKBRXUb1Tw6EdV+AxPY4EPfTgVNYC 1mswB1X1rarKbQ9VLXR/0LW00Qfj1zVL95a0taHxPxAdzw3fHQxpIyhRFYPLzLD1cViq fp8MT9/W4cCReJbMkM47GB67FNYJemeG2v4Gu3mRehMlReFVqQa/aS2MEGBop/ONpGDl PCHhXn8lNClJqPKP7hzoE4/JUEP9dpGZ5/4EZZo+P31q35Hm5JZqyJbpCVj6Q/yXCXmg 9dGQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=eI/OxnXRIKB57lBoz21sGaC914M6dhfbjsRtukHRXg0=; b=d/Ho9aQNRJDA2RIAw/r/T/Swj0yWslp7FgGh7eIYy+/HfOpXadOvuVJ+2MhU2sStzO u37KBERPdW1a5/mFhuso9jFm5Cmok7z7a+2Y11qnP1VAcXel4Of8tKDGG7zrzohexs+s toBr07Ld28lGl03uUoRkWzCx/ZRAxBLEoTiUYtA4+24UWvL+Ky3nTXINHvObCgw5WsYL T2+ZtnR6Ihbn4c4uQr6haHErJJ0iF3AU8RUyo9zwo5xXcYWlXXxvLIG+QphogE9kMdwb LSsoTPxCrZNmIlLsob5J5yVTUJgm3DMA9qRAb/Z2zI9HLFTTbdoAo4mtVYchodhag8nj EfIA== X-Gm-Message-State: APjAAAXMxs8dqnf/hB2vgY5hluW31Twko5RZ3Lw+mTAVu2pwTK7Wjq9b YPRhOz81r7MvwQdhvN7ZDW/GUg5bz2s= X-Google-Smtp-Source: APXvYqyH0Rzkf0arwYbT++2UD+Lh02d7Qh6Q9FA/O4Hx4aS4jyrNWxsTTqXdwOUeTvlSHbKqpKA/0A== X-Received: by 2002:a17:902:9691:: with SMTP id n17mr9590191plp.283.1558298299282; Sun, 19 May 2019 13:38:19 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sun, 19 May 2019 13:36:51 -0700 Message-Id: <20190519203726.20729-40-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190519203726.20729-1-richard.henderson@linaro.org> References: <20190519203726.20729-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::644 Subject: [Qemu-devel] [PATCH v7 39/74] linux-user: Split out kill X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: laurent@vivier.eu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Richard Henderson --- linux-user/syscall-defs.h | 1 + linux-user/syscall.h | 7 +++- linux-user/strace.c | 76 ++++++++++++++++++------------------ linux-user/syscall-sig.inc.c | 5 +++ linux-user/syscall.c | 2 - linux-user/strace.list | 3 -- 6 files changed, 48 insertions(+), 46 deletions(-) diff --git a/linux-user/syscall-defs.h b/linux-user/syscall-defs.h index 497fbdba66..c672b5ad99 100644 --- a/linux-user/syscall-defs.h +++ b/linux-user/syscall-defs.h @@ -58,6 +58,7 @@ SYSCALL_DEF(getxpid); #ifdef TARGET_NR_ipc SYSCALL_DEF_ARGS(ipc, ARG_HEX, ARG_DEC, ARG_DEC, ARG_HEX, ARG_PTR, ARG_HEX= ); #endif +SYSCALL_DEF(kill, ARG_DEC, ARG_SIGNAL); #ifdef TARGET_NR_link SYSCALL_DEF(link, ARG_STR, ARG_STR); #endif diff --git a/linux-user/syscall.h b/linux-user/syscall.h index 84a52b2d9a..642fb6dccb 100644 --- a/linux-user/syscall.h +++ b/linux-user/syscall.h @@ -55,8 +55,12 @@ typedef enum { ARG_HEX, ARG_OCT, =20 - /* These print as sets of flags. */ + /* These numbers are interpreted. */ ARG_ATDIRFD, + ARG_SIGNAL, + ARG_LSEEKWHENCE, + + /* These print as sets of flags. */ ARG_ACCESSFLAG, ARG_ATFLAG, ARG_CLONEFLAG, @@ -67,7 +71,6 @@ typedef enum { ARG_OPENFLAG, ARG_UMOUNTFLAG, ARG_UNLINKATFLAG, - ARG_LSEEKWHENCE, =20 /* These are interpreted as pointers. */ ARG_PTR, diff --git a/linux-user/strace.c b/linux-user/strace.c index c42abc2f08..01a5c210fa 100644 --- a/linux-user/strace.c +++ b/linux-user/strace.c @@ -70,35 +70,43 @@ UNUSED static void print_socket_protocol(int domain, in= t type, int protocol); /* * Utility functions */ +static int +add_signal(char *buf, int size, int sig) +{ + static const char * const signals[] =3D { + [TARGET_SIGHUP] =3D "SIGHUP", + [TARGET_SIGINT] =3D "SIGINT", + [TARGET_SIGQUIT] =3D "SIGQUIT", + [TARGET_SIGILL] =3D "SIGILL", + [TARGET_SIGABRT] =3D "SIGABRT", + [TARGET_SIGFPE] =3D "SIGFPE", + [TARGET_SIGKILL] =3D "SIGKILL", + [TARGET_SIGSEGV] =3D "SIGSEGV", + [TARGET_SIGPIPE] =3D "SIGPIPE", + [TARGET_SIGALRM] =3D "SIGALRM", + [TARGET_SIGTERM] =3D "SIGTERM", + [TARGET_SIGUSR1] =3D "SIGUSR1", + [TARGET_SIGUSR2] =3D "SIGUSR2", + [TARGET_SIGCHLD] =3D "SIGCHLD", + [TARGET_SIGCONT] =3D "SIGCONT", + [TARGET_SIGSTOP] =3D "SIGSTOP", + [TARGET_SIGTTIN] =3D "SIGTTIN", + [TARGET_SIGTTOU] =3D "SIGTTOU", + }; + + if (sig >=3D 0 && sig < ARRAY_SIZE(signals) && signals[sig]) { + return snprintf(buf, size, "%s", signals[sig]); + } else { + return snprintf(buf, size, "%d", sig); + } +} + static void print_signal(abi_ulong arg, int last) { - const char *signal_name =3D NULL; - switch(arg) { - case TARGET_SIGHUP: signal_name =3D "SIGHUP"; break; - case TARGET_SIGINT: signal_name =3D "SIGINT"; break; - case TARGET_SIGQUIT: signal_name =3D "SIGQUIT"; break; - case TARGET_SIGILL: signal_name =3D "SIGILL"; break; - case TARGET_SIGABRT: signal_name =3D "SIGABRT"; break; - case TARGET_SIGFPE: signal_name =3D "SIGFPE"; break; - case TARGET_SIGKILL: signal_name =3D "SIGKILL"; break; - case TARGET_SIGSEGV: signal_name =3D "SIGSEGV"; break; - case TARGET_SIGPIPE: signal_name =3D "SIGPIPE"; break; - case TARGET_SIGALRM: signal_name =3D "SIGALRM"; break; - case TARGET_SIGTERM: signal_name =3D "SIGTERM"; break; - case TARGET_SIGUSR1: signal_name =3D "SIGUSR1"; break; - case TARGET_SIGUSR2: signal_name =3D "SIGUSR2"; break; - case TARGET_SIGCHLD: signal_name =3D "SIGCHLD"; break; - case TARGET_SIGCONT: signal_name =3D "SIGCONT"; break; - case TARGET_SIGSTOP: signal_name =3D "SIGSTOP"; break; - case TARGET_SIGTTIN: signal_name =3D "SIGTTIN"; break; - case TARGET_SIGTTOU: signal_name =3D "SIGTTOU"; break; - } - if (signal_name =3D=3D NULL) { - print_raw_param("%ld", arg, last); - return; - } - gemu_log("%s%s", signal_name, get_comma(last)); + char buf[16]; + add_signal(buf, sizeof(buf), arg); + gemu_log("%s%s", buf, get_comma(last)); } =20 static void print_si_code(int arg) @@ -2044,19 +2052,6 @@ print_futex(const struct syscallname *name, } #endif =20 -#ifdef TARGET_NR_kill -static void -print_kill(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - print_syscall_prologue(name); - print_raw_param("%d", arg0, 0); - print_signal(arg1, 1); - print_syscall_epilogue(name); -} -#endif - #ifdef TARGET_NR_tkill static void print_tkill(const struct syscallname *name, @@ -2190,6 +2185,9 @@ static void print_syscall_def1(const SyscallDef *def,= int64_t args[6]) case ARG_ATDIRFD: len =3D add_atdirfd(b, rest, arg); break; + case ARG_SIGNAL: + len =3D add_signal(b, rest, arg); + break; case ARG_ACCESSFLAG: len =3D add_flags(b, rest, access_flags, arg, false); break; diff --git a/linux-user/syscall-sig.inc.c b/linux-user/syscall-sig.inc.c index f4e43eb00e..a4fbcc567d 100644 --- a/linux-user/syscall-sig.inc.c +++ b/linux-user/syscall-sig.inc.c @@ -23,6 +23,11 @@ SYSCALL_IMPL(alarm) } #endif =20 +SYSCALL_IMPL(kill) +{ + return get_errno(safe_kill(arg1, target_to_host_signal(arg2))); +} + #ifdef TARGET_NR_pause SYSCALL_IMPL(pause) { diff --git a/linux-user/syscall.c b/linux-user/syscall.c index d612dade23..3fe770890c 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -5391,8 +5391,6 @@ static abi_long do_syscall1(void *cpu_env, int num, a= bi_long arg1, void *p; =20 switch(num) { - case TARGET_NR_kill: - return get_errno(safe_kill(arg1, target_to_host_signal(arg2))); #ifdef TARGET_NR_rename case TARGET_NR_rename: { diff --git a/linux-user/strace.list b/linux-user/strace.list index 749bdce638..07e5f7c518 100644 --- a/linux-user/strace.list +++ b/linux-user/strace.list @@ -410,9 +410,6 @@ #ifdef TARGET_NR_keyctl { TARGET_NR_keyctl, "keyctl" , NULL, NULL, NULL }, #endif -#ifdef TARGET_NR_kill -{ TARGET_NR_kill, "kill", NULL, print_kill, NULL }, -#endif #ifdef TARGET_NR_lchown { TARGET_NR_lchown, "lchown" , NULL, NULL, NULL }, #endif --=20 2.17.1 From nobody Thu May 9 22:44:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1558299913; cv=none; d=zoho.com; s=zohoarc; b=djCzL0+Jx/vagCW0DGpBSxCHciU0WfxgHG8EnurHJY+4lEWOKWrlIfR1naqg/alimJkV5IaBq5zTKRJFrLNhHOz0AOWjbtlmJ7//5nBAsmAwve511R7OtTXWkaYnvG2BPmUn6PojK6j+QTBlw7nPna93flVq27uZB9FlcoN/j9U= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1558299913; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=MZ4xTXHoRnqxjbKzyUEkFjQQbSbYuTgwnyU38LEY1MU=; b=epyRW7SDwbRpsLQJpaKn5Fx3/pxHwD99vHR0Rh2wGAvk/PpSyn5kXBOIMECdaIz/MCuhlaN+bZlDzyinIMhcZ47Tvu5AdBGmS2FzP3xDWP0TxZ6uWLMUKU7IkcBgTKiZNKbIlplrtyYXr+xFNAmSOQVcBA/DZ9OEMSLuwgvtZfs= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (209.51.188.17 [209.51.188.17]) by mx.zohomail.com with SMTPS id 1558299913273581.8770637918177; Sun, 19 May 2019 14:05:13 -0700 (PDT) Received: from localhost ([127.0.0.1]:53483 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSzP-0000R2-Pj for importer@patchew.org; Sun, 19 May 2019 17:05:03 -0400 Received: from eggs.gnu.org ([209.51.188.92]:50750) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSZf-0003fD-Is for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:29 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hSSZd-0004Pw-IC for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:27 -0400 Received: from mail-pl1-x642.google.com ([2607:f8b0:4864:20::642]:39847) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hSSZd-0004Kj-7H for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:25 -0400 Received: by mail-pl1-x642.google.com with SMTP id g9so5709210plm.6 for ; Sun, 19 May 2019 13:38:21 -0700 (PDT) Received: from localhost.localdomain (97-113-13-231.tukw.qwest.net. [97.113.13.231]) by smtp.gmail.com with ESMTPSA id i7sm11397448pfo.19.2019.05.19.13.38.19 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 19 May 2019 13:38:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=MZ4xTXHoRnqxjbKzyUEkFjQQbSbYuTgwnyU38LEY1MU=; b=jzueuHJih53MA65QrNMqcmuShPK8bfIscnDjn98SrMNKFRBaG66E6Wv8nseh/UiCH0 Rc4r985n1zXgVQN7RER0C+GI6nU74Ol7UFOXvqkGkEHXx8aylIljtPGYt1ecc2HgAV6I XnBHTnln+h9kPUsQbPtwxI3KknAAIF141R0mizaBlCwRSqQOqTjn/TZlhspqEQ+G7qCP p1LfBJfNIf67dk0kNz84mwpWUSxW4+CEK/6BugaRzBxozECjHDN6jRs3o7NBm1LoHfCK EsZp6KkusZBriWnFYo5vV8HR+H5+AMkGDT1BRSsPzVAdcaUytGM+jKKpY1lCrw11Btbq bfdw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=MZ4xTXHoRnqxjbKzyUEkFjQQbSbYuTgwnyU38LEY1MU=; b=i6PYpOI5AFVYm5BT7yTmr6V92O3uLhVyw8ufyDK4RwJipEjEFtc20eOOkP62PIRXYL 3rjy7QHKfSNhxqkBkYbrZ093qixasP3vyID2cuEWvoPIOOyLpFOTf7vL3lELeCXYxo/f hbHQ+xW9xj9TQqeu57cCwtur7Ne+jh0+vATjL7/ihGlsZbXMsMW4M1UW1LIEtUgsGY/9 6zMV1bFtnnje02xKk5RqRXVeqnEDA/Hm/VMak7JlGTuAqVpizyPlmoZO1k0Xw9zyjvAB Hmgy+PchgkS5nS+5fTDK2wKH7naVgRQM6rr1BVxTIvqwhq8l6ShA3OwDqNA9IMbfVyY0 iWuA== X-Gm-Message-State: APjAAAUZ1w3vNB5y4vTWvzUbm7uM+gZLI2Vq/wJ+mT8cR37l3W9eTIBF S+jTqTHXNK4nrHn08VmWDQ8mTkE+deM= X-Google-Smtp-Source: APXvYqw8zkeTTVsa6JRfBrdWR6x5trbPLxBaxOV/a3jRn652ikneWC6CBBNPz8HjdNxICRPdGEw5hw== X-Received: by 2002:a17:902:201:: with SMTP id 1mr26872192plc.263.1558298300365; Sun, 19 May 2019 13:38:20 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sun, 19 May 2019 13:36:52 -0700 Message-Id: <20190519203726.20729-41-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190519203726.20729-1-richard.henderson@linaro.org> References: <20190519203726.20729-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::642 Subject: [Qemu-devel] [PATCH v7 40/74] linux-user: Split out rename, renameat, renameat2 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: laurent@vivier.eu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Note that renameat2 is universally available for guests. Merge sys_renameat2 into the new do_renameat2 helper. Signed-off-by: Richard Henderson --- linux-user/syscall-defs.h | 8 +++++ linux-user/syscall.h | 1 + linux-user/strace.c | 39 ++++++--------------- linux-user/syscall-file.inc.c | 45 ++++++++++++++++++++++++ linux-user/syscall.c | 64 ----------------------------------- linux-user/strace.list | 9 ----- 6 files changed, 65 insertions(+), 101 deletions(-) diff --git a/linux-user/syscall-defs.h b/linux-user/syscall-defs.h index c672b5ad99..0ed01aa100 100644 --- a/linux-user/syscall-defs.h +++ b/linux-user/syscall-defs.h @@ -142,6 +142,14 @@ SYSCALL_DEF(readlink, ARG_STR, ARG_PTR, ARG_DEC); #ifdef TARGET_NR_readlinkat SYSCALL_DEF(readlinkat, ARG_ATDIRFD, ARG_STR, ARG_PTR, ARG_DEC); #endif +#ifdef TARGET_NR_rename +SYSCALL_DEF(rename, ARG_STR, ARG_STR); +#endif +#ifdef TARGET_NR_renameat +SYSCALL_DEF(renameat, ARG_ATDIRFD, ARG_STR, ARG_ATDIRFD, ARG_STR); +#endif +SYSCALL_DEF(renameat2, ARG_ATDIRFD, ARG_STR, + ARG_ATDIRFD, ARG_STR, ARG_RENAMEFLAG); SYSCALL_DEF(readv, ARG_DEC, ARG_PTR, ARG_DEC); #ifdef TARGET_NR_rmdir SYSCALL_DEF(rmdir, ARG_STR); diff --git a/linux-user/syscall.h b/linux-user/syscall.h index 642fb6dccb..7b197840f5 100644 --- a/linux-user/syscall.h +++ b/linux-user/syscall.h @@ -69,6 +69,7 @@ typedef enum { ARG_MODEFLAG, ARG_MOUNTFLAG, ARG_OPENFLAG, + ARG_RENAMEFLAG, ARG_UMOUNTFLAG, ARG_UNLINKATFLAG, =20 diff --git a/linux-user/strace.c b/linux-user/strace.c index 01a5c210fa..8f871b30ae 100644 --- a/linux-user/strace.c +++ b/linux-user/strace.c @@ -4,6 +4,7 @@ #include #include #include +#include #include #include "qemu.h" #include "syscall.h" @@ -741,6 +742,13 @@ static struct flags const mount_flags[] =3D { FLAG_END, }; =20 +static struct flags const renameat2_flags[] =3D { + FLAG_GENERIC(RENAME_EXCHANGE), + FLAG_GENERIC(RENAME_NOREPLACE), + FLAG_GENERIC(RENAME_WHITEOUT), + FLAG_END, +}; + static struct flags const umount2_flags[] =3D { #ifdef MNT_FORCE FLAG_GENERIC(MNT_FORCE), @@ -1899,34 +1907,6 @@ print_fstatat64(const struct syscallname *name, #define print_newfstatat print_fstatat64 #endif =20 -#ifdef TARGET_NR_rename -static void -print_rename(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - print_syscall_prologue(name); - print_string(arg0, 0); - print_string(arg1, 1); - print_syscall_epilogue(name); -} -#endif - -#ifdef TARGET_NR_renameat -static void -print_renameat(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - print_syscall_prologue(name); - print_at_dirfd(arg0, 0); - print_string(arg1, 0); - print_at_dirfd(arg2, 0); - print_string(arg3, 1); - print_syscall_epilogue(name); -} -#endif - #ifdef TARGET_NR_statfs static void print_statfs(const struct syscallname *name, @@ -2212,6 +2192,9 @@ static void print_syscall_def1(const SyscallDef *def,= int64_t args[6]) case ARG_OPENFLAG: len =3D add_open_flags(b, rest, arg); break; + case ARG_RENAMEFLAG: + len =3D add_flags(b, rest, renameat2_flags, arg, false); + break; case ARG_UMOUNTFLAG: len =3D add_flags(b, rest, umount2_flags, arg, false); break; diff --git a/linux-user/syscall-file.inc.c b/linux-user/syscall-file.inc.c index 9f3cf7221a..18553f055e 100644 --- a/linux-user/syscall-file.inc.c +++ b/linux-user/syscall-file.inc.c @@ -873,6 +873,51 @@ SYSCALL_IMPL(readlinkat) } #endif =20 +static abi_long do_renameat2(int oldfd, abi_ulong target_oldpath, + int newfd, abi_ulong target_newpath, + unsigned int flags) +{ + char *p_old =3D lock_user_string(target_oldpath); + char *p_new =3D lock_user_string(target_newpath); + abi_long ret =3D -TARGET_EFAULT; + + if (p_old && p_new) { + if (flags =3D=3D 0) { + ret =3D renameat(oldfd, p_old, newfd, p_new); + } else { +#ifdef __NR_renameat2 + ret =3D syscall(__NR_renameat2, oldfd, p_old, newfd, p_new, fl= ags); +#else + errno =3D ENOSYS; + ret =3D -1; +#endif + } + ret =3D get_errno(ret); + } + unlock_user(p_old, target_oldpath, 0); + unlock_user(p_new, target_newpath, 0); + return ret; +} + +#ifdef TARGET_NR_rename +SYSCALL_IMPL(rename) +{ + return do_renameat2(AT_FDCWD, arg1, AT_FDCWD, arg2, 0); +} +#endif + +#ifdef TARGET_NR_renameat +SYSCALL_IMPL(renameat) +{ + return do_renameat2(arg1, arg2, arg3, arg4, 0); +} +#endif + +SYSCALL_IMPL(renameat2) +{ + return do_renameat2(arg1, arg2, arg3, arg4, arg5); +} + SYSCALL_IMPL(sync) { sync(); diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 3fe770890c..d8f6da63cc 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -331,24 +331,6 @@ static int sys_utimensat(int dirfd, const char *pathna= me, #endif #endif /* TARGET_NR_utimensat */ =20 -#ifdef TARGET_NR_renameat2 -#if defined(__NR_renameat2) -#define __NR_sys_renameat2 __NR_renameat2 -_syscall5(int, sys_renameat2, int, oldfd, const char *, old, int, newfd, - const char *, new, unsigned int, flags) -#else -static int sys_renameat2(int oldfd, const char *old, - int newfd, const char *new, int flags) -{ - if (flags =3D=3D 0) { - return renameat(oldfd, old, newfd, new); - } - errno =3D ENOSYS; - return -1; -} -#endif -#endif /* TARGET_NR_renameat2 */ - #ifdef CONFIG_INOTIFY #include =20 @@ -5391,52 +5373,6 @@ static abi_long do_syscall1(void *cpu_env, int num, = abi_long arg1, void *p; =20 switch(num) { -#ifdef TARGET_NR_rename - case TARGET_NR_rename: - { - void *p2; - p =3D lock_user_string(arg1); - p2 =3D lock_user_string(arg2); - if (!p || !p2) - ret =3D -TARGET_EFAULT; - else - ret =3D get_errno(rename(p, p2)); - unlock_user(p2, arg2, 0); - unlock_user(p, arg1, 0); - } - return ret; -#endif -#if defined(TARGET_NR_renameat) - case TARGET_NR_renameat: - { - void *p2; - p =3D lock_user_string(arg2); - p2 =3D lock_user_string(arg4); - if (!p || !p2) - ret =3D -TARGET_EFAULT; - else - ret =3D get_errno(renameat(arg1, p, arg3, p2)); - unlock_user(p2, arg4, 0); - unlock_user(p, arg2, 0); - } - return ret; -#endif -#if defined(TARGET_NR_renameat2) - case TARGET_NR_renameat2: - { - void *p2; - p =3D lock_user_string(arg2); - p2 =3D lock_user_string(arg4); - if (!p || !p2) { - ret =3D -TARGET_EFAULT; - } else { - ret =3D get_errno(sys_renameat2(arg1, p, arg3, p2, arg5)); - } - unlock_user(p2, arg4, 0); - unlock_user(p, arg2, 0); - } - return ret; -#endif #ifdef TARGET_NR_mkdir case TARGET_NR_mkdir: if (!(p =3D lock_user_string(arg1))) diff --git a/linux-user/strace.list b/linux-user/strace.list index 07e5f7c518..3b002a0500 100644 --- a/linux-user/strace.list +++ b/linux-user/strace.list @@ -944,15 +944,6 @@ #ifdef TARGET_NR_removexattr { TARGET_NR_removexattr, "removexattr" , NULL, NULL, NULL }, #endif -#ifdef TARGET_NR_rename -{ TARGET_NR_rename, "rename" , NULL, print_rename, NULL }, -#endif -#ifdef TARGET_NR_renameat -{ TARGET_NR_renameat, "renameat" , NULL, print_renameat, NULL }, -#endif -#ifdef TARGET_NR_renameat2 -{ TARGET_NR_renameat2, "renameat2" , NULL, NULL, NULL }, -#endif #ifdef TARGET_NR_request_key { TARGET_NR_request_key, "request_key" , NULL, NULL, NULL }, #endif --=20 2.17.1 From nobody Thu May 9 22:44:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1558300226; cv=none; d=zoho.com; s=zohoarc; b=JzsmIgg3YS5GqgHehihDnuNrQjx9d9Pj+IQ7Af5CahEBkg5DUOSgbkugtHdaopeBnPAMn7XcNt+hPj4VGHjT6BWDylGdlNZX+aH1S2dwCHskHDg4QzZF/RH9E9SF1OQo3Isc7lOYye6HiIsbr/2Ifimi5qoQCNj8B8ByJ4aGJEc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1558300226; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=sj59YrDaOii9L6seogQrj9UiCSK4yTlGx0hQSWmkpdA=; b=L3QI8w2wmrqkkQG+JwOT/NmZupH8N9uT+94SH6LX8I/6G22ZXmu6eBUuSBTzagkzJY7zfeKTjjhTNHr453ez2u6opQNs6pY2Tx4OK3mg8xp49ik64jBLNHZTW/AjaQwj7Dt21hvJYHQvtjQRvDgiRrCZuGRajgdtopafqDXXK3I= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (209.51.188.17 [209.51.188.17]) by mx.zohomail.com with SMTPS id 155830022694391.36706827871512; Sun, 19 May 2019 14:10:26 -0700 (PDT) Received: from localhost ([127.0.0.1]:53558 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hST4B-00051N-Ig for importer@patchew.org; Sun, 19 May 2019 17:09:59 -0400 Received: from eggs.gnu.org ([209.51.188.92]:50729) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSZe-0003ei-Tf for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:29 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hSSZd-0004Pq-Hs for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:26 -0400 Received: from mail-pg1-x542.google.com ([2607:f8b0:4864:20::542]:46948) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hSSZd-0004ML-8j for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:25 -0400 Received: by mail-pg1-x542.google.com with SMTP id t187so5715973pgb.13 for ; Sun, 19 May 2019 13:38:22 -0700 (PDT) Received: from localhost.localdomain (97-113-13-231.tukw.qwest.net. [97.113.13.231]) by smtp.gmail.com with ESMTPSA id i7sm11397448pfo.19.2019.05.19.13.38.20 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 19 May 2019 13:38:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=sj59YrDaOii9L6seogQrj9UiCSK4yTlGx0hQSWmkpdA=; b=Rd5loNaceU2JTZWTz70p9BYyr9D2BAwEvrsapMfTqsgfsZKpr5wxUiiXPuVDNBb6/e pB7CEE8j/eg6Bhun1IbPfPP3mh2Hmbp3VVy144bY4T9ewk0czfDhbi65i5soJ0JAslvM trLfSE7+adcc2u9WGpJHJEJ7uLVMbi0RJDgAWTd3XSUGsNnM5gAoJrFRHusnx2laWzQq sbV1S1Ry5ntpOm7MMxSOKHacVR9FO44AC9XGabpeWw3kMwReunuvqk1+kWWGGARrTIQr zITZ/W/b/iK8dtWWI/FYxPLukLOX8DzejL+1fsE8v01sYRQ68dolq+uCrQ6unzcnlfdE Q+FQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=sj59YrDaOii9L6seogQrj9UiCSK4yTlGx0hQSWmkpdA=; b=ImbxxclGwugF19YrC3g1qXNcojN8cDKoigZ0ufBBnH+HXpheSzQ8OemNq1AolqgVdO /MWc1CZJIkwxIq53oMLk18GBni6cSJOR/3FbVon3G4IgpgVHN28VSJ2VJ2Kw1WftQIRn vZvQjXyKC+AX8pG5TZxr/RRZhtRoRmjeO6Ld0iOx99VS+fXLYOMznb+GZi9DygrwAVtx G2Pbjyc3SiDt++3owBE2vsDrC3RcG7QwWqypkWXSoq5RIrIzhJD42IJ35YsSaMQ6RZ56 k7HCIV3mbhaqPBtWHVBrHor1oLojYgvJmSLieSqw6RVQC/D9MHXccIfZOPSMecaBB45/ trNg== X-Gm-Message-State: APjAAAUvnwUMfCxvYlndl9FvzL7N3nIDCLXA5hXNxztTUM6FoErTEte6 +Lg5kCnyQKEr7BnNNs7wyHe+s4WvGMI= X-Google-Smtp-Source: APXvYqyJxiLNZOTlkzk7WJxJWWd/izu17CGtGMlejQxISH+kAys7abAcxOi44tj1JuzMoCp3+cUKqw== X-Received: by 2002:a63:fb02:: with SMTP id o2mr70159867pgh.357.1558298301857; Sun, 19 May 2019 13:38:21 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sun, 19 May 2019 13:36:53 -0700 Message-Id: <20190519203726.20729-42-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190519203726.20729-1-richard.henderson@linaro.org> References: <20190519203726.20729-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::542 Subject: [Qemu-devel] [PATCH v7 41/74] linux-user: Split out mkdir, mkdirat X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: laurent@vivier.eu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Note that mkdirat is universally available. Signed-off-by: Richard Henderson --- linux-user/syscall-defs.h | 4 ++++ linux-user/strace.c | 27 --------------------------- linux-user/syscall-file.inc.c | 25 +++++++++++++++++++++++++ linux-user/syscall.c | 16 ---------------- linux-user/strace.list | 6 ------ 5 files changed, 29 insertions(+), 49 deletions(-) diff --git a/linux-user/syscall-defs.h b/linux-user/syscall-defs.h index 0ed01aa100..8b6d8f75ff 100644 --- a/linux-user/syscall-defs.h +++ b/linux-user/syscall-defs.h @@ -69,6 +69,10 @@ SYSCALL_DEF(lseek, ARG_DEC, ARG_DEC, ARG_LSEEKWHENCE); #ifdef TARGET_NR_llseek SYSCALL_DEF_ARGS(llseek, ARG_DEC, ARG_DEC, ARG_PTR, ARG_LSEEKWHENCE); #endif +#ifdef TARGET_NR_mkdir +SYSCALL_DEF(mkdir, ARG_STR, ARG_MODEFLAG); +#endif +SYSCALL_DEF(mkdirat, ARG_ATDIRFD, ARG_STR, ARG_MODEFLAG); #ifdef TARGET_NR_mknod SYSCALL_DEF(mknod, ARG_STR, ARG_MODEFLAG, ARG_HEX); #endif diff --git a/linux-user/strace.c b/linux-user/strace.c index 8f871b30ae..2b31998dbd 100644 --- a/linux-user/strace.c +++ b/linux-user/strace.c @@ -1676,33 +1676,6 @@ print_fstat(const struct syscallname *name, #define print_fstat64 print_fstat #endif =20 -#ifdef TARGET_NR_mkdir -static void -print_mkdir(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - print_syscall_prologue(name); - print_string(arg0, 0); - print_file_mode(arg1, 1); - print_syscall_epilogue(name); -} -#endif - -#ifdef TARGET_NR_mkdirat -static void -print_mkdirat(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - print_syscall_prologue(name); - print_at_dirfd(arg0, 0); - print_string(arg1, 0); - print_file_mode(arg2, 1); - print_syscall_epilogue(name); -} -#endif - #ifdef TARGET_NR_rt_sigaction static void print_rt_sigaction(const struct syscallname *name, diff --git a/linux-user/syscall-file.inc.c b/linux-user/syscall-file.inc.c index 18553f055e..5ed8b78c79 100644 --- a/linux-user/syscall-file.inc.c +++ b/linux-user/syscall-file.inc.c @@ -205,6 +205,31 @@ SYSCALL_IMPL(llseek) } #endif =20 +static abi_long do_mkdirat(int dirfd, abi_ulong target_path, mode_t mode) +{ + char *p =3D lock_user_string(target_path); + abi_long ret; + + if (!p) { + return -TARGET_EFAULT; + } + ret =3D get_errno(mkdirat(dirfd, p, mode)); + unlock_user(p, target_path, 0); + return ret; +} + +#ifdef TARGET_NR_mkdir +SYSCALL_IMPL(mkdir) +{ + return do_mkdirat(AT_FDCWD, arg1, arg2); +} +#endif + +SYSCALL_IMPL(mkdirat) +{ + return do_mkdirat(arg1, arg2, arg3); +} + static abi_long do_mknodat(int dirfd, abi_ulong target_path, mode_t mode, dev_t dev) { diff --git a/linux-user/syscall.c b/linux-user/syscall.c index d8f6da63cc..0d6a9b7a6c 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -5373,22 +5373,6 @@ static abi_long do_syscall1(void *cpu_env, int num, = abi_long arg1, void *p; =20 switch(num) { -#ifdef TARGET_NR_mkdir - case TARGET_NR_mkdir: - if (!(p =3D lock_user_string(arg1))) - return -TARGET_EFAULT; - ret =3D get_errno(mkdir(p, arg2)); - unlock_user(p, arg1, 0); - return ret; -#endif -#if defined(TARGET_NR_mkdirat) - case TARGET_NR_mkdirat: - if (!(p =3D lock_user_string(arg2))) - return -TARGET_EFAULT; - ret =3D get_errno(mkdirat(arg1, p, arg3)); - unlock_user(p, arg2, 0); - return ret; -#endif case TARGET_NR_dup: ret =3D get_errno(dup(arg1)); if (ret >=3D 0) { diff --git a/linux-user/strace.list b/linux-user/strace.list index 3b002a0500..cdbc59bffd 100644 --- a/linux-user/strace.list +++ b/linux-user/strace.list @@ -473,12 +473,6 @@ #ifdef TARGET_NR_mincore { TARGET_NR_mincore, "mincore" , NULL, NULL, NULL }, #endif -#ifdef TARGET_NR_mkdir -{ TARGET_NR_mkdir, "mkdir" , NULL, print_mkdir, NULL }, -#endif -#ifdef TARGET_NR_mkdirat -{ TARGET_NR_mkdirat, "mkdirat" , NULL, print_mkdirat, NULL }, -#endif #ifdef TARGET_NR_modify_ldt { TARGET_NR_modify_ldt, "modify_ldt" , NULL, NULL, NULL }, #endif --=20 2.17.1 From nobody Thu May 9 22:44:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1558300710; cv=none; d=zoho.com; s=zohoarc; b=dJnf0wfvMuiqhOkYhbZzqFOemrJvMavpC8LNURFQtF1zUSNtnhVrbzT0MRrGGO0agOUwtI6P6WcLixdnI2nNfLSUuMzKkpBneFH0BbB0ywdqDfN/1ObYerKcFP9qL05SyRIeg3uDw93IpBShERhj7fZwHWy/kloFbagQfZGC7Cg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1558300710; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=tO0MYq1BfTpb+Rq4mEcLzQaoCNhvveoe+wDeU1tkEl4=; b=fpjOlH5yFzDCRQYJq3bL1ALn+2+yl5/+BBsBewqAlpX37BMhDKhN0Hk0ouIIyN0q+RBEZEonFPROQ2Knx9cxFk+3EeIrPl8TiYdHUwIuvjpswprtrJiFL5A1KbUgdkLfspI5hdCwTPIFH9hqTzBaGxW3S4YO1HKq97D6Xk+e2Qc= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1558300710387524.1927067113169; Sun, 19 May 2019 14:18:30 -0700 (PDT) Received: from localhost ([127.0.0.1]:53698 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSTCD-0004AT-43 for importer@patchew.org; Sun, 19 May 2019 17:18:17 -0400 Received: from eggs.gnu.org ([209.51.188.92]:50744) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSZf-0003et-AW for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:29 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hSSZd-0004QM-OO for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:27 -0400 Received: from mail-pf1-x441.google.com ([2607:f8b0:4864:20::441]:34263) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hSSZd-0004NW-Fj for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:25 -0400 Received: by mail-pf1-x441.google.com with SMTP id n19so6182901pfa.1 for ; Sun, 19 May 2019 13:38:24 -0700 (PDT) Received: from localhost.localdomain (97-113-13-231.tukw.qwest.net. [97.113.13.231]) by smtp.gmail.com with ESMTPSA id i7sm11397448pfo.19.2019.05.19.13.38.21 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 19 May 2019 13:38:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=tO0MYq1BfTpb+Rq4mEcLzQaoCNhvveoe+wDeU1tkEl4=; b=JchIpMmGQzlbAZh0Xr/Y31cWysRgPDnxvatEZVGc5KkGSEl2yUXMqvnEs+txrnxyC+ KdzXK7cQVKuDZlXiLAOET5jWNVefAscgas8GkF3SP98bTlJlHJkbW8jUo3VaZdlE+SML E9FIS1LLNZiA3vQIF8fgyLbkV+7TA5ahQj7mshVzGARXKUbu3RR7YwHlMkJdhSXXvJ9L MccM4nuagbwuR3YzpzvYXhZiqTliEIQ6E+sqwEZT2JnKrPGrRn9Xgz0yfHyDNvbFJu4A 4/Nl72R2oeUROVd81jfY+/73eYzYdN4tXSs23Lw+BxFayExackAZTKl+OoGyWOVDox// 7tOA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=tO0MYq1BfTpb+Rq4mEcLzQaoCNhvveoe+wDeU1tkEl4=; b=QYvrQfURLoO/nM9+W9L0yGVBl9VtTxGFplBQwstuJMbG/vi7RXWNjpTWl9C4NGQk9z NWPPDAX2RPa1sN7+MxplUXJSGdT/vT1klibujI3y5cDjASIGeVJnNJmE9qNjKYqVuGqx jt+RYt6DteFfV4LS+UApfsKIkmRFDtwoPkk9LNGy5W0pkVdAT9mfGdiT9hyjBXplbuxR hoY3dPsFMmZUhkGMZhGZc4lJ6BnkGEw4Dr0/KLn3yYoEAgSQh33XJi3eYxZN2m4TNb2h MvjBWJp8/6RlMrO+D+D5OZvS6YbVzfwmxVHeM2q3x7zfDJxKD86+f99Khkrl+sLdNehB JEbw== X-Gm-Message-State: APjAAAWKzRuKxRpz8Z/yCXy3p62U3PqC9usSXHZV4sokW8m0R59/tvK5 e8/BlbihOL3RqbmuzV9yWR+Uun7XivQ= X-Google-Smtp-Source: APXvYqyoELX56gHUfCD3HGgaen/oc0rBemdA25wNQp66cpePhFnuStg+y/GZS9tbG/A8WZU0l6YznQ== X-Received: by 2002:a65:5c89:: with SMTP id a9mr71874534pgt.334.1558298303006; Sun, 19 May 2019 13:38:23 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sun, 19 May 2019 13:36:54 -0700 Message-Id: <20190519203726.20729-43-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190519203726.20729-1-richard.henderson@linaro.org> References: <20190519203726.20729-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::441 Subject: [Qemu-devel] [PATCH v7 42/74] linux-user: Split out dup, dup2, dup3 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: laurent@vivier.eu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Note that dup3 is universally available for guests. Implement host support with syscall when !CONFIG_DUP3. Signed-off-by: Richard Henderson --- linux-user/syscall-defs.h | 5 +++++ linux-user/syscall-file.inc.c | 42 +++++++++++++++++++++++++++++++++++ linux-user/syscall.c | 33 +++------------------------ linux-user/strace.list | 6 ----- 4 files changed, 50 insertions(+), 36 deletions(-) diff --git a/linux-user/syscall-defs.h b/linux-user/syscall-defs.h index 8b6d8f75ff..062adddd75 100644 --- a/linux-user/syscall-defs.h +++ b/linux-user/syscall-defs.h @@ -34,6 +34,11 @@ SYSCALL_DEF(close, ARG_DEC); #ifdef TARGET_NR_creat SYSCALL_DEF(creat, ARG_STR, ARG_MODEFLAG); #endif +SYSCALL_DEF(dup, ARG_DEC); +#ifdef TARGET_NR_dup2 +SYSCALL_DEF(dup2, ARG_DEC, ARG_DEC); +#endif +SYSCALL_DEF(dup3, ARG_DEC, ARG_DEC, ARG_OPENFLAG); SYSCALL_DEF(exit, ARG_DEC); SYSCALL_DEF(execve, ARG_STR, ARG_PTR, ARG_PTR); SYSCALL_DEF(execveat, ARG_ATDIRFD, ARG_STR, ARG_PTR, ARG_PTR, ARG_ATFLAG); diff --git a/linux-user/syscall-file.inc.c b/linux-user/syscall-file.inc.c index 5ed8b78c79..7d97dd1ec1 100644 --- a/linux-user/syscall-file.inc.c +++ b/linux-user/syscall-file.inc.c @@ -94,6 +94,48 @@ SYSCALL_IMPL(creat) } #endif =20 +SYSCALL_IMPL(dup) +{ + abi_long ret =3D get_errno(dup(arg1)); + if (ret >=3D 0) { + fd_trans_dup(arg1, ret); + } + return ret; +} + +#ifdef TARGET_NR_dup2 +SYSCALL_IMPL(dup2) +{ + abi_long ret =3D get_errno(dup2(arg1, arg2)); + if (ret >=3D 0) { + fd_trans_dup(arg1, arg2); + } + return ret; +} +#endif + +SYSCALL_IMPL(dup3) +{ + int ofd =3D arg1; + int nfd =3D arg2; + int host_flags =3D target_to_host_bitmask(arg3, fcntl_flags_tbl); + abi_long ret; + +#ifdef CONFIG_DUP3 + ret =3D dup3(ofd, nfd, host_flags); +#else + if (host_flags =3D=3D 0) { + if (ofd =3D=3D nfd) { + return -TARGET_EINVAL; + } + ret =3D dup2(ofd, nfd); + } else { + ret =3D syscall(__NR_dup3, ofd, nfd, host_flags); + } +#endif + return get_errno(ret); +} + SYSCALL_IMPL(faccessat) { return do_faccessat(arg1, arg2, arg3); diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 0d6a9b7a6c..bab9a57ee0 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -204,6 +204,9 @@ _syscall0(int, sys_gettid) * Performing a bogus syscall is easier than boilerplating * the replacement functions here in C. */ +#ifndef __NR_dup3 +#define __NR_dup3 -1 +#endif #ifndef __NR_syncfs #define __NR_syncfs -1 #endif @@ -5373,12 +5376,6 @@ static abi_long do_syscall1(void *cpu_env, int num, = abi_long arg1, void *p; =20 switch(num) { - case TARGET_NR_dup: - ret =3D get_errno(dup(arg1)); - if (ret >=3D 0) { - fd_trans_dup(arg1, ret); - } - return ret; #ifdef TARGET_NR_pipe case TARGET_NR_pipe: return do_pipe(cpu_env, arg1, 0, 0); @@ -5433,30 +5430,6 @@ static abi_long do_syscall1(void *cpu_env, int num, = abi_long arg1, ret =3D get_errno(chroot(p)); unlock_user(p, arg1, 0); return ret; -#ifdef TARGET_NR_dup2 - case TARGET_NR_dup2: - ret =3D get_errno(dup2(arg1, arg2)); - if (ret >=3D 0) { - fd_trans_dup(arg1, arg2); - } - return ret; -#endif -#if defined(CONFIG_DUP3) && defined(TARGET_NR_dup3) - case TARGET_NR_dup3: - { - int host_flags; - - if ((arg3 & ~TARGET_O_CLOEXEC) !=3D 0) { - return -EINVAL; - } - host_flags =3D target_to_host_bitmask(arg3, fcntl_flags_tbl); - ret =3D get_errno(dup3(arg1, arg2, host_flags)); - if (ret >=3D 0) { - fd_trans_dup(arg1, arg2); - } - return ret; - } -#endif #ifdef TARGET_NR_getpgrp case TARGET_NR_getpgrp: return get_errno(getpgrp()); diff --git a/linux-user/strace.list b/linux-user/strace.list index cdbc59bffd..2f78f4685b 100644 --- a/linux-user/strace.list +++ b/linux-user/strace.list @@ -91,12 +91,6 @@ #ifdef TARGET_NR_dipc { TARGET_NR_dipc, "dipc" , NULL, NULL, NULL }, #endif -#ifdef TARGET_NR_dup -{ TARGET_NR_dup, "dup" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_dup2 -{ TARGET_NR_dup2, "dup2" , NULL, NULL, NULL }, -#endif #ifdef TARGET_NR_epoll_create { TARGET_NR_epoll_create, "epoll_create" , NULL, NULL, NULL }, #endif --=20 2.17.1 From nobody Thu May 9 22:44:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1558301082; cv=none; d=zoho.com; s=zohoarc; b=N2GnG8GmFBkn+WuXG4aiPlC69cjzZQO2562BFcI2TTxLwi5ox0thQd5MvzpCF9yNeQcDylrdehp76a8JNMXRrYZyIuY4vVQBPlOnFKEae+LvDFix4a0jwAxQLVxYp5YKeTXZ4ScVpGugl+RaByMb/33fI9p2sCKDcHBLtbXuWzo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1558301082; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=i/scOGMWF8bWzvx8tsNwoDLjnfeTL/fRVFk/GWGzfuQ=; b=bDGpJDbyA8gNE+76j3AFw4ap5DgW+RKOG7aaCyO4EsmhWwqlIjmQQyhUH7WTFQ+2ppHmy9oRcDladCek3UtL+KIwHttTr/kSVSgk8Q4VEXvQFNPuZY4JaGdiMqKLgm28t0yzolpdFTuEfd8d/9CnYadUUo0CaZj4YVOthMZd6io= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (209.51.188.17 [209.51.188.17]) by mx.zohomail.com with SMTPS id 15583010829671019.3870961203544; Sun, 19 May 2019 14:24:42 -0700 (PDT) Received: from localhost ([127.0.0.1]:53788 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSTIK-0001Ql-Qh for importer@patchew.org; Sun, 19 May 2019 17:24:36 -0400 Received: from eggs.gnu.org ([209.51.188.92]:50763) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSZg-0003fo-7C for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:30 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hSSZd-0004Qa-Ou for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:28 -0400 Received: from mail-pl1-x642.google.com ([2607:f8b0:4864:20::642]:44237) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hSSZd-0004Ot-Ha for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:25 -0400 Received: by mail-pl1-x642.google.com with SMTP id c5so5690839pll.11 for ; Sun, 19 May 2019 13:38:25 -0700 (PDT) Received: from localhost.localdomain (97-113-13-231.tukw.qwest.net. [97.113.13.231]) by smtp.gmail.com with ESMTPSA id i7sm11397448pfo.19.2019.05.19.13.38.23 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 19 May 2019 13:38:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=i/scOGMWF8bWzvx8tsNwoDLjnfeTL/fRVFk/GWGzfuQ=; b=pU3oRYKPv6Id6hInOj/s4iOl45/+lVmFh+PQartwsUjaWX2vuzFP34vb8/uBdLzgku 73Xbz8VsHqpXchVfaFQ87uX4l1p2DwgkHWKiE/IhVKNlMnj79l3/epXn0WqxBSPczVHx 2y3hynA6b0U5cv0B4J451Gf2/u4ynkQI4w5+yCm0uAIRK6JgWum8QnMbyhtJGh0w8/+h G0ZMAemoCJCZw2egRWO8jUWTnNIO5su9YcK+tFJUndAYRhUqqzne0il1Afh6UZOj9F0f DWXArxVIYKTaHDO6eeXCEkQlQ+12J2WgyGQwogWmOJBOVYHxbR91i/Mwh9afzGkfZODH G2cA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=i/scOGMWF8bWzvx8tsNwoDLjnfeTL/fRVFk/GWGzfuQ=; b=W8YB98bG2U6dE6uP1I5IBFGp1a8HguFboP0owmj4dcT2W371vqg8jXqx85PrRGWRAy 5B4AoS7FhtMwws4GnyvtqphF/Cy1NZZUDfxs8IaBUaPKI3qtCLV3Fb7qB+gNo5BDm1FL /cZzl6DZuXo2LHxMeUJ1B539RbKjJKCmb5NUKF2iL3DEziOhp6nmwMngjn4WzGz21FdE DYRhhOOpafzjcAkX4xrxBWQN0wnXZg8brf4iriI8U9/RfLRApxNPeKvHhGez7eUXWEBD I73U7Y9cl/74DfvSSyB1/MxGEU4+3EGlixD8vIsywuDkWG9uJE53NTKfq9VwxO5SR2Ue E8UQ== X-Gm-Message-State: APjAAAX640OGdpVf1L063KZp1bi1hUyb2KsHG9uxfhACPXUt7w9tpgNs l8i6gZrnnghog/3c0hcYafPVQaWkeGU= X-Google-Smtp-Source: APXvYqwlMLrSn2/ZVMkVhweUsbldcJJygP2XoefSAR+K/j1+LOLuCPNX9P24r5l13H+5cI9Yj6bPrA== X-Received: by 2002:a17:902:4203:: with SMTP id g3mr53196000pld.288.1558298304197; Sun, 19 May 2019 13:38:24 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sun, 19 May 2019 13:36:55 -0700 Message-Id: <20190519203726.20729-44-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190519203726.20729-1-richard.henderson@linaro.org> References: <20190519203726.20729-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::642 Subject: [Qemu-devel] [PATCH v7 43/74] linux-user: Split out pipe, pipe2 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: laurent@vivier.eu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Note that pipe2 is universally available for guests. Implement host support with syscall when !CONFIG_PIPE2. Signed-off-by: Richard Henderson --- linux-user/syscall-defs.h | 10 ++++++ linux-user/syscall-file.inc.c | 51 +++++++++++++++++++++++++++ linux-user/syscall.c | 65 +++++++---------------------------- linux-user/strace.list | 6 ---- 4 files changed, 74 insertions(+), 58 deletions(-) diff --git a/linux-user/syscall-defs.h b/linux-user/syscall-defs.h index 062adddd75..bd3301a72f 100644 --- a/linux-user/syscall-defs.h +++ b/linux-user/syscall-defs.h @@ -132,6 +132,16 @@ SYSCALL_DEF(open_by_handle_at, ARG_DEC, ARG_PTR, ARG_O= PENFLAG); #ifdef TARGET_NR_pause SYSCALL_DEF(pause); #endif +#ifdef TARGET_NR_pipe +# if defined(TARGET_ALPHA) || defined(TARGET_MIPS) || \ + defined(TARGET_SH4) || defined(TARGET_SPARC) +/* ??? We have no way for strace to display the second returned fd. */ +SYSCALL_DEF(pipe); +# else +SYSCALL_DEF(pipe, ARG_PTR); +# endif +#endif +SYSCALL_DEF(pipe2, ARG_PTR, ARG_OPENFLAG); SYSCALL_DEF_FULL(pread64, .impl =3D impl_pread64, .args =3D args_pread64_pwrite64, .arg_type =3D { ARG_DEC, ARG_PTR, ARG_DEC, ARG_DEC64 }); diff --git a/linux-user/syscall-file.inc.c b/linux-user/syscall-file.inc.c index 7d97dd1ec1..5bd9eaa002 100644 --- a/linux-user/syscall-file.inc.c +++ b/linux-user/syscall-file.inc.c @@ -726,6 +726,57 @@ SYSCALL_IMPL(open_by_handle_at) return ret; } =20 +static abi_long do_pipe(CPUArchState *cpu_env, abi_ulong target_fds, + int target_flags, bool is_pipe2) +{ + int host_flags =3D target_to_host_bitmask(target_flags, fcntl_flags_tb= l); + int host_fds[2]; + abi_long ret; + + ret =3D pipe2(host_fds, host_flags); + if (is_error(ret)) { + return get_errno(ret); + } + + /* + * Several targets have special calling conventions for the original + * pipe syscall, but didn't replicate this into the pipe2 syscall. + */ + if (!is_pipe2) { +#if defined(TARGET_ALPHA) + cpu_env->ir[IR_A4] =3D host_fds[1]; + return host_fds[0]; +#elif defined(TARGET_MIPS) + cpu_env->active_tc.gpr[3] =3D host_fds[1]; + return host_fds[0]; +#elif defined(TARGET_SH4) + cpu_env->gregs[1] =3D host_fds[1]; + return host_fds[0]; +#elif defined(TARGET_SPARC) + cpu_env->regwptr[1] =3D host_fds[1]; + return host_fds[0]; +#endif + } + + if (put_user_s32(host_fds[0], target_fds) + || put_user_s32(host_fds[1], target_fds + 4)) { + return -TARGET_EFAULT; + } + return 0; +} + +#ifdef TARGET_NR_pipe +SYSCALL_IMPL(pipe) +{ + return do_pipe(cpu_env, arg1, 0, false); +} +#endif + +SYSCALL_IMPL(pipe2) +{ + return do_pipe(cpu_env, arg1, arg2, true); +} + /* * Both pread64 and pwrite64 merge args into a 64-bit offset, * but the input registers and ordering are target specific. diff --git a/linux-user/syscall.c b/linux-user/syscall.c index bab9a57ee0..cda1f8a205 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -207,6 +207,9 @@ _syscall0(int, sys_gettid) #ifndef __NR_dup3 #define __NR_dup3 -1 #endif +#ifndef __NR_pipe2 +#define __NR_pipe2 -1 +#endif #ifndef __NR_syncfs #define __NR_syncfs -1 #endif @@ -273,6 +276,16 @@ _syscall5(int, kcmp, pid_t, pid1, pid_t, pid2, int, ty= pe, #ifndef CONFIG_SYNCFS _syscall1(int, syncfs, int, fd) #endif +#ifndef CONFIG_PIPE2 +static int pipe2(int *fds, int flags) +{ + if (flags) { + return syscall(__NR_pipe2, fds, flags); + } else { + return pipe(fds); + } +} +#endif =20 static bitmask_transtbl fcntl_flags_tbl[] =3D { { TARGET_O_ACCMODE, TARGET_O_WRONLY, O_ACCMODE, O_WRONLY, }, @@ -1124,49 +1137,6 @@ static abi_long do_old_select(abi_ulong arg1) #endif #endif =20 -static abi_long do_pipe2(int host_pipe[], int flags) -{ -#ifdef CONFIG_PIPE2 - return pipe2(host_pipe, flags); -#else - return -ENOSYS; -#endif -} - -static abi_long do_pipe(void *cpu_env, abi_ulong pipedes, - int flags, int is_pipe2) -{ - int host_pipe[2]; - abi_long ret; - ret =3D flags ? do_pipe2(host_pipe, flags) : pipe(host_pipe); - - if (is_error(ret)) - return get_errno(ret); - - /* Several targets have special calling conventions for the original - pipe syscall, but didn't replicate this into the pipe2 syscall. */ - if (!is_pipe2) { -#if defined(TARGET_ALPHA) - ((CPUAlphaState *)cpu_env)->ir[IR_A4] =3D host_pipe[1]; - return host_pipe[0]; -#elif defined(TARGET_MIPS) - ((CPUMIPSState*)cpu_env)->active_tc.gpr[3] =3D host_pipe[1]; - return host_pipe[0]; -#elif defined(TARGET_SH4) - ((CPUSH4State*)cpu_env)->gregs[1] =3D host_pipe[1]; - return host_pipe[0]; -#elif defined(TARGET_SPARC) - ((CPUSPARCState*)cpu_env)->regwptr[1] =3D host_pipe[1]; - return host_pipe[0]; -#endif - } - - if (put_user_s32(host_pipe[0], pipedes) - || put_user_s32(host_pipe[1], pipedes + sizeof(host_pipe[0]))) - return -TARGET_EFAULT; - return get_errno(ret); -} - static inline abi_long target_to_host_ip_mreq(struct ip_mreqn *mreqn, abi_ulong target_addr, socklen_t len) @@ -5376,15 +5346,6 @@ static abi_long do_syscall1(void *cpu_env, int num, = abi_long arg1, void *p; =20 switch(num) { -#ifdef TARGET_NR_pipe - case TARGET_NR_pipe: - return do_pipe(cpu_env, arg1, 0, 0); -#endif -#ifdef TARGET_NR_pipe2 - case TARGET_NR_pipe2: - return do_pipe(cpu_env, arg1, - target_to_host_bitmask(arg2, fcntl_flags_tbl), 1); -#endif case TARGET_NR_times: { struct target_tms *tmsp; diff --git a/linux-user/strace.list b/linux-user/strace.list index 2f78f4685b..a1c3dd98e0 100644 --- a/linux-user/strace.list +++ b/linux-user/strace.list @@ -860,9 +860,6 @@ #ifdef TARGET_NR_personality { TARGET_NR_personality, "personality" , NULL, NULL, NULL }, #endif -#ifdef TARGET_NR_pipe -{ TARGET_NR_pipe, "pipe" , NULL, NULL, NULL }, -#endif #ifdef TARGET_NR_pivot_root { TARGET_NR_pivot_root, "pivot_root" , NULL, NULL, NULL }, #endif @@ -1377,9 +1374,6 @@ #ifdef TARGET_NR_sync_file_range2 { TARGET_NR_sync_file_range2, "sync_file_range2", NULL, NULL, NULL }, #endif -#ifdef TARGET_NR_pipe2 -{ TARGET_NR_pipe2, "pipe2", NULL, NULL, NULL }, -#endif #ifdef TARGET_NR_atomic_cmpxchg_32 { TARGET_NR_atomic_cmpxchg_32, "atomic_cmpxchg_32", NULL, NULL, NULL }, #endif --=20 2.17.1 From nobody Thu May 9 22:44:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1558300081; cv=none; d=zoho.com; s=zohoarc; b=kjA4IqCQ82xgHE2WeNSs5u+p++kQGOifwZODXFvjKqsX9Avag1v+p2QVqOHncaxufGqFNUtp+2fHVWI6M6Z8QQczEJ6QvWbFnNhgfhuLhCFLPWPqsNvjyEc1jQHfbQOdBiOoTzp0XYX1il2iMn+HzNcujOsNgwFmjrPZJKevM08= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1558300081; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=hCKl3WsFFB8I9SyuErlgjzDySDbodc+1SphzTaA0mp0=; b=iJPg5WwGY5tTl68xPPIzgq9CLSNCsoWHN9lDQ5iBHyxwauIvWxK1TsTCTAlAueGWzodSHLpk1y7fLgTZ1DzVxpasIOGd5MqrTUzIErRCaitvf6yGw3jRlGxkUO2rUrqIPp7c6WeEwwT3tECTF80d6PwiIhKLCOT963ckjpK4D6s= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (209.51.188.17 [209.51.188.17]) by mx.zohomail.com with SMTPS id 1558300081034233.62252958828674; Sun, 19 May 2019 14:08:01 -0700 (PDT) Received: from localhost ([127.0.0.1]:53540 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hST2A-0003HP-Na for importer@patchew.org; Sun, 19 May 2019 17:07:54 -0400 Received: from eggs.gnu.org ([209.51.188.92]:50783) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSZg-0003gT-QI for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:30 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hSSZe-0004Sg-P8 for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:28 -0400 Received: from mail-pl1-x641.google.com ([2607:f8b0:4864:20::641]:41408) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hSSZe-0004R4-HU for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:26 -0400 Received: by mail-pl1-x641.google.com with SMTP id f12so5707249plt.8 for ; Sun, 19 May 2019 13:38:26 -0700 (PDT) Received: from localhost.localdomain (97-113-13-231.tukw.qwest.net. [97.113.13.231]) by smtp.gmail.com with ESMTPSA id i7sm11397448pfo.19.2019.05.19.13.38.24 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 19 May 2019 13:38:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=hCKl3WsFFB8I9SyuErlgjzDySDbodc+1SphzTaA0mp0=; b=IBCN5yrde7jbvLtsr8VkhNSO50Hr38sFL8xFDuu0FVnf2s6cIEXyIBnmK9UlbEud3L iUjQ/MuneVRfAdmbcV+9WDNHoDuZTH9QWqJYqPygkULjpzD2R9oSpnzFlJVgyYgD1/rh veE9EY5y/IopR81L8oPkbPRjK62wHs4fe1K0O0N8CgVZZHkYohMHm6nAPtdlPJE0EtA8 ZgTI4NzJ5jo5nAF2Xa6c5X4dXc9SXdIqPJM+9UOrKSyEADTXLS6hsdxT/LVr9wj+uifZ H4mqwUU3zme7MaRpHWEC+R/tu8FMfmxrKT+1xtkqO7L0vzlqEAejHPlrC97u7b1ErZow EiIQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=hCKl3WsFFB8I9SyuErlgjzDySDbodc+1SphzTaA0mp0=; b=BG0W6Ru4eLaU8o89lw4KryrvcejqfmrNjPhugdovEzz8v1SVCq40vldiE+ulWRCE1V lDtK6Z6bki6/YQWq9FX4uQtMrgw/3jhxso4uhUyxH7Fog1gxWfYq7OnP5BMVvZUF9saY quGgHzNJk0k3ySKybtsmLIoSJN0Yp9H6TDnWKMjdLO4VA0LAXiMfFVm0zj/Aa2bU8GCS jhgqPJ6YwerD66qrVHZUbqbVsUKBZwa9Nkyg1ZDUJfxiSbkJjSZ1v3junx+jnsW9HIec dUdPykjDWhiwJW9YZfwdhjF0ABxV03eoca4uqWXWqtb3SuhIGwQ36D6gcsagI77ktXPS QeNQ== X-Gm-Message-State: APjAAAV9PwbNWiSFKzFdB5/bt6HUH196KUKDDe8BoQfWkha1kES2Avj1 gHWa+jb6qPo278Oq6EReWjfD8aAlXoE= X-Google-Smtp-Source: APXvYqxWa7yZt46HyYmaxImDDO8wG2CYq5FLocecukC1T6SC0jg2SGJmJVTGFywFYU41qfOgcN5o4g== X-Received: by 2002:a17:902:6bc8:: with SMTP id m8mr70316262plt.227.1558298305264; Sun, 19 May 2019 13:38:25 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sun, 19 May 2019 13:36:56 -0700 Message-Id: <20190519203726.20729-45-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190519203726.20729-1-richard.henderson@linaro.org> References: <20190519203726.20729-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::641 Subject: [Qemu-devel] [PATCH v7 44/74] linux-user: Split out times X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: laurent@vivier.eu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Richard Henderson --- linux-user/syscall-defs.h | 1 + linux-user/syscall-proc.inc.c | 25 +++++++++++++++++++++++++ linux-user/syscall.c | 18 ------------------ linux-user/strace.list | 3 --- 4 files changed, 26 insertions(+), 21 deletions(-) diff --git a/linux-user/syscall-defs.h b/linux-user/syscall-defs.h index bd3301a72f..25d5aaccd1 100644 --- a/linux-user/syscall-defs.h +++ b/linux-user/syscall-defs.h @@ -204,6 +204,7 @@ SYSCALL_DEF(syncfs, ARG_DEC); #ifdef TARGET_NR_time SYSCALL_DEF(time, ARG_PTR); #endif +SYSCALL_DEF(times, ARG_PTR); #ifdef TARGET_NR_umount SYSCALL_DEF(umount, ARG_STR); #endif diff --git a/linux-user/syscall-proc.inc.c b/linux-user/syscall-proc.inc.c index e29c2ede25..517f84e139 100644 --- a/linux-user/syscall-proc.inc.c +++ b/linux-user/syscall-proc.inc.c @@ -468,6 +468,31 @@ SYSCALL_IMPL(nice) } #endif =20 +SYSCALL_IMPL(times) +{ + abi_ulong target_buf =3D arg1; + struct tms tms; + abi_long ret; + + ret =3D get_errno(times(&tms)); + if (target_buf) { + struct target_tms *tmsp =3D lock_user(VERIFY_WRITE, target_buf, + sizeof(struct target_tms), 0); + if (!tmsp) { + return -TARGET_EFAULT; + } + tmsp->tms_utime =3D tswapal(host_to_target_clock_t(tms.tms_utime)); + tmsp->tms_stime =3D tswapal(host_to_target_clock_t(tms.tms_stime)); + tmsp->tms_cutime =3D tswapal(host_to_target_clock_t(tms.tms_cutime= )); + tmsp->tms_cstime =3D tswapal(host_to_target_clock_t(tms.tms_cstime= )); + unlock_user(tmsp, target_buf, sizeof(struct target_tms)); + } + if (!is_error(ret)) { + ret =3D host_to_target_clock_t(ret); + } + return ret; +} + /* * Map host to target signal numbers for the wait family of syscalls. * Assume all other status bits are the same. diff --git a/linux-user/syscall.c b/linux-user/syscall.c index cda1f8a205..cdca0dbe4f 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -5346,24 +5346,6 @@ static abi_long do_syscall1(void *cpu_env, int num, = abi_long arg1, void *p; =20 switch(num) { - case TARGET_NR_times: - { - struct target_tms *tmsp; - struct tms tms; - ret =3D get_errno(times(&tms)); - if (arg1) { - tmsp =3D lock_user(VERIFY_WRITE, arg1, sizeof(struct targe= t_tms), 0); - if (!tmsp) - return -TARGET_EFAULT; - tmsp->tms_utime =3D tswapal(host_to_target_clock_t(tms.tms= _utime)); - tmsp->tms_stime =3D tswapal(host_to_target_clock_t(tms.tms= _stime)); - tmsp->tms_cutime =3D tswapal(host_to_target_clock_t(tms.tm= s_cutime)); - tmsp->tms_cstime =3D tswapal(host_to_target_clock_t(tms.tm= s_cstime)); - } - if (!is_error(ret)) - ret =3D host_to_target_clock_t(ret); - } - return ret; case TARGET_NR_acct: if (arg1 =3D=3D 0) { ret =3D get_errno(acct(NULL)); diff --git a/linux-user/strace.list b/linux-user/strace.list index a1c3dd98e0..85e3de87d8 100644 --- a/linux-user/strace.list +++ b/linux-user/strace.list @@ -1290,9 +1290,6 @@ #ifdef TARGET_NR_timerfd_settime { TARGET_NR_timerfd_settime, "timerfd_settime" , NULL, NULL, NULL }, #endif -#ifdef TARGET_NR_times -{ TARGET_NR_times, "times" , NULL, NULL, NULL }, -#endif #ifdef TARGET_NR_tkill { TARGET_NR_tkill, "tkill" , NULL, print_tkill, NULL }, #endif --=20 2.17.1 From nobody Thu May 9 22:44:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1558300366; cv=none; d=zoho.com; s=zohoarc; b=BFT0uhnfwbfbW9ML0cOAWMLxR3uyeybXDarr+2d5jzieQi0aZuS2ZMJ5p/diOmE4TAY9OlQL8GzUOhiijR4d/ZZEhkrxbJfCd4YXs6WSOW2FnrxpBG6c57Yi4mydeyVqn0UKNK921NGhXM4zOLdXFsEno2UxjI0foP+KJEdL0Ak= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1558300366; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=zxww4ylhQcPO6FqWBn/qpIs5WYaAwpNI1B5WcIoosKI=; b=Yug6104yYvpUWppP4jHj9NyxQhLGk/BV50mOGL+qmqloEsc6GNqJM94N2ZwN3FFSuTmb73a622Nk8YTvnjjy7zNVZO+OHZkJ+OgapJ6mwbr2BaPMV0dJ8xxmdXpKC2AxkFMSYeGPObSzjFKBIUc3fabKHNO51aoOb4x7Wvgdt+0= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (209.51.188.17 [209.51.188.17]) by mx.zohomail.com with SMTPS id 1558300366480366.296717223868; Sun, 19 May 2019 14:12:46 -0700 (PDT) Received: from localhost ([127.0.0.1]:53615 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hST6m-0007hy-9E for importer@patchew.org; Sun, 19 May 2019 17:12:40 -0400 Received: from eggs.gnu.org ([209.51.188.92]:50797) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSZh-0003hL-I5 for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:30 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hSSZg-0004Ve-7E for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:29 -0400 Received: from mail-pg1-x541.google.com ([2607:f8b0:4864:20::541]:37308) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hSSZf-0004Tp-U8 for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:28 -0400 Received: by mail-pg1-x541.google.com with SMTP id n27so3140019pgm.4 for ; Sun, 19 May 2019 13:38:27 -0700 (PDT) Received: from localhost.localdomain (97-113-13-231.tukw.qwest.net. [97.113.13.231]) by smtp.gmail.com with ESMTPSA id i7sm11397448pfo.19.2019.05.19.13.38.25 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 19 May 2019 13:38:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=zxww4ylhQcPO6FqWBn/qpIs5WYaAwpNI1B5WcIoosKI=; b=Tln0sEurgF+JnTziJnpUITbTY8QogpEjvYOfZlbhDzbziVqwoDEtegx/uwT8JmZPQx l14/qnDJ8G0SHw4O7VVXnyu1AHjaAiDq1Wprdh7oGUWZOn0noAitgN62lAlBl6wly1gd 5vAwwGtWjXJWPQ1U4T05RrzG4cXOcnvQE2KKGx7l7nRDGCI0ffATzqvMYnHuSYgYUl9n P6SpkjVT4toExsxO9boPA0wEP//7eAwaQ9VosA88ciaDiFdBplZhJ9TlsUgFpYaEA/Sm 64uARjnQtGPoLlQsqZACfoTwoaUVh6wthoxcLtWzx2PjK02ayN1YZwmD7WEMatwkUcLG TsIA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=zxww4ylhQcPO6FqWBn/qpIs5WYaAwpNI1B5WcIoosKI=; b=j1wjiWOEphBkKvTaDQeq4XY8Gi9aeftAKx8yQ12Mcq2vRxvli0lQToaAQaeob8IYhJ X0+uTm9KLpUU2utOPcbBvFzN7rmJARzCSlW6gI61bMnRmZeLYjih64wLFAfEggs4uUZ9 pqjegLeb3U/1oi0NQuRnhtTdKLrpyYunKgY0DMuo95Lh7jpM4/qstEXKH1Suu6KY6zoB w9vhZveJBHRarfSliCSxbDz1c63bBoHSuktXxSydyVzuJv1Ik/dKsmXnnsl/AJPtxsna MJ1szd/OLsqrQfSaLq/tNoDCtqlSX9g3Ap4QPO8Rc6wh9HT7Lv8bGXBSyuMdlz8WS29A 3NHw== X-Gm-Message-State: APjAAAUVjDaoC1DdMvnB/vAfZ77SyPXZgAdaGe9acaF+Z2VHVfURR7af hHepJFmgmQYwkqeKDhYQ/tvOYb3tdO0= X-Google-Smtp-Source: APXvYqyvQSsqWUi6GM80EAQOj3+4CpvJPIxalyJyMIXJvkway5/UTRzEQLox///Isn94y9X8fHI2+Q== X-Received: by 2002:a63:5726:: with SMTP id l38mr10616007pgb.344.1558298306631; Sun, 19 May 2019 13:38:26 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sun, 19 May 2019 13:36:57 -0700 Message-Id: <20190519203726.20729-46-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190519203726.20729-1-richard.henderson@linaro.org> References: <20190519203726.20729-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::541 Subject: [Qemu-devel] [PATCH v7 45/74] linux-user: Split out acct X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: laurent@vivier.eu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Richard Henderson --- linux-user/syscall-defs.h | 1 + linux-user/syscall-file.inc.c | 18 ++++++++++++++++++ linux-user/syscall.c | 11 ----------- linux-user/strace.list | 3 --- 4 files changed, 19 insertions(+), 14 deletions(-) diff --git a/linux-user/syscall-defs.h b/linux-user/syscall-defs.h index 25d5aaccd1..f8f280f376 100644 --- a/linux-user/syscall-defs.h +++ b/linux-user/syscall-defs.h @@ -19,6 +19,7 @@ #ifdef TARGET_NR_access SYSCALL_DEF(access, ARG_STR, ARG_ACCESSFLAG); #endif +SYSCALL_DEF(acct, ARG_STR); #ifdef TARGET_NR_alarm SYSCALL_DEF(alarm, ARG_DEC); #endif diff --git a/linux-user/syscall-file.inc.c b/linux-user/syscall-file.inc.c index 5bd9eaa002..4080ab250e 100644 --- a/linux-user/syscall-file.inc.c +++ b/linux-user/syscall-file.inc.c @@ -36,6 +36,24 @@ SYSCALL_IMPL(access) } #endif =20 +SYSCALL_IMPL(acct) +{ + abi_ulong target_path =3D arg1; + abi_long ret; + + if (target_path =3D=3D 0) { + ret =3D get_errno(acct(NULL)); + } else { + char *p =3D lock_user_string(target_path); + if (!p) { + return -TARGET_EFAULT; + } + ret =3D get_errno(acct(path(p))); + unlock_user(p, target_path, 0); + } + return ret; +} + SYSCALL_IMPL(chdir) { abi_ulong target_path =3D arg1; diff --git a/linux-user/syscall.c b/linux-user/syscall.c index cdca0dbe4f..5343486a58 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -5346,17 +5346,6 @@ static abi_long do_syscall1(void *cpu_env, int num, = abi_long arg1, void *p; =20 switch(num) { - case TARGET_NR_acct: - if (arg1 =3D=3D 0) { - ret =3D get_errno(acct(NULL)); - } else { - if (!(p =3D lock_user_string(arg1))) { - return -TARGET_EFAULT; - } - ret =3D get_errno(acct(path(p))); - unlock_user(p, arg1, 0); - } - return ret; case TARGET_NR_ioctl: return do_ioctl(arg1, arg2, arg3); #ifdef TARGET_NR_fcntl diff --git a/linux-user/strace.list b/linux-user/strace.list index 85e3de87d8..ce5e02975b 100644 --- a/linux-user/strace.list +++ b/linux-user/strace.list @@ -9,9 +9,6 @@ #ifdef TARGET_NR_accept4 { TARGET_NR_accept4, "accept4" , NULL, NULL, NULL }, #endif -#ifdef TARGET_NR_acct -{ TARGET_NR_acct, "acct" , NULL, NULL, NULL }, -#endif #ifdef TARGET_NR_add_key { TARGET_NR_add_key, "add_key" , NULL, NULL, NULL }, #endif --=20 2.17.1 From nobody Thu May 9 22:44:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1558300248; cv=none; d=zoho.com; s=zohoarc; b=NOjQMGJPep9d+OAFBfKYFBl9RIEhbBJW5VNr/HznPjMB2K99RlXBoeKLAgu4iMdIRlwQUxIx2z2nvwB3BrqTS0c/HfaTUd73H7/u+hhqV5+uDr9AgHsqRVx0WR+LuM70y7jxDjltkVIh8E2KhrN3ojoijQsT+BVUtX6DfBrnSJk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1558300248; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=AI0qmlYjgj5NtbNVWKgQPuyo9CkZotUm28Hs9oy8FWY=; b=DtLzUcwUNiCRtCuYMj/yFBwodpW0+FETJWmBaRsRhu+6/FCgMwnAR/mZxGlpOnSMlHpkNv0+hM61cxUD9vGQMHAYOzKDBz7t8UvAHdyIyytd/EdS0VO/hVAKXMmoN5Z6blOmxMXrH6ouW63jQKfG1qF5wtv/RlARRQPZ64RVe2A= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (209.51.188.17 [209.51.188.17]) by mx.zohomail.com with SMTPS id 1558300248330342.595824779267; Sun, 19 May 2019 14:10:48 -0700 (PDT) Received: from localhost ([127.0.0.1]:53581 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hST4p-0005ZH-4y for importer@patchew.org; Sun, 19 May 2019 17:10:39 -0400 Received: from eggs.gnu.org ([209.51.188.92]:50815) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSZi-0003ie-Qj for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:32 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hSSZh-0004X3-BL for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:30 -0400 Received: from mail-pg1-x542.google.com ([2607:f8b0:4864:20::542]:44713) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hSSZh-0004W5-1T for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:29 -0400 Received: by mail-pg1-x542.google.com with SMTP id z16so5724088pgv.11 for ; Sun, 19 May 2019 13:38:28 -0700 (PDT) Received: from localhost.localdomain (97-113-13-231.tukw.qwest.net. [97.113.13.231]) by smtp.gmail.com with ESMTPSA id i7sm11397448pfo.19.2019.05.19.13.38.26 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 19 May 2019 13:38:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=AI0qmlYjgj5NtbNVWKgQPuyo9CkZotUm28Hs9oy8FWY=; b=WDiAzAWBoYrx+T/f1r514LVxPvjELJd8UIHCR8Cr8GWYn5WVntha55DkeNUQE2z2we MUbkuYQJaFCBtmdTgMwFMXQ2X7B90J1yR5s6SH7Wi1RUTybLjBW8goKWVwx8bYaWYgue /GwLb2E3sSQaxM54uduTRpK2wCApQob7Bzz0+mZ7aLegGqB1TlZrif2klOcWj536pjxb b+D6ziPYs4LyMAdkfXVWP0/82RHPlVtj/fLTMHroupF0IE3Ee4jez40ZB7A0e2EsGN4R iQPYXqjqlvNjUcVV4iMz7yYqHtvjCBO9mmOj/024MkRRBcjR+gYroI/d0urevPElf53n LH9w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=AI0qmlYjgj5NtbNVWKgQPuyo9CkZotUm28Hs9oy8FWY=; b=D0YHcSGPTEDdcxVmrbhUlY3vjmj/oLB2ZtoNWE4iJdVtBjuAZU9ONv0Yyi93glDK/R Z/x6HJdhPo4Gf8UKQX4+nQf2wycJZrc+hyDiHVgE4O7MbxwG2TqAbb5d8vNVJxMEu0rr VjB6mF/y9Lsp8Vma2Z8ic3ZxuvYzg1Hrz2aNt9Ig48Hvx+cFhHT4aJHufaIE/WSPLVAB xDTpYkjyCVHUhdBBC54nYf1V9EDck05bg2HQxAjWvYUIH3WM0ge3pgmwol6irkZrsi7x kvKGXsmetBif8uP0hwVH3TxH7UHjD7Z7HbHA0wYjpWa+HXeFUB3aJUUiPksEZTjTAkPp GhSg== X-Gm-Message-State: APjAAAUVjXgH6Tkd+/kYVlnglU54KfpwoOfzZwwkghmG75tksGBogSqV RbAfDyXSpwLJfn12DCr4Hi1EUBBoDDI= X-Google-Smtp-Source: APXvYqyYvwesz+zi/r1Hku7Djj+p9gxszWayC2IFmPn32fI9Kr3eRrOgkNaGOxDNevmaaU8yBtqgHw== X-Received: by 2002:a63:4346:: with SMTP id q67mr71033800pga.241.1558298307785; Sun, 19 May 2019 13:38:27 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sun, 19 May 2019 13:36:58 -0700 Message-Id: <20190519203726.20729-47-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190519203726.20729-1-richard.henderson@linaro.org> References: <20190519203726.20729-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::542 Subject: [Qemu-devel] [PATCH v7 46/74] linux-user: Move syscall_init to the end X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: laurent@vivier.eu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" No functional change. This will aid moving everything related to ioctls to a separate file. Signed-off-by: Richard Henderson --- linux-user/syscall.c | 113 +++++++++++++++++++++++-------------------- 1 file changed, 61 insertions(+), 52 deletions(-) diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 5343486a58..d0e76c392e 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -4831,58 +4831,6 @@ _syscall1(int, sys_setgid, gid_t, gid) _syscall3(int, sys_setresuid, uid_t, ruid, uid_t, euid, uid_t, suid) _syscall3(int, sys_setresgid, gid_t, rgid, gid_t, egid, gid_t, sgid) =20 -void syscall_init(void) -{ - IOCTLEntry *ie; - const argtype *arg_type; - int size; - int i; - - thunk_init(STRUCT_MAX); - -#define STRUCT(name, ...) thunk_register_struct(STRUCT_ ## name, #name, st= ruct_ ## name ## _def); -#define STRUCT_SPECIAL(name) thunk_register_struct_direct(STRUCT_ ## name,= #name, &struct_ ## name ## _def); -#include "syscall_types.h" -#undef STRUCT -#undef STRUCT_SPECIAL - - /* Build target_to_host_errno_table[] table from - * host_to_target_errno_table[]. */ - for (i =3D 0; i < ERRNO_TABLE_SIZE; i++) { - target_to_host_errno_table[host_to_target_errno_table[i]] =3D i; - } - - /* we patch the ioctl size if necessary. We rely on the fact that - no ioctl has all the bits at '1' in the size field */ - ie =3D ioctl_entries; - while (ie->target_cmd !=3D 0) { - if (((ie->target_cmd >> TARGET_IOC_SIZESHIFT) & TARGET_IOC_SIZEMAS= K) =3D=3D - TARGET_IOC_SIZEMASK) { - arg_type =3D ie->arg_type; - if (arg_type[0] !=3D TYPE_PTR) { - fprintf(stderr, "cannot patch size for ioctl 0x%x\n", - ie->target_cmd); - exit(1); - } - arg_type++; - size =3D thunk_type_size(arg_type, 0); - ie->target_cmd =3D (ie->target_cmd & - ~(TARGET_IOC_SIZEMASK << TARGET_IOC_SIZESHIF= T)) | - (size << TARGET_IOC_SIZESHIFT); - } - - /* automatic consistency check if same arch */ -#if (defined(__i386__) && defined(TARGET_I386) && defined(TARGET_ABI32)) |= | \ - (defined(__x86_64__) && defined(TARGET_X86_64)) - if (unlikely(ie->target_cmd !=3D ie->host_cmd)) { - fprintf(stderr, "ERROR: ioctl(%s): target=3D0x%x host=3D0x%x\n= ", - ie->name, ie->target_cmd, ie->host_cmd); - } -#endif - ie++; - } -} - static inline uint64_t target_offset64(abi_ulong word0, abi_ulong word1) { #if TARGET_ABI_BITS =3D=3D 64 @@ -9072,3 +9020,64 @@ abi_long do_syscall(void *cpu_env, int num, abi_long= arg1, trace_guest_user_syscall_ret(cpu, num, ret); return ret; } + +void syscall_init(void) +{ + IOCTLEntry *ie; + const argtype *arg_type; + int size; + int i; + + thunk_init(STRUCT_MAX); + +#define STRUCT(name, ...) \ + thunk_register_struct(STRUCT_ ## name, #name, struct_ ## name ## _def); +#define STRUCT_SPECIAL(name) \ + thunk_register_struct_direct(STRUCT_ ## name, #name, \ + &struct_ ## name ## _def); + +#include "syscall_types.h" + +#undef STRUCT +#undef STRUCT_SPECIAL + + /* + * Build target_to_host_errno_table[] table from + * host_to_target_errno_table[]. + */ + for (i =3D 0; i < ERRNO_TABLE_SIZE; i++) { + target_to_host_errno_table[host_to_target_errno_table[i]] =3D i; + } + + /* + * We patch the ioctl size if necessary. We rely on the fact that + * no ioctl has all the bits at '1' in the size field. + */ + ie =3D ioctl_entries; + while (ie->target_cmd !=3D 0) { + if (((ie->target_cmd >> TARGET_IOC_SIZESHIFT) & TARGET_IOC_SIZEMAS= K) =3D=3D + TARGET_IOC_SIZEMASK) { + arg_type =3D ie->arg_type; + if (arg_type[0] !=3D TYPE_PTR) { + fprintf(stderr, "cannot patch size for ioctl 0x%x\n", + ie->target_cmd); + exit(1); + } + arg_type++; + size =3D thunk_type_size(arg_type, 0); + ie->target_cmd =3D (ie->target_cmd & + ~(TARGET_IOC_SIZEMASK << TARGET_IOC_SIZESHIF= T)) | + (size << TARGET_IOC_SIZESHIFT); + } + + /* automatic consistency check if same arch */ +#if (defined(__i386__) && defined(TARGET_I386) && defined(TARGET_ABI32)) |= | \ + (defined(__x86_64__) && defined(TARGET_X86_64)) + if (unlikely(ie->target_cmd !=3D ie->host_cmd)) { + fprintf(stderr, "ERROR: ioctl(%s): target=3D0x%x host=3D0x%x\n= ", + ie->name, ie->target_cmd, ie->host_cmd); + } +#endif + ie++; + } +} --=20 2.17.1 From nobody Thu May 9 22:44:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1558300594; cv=none; d=zoho.com; s=zohoarc; b=DQu5ARSOWcaKe92QUAb+Nc5cWeFW+Qj3eJ0Qfya8zZwjs6834mDuE2e+Bjs2KRBvUVln+z7RxHRXpdbYPqneezjCC5r+Rf6taNHqraXps713NB3T5cHxYfY/902FMwVhIlw+byMaipcd7RJUPnyj184vt/dhuWMOn5k9sb1WW5Q= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1558300594; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=iP3/CNN5zTtN5TgGZJCg5VKq0GbEgLMrSCvjo5Au37s=; b=du6wbrSnfny+grhC/qcXycdg7tk/Dbwq5cZ8mYwVURtp6UNUtu78bK9mJlTHjUrYvEtdHbdXvO2kqnZkTtSAcXJ7lXB1rcq+p6TYvQDY6aGwUe5cswhUJNRedcpJqe18426EoUX2oLWvZdP22QQGC7X7lCYrTXyJC324z353mYo= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (209.51.188.17 [209.51.188.17]) by mx.zohomail.com with SMTPS id 1558300594978561.6807410025265; Sun, 19 May 2019 14:16:34 -0700 (PDT) Received: from localhost ([127.0.0.1]:53677 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSTAS-0002cw-KS for importer@patchew.org; Sun, 19 May 2019 17:16:28 -0400 Received: from eggs.gnu.org ([209.51.188.92]:50871) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSZo-0003oH-9E for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:42 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hSSZj-0004ZI-8i for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:36 -0400 Received: from mail-pl1-x644.google.com ([2607:f8b0:4864:20::644]:41411) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hSSZi-0004Y7-Pl for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:31 -0400 Received: by mail-pl1-x644.google.com with SMTP id f12so5707270plt.8 for ; Sun, 19 May 2019 13:38:30 -0700 (PDT) Received: from localhost.localdomain (97-113-13-231.tukw.qwest.net. [97.113.13.231]) by smtp.gmail.com with ESMTPSA id i7sm11397448pfo.19.2019.05.19.13.38.27 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 19 May 2019 13:38:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=iP3/CNN5zTtN5TgGZJCg5VKq0GbEgLMrSCvjo5Au37s=; b=mqleqw9bxzXB15Ae63IyBO9zF5opmZmA1z4kVjIK9dGIKhmLSoVZKDAO1mtnV6oPRD 14SF+B7uGpOsUaMMIK7X79xzEBFVO1gfm0H/TH5z6r+zaef6yTznVmdmWK62gbmPLuF/ YGIiuKbnv8acUuWxnDKNQpRCMBdcZcfgEAlxWEkkJet43pWRC3/zvYm28ND6LDlhGQyN BqiDwguu6TLOdhAiho+4TR4nnFqWFYmM6RI7zKcusblY7ZPXk7jwPCQ1xBOr3j95uB0e CXn7CJZ+3ZtIHhLpLKbCDpjvfqkhJJPBMayrXcJ1bJHy/kHU//0nHXRugKzCxWnL72Sc 0C6A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=iP3/CNN5zTtN5TgGZJCg5VKq0GbEgLMrSCvjo5Au37s=; b=ocoQaeE923u9+tDL6isIRxJI85ELpsz7lxhVGp/dPbViiZbI4Kdn6fS5rM96VEIKbs 5h3A1Q9aI+zZg/aDc17HNb8iVNKkYco3sACaWo2nv5fYikeGgiDvV2pKeFyXjNPpOz9T ogs2NuEyUHlQGXB96ctgpEtw5t5F69P4QRn+WnS898PjDAdswKPK/R7H+wX6nO6mXtYX ND2di5OxG1f2F8Pf906Y4PVqO4G5Is1gbG/cN/75Ac1rIsQ6116yFsAT+nrTsSmsNeM/ AZIhK/1mOdaMwzkcqQc/fDmm5ejMIqVF2CiyuPGq2qRbJ+h/f74j9MkzPUZ3VBREqJ/4 LTmg== X-Gm-Message-State: APjAAAWnDIM4uRaz5pOO1vuSreu/0Fs+vxNKm3K94AStifD2XaPqkpXo 3LJneOWpr1fN+N8uqNRt/1zlluRZ4G0= X-Google-Smtp-Source: APXvYqxSX+JXrLZFG4M3IVcLAQ7kcFwSU0wEHA5ZlGIqJk/2X2qpTfaCKkrMZNaF260R4Q/RDqr93w== X-Received: by 2002:a17:902:74c6:: with SMTP id f6mr13666125plt.335.1558298308905; Sun, 19 May 2019 13:38:28 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sun, 19 May 2019 13:36:59 -0700 Message-Id: <20190519203726.20729-48-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190519203726.20729-1-richard.henderson@linaro.org> References: <20190519203726.20729-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::644 Subject: [Qemu-devel] [PATCH v7 47/74] linux-user: Split out ioctl X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: laurent@vivier.eu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Richard Henderson --- v7: Do not accidentally change type of "cmd". --- linux-user/syscall-defs.h | 1 + linux-user/syscall-ioctl.inc.c | 873 +++++++++++++++++++++++++++++++++ linux-user/syscall.c | 852 +------------------------------- linux-user/strace.list | 3 - 4 files changed, 875 insertions(+), 854 deletions(-) create mode 100644 linux-user/syscall-ioctl.inc.c diff --git a/linux-user/syscall-defs.h b/linux-user/syscall-defs.h index f8f280f376..f58b9745a4 100644 --- a/linux-user/syscall-defs.h +++ b/linux-user/syscall-defs.h @@ -61,6 +61,7 @@ SYSCALL_DEF(getppid); #ifdef TARGET_NR_getxpid SYSCALL_DEF(getxpid); #endif +SYSCALL_DEF(ioctl, ARG_DEC, ARG_HEX); #ifdef TARGET_NR_ipc SYSCALL_DEF_ARGS(ipc, ARG_HEX, ARG_DEC, ARG_DEC, ARG_HEX, ARG_PTR, ARG_HEX= ); #endif diff --git a/linux-user/syscall-ioctl.inc.c b/linux-user/syscall-ioctl.inc.c new file mode 100644 index 0000000000..be3f0b4b92 --- /dev/null +++ b/linux-user/syscall-ioctl.inc.c @@ -0,0 +1,873 @@ +/* + * Linux ioctl syscall implementation + * Copyright (c) 2003 Fabrice Bellard + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + */ + +typedef struct IOCTLEntry IOCTLEntry; + +typedef abi_long do_ioctl_fn(const IOCTLEntry *ie, uint8_t *buf_temp, + int fd, int cmd, abi_long arg); + +struct IOCTLEntry { + int target_cmd; + unsigned int host_cmd; + const char *name; + int access; + do_ioctl_fn *do_ioctl; + const argtype arg_type[5]; +}; + +#define IOC_R 0x0001 +#define IOC_W 0x0002 +#define IOC_RW (IOC_R | IOC_W) + +#define MAX_STRUCT_SIZE 4096 + +#ifdef CONFIG_FIEMAP +/* + * So fiemap access checks don't overflow on 32 bit systems. + * This is very slightly smaller than the limit imposed by + * the underlying kernel. + */ +#define FIEMAP_MAX_EXTENTS ((UINT_MAX - sizeof(struct fiemap)) \ + / sizeof(struct fiemap_extent)) + +static abi_long do_ioctl_fs_ioc_fiemap(const IOCTLEntry *ie, uint8_t *buf_= temp, + int fd, int cmd, abi_long arg) +{ + /* + * The parameter for this ioctl is a struct fiemap followed + * by an array of struct fiemap_extent whose size is set + * in fiemap->fm_extent_count. The array is filled in by the + * ioctl. + */ + int target_size_in, target_size_out; + struct fiemap *fm; + const argtype *arg_type =3D ie->arg_type; + const argtype extent_arg_type[] =3D { MK_STRUCT(STRUCT_fiemap_extent) = }; + void *argptr, *p; + abi_long ret; + int i, extent_size =3D thunk_type_size(extent_arg_type, 0); + uint32_t outbufsz; + int free_fm =3D 0; + + assert(arg_type[0] =3D=3D TYPE_PTR); + assert(ie->access =3D=3D IOC_RW); + arg_type++; + target_size_in =3D thunk_type_size(arg_type, 0); + argptr =3D lock_user(VERIFY_READ, arg, target_size_in, 1); + if (!argptr) { + return -TARGET_EFAULT; + } + thunk_convert(buf_temp, argptr, arg_type, THUNK_HOST); + unlock_user(argptr, arg, 0); + fm =3D (struct fiemap *)buf_temp; + if (fm->fm_extent_count > FIEMAP_MAX_EXTENTS) { + return -TARGET_EINVAL; + } + + outbufsz =3D sizeof(*fm) + sizeof(struct fiemap_extent) * fm->fm_exten= t_count; + + if (outbufsz > MAX_STRUCT_SIZE) { + /* + * We can't fit all the extents into the fixed size buffer. + * Allocate one that is large enough and use it instead. + */ + fm =3D g_try_malloc(outbufsz); + if (!fm) { + return -TARGET_ENOMEM; + } + memcpy(fm, buf_temp, sizeof(struct fiemap)); + free_fm =3D 1; + } + ret =3D get_errno(safe_ioctl(fd, ie->host_cmd, fm)); + if (!is_error(ret)) { + target_size_out =3D target_size_in; + /* + * An extent_count of 0 means we were only counting the extents + * so there are no structs to copy + */ + if (fm->fm_extent_count !=3D 0) { + target_size_out +=3D fm->fm_mapped_extents * extent_size; + } + argptr =3D lock_user(VERIFY_WRITE, arg, target_size_out, 0); + if (!argptr) { + ret =3D -TARGET_EFAULT; + } else { + /* Convert the struct fiemap */ + thunk_convert(argptr, fm, arg_type, THUNK_TARGET); + if (fm->fm_extent_count !=3D 0) { + p =3D argptr + target_size_in; + /* ...and then all the struct fiemap_extents */ + for (i =3D 0; i < fm->fm_mapped_extents; i++) { + thunk_convert(p, &fm->fm_extents[i], extent_arg_type, + THUNK_TARGET); + p +=3D extent_size; + } + } + unlock_user(argptr, arg, target_size_out); + } + } + if (free_fm) { + g_free(fm); + } + return ret; +} +#endif + +static abi_long do_ioctl_ifconf(const IOCTLEntry *ie, uint8_t *buf_temp, + int fd, int cmd, abi_long arg) +{ + const argtype *arg_type =3D ie->arg_type; + int target_size; + void *argptr; + int ret; + struct ifconf *host_ifconf; + uint32_t outbufsz; + const argtype ifreq_arg_type[] =3D { MK_STRUCT(STRUCT_sockaddr_ifreq) = }; + int target_ifreq_size; + int nb_ifreq; + int free_buf =3D 0; + int i; + int target_ifc_len; + abi_long target_ifc_buf; + int host_ifc_len; + char *host_ifc_buf; + + assert(arg_type[0] =3D=3D TYPE_PTR); + assert(ie->access =3D=3D IOC_RW); + + arg_type++; + target_size =3D thunk_type_size(arg_type, 0); + + argptr =3D lock_user(VERIFY_READ, arg, target_size, 1); + if (!argptr) { + return -TARGET_EFAULT; + } + thunk_convert(buf_temp, argptr, arg_type, THUNK_HOST); + unlock_user(argptr, arg, 0); + + host_ifconf =3D (struct ifconf *)(unsigned long)buf_temp; + target_ifc_len =3D host_ifconf->ifc_len; + target_ifc_buf =3D (abi_long)(unsigned long)host_ifconf->ifc_buf; + + target_ifreq_size =3D thunk_type_size(ifreq_arg_type, 0); + nb_ifreq =3D target_ifc_len / target_ifreq_size; + host_ifc_len =3D nb_ifreq * sizeof(struct ifreq); + + outbufsz =3D sizeof(*host_ifconf) + host_ifc_len; + if (outbufsz > MAX_STRUCT_SIZE) { + /* + * We can't fit all the extents into the fixed size buffer. + * Allocate one that is large enough and use it instead. + */ + host_ifconf =3D malloc(outbufsz); + if (!host_ifconf) { + return -TARGET_ENOMEM; + } + memcpy(host_ifconf, buf_temp, sizeof(*host_ifconf)); + free_buf =3D 1; + } + host_ifc_buf =3D (char *)host_ifconf + sizeof(*host_ifconf); + + host_ifconf->ifc_len =3D host_ifc_len; + host_ifconf->ifc_buf =3D host_ifc_buf; + + ret =3D get_errno(safe_ioctl(fd, ie->host_cmd, host_ifconf)); + if (!is_error(ret)) { + /* convert host ifc_len to target ifc_len */ + + nb_ifreq =3D host_ifconf->ifc_len / sizeof(struct ifreq); + target_ifc_len =3D nb_ifreq * target_ifreq_size; + host_ifconf->ifc_len =3D target_ifc_len; + + /* restore target ifc_buf */ + + host_ifconf->ifc_buf =3D (char *)(unsigned long)target_ifc_buf; + + /* copy struct ifconf to target user */ + + argptr =3D lock_user(VERIFY_WRITE, arg, target_size, 0); + if (!argptr) { + return -TARGET_EFAULT; + } + thunk_convert(argptr, host_ifconf, arg_type, THUNK_TARGET); + unlock_user(argptr, arg, target_size); + + /* copy ifreq[] to target user */ + + argptr =3D lock_user(VERIFY_WRITE, target_ifc_buf, target_ifc_len,= 0); + for (i =3D 0; i < nb_ifreq ; i++) { + thunk_convert(argptr + i * target_ifreq_size, + host_ifc_buf + i * sizeof(struct ifreq), + ifreq_arg_type, THUNK_TARGET); + } + unlock_user(argptr, target_ifc_buf, target_ifc_len); + } + + if (free_buf) { + free(host_ifconf); + } + + return ret; +} + +#if defined(CONFIG_USBFS) +#if HOST_LONG_BITS > 64 +#error USBDEVFS thunks do not support >64 bit hosts yet. +#endif +struct live_urb { + uint64_t target_urb_adr; + uint64_t target_buf_adr; + char *target_buf_ptr; + struct usbdevfs_urb host_urb; +}; + +static GHashTable *usbdevfs_urb_hashtable(void) +{ + static GHashTable *urb_hashtable; + + if (!urb_hashtable) { + urb_hashtable =3D g_hash_table_new(g_int64_hash, g_int64_equal); + } + return urb_hashtable; +} + +static void urb_hashtable_insert(struct live_urb *urb) +{ + GHashTable *urb_hashtable =3D usbdevfs_urb_hashtable(); + g_hash_table_insert(urb_hashtable, urb, urb); +} + +static struct live_urb *urb_hashtable_lookup(uint64_t target_urb_adr) +{ + GHashTable *urb_hashtable =3D usbdevfs_urb_hashtable(); + return g_hash_table_lookup(urb_hashtable, &target_urb_adr); +} + +static void urb_hashtable_remove(struct live_urb *urb) +{ + GHashTable *urb_hashtable =3D usbdevfs_urb_hashtable(); + g_hash_table_remove(urb_hashtable, urb); +} + +static abi_long +do_ioctl_usbdevfs_reapurb(const IOCTLEntry *ie, uint8_t *buf_temp, + int fd, int cmd, abi_long arg) +{ + const argtype usbfsurb_arg_type[] =3D { MK_STRUCT(STRUCT_usbdevfs_urb)= }; + const argtype ptrvoid_arg_type[] =3D { TYPE_PTRVOID, 0, 0 }; + struct live_urb *lurb; + void *argptr; + uint64_t hurb; + int target_size; + uintptr_t target_urb_adr; + abi_long ret; + + target_size =3D thunk_type_size(usbfsurb_arg_type, THUNK_TARGET); + + memset(buf_temp, 0, sizeof(uint64_t)); + ret =3D get_errno(safe_ioctl(fd, ie->host_cmd, buf_temp)); + if (is_error(ret)) { + return ret; + } + + memcpy(&hurb, buf_temp, sizeof(uint64_t)); + lurb =3D (void *)((uintptr_t)hurb - offsetof(struct live_urb, host_urb= )); + if (!lurb->target_urb_adr) { + return -TARGET_EFAULT; + } + urb_hashtable_remove(lurb); + unlock_user(lurb->target_buf_ptr, lurb->target_buf_adr, + lurb->host_urb.buffer_length); + lurb->target_buf_ptr =3D NULL; + + /* restore the guest buffer pointer */ + lurb->host_urb.buffer =3D (void *)(uintptr_t)lurb->target_buf_adr; + + /* update the guest urb struct */ + argptr =3D lock_user(VERIFY_WRITE, lurb->target_urb_adr, target_size, = 0); + if (!argptr) { + g_free(lurb); + return -TARGET_EFAULT; + } + thunk_convert(argptr, &lurb->host_urb, usbfsurb_arg_type, THUNK_TARGET= ); + unlock_user(argptr, lurb->target_urb_adr, target_size); + + target_size =3D thunk_type_size(ptrvoid_arg_type, THUNK_TARGET); + /* write back the urb handle */ + argptr =3D lock_user(VERIFY_WRITE, arg, target_size, 0); + if (!argptr) { + g_free(lurb); + return -TARGET_EFAULT; + } + + /* GHashTable uses 64-bit keys but thunk_convert expects uintptr_t */ + target_urb_adr =3D lurb->target_urb_adr; + thunk_convert(argptr, &target_urb_adr, ptrvoid_arg_type, THUNK_TARGET); + unlock_user(argptr, arg, target_size); + + g_free(lurb); + return ret; +} + +static abi_long +do_ioctl_usbdevfs_discardurb(const IOCTLEntry *ie, + uint8_t *buf_temp __attribute__((unused)), + int fd, int cmd, abi_long arg) +{ + struct live_urb *lurb; + + /* map target address back to host URB with metadata. */ + lurb =3D urb_hashtable_lookup(arg); + if (!lurb) { + return -TARGET_EFAULT; + } + return get_errno(safe_ioctl(fd, ie->host_cmd, &lurb->host_urb)); +} + +static abi_long +do_ioctl_usbdevfs_submiturb(const IOCTLEntry *ie, uint8_t *buf_temp, + int fd, int cmd, abi_long arg) +{ + const argtype *arg_type =3D ie->arg_type; + int target_size; + abi_long ret; + void *argptr; + int rw_dir; + struct live_urb *lurb; + + /* + * each submitted URB needs to map to a unique ID for the + * kernel, and that unique ID needs to be a pointer to + * host memory. hence, we need to malloc for each URB. + * isochronous transfers have a variable length struct. + */ + arg_type++; + target_size =3D thunk_type_size(arg_type, THUNK_TARGET); + + /* construct host copy of urb and metadata */ + lurb =3D g_try_malloc0(sizeof(struct live_urb)); + if (!lurb) { + return -TARGET_ENOMEM; + } + + argptr =3D lock_user(VERIFY_READ, arg, target_size, 1); + if (!argptr) { + g_free(lurb); + return -TARGET_EFAULT; + } + thunk_convert(&lurb->host_urb, argptr, arg_type, THUNK_HOST); + unlock_user(argptr, arg, 0); + + lurb->target_urb_adr =3D arg; + lurb->target_buf_adr =3D (uintptr_t)lurb->host_urb.buffer; + + /* buffer space used depends on endpoint type so lock the entire buffe= r */ + /* control type urbs should check the buffer contents for true directi= on */ + rw_dir =3D lurb->host_urb.endpoint & USB_DIR_IN ? VERIFY_WRITE : VERIF= Y_READ; + lurb->target_buf_ptr =3D lock_user(rw_dir, lurb->target_buf_adr, + lurb->host_urb.buffer_length, 1); + if (lurb->target_buf_ptr =3D=3D NULL) { + g_free(lurb); + return -TARGET_EFAULT; + } + + /* update buffer pointer in host copy */ + lurb->host_urb.buffer =3D lurb->target_buf_ptr; + + ret =3D get_errno(safe_ioctl(fd, ie->host_cmd, &lurb->host_urb)); + if (is_error(ret)) { + unlock_user(lurb->target_buf_ptr, lurb->target_buf_adr, 0); + g_free(lurb); + } else { + urb_hashtable_insert(lurb); + } + + return ret; +} +#endif /* CONFIG_USBFS */ + +static abi_long do_ioctl_dm(const IOCTLEntry *ie, uint8_t *buf_temp, int f= d, + int cmd, abi_long arg) +{ + void *argptr; + struct dm_ioctl *host_dm; + abi_long guest_data; + uint32_t guest_data_size; + int target_size; + const argtype *arg_type =3D ie->arg_type; + abi_long ret; + void *big_buf =3D NULL; + char *host_data; + + arg_type++; + target_size =3D thunk_type_size(arg_type, 0); + argptr =3D lock_user(VERIFY_READ, arg, target_size, 1); + if (!argptr) { + ret =3D -TARGET_EFAULT; + goto out; + } + thunk_convert(buf_temp, argptr, arg_type, THUNK_HOST); + unlock_user(argptr, arg, 0); + + /* buf_temp is too small, so fetch things into a bigger buffer */ + big_buf =3D g_malloc0(((struct dm_ioctl *)buf_temp)->data_size * 2); + memcpy(big_buf, buf_temp, target_size); + buf_temp =3D big_buf; + host_dm =3D big_buf; + + guest_data =3D arg + host_dm->data_start; + if ((guest_data - arg) < 0) { + ret =3D -TARGET_EINVAL; + goto out; + } + guest_data_size =3D host_dm->data_size - host_dm->data_start; + host_data =3D (char *)host_dm + host_dm->data_start; + + argptr =3D lock_user(VERIFY_READ, guest_data, guest_data_size, 1); + if (!argptr) { + ret =3D -TARGET_EFAULT; + goto out; + } + + switch (ie->host_cmd) { + case DM_REMOVE_ALL: + case DM_LIST_DEVICES: + case DM_DEV_CREATE: + case DM_DEV_REMOVE: + case DM_DEV_SUSPEND: + case DM_DEV_STATUS: + case DM_DEV_WAIT: + case DM_TABLE_STATUS: + case DM_TABLE_CLEAR: + case DM_TABLE_DEPS: + case DM_LIST_VERSIONS: + /* no input data */ + break; + case DM_DEV_RENAME: + case DM_DEV_SET_GEOMETRY: + /* data contains only strings */ + memcpy(host_data, argptr, guest_data_size); + break; + case DM_TARGET_MSG: + memcpy(host_data, argptr, guest_data_size); + *(uint64_t *)host_data =3D tswap64(*(uint64_t *)argptr); + break; + case DM_TABLE_LOAD: + { + void *gspec =3D argptr; + void *cur_data =3D host_data; + const argtype arg_type[] =3D { MK_STRUCT(STRUCT_dm_target_spec) }; + int spec_size =3D thunk_type_size(arg_type, 0); + int i; + + for (i =3D 0; i < host_dm->target_count; i++) { + struct dm_target_spec *spec =3D cur_data; + uint32_t next; + int slen; + + thunk_convert(spec, gspec, arg_type, THUNK_HOST); + slen =3D strlen((char *)gspec + spec_size) + 1; + next =3D spec->next; + spec->next =3D sizeof(*spec) + slen; + strcpy((char *)&spec[1], gspec + spec_size); + gspec +=3D next; + cur_data +=3D spec->next; + } + break; + } + default: + ret =3D -TARGET_EINVAL; + unlock_user(argptr, guest_data, 0); + goto out; + } + unlock_user(argptr, guest_data, 0); + + ret =3D get_errno(safe_ioctl(fd, ie->host_cmd, buf_temp)); + if (!is_error(ret)) { + guest_data =3D arg + host_dm->data_start; + guest_data_size =3D host_dm->data_size - host_dm->data_start; + argptr =3D lock_user(VERIFY_WRITE, guest_data, guest_data_size, 0); + switch (ie->host_cmd) { + case DM_REMOVE_ALL: + case DM_DEV_CREATE: + case DM_DEV_REMOVE: + case DM_DEV_RENAME: + case DM_DEV_SUSPEND: + case DM_DEV_STATUS: + case DM_TABLE_LOAD: + case DM_TABLE_CLEAR: + case DM_TARGET_MSG: + case DM_DEV_SET_GEOMETRY: + /* no return data */ + break; + case DM_LIST_DEVICES: + { + struct dm_name_list *nl =3D (void *)host_dm + host_dm->data_st= art; + uint32_t remaining_data =3D guest_data_size; + void *cur_data =3D argptr; + const argtype arg_type[] =3D { MK_STRUCT(STRUCT_dm_name_list) = }; + int nl_size =3D 12; /* can't use thunk_size due to alignment */ + + while (1) { + uint32_t next =3D nl->next; + if (next) { + nl->next =3D nl_size + (strlen(nl->name) + 1); + } + if (remaining_data < nl->next) { + host_dm->flags |=3D DM_BUFFER_FULL_FLAG; + break; + } + thunk_convert(cur_data, nl, arg_type, THUNK_TARGET); + strcpy(cur_data + nl_size, nl->name); + cur_data +=3D nl->next; + remaining_data -=3D nl->next; + if (!next) { + break; + } + nl =3D (void *)nl + next; + } + break; + } + case DM_DEV_WAIT: + case DM_TABLE_STATUS: + { + struct dm_target_spec *spec + =3D (void *)host_dm + host_dm->data_start; + void *cur_data =3D argptr; + const argtype arg_type[] =3D { MK_STRUCT(STRUCT_dm_target_spec= ) }; + int spec_size =3D thunk_type_size(arg_type, 0); + int i; + + for (i =3D 0; i < host_dm->target_count; i++) { + uint32_t next =3D spec->next; + int slen =3D strlen((char *)&spec[1]) + 1; + spec->next =3D (cur_data - argptr) + spec_size + slen; + if (guest_data_size < spec->next) { + host_dm->flags |=3D DM_BUFFER_FULL_FLAG; + break; + } + thunk_convert(cur_data, spec, arg_type, THUNK_TARGET); + strcpy(cur_data + spec_size, (char *)&spec[1]); + cur_data =3D argptr + spec->next; + spec =3D (void *)host_dm + host_dm->data_start + next; + } + break; + } + case DM_TABLE_DEPS: + { + void *hdata =3D (void *)host_dm + host_dm->data_start; + int count =3D *(uint32_t *)hdata; + uint64_t *hdev =3D hdata + 8; + uint64_t *gdev =3D argptr + 8; + int i; + + *(uint32_t *)argptr =3D tswap32(count); + for (i =3D 0; i < count; i++) { + *gdev =3D tswap64(*hdev); + gdev++; + hdev++; + } + break; + } + case DM_LIST_VERSIONS: + { + struct dm_target_versions *vers + =3D (void *)host_dm + host_dm->data_start; + uint32_t remaining_data =3D guest_data_size; + void *cur_data =3D argptr; + const argtype arg_type[] + =3D { MK_STRUCT(STRUCT_dm_target_versions) }; + int vers_size =3D thunk_type_size(arg_type, 0); + + while (1) { + uint32_t next =3D vers->next; + if (next) { + vers->next =3D vers_size + strlen(vers->name) + 1; + } + if (remaining_data < vers->next) { + host_dm->flags |=3D DM_BUFFER_FULL_FLAG; + break; + } + thunk_convert(cur_data, vers, arg_type, THUNK_TARGET); + strcpy(cur_data + vers_size, vers->name); + cur_data +=3D vers->next; + remaining_data -=3D vers->next; + if (!next) { + break; + } + vers =3D (void *)vers + next; + } + break; + } + default: + unlock_user(argptr, guest_data, 0); + ret =3D -TARGET_EINVAL; + goto out; + } + unlock_user(argptr, guest_data, guest_data_size); + + argptr =3D lock_user(VERIFY_WRITE, arg, target_size, 0); + if (!argptr) { + ret =3D -TARGET_EFAULT; + goto out; + } + thunk_convert(argptr, buf_temp, arg_type, THUNK_TARGET); + unlock_user(argptr, arg, target_size); + } +out: + g_free(big_buf); + return ret; +} + +static abi_long do_ioctl_blkpg(const IOCTLEntry *ie, uint8_t *buf_temp, in= t fd, + int cmd, abi_long arg) +{ + void *argptr; + int target_size; + const argtype *arg_type =3D ie->arg_type; + const argtype part_arg_type[] =3D { MK_STRUCT(STRUCT_blkpg_partition) = }; + abi_long ret; + struct blkpg_ioctl_arg *host_blkpg =3D (void *)buf_temp; + struct blkpg_partition host_part; + + /* Read and convert blkpg */ + arg_type++; + target_size =3D thunk_type_size(arg_type, 0); + argptr =3D lock_user(VERIFY_READ, arg, target_size, 1); + if (!argptr) { + ret =3D -TARGET_EFAULT; + goto out; + } + thunk_convert(buf_temp, argptr, arg_type, THUNK_HOST); + unlock_user(argptr, arg, 0); + + switch (host_blkpg->op) { + case BLKPG_ADD_PARTITION: + case BLKPG_DEL_PARTITION: + /* payload is struct blkpg_partition */ + break; + default: + /* Unknown opcode */ + ret =3D -TARGET_EINVAL; + goto out; + } + + /* Read and convert blkpg->data */ + arg =3D (abi_long)(uintptr_t)host_blkpg->data; + target_size =3D thunk_type_size(part_arg_type, 0); + argptr =3D lock_user(VERIFY_READ, arg, target_size, 1); + if (!argptr) { + ret =3D -TARGET_EFAULT; + goto out; + } + thunk_convert(&host_part, argptr, part_arg_type, THUNK_HOST); + unlock_user(argptr, arg, 0); + + /* Swizzle the data pointer to our local copy and call! */ + host_blkpg->data =3D &host_part; + ret =3D get_errno(safe_ioctl(fd, ie->host_cmd, host_blkpg)); + +out: + return ret; +} + +static abi_long do_ioctl_rt(const IOCTLEntry *ie, uint8_t *buf_temp, + int fd, int cmd, abi_long arg) +{ + const argtype *arg_type =3D ie->arg_type; + const StructEntry *se; + const argtype *field_types; + const int *dst_offsets, *src_offsets; + int target_size; + void *argptr; + abi_ulong *target_rt_dev_ptr =3D NULL; + unsigned long *host_rt_dev_ptr =3D NULL; + abi_long ret; + int i; + + assert(ie->access =3D=3D IOC_W); + assert(*arg_type =3D=3D TYPE_PTR); + arg_type++; + assert(*arg_type =3D=3D TYPE_STRUCT); + target_size =3D thunk_type_size(arg_type, 0); + argptr =3D lock_user(VERIFY_READ, arg, target_size, 1); + if (!argptr) { + return -TARGET_EFAULT; + } + arg_type++; + assert(*arg_type =3D=3D (int)STRUCT_rtentry); + se =3D struct_entries + *arg_type++; + assert(se->convert[0] =3D=3D NULL); + /* convert struct here to be able to catch rt_dev string */ + field_types =3D se->field_types; + dst_offsets =3D se->field_offsets[THUNK_HOST]; + src_offsets =3D se->field_offsets[THUNK_TARGET]; + for (i =3D 0; i < se->nb_fields; i++) { + if (dst_offsets[i] =3D=3D offsetof(struct rtentry, rt_dev)) { + assert(*field_types =3D=3D TYPE_PTRVOID); + target_rt_dev_ptr =3D (abi_ulong *)(argptr + src_offsets[i]); + host_rt_dev_ptr =3D (unsigned long *)(buf_temp + dst_offsets[i= ]); + if (*target_rt_dev_ptr !=3D 0) { + *host_rt_dev_ptr =3D (unsigned long)lock_user_string( + tswapal(*target_rt_dev_ptr)); + if (!*host_rt_dev_ptr) { + unlock_user(argptr, arg, 0); + return -TARGET_EFAULT; + } + } else { + *host_rt_dev_ptr =3D 0; + } + field_types++; + continue; + } + field_types =3D thunk_convert(buf_temp + dst_offsets[i], + argptr + src_offsets[i], + field_types, THUNK_HOST); + } + unlock_user(argptr, arg, 0); + + ret =3D get_errno(safe_ioctl(fd, ie->host_cmd, buf_temp)); + if (*host_rt_dev_ptr !=3D 0) { + unlock_user((void *)*host_rt_dev_ptr, + *target_rt_dev_ptr, 0); + } + return ret; +} + +static abi_long do_ioctl_kdsigaccept(const IOCTLEntry *ie, uint8_t *buf_te= mp, + int fd, int cmd, abi_long arg) +{ + int sig =3D target_to_host_signal(arg); + return get_errno(safe_ioctl(fd, ie->host_cmd, sig)); +} + +#ifdef TIOCGPTPEER +static abi_long do_ioctl_tiocgptpeer(const IOCTLEntry *ie, uint8_t *buf_te= mp, + int fd, int cmd, abi_long arg) +{ + int flags =3D target_to_host_bitmask(arg, fcntl_flags_tbl); + return get_errno(safe_ioctl(fd, ie->host_cmd, flags)); +} +#endif + +static IOCTLEntry ioctl_entries[] =3D { +#define IOCTL(cmd, access, ...) \ + { TARGET_ ## cmd, cmd, #cmd, access, 0, { __VA_ARGS__ } }, +#define IOCTL_SPECIAL(cmd, access, dofn, ...) \ + { TARGET_ ## cmd, cmd, #cmd, access, dofn, { __VA_ARGS__ } }, +#define IOCTL_IGNORE(cmd) \ + { TARGET_ ## cmd, 0, #cmd }, +#include "ioctls.h" + { 0, 0, }, +}; + +/* ??? Implement proper locking for ioctls. */ +SYSCALL_IMPL(ioctl) +{ + int fd =3D arg1; + int cmd =3D arg2; + abi_ulong arg =3D arg3; + const IOCTLEntry *ie; + const argtype *arg_type; + abi_long ret; + uint8_t buf_temp[MAX_STRUCT_SIZE]; + int target_size; + void *argptr; + + for (ie =3D ioctl_entries; ; ie++) { + if (ie->target_cmd =3D=3D 0) { + gemu_log("Unsupported ioctl: cmd=3D0x%04lx\n", (long)cmd); + return -TARGET_ENOSYS; + } + if (ie->target_cmd =3D=3D cmd) { + break; + } + } + + arg_type =3D ie->arg_type; + if (ie->do_ioctl) { + return ie->do_ioctl(ie, buf_temp, fd, cmd, arg); + } else if (!ie->host_cmd) { + /* + * Some architectures define BSD ioctls in their headers + * that are not implemented in Linux. + */ + return -TARGET_ENOSYS; + } + + switch (arg_type[0]) { + case TYPE_NULL: + /* no argument */ + ret =3D get_errno(safe_ioctl(fd, ie->host_cmd)); + break; + case TYPE_PTRVOID: + case TYPE_INT: + ret =3D get_errno(safe_ioctl(fd, ie->host_cmd, arg)); + break; + case TYPE_PTR: + arg_type++; + target_size =3D thunk_type_size(arg_type, 0); + switch (ie->access) { + case IOC_R: + ret =3D get_errno(safe_ioctl(fd, ie->host_cmd, buf_temp)); + if (!is_error(ret)) { + argptr =3D lock_user(VERIFY_WRITE, arg, target_size, 0); + if (!argptr) { + return -TARGET_EFAULT; + } + thunk_convert(argptr, buf_temp, arg_type, THUNK_TARGET); + unlock_user(argptr, arg, target_size); + } + break; + case IOC_W: + argptr =3D lock_user(VERIFY_READ, arg, target_size, 1); + if (!argptr) { + return -TARGET_EFAULT; + } + thunk_convert(buf_temp, argptr, arg_type, THUNK_HOST); + unlock_user(argptr, arg, 0); + ret =3D get_errno(safe_ioctl(fd, ie->host_cmd, buf_temp)); + break; + default: + case IOC_RW: + argptr =3D lock_user(VERIFY_READ, arg, target_size, 1); + if (!argptr) { + return -TARGET_EFAULT; + } + thunk_convert(buf_temp, argptr, arg_type, THUNK_HOST); + unlock_user(argptr, arg, 0); + ret =3D get_errno(safe_ioctl(fd, ie->host_cmd, buf_temp)); + if (!is_error(ret)) { + argptr =3D lock_user(VERIFY_WRITE, arg, target_size, 0); + if (!argptr) { + return -TARGET_EFAULT; + } + thunk_convert(argptr, buf_temp, arg_type, THUNK_TARGET); + unlock_user(argptr, arg, target_size); + } + break; + } + break; + default: + gemu_log("Unsupported ioctl type: cmd=3D0x%04lx type=3D%d\n", + (long)cmd, arg_type[0]); + ret =3D -TARGET_ENOSYS; + break; + } + return ret; +} diff --git a/linux-user/syscall.c b/linux-user/syscall.c index d0e76c392e..8f90affe2f 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -2979,855 +2979,6 @@ STRUCT_MAX #undef STRUCT #undef STRUCT_SPECIAL =20 -typedef struct IOCTLEntry IOCTLEntry; - -typedef abi_long do_ioctl_fn(const IOCTLEntry *ie, uint8_t *buf_temp, - int fd, int cmd, abi_long arg); - -struct IOCTLEntry { - int target_cmd; - unsigned int host_cmd; - const char *name; - int access; - do_ioctl_fn *do_ioctl; - const argtype arg_type[5]; -}; - -#define IOC_R 0x0001 -#define IOC_W 0x0002 -#define IOC_RW (IOC_R | IOC_W) - -#define MAX_STRUCT_SIZE 4096 - -#ifdef CONFIG_FIEMAP -/* So fiemap access checks don't overflow on 32 bit systems. - * This is very slightly smaller than the limit imposed by - * the underlying kernel. - */ -#define FIEMAP_MAX_EXTENTS ((UINT_MAX - sizeof(struct fiemap)) \ - / sizeof(struct fiemap_extent)) - -static abi_long do_ioctl_fs_ioc_fiemap(const IOCTLEntry *ie, uint8_t *buf_= temp, - int fd, int cmd, abi_long arg) -{ - /* The parameter for this ioctl is a struct fiemap followed - * by an array of struct fiemap_extent whose size is set - * in fiemap->fm_extent_count. The array is filled in by the - * ioctl. - */ - int target_size_in, target_size_out; - struct fiemap *fm; - const argtype *arg_type =3D ie->arg_type; - const argtype extent_arg_type[] =3D { MK_STRUCT(STRUCT_fiemap_extent) = }; - void *argptr, *p; - abi_long ret; - int i, extent_size =3D thunk_type_size(extent_arg_type, 0); - uint32_t outbufsz; - int free_fm =3D 0; - - assert(arg_type[0] =3D=3D TYPE_PTR); - assert(ie->access =3D=3D IOC_RW); - arg_type++; - target_size_in =3D thunk_type_size(arg_type, 0); - argptr =3D lock_user(VERIFY_READ, arg, target_size_in, 1); - if (!argptr) { - return -TARGET_EFAULT; - } - thunk_convert(buf_temp, argptr, arg_type, THUNK_HOST); - unlock_user(argptr, arg, 0); - fm =3D (struct fiemap *)buf_temp; - if (fm->fm_extent_count > FIEMAP_MAX_EXTENTS) { - return -TARGET_EINVAL; - } - - outbufsz =3D sizeof (*fm) + - (sizeof(struct fiemap_extent) * fm->fm_extent_count); - - if (outbufsz > MAX_STRUCT_SIZE) { - /* We can't fit all the extents into the fixed size buffer. - * Allocate one that is large enough and use it instead. - */ - fm =3D g_try_malloc(outbufsz); - if (!fm) { - return -TARGET_ENOMEM; - } - memcpy(fm, buf_temp, sizeof(struct fiemap)); - free_fm =3D 1; - } - ret =3D get_errno(safe_ioctl(fd, ie->host_cmd, fm)); - if (!is_error(ret)) { - target_size_out =3D target_size_in; - /* An extent_count of 0 means we were only counting the extents - * so there are no structs to copy - */ - if (fm->fm_extent_count !=3D 0) { - target_size_out +=3D fm->fm_mapped_extents * extent_size; - } - argptr =3D lock_user(VERIFY_WRITE, arg, target_size_out, 0); - if (!argptr) { - ret =3D -TARGET_EFAULT; - } else { - /* Convert the struct fiemap */ - thunk_convert(argptr, fm, arg_type, THUNK_TARGET); - if (fm->fm_extent_count !=3D 0) { - p =3D argptr + target_size_in; - /* ...and then all the struct fiemap_extents */ - for (i =3D 0; i < fm->fm_mapped_extents; i++) { - thunk_convert(p, &fm->fm_extents[i], extent_arg_type, - THUNK_TARGET); - p +=3D extent_size; - } - } - unlock_user(argptr, arg, target_size_out); - } - } - if (free_fm) { - g_free(fm); - } - return ret; -} -#endif - -static abi_long do_ioctl_ifconf(const IOCTLEntry *ie, uint8_t *buf_temp, - int fd, int cmd, abi_long arg) -{ - const argtype *arg_type =3D ie->arg_type; - int target_size; - void *argptr; - int ret; - struct ifconf *host_ifconf; - uint32_t outbufsz; - const argtype ifreq_arg_type[] =3D { MK_STRUCT(STRUCT_sockaddr_ifreq) = }; - int target_ifreq_size; - int nb_ifreq; - int free_buf =3D 0; - int i; - int target_ifc_len; - abi_long target_ifc_buf; - int host_ifc_len; - char *host_ifc_buf; - - assert(arg_type[0] =3D=3D TYPE_PTR); - assert(ie->access =3D=3D IOC_RW); - - arg_type++; - target_size =3D thunk_type_size(arg_type, 0); - - argptr =3D lock_user(VERIFY_READ, arg, target_size, 1); - if (!argptr) - return -TARGET_EFAULT; - thunk_convert(buf_temp, argptr, arg_type, THUNK_HOST); - unlock_user(argptr, arg, 0); - - host_ifconf =3D (struct ifconf *)(unsigned long)buf_temp; - target_ifc_buf =3D (abi_long)(unsigned long)host_ifconf->ifc_buf; - target_ifreq_size =3D thunk_type_size(ifreq_arg_type, 0); - - if (target_ifc_buf !=3D 0) { - target_ifc_len =3D host_ifconf->ifc_len; - nb_ifreq =3D target_ifc_len / target_ifreq_size; - host_ifc_len =3D nb_ifreq * sizeof(struct ifreq); - - outbufsz =3D sizeof(*host_ifconf) + host_ifc_len; - if (outbufsz > MAX_STRUCT_SIZE) { - /* - * We can't fit all the extents into the fixed size buffer. - * Allocate one that is large enough and use it instead. - */ - host_ifconf =3D malloc(outbufsz); - if (!host_ifconf) { - return -TARGET_ENOMEM; - } - memcpy(host_ifconf, buf_temp, sizeof(*host_ifconf)); - free_buf =3D 1; - } - host_ifc_buf =3D (char *)host_ifconf + sizeof(*host_ifconf); - - host_ifconf->ifc_len =3D host_ifc_len; - } else { - host_ifc_buf =3D NULL; - } - host_ifconf->ifc_buf =3D host_ifc_buf; - - ret =3D get_errno(safe_ioctl(fd, ie->host_cmd, host_ifconf)); - if (!is_error(ret)) { - /* convert host ifc_len to target ifc_len */ - - nb_ifreq =3D host_ifconf->ifc_len / sizeof(struct ifreq); - target_ifc_len =3D nb_ifreq * target_ifreq_size; - host_ifconf->ifc_len =3D target_ifc_len; - - /* restore target ifc_buf */ - - host_ifconf->ifc_buf =3D (char *)(unsigned long)target_ifc_buf; - - /* copy struct ifconf to target user */ - - argptr =3D lock_user(VERIFY_WRITE, arg, target_size, 0); - if (!argptr) - return -TARGET_EFAULT; - thunk_convert(argptr, host_ifconf, arg_type, THUNK_TARGET); - unlock_user(argptr, arg, target_size); - - if (target_ifc_buf !=3D 0) { - /* copy ifreq[] to target user */ - argptr =3D lock_user(VERIFY_WRITE, target_ifc_buf, target_ifc_= len, 0); - for (i =3D 0; i < nb_ifreq ; i++) { - thunk_convert(argptr + i * target_ifreq_size, - host_ifc_buf + i * sizeof(struct ifreq), - ifreq_arg_type, THUNK_TARGET); - } - unlock_user(argptr, target_ifc_buf, target_ifc_len); - } - } - - if (free_buf) { - free(host_ifconf); - } - - return ret; -} - -#if defined(CONFIG_USBFS) -#if HOST_LONG_BITS > 64 -#error USBDEVFS thunks do not support >64 bit hosts yet. -#endif -struct live_urb { - uint64_t target_urb_adr; - uint64_t target_buf_adr; - char *target_buf_ptr; - struct usbdevfs_urb host_urb; -}; - -static GHashTable *usbdevfs_urb_hashtable(void) -{ - static GHashTable *urb_hashtable; - - if (!urb_hashtable) { - urb_hashtable =3D g_hash_table_new(g_int64_hash, g_int64_equal); - } - return urb_hashtable; -} - -static void urb_hashtable_insert(struct live_urb *urb) -{ - GHashTable *urb_hashtable =3D usbdevfs_urb_hashtable(); - g_hash_table_insert(urb_hashtable, urb, urb); -} - -static struct live_urb *urb_hashtable_lookup(uint64_t target_urb_adr) -{ - GHashTable *urb_hashtable =3D usbdevfs_urb_hashtable(); - return g_hash_table_lookup(urb_hashtable, &target_urb_adr); -} - -static void urb_hashtable_remove(struct live_urb *urb) -{ - GHashTable *urb_hashtable =3D usbdevfs_urb_hashtable(); - g_hash_table_remove(urb_hashtable, urb); -} - -static abi_long -do_ioctl_usbdevfs_reapurb(const IOCTLEntry *ie, uint8_t *buf_temp, - int fd, int cmd, abi_long arg) -{ - const argtype usbfsurb_arg_type[] =3D { MK_STRUCT(STRUCT_usbdevfs_urb)= }; - const argtype ptrvoid_arg_type[] =3D { TYPE_PTRVOID, 0, 0 }; - struct live_urb *lurb; - void *argptr; - uint64_t hurb; - int target_size; - uintptr_t target_urb_adr; - abi_long ret; - - target_size =3D thunk_type_size(usbfsurb_arg_type, THUNK_TARGET); - - memset(buf_temp, 0, sizeof(uint64_t)); - ret =3D get_errno(safe_ioctl(fd, ie->host_cmd, buf_temp)); - if (is_error(ret)) { - return ret; - } - - memcpy(&hurb, buf_temp, sizeof(uint64_t)); - lurb =3D (void *)((uintptr_t)hurb - offsetof(struct live_urb, host_urb= )); - if (!lurb->target_urb_adr) { - return -TARGET_EFAULT; - } - urb_hashtable_remove(lurb); - unlock_user(lurb->target_buf_ptr, lurb->target_buf_adr, - lurb->host_urb.buffer_length); - lurb->target_buf_ptr =3D NULL; - - /* restore the guest buffer pointer */ - lurb->host_urb.buffer =3D (void *)(uintptr_t)lurb->target_buf_adr; - - /* update the guest urb struct */ - argptr =3D lock_user(VERIFY_WRITE, lurb->target_urb_adr, target_size, = 0); - if (!argptr) { - g_free(lurb); - return -TARGET_EFAULT; - } - thunk_convert(argptr, &lurb->host_urb, usbfsurb_arg_type, THUNK_TARGET= ); - unlock_user(argptr, lurb->target_urb_adr, target_size); - - target_size =3D thunk_type_size(ptrvoid_arg_type, THUNK_TARGET); - /* write back the urb handle */ - argptr =3D lock_user(VERIFY_WRITE, arg, target_size, 0); - if (!argptr) { - g_free(lurb); - return -TARGET_EFAULT; - } - - /* GHashTable uses 64-bit keys but thunk_convert expects uintptr_t */ - target_urb_adr =3D lurb->target_urb_adr; - thunk_convert(argptr, &target_urb_adr, ptrvoid_arg_type, THUNK_TARGET); - unlock_user(argptr, arg, target_size); - - g_free(lurb); - return ret; -} - -static abi_long -do_ioctl_usbdevfs_discardurb(const IOCTLEntry *ie, - uint8_t *buf_temp __attribute__((unused)), - int fd, int cmd, abi_long arg) -{ - struct live_urb *lurb; - - /* map target address back to host URB with metadata. */ - lurb =3D urb_hashtable_lookup(arg); - if (!lurb) { - return -TARGET_EFAULT; - } - return get_errno(safe_ioctl(fd, ie->host_cmd, &lurb->host_urb)); -} - -static abi_long -do_ioctl_usbdevfs_submiturb(const IOCTLEntry *ie, uint8_t *buf_temp, - int fd, int cmd, abi_long arg) -{ - const argtype *arg_type =3D ie->arg_type; - int target_size; - abi_long ret; - void *argptr; - int rw_dir; - struct live_urb *lurb; - - /* - * each submitted URB needs to map to a unique ID for the - * kernel, and that unique ID needs to be a pointer to - * host memory. hence, we need to malloc for each URB. - * isochronous transfers have a variable length struct. - */ - arg_type++; - target_size =3D thunk_type_size(arg_type, THUNK_TARGET); - - /* construct host copy of urb and metadata */ - lurb =3D g_try_malloc0(sizeof(struct live_urb)); - if (!lurb) { - return -TARGET_ENOMEM; - } - - argptr =3D lock_user(VERIFY_READ, arg, target_size, 1); - if (!argptr) { - g_free(lurb); - return -TARGET_EFAULT; - } - thunk_convert(&lurb->host_urb, argptr, arg_type, THUNK_HOST); - unlock_user(argptr, arg, 0); - - lurb->target_urb_adr =3D arg; - lurb->target_buf_adr =3D (uintptr_t)lurb->host_urb.buffer; - - /* buffer space used depends on endpoint type so lock the entire buffe= r */ - /* control type urbs should check the buffer contents for true directi= on */ - rw_dir =3D lurb->host_urb.endpoint & USB_DIR_IN ? VERIFY_WRITE : VERIF= Y_READ; - lurb->target_buf_ptr =3D lock_user(rw_dir, lurb->target_buf_adr, - lurb->host_urb.buffer_length, 1); - if (lurb->target_buf_ptr =3D=3D NULL) { - g_free(lurb); - return -TARGET_EFAULT; - } - - /* update buffer pointer in host copy */ - lurb->host_urb.buffer =3D lurb->target_buf_ptr; - - ret =3D get_errno(safe_ioctl(fd, ie->host_cmd, &lurb->host_urb)); - if (is_error(ret)) { - unlock_user(lurb->target_buf_ptr, lurb->target_buf_adr, 0); - g_free(lurb); - } else { - urb_hashtable_insert(lurb); - } - - return ret; -} -#endif /* CONFIG_USBFS */ - -static abi_long do_ioctl_dm(const IOCTLEntry *ie, uint8_t *buf_temp, int f= d, - int cmd, abi_long arg) -{ - void *argptr; - struct dm_ioctl *host_dm; - abi_long guest_data; - uint32_t guest_data_size; - int target_size; - const argtype *arg_type =3D ie->arg_type; - abi_long ret; - void *big_buf =3D NULL; - char *host_data; - - arg_type++; - target_size =3D thunk_type_size(arg_type, 0); - argptr =3D lock_user(VERIFY_READ, arg, target_size, 1); - if (!argptr) { - ret =3D -TARGET_EFAULT; - goto out; - } - thunk_convert(buf_temp, argptr, arg_type, THUNK_HOST); - unlock_user(argptr, arg, 0); - - /* buf_temp is too small, so fetch things into a bigger buffer */ - big_buf =3D g_malloc0(((struct dm_ioctl*)buf_temp)->data_size * 2); - memcpy(big_buf, buf_temp, target_size); - buf_temp =3D big_buf; - host_dm =3D big_buf; - - guest_data =3D arg + host_dm->data_start; - if ((guest_data - arg) < 0) { - ret =3D -TARGET_EINVAL; - goto out; - } - guest_data_size =3D host_dm->data_size - host_dm->data_start; - host_data =3D (char*)host_dm + host_dm->data_start; - - argptr =3D lock_user(VERIFY_READ, guest_data, guest_data_size, 1); - if (!argptr) { - ret =3D -TARGET_EFAULT; - goto out; - } - - switch (ie->host_cmd) { - case DM_REMOVE_ALL: - case DM_LIST_DEVICES: - case DM_DEV_CREATE: - case DM_DEV_REMOVE: - case DM_DEV_SUSPEND: - case DM_DEV_STATUS: - case DM_DEV_WAIT: - case DM_TABLE_STATUS: - case DM_TABLE_CLEAR: - case DM_TABLE_DEPS: - case DM_LIST_VERSIONS: - /* no input data */ - break; - case DM_DEV_RENAME: - case DM_DEV_SET_GEOMETRY: - /* data contains only strings */ - memcpy(host_data, argptr, guest_data_size); - break; - case DM_TARGET_MSG: - memcpy(host_data, argptr, guest_data_size); - *(uint64_t*)host_data =3D tswap64(*(uint64_t*)argptr); - break; - case DM_TABLE_LOAD: - { - void *gspec =3D argptr; - void *cur_data =3D host_data; - const argtype arg_type[] =3D { MK_STRUCT(STRUCT_dm_target_spec) }; - int spec_size =3D thunk_type_size(arg_type, 0); - int i; - - for (i =3D 0; i < host_dm->target_count; i++) { - struct dm_target_spec *spec =3D cur_data; - uint32_t next; - int slen; - - thunk_convert(spec, gspec, arg_type, THUNK_HOST); - slen =3D strlen((char*)gspec + spec_size) + 1; - next =3D spec->next; - spec->next =3D sizeof(*spec) + slen; - strcpy((char*)&spec[1], gspec + spec_size); - gspec +=3D next; - cur_data +=3D spec->next; - } - break; - } - default: - ret =3D -TARGET_EINVAL; - unlock_user(argptr, guest_data, 0); - goto out; - } - unlock_user(argptr, guest_data, 0); - - ret =3D get_errno(safe_ioctl(fd, ie->host_cmd, buf_temp)); - if (!is_error(ret)) { - guest_data =3D arg + host_dm->data_start; - guest_data_size =3D host_dm->data_size - host_dm->data_start; - argptr =3D lock_user(VERIFY_WRITE, guest_data, guest_data_size, 0); - switch (ie->host_cmd) { - case DM_REMOVE_ALL: - case DM_DEV_CREATE: - case DM_DEV_REMOVE: - case DM_DEV_RENAME: - case DM_DEV_SUSPEND: - case DM_DEV_STATUS: - case DM_TABLE_LOAD: - case DM_TABLE_CLEAR: - case DM_TARGET_MSG: - case DM_DEV_SET_GEOMETRY: - /* no return data */ - break; - case DM_LIST_DEVICES: - { - struct dm_name_list *nl =3D (void*)host_dm + host_dm->data_sta= rt; - uint32_t remaining_data =3D guest_data_size; - void *cur_data =3D argptr; - const argtype arg_type[] =3D { MK_STRUCT(STRUCT_dm_name_list) = }; - int nl_size =3D 12; /* can't use thunk_size due to alignment */ - - while (1) { - uint32_t next =3D nl->next; - if (next) { - nl->next =3D nl_size + (strlen(nl->name) + 1); - } - if (remaining_data < nl->next) { - host_dm->flags |=3D DM_BUFFER_FULL_FLAG; - break; - } - thunk_convert(cur_data, nl, arg_type, THUNK_TARGET); - strcpy(cur_data + nl_size, nl->name); - cur_data +=3D nl->next; - remaining_data -=3D nl->next; - if (!next) { - break; - } - nl =3D (void*)nl + next; - } - break; - } - case DM_DEV_WAIT: - case DM_TABLE_STATUS: - { - struct dm_target_spec *spec =3D (void*)host_dm + host_dm->data= _start; - void *cur_data =3D argptr; - const argtype arg_type[] =3D { MK_STRUCT(STRUCT_dm_target_spec= ) }; - int spec_size =3D thunk_type_size(arg_type, 0); - int i; - - for (i =3D 0; i < host_dm->target_count; i++) { - uint32_t next =3D spec->next; - int slen =3D strlen((char*)&spec[1]) + 1; - spec->next =3D (cur_data - argptr) + spec_size + slen; - if (guest_data_size < spec->next) { - host_dm->flags |=3D DM_BUFFER_FULL_FLAG; - break; - } - thunk_convert(cur_data, spec, arg_type, THUNK_TARGET); - strcpy(cur_data + spec_size, (char*)&spec[1]); - cur_data =3D argptr + spec->next; - spec =3D (void*)host_dm + host_dm->data_start + next; - } - break; - } - case DM_TABLE_DEPS: - { - void *hdata =3D (void*)host_dm + host_dm->data_start; - int count =3D *(uint32_t*)hdata; - uint64_t *hdev =3D hdata + 8; - uint64_t *gdev =3D argptr + 8; - int i; - - *(uint32_t*)argptr =3D tswap32(count); - for (i =3D 0; i < count; i++) { - *gdev =3D tswap64(*hdev); - gdev++; - hdev++; - } - break; - } - case DM_LIST_VERSIONS: - { - struct dm_target_versions *vers =3D (void*)host_dm + host_dm->= data_start; - uint32_t remaining_data =3D guest_data_size; - void *cur_data =3D argptr; - const argtype arg_type[] =3D { MK_STRUCT(STRUCT_dm_target_vers= ions) }; - int vers_size =3D thunk_type_size(arg_type, 0); - - while (1) { - uint32_t next =3D vers->next; - if (next) { - vers->next =3D vers_size + (strlen(vers->name) + 1); - } - if (remaining_data < vers->next) { - host_dm->flags |=3D DM_BUFFER_FULL_FLAG; - break; - } - thunk_convert(cur_data, vers, arg_type, THUNK_TARGET); - strcpy(cur_data + vers_size, vers->name); - cur_data +=3D vers->next; - remaining_data -=3D vers->next; - if (!next) { - break; - } - vers =3D (void*)vers + next; - } - break; - } - default: - unlock_user(argptr, guest_data, 0); - ret =3D -TARGET_EINVAL; - goto out; - } - unlock_user(argptr, guest_data, guest_data_size); - - argptr =3D lock_user(VERIFY_WRITE, arg, target_size, 0); - if (!argptr) { - ret =3D -TARGET_EFAULT; - goto out; - } - thunk_convert(argptr, buf_temp, arg_type, THUNK_TARGET); - unlock_user(argptr, arg, target_size); - } -out: - g_free(big_buf); - return ret; -} - -static abi_long do_ioctl_blkpg(const IOCTLEntry *ie, uint8_t *buf_temp, in= t fd, - int cmd, abi_long arg) -{ - void *argptr; - int target_size; - const argtype *arg_type =3D ie->arg_type; - const argtype part_arg_type[] =3D { MK_STRUCT(STRUCT_blkpg_partition) = }; - abi_long ret; - - struct blkpg_ioctl_arg *host_blkpg =3D (void*)buf_temp; - struct blkpg_partition host_part; - - /* Read and convert blkpg */ - arg_type++; - target_size =3D thunk_type_size(arg_type, 0); - argptr =3D lock_user(VERIFY_READ, arg, target_size, 1); - if (!argptr) { - ret =3D -TARGET_EFAULT; - goto out; - } - thunk_convert(buf_temp, argptr, arg_type, THUNK_HOST); - unlock_user(argptr, arg, 0); - - switch (host_blkpg->op) { - case BLKPG_ADD_PARTITION: - case BLKPG_DEL_PARTITION: - /* payload is struct blkpg_partition */ - break; - default: - /* Unknown opcode */ - ret =3D -TARGET_EINVAL; - goto out; - } - - /* Read and convert blkpg->data */ - arg =3D (abi_long)(uintptr_t)host_blkpg->data; - target_size =3D thunk_type_size(part_arg_type, 0); - argptr =3D lock_user(VERIFY_READ, arg, target_size, 1); - if (!argptr) { - ret =3D -TARGET_EFAULT; - goto out; - } - thunk_convert(&host_part, argptr, part_arg_type, THUNK_HOST); - unlock_user(argptr, arg, 0); - - /* Swizzle the data pointer to our local copy and call! */ - host_blkpg->data =3D &host_part; - ret =3D get_errno(safe_ioctl(fd, ie->host_cmd, host_blkpg)); - -out: - return ret; -} - -static abi_long do_ioctl_rt(const IOCTLEntry *ie, uint8_t *buf_temp, - int fd, int cmd, abi_long arg) -{ - const argtype *arg_type =3D ie->arg_type; - const StructEntry *se; - const argtype *field_types; - const int *dst_offsets, *src_offsets; - int target_size; - void *argptr; - abi_ulong *target_rt_dev_ptr =3D NULL; - unsigned long *host_rt_dev_ptr =3D NULL; - abi_long ret; - int i; - - assert(ie->access =3D=3D IOC_W); - assert(*arg_type =3D=3D TYPE_PTR); - arg_type++; - assert(*arg_type =3D=3D TYPE_STRUCT); - target_size =3D thunk_type_size(arg_type, 0); - argptr =3D lock_user(VERIFY_READ, arg, target_size, 1); - if (!argptr) { - return -TARGET_EFAULT; - } - arg_type++; - assert(*arg_type =3D=3D (int)STRUCT_rtentry); - se =3D struct_entries + *arg_type++; - assert(se->convert[0] =3D=3D NULL); - /* convert struct here to be able to catch rt_dev string */ - field_types =3D se->field_types; - dst_offsets =3D se->field_offsets[THUNK_HOST]; - src_offsets =3D se->field_offsets[THUNK_TARGET]; - for (i =3D 0; i < se->nb_fields; i++) { - if (dst_offsets[i] =3D=3D offsetof(struct rtentry, rt_dev)) { - assert(*field_types =3D=3D TYPE_PTRVOID); - target_rt_dev_ptr =3D (abi_ulong *)(argptr + src_offsets[i]); - host_rt_dev_ptr =3D (unsigned long *)(buf_temp + dst_offsets[i= ]); - if (*target_rt_dev_ptr !=3D 0) { - *host_rt_dev_ptr =3D (unsigned long)lock_user_string( - tswapal(*target_rt_dev_p= tr)); - if (!*host_rt_dev_ptr) { - unlock_user(argptr, arg, 0); - return -TARGET_EFAULT; - } - } else { - *host_rt_dev_ptr =3D 0; - } - field_types++; - continue; - } - field_types =3D thunk_convert(buf_temp + dst_offsets[i], - argptr + src_offsets[i], - field_types, THUNK_HOST); - } - unlock_user(argptr, arg, 0); - - ret =3D get_errno(safe_ioctl(fd, ie->host_cmd, buf_temp)); - - assert(host_rt_dev_ptr !=3D NULL); - assert(target_rt_dev_ptr !=3D NULL); - if (*host_rt_dev_ptr !=3D 0) { - unlock_user((void *)*host_rt_dev_ptr, - *target_rt_dev_ptr, 0); - } - return ret; -} - -static abi_long do_ioctl_kdsigaccept(const IOCTLEntry *ie, uint8_t *buf_te= mp, - int fd, int cmd, abi_long arg) -{ - int sig =3D target_to_host_signal(arg); - return get_errno(safe_ioctl(fd, ie->host_cmd, sig)); -} - -#ifdef TIOCGPTPEER -static abi_long do_ioctl_tiocgptpeer(const IOCTLEntry *ie, uint8_t *buf_te= mp, - int fd, int cmd, abi_long arg) -{ - int flags =3D target_to_host_bitmask(arg, fcntl_flags_tbl); - return get_errno(safe_ioctl(fd, ie->host_cmd, flags)); -} -#endif - -static IOCTLEntry ioctl_entries[] =3D { -#define IOCTL(cmd, access, ...) \ - { TARGET_ ## cmd, cmd, #cmd, access, 0, { __VA_ARGS__ } }, -#define IOCTL_SPECIAL(cmd, access, dofn, ...) \ - { TARGET_ ## cmd, cmd, #cmd, access, dofn, { __VA_ARGS__ } }, -#define IOCTL_IGNORE(cmd) \ - { TARGET_ ## cmd, 0, #cmd }, -#include "ioctls.h" - { 0, 0, }, -}; - -/* ??? Implement proper locking for ioctls. */ -/* do_ioctl() Must return target values and target errnos. */ -static abi_long do_ioctl(int fd, int cmd, abi_long arg) -{ - const IOCTLEntry *ie; - const argtype *arg_type; - abi_long ret; - uint8_t buf_temp[MAX_STRUCT_SIZE]; - int target_size; - void *argptr; - - ie =3D ioctl_entries; - for(;;) { - if (ie->target_cmd =3D=3D 0) { - gemu_log("Unsupported ioctl: cmd=3D0x%04lx\n", (long)cmd); - return -TARGET_ENOSYS; - } - if (ie->target_cmd =3D=3D cmd) - break; - ie++; - } - arg_type =3D ie->arg_type; - if (ie->do_ioctl) { - return ie->do_ioctl(ie, buf_temp, fd, cmd, arg); - } else if (!ie->host_cmd) { - /* Some architectures define BSD ioctls in their headers - that are not implemented in Linux. */ - return -TARGET_ENOSYS; - } - - switch(arg_type[0]) { - case TYPE_NULL: - /* no argument */ - ret =3D get_errno(safe_ioctl(fd, ie->host_cmd)); - break; - case TYPE_PTRVOID: - case TYPE_INT: - ret =3D get_errno(safe_ioctl(fd, ie->host_cmd, arg)); - break; - case TYPE_PTR: - arg_type++; - target_size =3D thunk_type_size(arg_type, 0); - switch(ie->access) { - case IOC_R: - ret =3D get_errno(safe_ioctl(fd, ie->host_cmd, buf_temp)); - if (!is_error(ret)) { - argptr =3D lock_user(VERIFY_WRITE, arg, target_size, 0); - if (!argptr) - return -TARGET_EFAULT; - thunk_convert(argptr, buf_temp, arg_type, THUNK_TARGET); - unlock_user(argptr, arg, target_size); - } - break; - case IOC_W: - argptr =3D lock_user(VERIFY_READ, arg, target_size, 1); - if (!argptr) - return -TARGET_EFAULT; - thunk_convert(buf_temp, argptr, arg_type, THUNK_HOST); - unlock_user(argptr, arg, 0); - ret =3D get_errno(safe_ioctl(fd, ie->host_cmd, buf_temp)); - break; - default: - case IOC_RW: - argptr =3D lock_user(VERIFY_READ, arg, target_size, 1); - if (!argptr) - return -TARGET_EFAULT; - thunk_convert(buf_temp, argptr, arg_type, THUNK_HOST); - unlock_user(argptr, arg, 0); - ret =3D get_errno(safe_ioctl(fd, ie->host_cmd, buf_temp)); - if (!is_error(ret)) { - argptr =3D lock_user(VERIFY_WRITE, arg, target_size, 0); - if (!argptr) - return -TARGET_EFAULT; - thunk_convert(argptr, buf_temp, arg_type, THUNK_TARGET); - unlock_user(argptr, arg, target_size); - } - break; - } - break; - default: - gemu_log("Unsupported ioctl type: cmd=3D0x%04lx type=3D%d\n", - (long)cmd, arg_type[0]); - ret =3D -TARGET_ENOSYS; - break; - } - return ret; -} - static const bitmask_transtbl iflag_tbl[] =3D { { TARGET_IGNBRK, TARGET_IGNBRK, IGNBRK, IGNBRK }, { TARGET_BRKINT, TARGET_BRKINT, BRKINT, BRKINT }, @@ -5294,8 +4445,6 @@ static abi_long do_syscall1(void *cpu_env, int num, a= bi_long arg1, void *p; =20 switch(num) { - case TARGET_NR_ioctl: - return do_ioctl(arg1, arg2, arg3); #ifdef TARGET_NR_fcntl case TARGET_NR_fcntl: return do_fcntl(arg1, arg2, arg3); @@ -8900,6 +8049,7 @@ static abi_long do_syscall1(void *cpu_env, int num, a= bi_long arg1, int64_t arg5, int64_t arg6) =20 #include "syscall-file.inc.c" +#include "syscall-ioctl.inc.c" #include "syscall-ipc.inc.c" #include "syscall-mem.inc.c" #include "syscall-proc.inc.c" diff --git a/linux-user/strace.list b/linux-user/strace.list index ce5e02975b..efc64cd29f 100644 --- a/linux-user/strace.list +++ b/linux-user/strace.list @@ -365,9 +365,6 @@ #ifdef TARGET_NR_io_cancel { TARGET_NR_io_cancel, "io_cancel" , NULL, NULL, NULL }, #endif -#ifdef TARGET_NR_ioctl -{ TARGET_NR_ioctl, "ioctl" , NULL, NULL, NULL }, -#endif #ifdef TARGET_NR_io_destroy { TARGET_NR_io_destroy, "io_destroy" , NULL, NULL, NULL }, #endif --=20 2.17.1 From nobody Thu May 9 22:44:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1558301243; cv=none; d=zoho.com; s=zohoarc; b=iALQwq6k8gOvbzLfsY6TMY6qcedYMqibrsaAa2o9qtNWqLtIaBP+RuHLpE1dK1sLD7cNpKFOj1eCHsbgM0mnvpU0qjoRLAyn33YaTawyXWyANHusGIlFu5DAutHq2BFcppg3DLtJYX+osiNu0O6F2h8/nsGnnBNPlSKDQ1zdWuk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1558301243; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=OfeoJQTtaaK+fPbdLfxvz94gE9h/4wGKMQdWOeJxa7o=; b=lhY2SgkSHL9pVjMQdiTwBje+BLziAKU8kD12f3fRwD392zVt3/LqYQZ5XewQPIlpbcmwDhHIvwyPWn7hKsYXvNq+8XpVDUZRgRSsR0eWYHGjfZwm5hfe+9y1AqcN1RJ+G6qeChHPPFmyEaeNJjiCCrY7geRt28+y3SWwc1nh8Pw= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1558301243355244.7938961996383; Sun, 19 May 2019 14:27:23 -0700 (PDT) Received: from localhost ([127.0.0.1]:53843 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSTKt-0003uu-Td for importer@patchew.org; Sun, 19 May 2019 17:27:15 -0400 Received: from eggs.gnu.org ([209.51.188.92]:50830) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSZk-0003kD-5D for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:33 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hSSZj-0004ZO-AB for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:32 -0400 Received: from mail-pg1-x542.google.com ([2607:f8b0:4864:20::542]:36052) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hSSZj-0004YN-2D for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:31 -0400 Received: by mail-pg1-x542.google.com with SMTP id a3so5748173pgb.3 for ; Sun, 19 May 2019 13:38:30 -0700 (PDT) Received: from localhost.localdomain (97-113-13-231.tukw.qwest.net. [97.113.13.231]) by smtp.gmail.com with ESMTPSA id i7sm11397448pfo.19.2019.05.19.13.38.28 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 19 May 2019 13:38:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=OfeoJQTtaaK+fPbdLfxvz94gE9h/4wGKMQdWOeJxa7o=; b=sPeEIANbnrlgFVXYdGYc7ADETYF1JqEBXSg3MaLO1/2o1TFntMnojX27kpBoZZ0gbi BSrF1n2tEQ+0yhucLw6GH0mRAl1waOF9Cq2eRw2MDz5RLTxdI8HZUAGJk9+d4c1+0t9z w8u4MkDvj9E7lia3E3lFOY2urYQrqQPHj/mzQL484aSqCN6fyKk4S+YhVFOjof+ukLRZ McSUwzu/O2I8HUkMBEYGp2GAsWGoH0nFgG9iqSAzkDKFjWWtEpnrKJ3KF1jRZb7kh5gb eZzBWwCqG2/4dR5p+cPu4mMdHBc4Ap5Y+xz7xTx2k0Dl/6welJA1vVsB7YkavwAILplN Ndgw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=OfeoJQTtaaK+fPbdLfxvz94gE9h/4wGKMQdWOeJxa7o=; b=Ej8FlvOXY7/vYz5bUHM/iF2dg02ytiLTHxqsyIfQlXzBYguSQ+7qz5prTKU8gTiWFa xuRbWAaM9EjOayyq7P7r9CQlk9d9e0xdjsWf96yuortLHTNB1enYmwRosMU1bo/nA1fc v6UBrZnmVBMllbSdgYqp8gJGK/OL04MHv7ALeDuAK5wEINdm2zZnXIcjNrkjbHi22rh9 v/sFGU32I/ishYlZNnJiTpVlhzfkqT2zcHKbHWGru1rWQH3BIB05pKWaSvMpDz9t9iF9 fJBJs9f9HK/WZsvBm7HuidLYAGXlx0UuD/jvdFE2b03JnL6T8mD0+gkPP64MiLmeG392 2M0w== X-Gm-Message-State: APjAAAWJKpFG1oCsO/nWLkEagguwPB+Zh/mdC4I+H2/+4wxkT29rexPX d+n1hstQRT6vwiF4KKFEfQLTYCWWaTM= X-Google-Smtp-Source: APXvYqzrqZExyA59sB7DrQH2X9YeYoMfdcVjwdhUBf8yUiY9NieV6iG3vEVpYLERymKdxaGqy1KtbQ== X-Received: by 2002:a63:1a03:: with SMTP id a3mr72009716pga.412.1558298309801; Sun, 19 May 2019 13:38:29 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sun, 19 May 2019 13:37:00 -0700 Message-Id: <20190519203726.20729-49-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190519203726.20729-1-richard.henderson@linaro.org> References: <20190519203726.20729-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::542 Subject: [Qemu-devel] [PATCH v7 48/74] linux-user: Fix types in ioctl logging X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: laurent@vivier.eu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" There is no need to cast "int" to "long"; just use the correct format in the first place. Signed-off-by: Richard Henderson --- linux-user/syscall-ioctl.inc.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/linux-user/syscall-ioctl.inc.c b/linux-user/syscall-ioctl.inc.c index be3f0b4b92..15d87b9663 100644 --- a/linux-user/syscall-ioctl.inc.c +++ b/linux-user/syscall-ioctl.inc.c @@ -791,7 +791,7 @@ SYSCALL_IMPL(ioctl) =20 for (ie =3D ioctl_entries; ; ie++) { if (ie->target_cmd =3D=3D 0) { - gemu_log("Unsupported ioctl: cmd=3D0x%04lx\n", (long)cmd); + gemu_log("Unsupported ioctl: cmd=3D0x%04x\n", cmd); return -TARGET_ENOSYS; } if (ie->target_cmd =3D=3D cmd) { @@ -864,8 +864,8 @@ SYSCALL_IMPL(ioctl) } break; default: - gemu_log("Unsupported ioctl type: cmd=3D0x%04lx type=3D%d\n", - (long)cmd, arg_type[0]); + gemu_log("Unsupported ioctl type: cmd=3D0x%04x type=3D%d\n", + cmd, arg_type[0]); ret =3D -TARGET_ENOSYS; break; } --=20 2.17.1 From nobody Thu May 9 22:44:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1558302362; cv=none; d=zoho.com; s=zohoarc; b=VLpjjJ0buAj5O9bVo00BlUPEFXfEOVr+h71aFF77jJpeqmNvLkPFFTmz2LNkg/iMrifbw/2pzQY7rERCMVyiwiyXm1pjY81Y8AVlrdwuNkfCgtxrd3UdJ9KoEwdjYwrJ4jd0XvwHUo5AErphm83Yatlm+IYkfGY61Rm7ZcGjuPU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1558302362; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=gMLsvL1jnb8FN6BVtc8z8p85LWUNX5tvXcqS5qNVubg=; b=i4dTp6HdiKUqD/aukyii8TZJ/T2Y+vpHVQAL06J6pJjdAKsSKnuBnRpUJCxmndZK2PiwmQLO0DfJ/4D9PRQ8grThH3VyROLiGHAzte7YBTOSTVK3OktW7BJm0AjBGdlbuMfXLJyA/6VwDgAMDyOMgFQvR/jNUe9delU8QnvhnBQ= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1558302362632261.68287089864543; Sun, 19 May 2019 14:46:02 -0700 (PDT) Received: from localhost ([127.0.0.1]:53641 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hST9K-0001ZL-H0 for importer@patchew.org; Sun, 19 May 2019 17:15:18 -0400 Received: from eggs.gnu.org ([209.51.188.92]:50841) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSZl-0003ky-43 for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:34 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hSSZk-0004aU-7h for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:33 -0400 Received: from mail-pg1-x542.google.com ([2607:f8b0:4864:20::542]:34655) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hSSZk-0004Ze-23 for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:32 -0400 Received: by mail-pg1-x542.google.com with SMTP id c13so5748150pgt.1 for ; Sun, 19 May 2019 13:38:31 -0700 (PDT) Received: from localhost.localdomain (97-113-13-231.tukw.qwest.net. [97.113.13.231]) by smtp.gmail.com with ESMTPSA id i7sm11397448pfo.19.2019.05.19.13.38.29 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 19 May 2019 13:38:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=gMLsvL1jnb8FN6BVtc8z8p85LWUNX5tvXcqS5qNVubg=; b=H/24O4J2CtVeAW2bEmUi0Fq2daN8ycHshgm6J7xFzJ7+9qMyu9O9tLWXf3NtBSU9yd NsY59B95gfilKGxFAFHZliRhsqeBgw2nEGcatkoqFdD/DTfXeodTIAZIqJgqO2pMY5cB XEnqsbq1Q5zgWvyGN/sy/MKFc0OlfX9RzGDBH4Y41oPOXORWb0/efAvqoZqbBzGXGY4q i5MhimEObeT8gBBvfH16W7cbJJUmkvrYEueemJdx95zuWXTyPfZzhTB5I9r+CUpOAGzN v8zPUNAxDG1/jKY0tTeusQXXa4Z55b4M6pFABIyrIJAeEjUOIOI67dvzuhnfS29+j6Ta D6Cg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=gMLsvL1jnb8FN6BVtc8z8p85LWUNX5tvXcqS5qNVubg=; b=bJLbH4K5mEAo+KEp7hiwjai00NY7Df9gQNt0Ci4eXuQKs15yZFXXuEzWza2LFY5zc+ q0u4/KYMlZPd4O8yZDfDHFKAcR9O3wmHES7mRPB5kYNCE7nwtwegROVX36AnKbn6GiSf MrmkV5gluHTLd3YX2cGjqSqgQuQKULOUIhY7M2FjwBB1OgqvhsSApbhsmkq85G1lQneI ILGi07VpJV8sZWaINEboWXogU7ZywIlDIWMtWDvZWOmQB/s2DX2wiRSLE8mNlNZ5J1d6 LNJYOp5HLaAGW/Nq5bOKVVVM6m/WmguH/p93JhzTSAFnszYGfAUYzNuB3zzBtLznq7aA szrA== X-Gm-Message-State: APjAAAVKSApRYxdc46gEW4/dzL4eeSoXr7FvgARlhEUUuppwvfvUQyjj INR2itbXC10Pd240TU53pajAzY0hkgo= X-Google-Smtp-Source: APXvYqxfrYyCwBN3w09kV6HKf9URW7pgmL+3V2yt30ScS6fR2hwpT+tVBGMBvbMuVqjJlZaayV8sxQ== X-Received: by 2002:a63:d045:: with SMTP id s5mr8723728pgi.199.1558298310842; Sun, 19 May 2019 13:38:30 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sun, 19 May 2019 13:37:01 -0700 Message-Id: <20190519203726.20729-50-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190519203726.20729-1-richard.henderson@linaro.org> References: <20190519203726.20729-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::542 Subject: [Qemu-devel] [PATCH v7 49/74] linux-user: Remove sentinel from ioctl_entries X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: laurent@vivier.eu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Iterate based on the size of the array instead. Signed-off-by: Richard Henderson --- linux-user/syscall-ioctl.inc.c | 14 +++++++------- linux-user/syscall.c | 6 ++---- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/linux-user/syscall-ioctl.inc.c b/linux-user/syscall-ioctl.inc.c index 15d87b9663..fc7df62017 100644 --- a/linux-user/syscall-ioctl.inc.c +++ b/linux-user/syscall-ioctl.inc.c @@ -773,7 +773,6 @@ static IOCTLEntry ioctl_entries[] =3D { #define IOCTL_IGNORE(cmd) \ { TARGET_ ## cmd, 0, #cmd }, #include "ioctls.h" - { 0, 0, }, }; =20 /* ??? Implement proper locking for ioctls. */ @@ -789,16 +788,17 @@ SYSCALL_IMPL(ioctl) int target_size; void *argptr; =20 - for (ie =3D ioctl_entries; ; ie++) { - if (ie->target_cmd =3D=3D 0) { - gemu_log("Unsupported ioctl: cmd=3D0x%04x\n", cmd); - return -TARGET_ENOSYS; - } + for (ie =3D ioctl_entries; + ie < ioctl_entries + ARRAY_SIZE(ioctl_entries); + ie++) { if (ie->target_cmd =3D=3D cmd) { - break; + goto found; } } + gemu_log("Unsupported ioctl: cmd=3D0x%04x\n", cmd); + return -TARGET_ENOSYS; =20 + found: arg_type =3D ie->arg_type; if (ie->do_ioctl) { return ie->do_ioctl(ie, buf_temp, fd, cmd, arg); diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 8f90affe2f..5871d3e711 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -8173,7 +8173,6 @@ abi_long do_syscall(void *cpu_env, int num, abi_long = arg1, =20 void syscall_init(void) { - IOCTLEntry *ie; const argtype *arg_type; int size; int i; @@ -8203,8 +8202,8 @@ void syscall_init(void) * We patch the ioctl size if necessary. We rely on the fact that * no ioctl has all the bits at '1' in the size field. */ - ie =3D ioctl_entries; - while (ie->target_cmd !=3D 0) { + for (i =3D 0; i < ARRAY_SIZE(ioctl_entries); i++) { + IOCTLEntry *ie =3D &ioctl_entries[i]; if (((ie->target_cmd >> TARGET_IOC_SIZESHIFT) & TARGET_IOC_SIZEMAS= K) =3D=3D TARGET_IOC_SIZEMASK) { arg_type =3D ie->arg_type; @@ -8228,6 +8227,5 @@ void syscall_init(void) ie->name, ie->target_cmd, ie->host_cmd); } #endif - ie++; } } --=20 2.17.1 From nobody Thu May 9 22:44:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1558300424; cv=none; d=zoho.com; s=zohoarc; b=bU8FlFdu+giSpI3ofbCifwcVmQqPXM0RBiECokcmTQ7oT2Ny0SoUbc+ALLB3Ti+7xfFzcp/1fp1Hwg+gf3AGrIXlMqwAv+ojRygyXc1hEK9pKNPPM0gq3cDBurDaHPAqeHP/IFyADsfuTpjtHQsVqpzqTuf7stPorIYDDVXfCr4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1558300424; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=eI/KXLTeyrTJ11b57PtRyAzuENF86hpTnzEthpS7ZMU=; b=UKoryo5gloEZocJfrE3Q/BLZoW+aGj/72PSl7WF2X/uYvTJx2LcJtjd8z1Ecg5kvNonW6b10+I7MmnfQLFHjqid7tr9UeLJKoSgCneSD3OaV9b2A/xFSvM4N71EuftpmfS8BrdmMcAfcm0P9JhUtkpw9bOj2Czch5BILHNJNp9o= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (209.51.188.17 [209.51.188.17]) by mx.zohomail.com with SMTPS id 15583004247820.09360756067928833; Sun, 19 May 2019 14:13:44 -0700 (PDT) Received: from localhost ([127.0.0.1]:53622 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hST7i-0008Uj-BI for importer@patchew.org; Sun, 19 May 2019 17:13:38 -0400 Received: from eggs.gnu.org ([209.51.188.92]:50873) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSZo-0003oM-Aj for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:42 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hSSZl-0004cE-QM for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:36 -0400 Received: from mail-pl1-x641.google.com ([2607:f8b0:4864:20::641]:35575) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hSSZl-0004bI-H1 for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:33 -0400 Received: by mail-pl1-x641.google.com with SMTP id p1so336660plo.2 for ; Sun, 19 May 2019 13:38:33 -0700 (PDT) Received: from localhost.localdomain (97-113-13-231.tukw.qwest.net. [97.113.13.231]) by smtp.gmail.com with ESMTPSA id i7sm11397448pfo.19.2019.05.19.13.38.30 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 19 May 2019 13:38:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=eI/KXLTeyrTJ11b57PtRyAzuENF86hpTnzEthpS7ZMU=; b=LVHq3gzL7T6nq08NBGyiK7jj/CMP7oRPLB8kcKYQLSzaCna94KiTQOgmCe3gb5FyaY v185tzlZmOiTzVKDV4kh0gNYQhPK5Nf9YnxHv+uTzEyrIAmX9Sy2ITzIDGBTS1ls0tDT dvCMibCX2RAqfj1zXaB970fiykEjbazbPxPqqrHL1SmnNh6+e/g9B+tGLbt2buTZw+7d kZceQ+1hHD5yVNyEsMthkmthQAM5QYtIdGI1qBfxRThGUUGZQzUfBoblQjYLGab+t8CP xo3O+vfRKgZCFcZ5iAJUOoSn+CXCE0DQ6TC/f5qfjPRvsZCzKX9nS1oWLJdKpFy919f+ /NZw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=eI/KXLTeyrTJ11b57PtRyAzuENF86hpTnzEthpS7ZMU=; b=R/1YQuotoGzAG5do+OGbnfolMUtTjhMykd7Dz0LyHaL8xxHlbvnCW//l/5LvV4u/zc irnvetfVLW2X/wSO3sZvLqxpy0j9xxmCVnHWewDsN6w7gztIWmvvb8zciMPRLQWjxgZ8 M7JtiU3qvPjDu2vwbhOXVmF11Gbz/q9N0n4KCTm7vlJqS734atj2ly5jws/0HNkN2EL2 aQul86GY3L8cZmYQfKcoLK/DJny0Zu5UhQ+JpOOR0eialvEcBh55z5zUPJJiOwj5oWiF d74Oat6LJDps8mBaDS/FZRYQX87GkNmsnx2XNG6v8oJuf3FKOLDQuijfxJzZ+ofYFFPi HyXg== X-Gm-Message-State: APjAAAV3OIw0jU7PLOv58hmAEYBQprWsQz4KRo0ANFY8skx9rheS7Rwj meXjC3/YM8U4Wiu5yZxg9R/JrblHFS4= X-Google-Smtp-Source: APXvYqzrmHqEVoKzAJT6AYL7/ZUUsDX5Be0mKK6aeLADeIlZInKCe2k3i0svEgGbaSgSiILbtpYE9Q== X-Received: by 2002:a17:902:2bc9:: with SMTP id l67mr35899892plb.171.1558298312041; Sun, 19 May 2019 13:38:32 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sun, 19 May 2019 13:37:02 -0700 Message-Id: <20190519203726.20729-51-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190519203726.20729-1-richard.henderson@linaro.org> References: <20190519203726.20729-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::641 Subject: [Qemu-devel] [PATCH v7 50/74] linux-user: Split out fcntl, fcntl64 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: laurent@vivier.eu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Preserving strace functionality is tricky with this one. Rearrange to lookup structures that contain the data for both execution and strace for each command. Do not allow lookup of 64-bit fcntl commands from 32-bit fcntl. Signed-off-by: Richard Henderson --- linux-user/syscall-defs.h | 6 + linux-user/strace.c | 100 ---------- linux-user/syscall-fcntl.inc.c | 322 +++++++++++++++++++++++++++++++++ linux-user/syscall.c | 256 +------------------------- linux-user/strace.list | 6 - 5 files changed, 329 insertions(+), 361 deletions(-) create mode 100644 linux-user/syscall-fcntl.inc.c diff --git a/linux-user/syscall-defs.h b/linux-user/syscall-defs.h index f58b9745a4..5cf39f2bb9 100644 --- a/linux-user/syscall-defs.h +++ b/linux-user/syscall-defs.h @@ -46,6 +46,12 @@ SYSCALL_DEF(execveat, ARG_ATDIRFD, ARG_STR, ARG_PTR, ARG= _PTR, ARG_ATFLAG); SYSCALL_DEF(faccessat, ARG_ATDIRFD, ARG_STR, ARG_ACCESSFLAG); SYSCALL_DEF(fchmod, ARG_DEC, ARG_MODEFLAG); SYSCALL_DEF(fchmodat, ARG_ATDIRFD, ARG_STR, ARG_MODEFLAG); +#ifdef TARGET_NR_fcntl +SYSCALL_DEF_FULL(fcntl, .impl =3D impl_fcntl, .print =3D print_fcntl); +#endif +#if TARGET_ABI_BITS =3D=3D 32 +SYSCALL_DEF_FULL(fcntl64, .impl =3D impl_fcntl64, .print =3D print_fcntl64= ); +#endif #ifdef TARGET_NR_futimesat SYSCALL_DEF(futimesat, ARG_ATDIRFD, ARG_STR, ARG_PTR); #endif diff --git a/linux-user/strace.c b/linux-user/strace.c index 2b31998dbd..560284b3c3 100644 --- a/linux-user/strace.c +++ b/linux-user/strace.c @@ -1184,106 +1184,6 @@ print_fchownat(const struct syscallname *name, } #endif =20 -#if defined(TARGET_NR_fcntl) || defined(TARGET_NR_fcntl64) -static void -print_fcntl(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - print_syscall_prologue(name); - print_raw_param("%d", arg0, 0); - switch(arg1) { - case TARGET_F_DUPFD: - gemu_log("F_DUPFD,"); - print_raw_param(TARGET_ABI_FMT_ld, arg2, 1); - break; - case TARGET_F_GETFD: - gemu_log("F_GETFD"); - break; - case TARGET_F_SETFD: - gemu_log("F_SETFD,"); - print_raw_param(TARGET_ABI_FMT_ld, arg2, 1); - break; - case TARGET_F_GETFL: - gemu_log("F_GETFL"); - break; - case TARGET_F_SETFL: - gemu_log("F_SETFL,"); - print_open_flags(arg2, 1); - break; - case TARGET_F_GETLK: - gemu_log("F_GETLK,"); - print_pointer(arg2, 1); - break; - case TARGET_F_SETLK: - gemu_log("F_SETLK,"); - print_pointer(arg2, 1); - break; - case TARGET_F_SETLKW: - gemu_log("F_SETLKW,"); - print_pointer(arg2, 1); - break; - case TARGET_F_GETOWN: - gemu_log("F_GETOWN"); - break; - case TARGET_F_SETOWN: - gemu_log("F_SETOWN,"); - print_raw_param(TARGET_ABI_FMT_ld, arg2, 0); - break; - case TARGET_F_GETSIG: - gemu_log("F_GETSIG"); - break; - case TARGET_F_SETSIG: - gemu_log("F_SETSIG,"); - print_raw_param(TARGET_ABI_FMT_ld, arg2, 0); - break; -#if TARGET_ABI_BITS =3D=3D 32 - case TARGET_F_GETLK64: - gemu_log("F_GETLK64,"); - print_pointer(arg2, 1); - break; - case TARGET_F_SETLK64: - gemu_log("F_SETLK64,"); - print_pointer(arg2, 1); - break; - case TARGET_F_SETLKW64: - gemu_log("F_SETLKW64,"); - print_pointer(arg2, 1); - break; -#endif - case TARGET_F_SETLEASE: - gemu_log("F_SETLEASE,"); - print_raw_param(TARGET_ABI_FMT_ld, arg2, 0); - break; - case TARGET_F_GETLEASE: - gemu_log("F_GETLEASE"); - break; - case TARGET_F_SETPIPE_SZ: - gemu_log("F_SETPIPE_SZ,"); - print_raw_param(TARGET_ABI_FMT_ld, arg2, 1); - break; - case TARGET_F_GETPIPE_SZ: - gemu_log("F_GETPIPE_SZ"); - break; - case TARGET_F_DUPFD_CLOEXEC: - gemu_log("F_DUPFD_CLOEXEC,"); - print_raw_param(TARGET_ABI_FMT_ld, arg2, 1); - break; - case TARGET_F_NOTIFY: - gemu_log("F_NOTIFY,"); - print_raw_param(TARGET_ABI_FMT_ld, arg2, 0); - break; - default: - print_raw_param(TARGET_ABI_FMT_ld, arg1, 0); - print_pointer(arg2, 1); - break; - } - print_syscall_epilogue(name); -} -#define print_fcntl64 print_fcntl -#endif - - #if defined(TARGET_NR_socket) static void print_socket(const struct syscallname *name, diff --git a/linux-user/syscall-fcntl.inc.c b/linux-user/syscall-fcntl.inc.c new file mode 100644 index 0000000000..768682bd17 --- /dev/null +++ b/linux-user/syscall-fcntl.inc.c @@ -0,0 +1,322 @@ +/* + * Linux fcntl syscall implementation + * Copyright (c) 2003 Fabrice Bellard + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + */ + +typedef struct FcntlEntry FcntlEntry; + +typedef abi_long FcntlFn(int fd, int host_cmd, abi_long arg); + +struct FcntlEntry { + const char *name; + FcntlFn *host_fn; + int host_cmd; + SyscallArgType arg_type; +}; + +static abi_long do_fcntl_int(int fd, int host_cmd, abi_long arg) +{ + return get_errno(safe_fcntl(fd, host_cmd, arg)); +} + +static abi_long do_fcntl_getfl(int fd, int host_cmd, abi_long arg) +{ + abi_long ret =3D get_errno(safe_fcntl(fd, host_cmd)); + if (!is_error(ret)) { + ret =3D host_to_target_bitmask(ret, fcntl_flags_tbl); + } + return ret; +} + +static abi_long do_fcntl_setfl(int fd, int host_cmd, abi_long arg) +{ + return get_errno(safe_fcntl(fd, host_cmd, + target_to_host_bitmask(arg, fcntl_flags_tb= l))); +} + +static abi_long do_fcntl_getlk_1(int fd, int host_cmd, abi_long arg, + from_flock64_fn *copy_from, + to_flock64_fn *copy_to) +{ + struct flock64 fl64; + abi_long ret; + + ret =3D copy_from(&fl64, arg); + if (ret =3D=3D 0) { + ret =3D get_errno(safe_fcntl(fd, host_cmd, &fl64)); + if (ret =3D=3D 0) { + ret =3D copy_to(arg, &fl64); + } + } + return ret; +} + +static abi_long do_fcntl_setlk_1(int fd, int host_cmd, abi_long arg, + from_flock64_fn *copy_from) +{ + struct flock64 fl64; + abi_long ret; + + ret =3D copy_from(&fl64, arg); + if (ret =3D=3D 0) { + ret =3D get_errno(safe_fcntl(fd, host_cmd, &fl64)); + } + return ret; +} + +static abi_long do_fcntl_getlk(int fd, int cmd, abi_long arg) +{ + return do_fcntl_getlk_1(fd, cmd, arg, + copy_from_user_flock, + copy_to_user_flock); +} + +static abi_long do_fcntl_setlk(int fd, int cmd, abi_long arg) +{ + return do_fcntl_setlk_1(fd, cmd, arg, copy_from_user_flock); +} + +static abi_long do_fcntl_getlk64(int fd, int cmd, abi_long arg) +{ + return do_fcntl_getlk_1(fd, cmd, arg, + copy_from_user_flock64, + copy_to_user_flock64); +} + +static abi_long do_fcntl_setlk64(int fd, int cmd, abi_long arg) +{ + return do_fcntl_setlk_1(fd, cmd, arg, copy_from_user_flock64); +} + +#if defined(TARGET_ARM) && TARGET_ABI_BITS =3D=3D 32 +static abi_long do_fcntl_oabi_getlk64(int fd, int cmd, abi_long arg) +{ + return do_fcntl_getlk_1(fd, cmd, arg, + copy_from_user_oabi_flock64, + copy_to_user_oabi_flock64); +} + +static abi_long do_fcntl_oabi_setlk64(int fd, int cmd, abi_long arg) +{ + return do_fcntl_setlk_1(fd, cmd, arg, copy_from_user_oabi_flock64); +} +#endif /* TARGET_ARM */ + +#ifdef F_GETOWN_EX +static abi_long do_fcntl_getown_ex(int fd, int cmd, abi_long arg) +{ + struct f_owner_ex fox; + abi_long ret =3D get_errno(safe_fcntl(fd, cmd, &fox)); + + if (!is_error(ret)) { + struct target_f_owner_ex *target_fox; + if (!lock_user_struct(VERIFY_WRITE, target_fox, arg, 0)) { + return -TARGET_EFAULT; + } + target_fox->type =3D tswap32(fox.type); + target_fox->pid =3D tswap32(fox.pid); + unlock_user_struct(target_fox, arg, 1); + } + return ret; +} + +static abi_long do_fcntl_setown_ex(int fd, int cmd, abi_long arg) +{ + struct target_f_owner_ex *target_fox; + struct f_owner_ex fox; + + if (!lock_user_struct(VERIFY_READ, target_fox, arg, 1)) { + return -TARGET_EFAULT; + } + fox.type =3D tswap32(target_fox->type); + fox.pid =3D tswap32(target_fox->pid); + unlock_user_struct(target_fox, arg, 0); + return get_errno(safe_fcntl(fd, cmd, &fox)); +} +#endif /* F_GETOWN_EX */ + +static const FcntlEntry *target_fcntl_cmd(int cmd, int is_64) +{ +#define CMD2(T, H, A, FN) \ + case TARGET_##T: do { \ + static const FcntlEntry ent_##T =3D { \ + .name =3D #T, .host_cmd =3D H, .host_fn =3D FN, .arg_type =3D = A \ + }; \ + return &ent_##T; \ + } while(0) + +#define CMD1(T, A, FN) \ + case TARGET_##T: do { \ + static const FcntlEntry ent_##T =3D { \ + .name =3D #T, .host_cmd =3D T, .host_fn =3D FN, .arg_type =3D = A \ + }; \ + return &ent_##T; \ + } while(0) + +#if TARGET_ABI_BITS =3D=3D 64 +# ifdef __powerpc64__ +/* + * On PPC64, glibc headers has the F_*LK* defined to 12, 13 and 14 and + * is not supported by kernel. The glibc fcntl call actually adjusts + * them to 5, 6 and 7 before making the syscall(). Since we make the + * syscall directly, adjust to what is supported by the kernel. + */ +# define HOST_CMD_ADJ64(C) (C - (F_GETLK64 - 5)) +# else +# define HOST_CMD_ADJ64(C) C +# endif +# define CMD64(T, FN) \ + case TARGET_##T: do { \ + static const FcntlEntry ent_##T =3D { \ + .name =3D #T, .host_cmd =3D HOST_CMD_ADJ64(T), \ + .host_fn =3D do_fcntl_##FN, .arg_type =3D ARG_PTR \ + }; \ + return &ent_##T; \ + } while(0) +#elif defined(TARGET_ARM) +# define CMD64(T, FN) \ + case TARGET_##T: do { \ + if (!is_64) { \ + return NULL; \ + } else if (is_64 > 0) { \ + static const FcntlEntry ent_##T =3D { \ + .name =3D #T, .host_cmd =3D T, \ + .host_fn =3D do_fcntl_##FN, .arg_type =3D ARG_PTR \ + }; \ + return &ent_##T; \ + } else { \ + static const FcntlEntry ent_oabi_##T =3D { \ + .name =3D #T, .host_cmd =3D T, \ + .host_fn =3D do_fcntl_oabi_##FN, .arg_type =3D ARG_PTR \ + }; \ + return &ent_oabi_##T; \ + } \ + } while (0) +#else +# define CMD64(T, FN) \ + case TARGET_##T: do { \ + static const FcntlEntry ent_##T =3D { \ + .name =3D #T, .host_cmd =3D T, \ + .host_fn =3D do_fcntl_##FN, .arg_type =3D ARG_PTR \ + }; \ + return is_64 ? &ent_##T : NULL; \ + } while (0) +#endif + + switch (cmd) { + CMD1(F_DUPFD, ARG_DEC, do_fcntl_int); + CMD1(F_GETFD, ARG_NONE, do_fcntl_int); + CMD1(F_SETFD, ARG_DEC, do_fcntl_int); + CMD1(F_GETFL, ARG_NONE, do_fcntl_getfl); + CMD1(F_SETFL, ARG_DEC, do_fcntl_setfl); + + CMD2(F_GETLK, F_GETLK64, ARG_PTR, do_fcntl_getlk); + CMD2(F_SETLK, F_SETLK64, ARG_PTR, do_fcntl_setlk); + CMD2(F_SETLKW, F_SETLKW64, ARG_PTR, do_fcntl_setlk); + + CMD1(F_GETOWN, ARG_NONE, do_fcntl_int); + CMD1(F_SETOWN, ARG_DEC, do_fcntl_int); + CMD1(F_GETSIG, ARG_NONE, do_fcntl_int); + CMD1(F_SETSIG, ARG_DEC, do_fcntl_int); + + CMD64(F_GETLK64, getlk64); + CMD64(F_SETLK64, setlk64); + CMD64(F_SETLKW64, setlk64); + + CMD1(F_GETLEASE, ARG_NONE, do_fcntl_int); + CMD1(F_SETLEASE, ARG_DEC, do_fcntl_int); +#ifdef F_DUPFD_CLOEXEC + CMD1(F_DUPFD_CLOEXEC, ARG_DEC, do_fcntl_int); +#endif + CMD1(F_NOTIFY, ARG_DEC, do_fcntl_int); +#ifdef F_GETOWN_EX + CMD1(F_GETOWN_EX, ARG_PTR, do_fcntl_getown_ex); + CMD1(F_SETOWN_EX, ARG_PTR, do_fcntl_setown_ex); +#endif +#ifdef F_SETPIPE_SZ + CMD1(F_SETPIPE_SZ, ARG_DEC, do_fcntl_int); + CMD1(F_GETPIPE_SZ, ARG_DEC, do_fcntl_int); +#endif + } + return NULL; + +#undef CMD1 +#undef CMD2 +#undef CMD64 +#undef HOST_CMD_ADJ64 +} + +static abi_long do_fcntl(int fd, int target_cmd, abi_ulong arg, int is_64) +{ + const FcntlEntry *ent =3D target_fcntl_cmd(target_cmd, is_64); + + if (ent =3D=3D NULL) { + return -TARGET_EINVAL; + } + return ent->host_fn(fd, ent->host_cmd, arg); +} + +static void do_print_fcntl(const SyscallDef *def, int fd, int target_cmd, + abi_ulong arg, int is_64) +{ + const FcntlEntry *ent =3D target_fcntl_cmd(target_cmd, is_64); + + switch (ent->arg_type) { + case ARG_NONE: + gemu_log("%d %s(%d,%s)", getpid(), def->name, fd, ent->name); + break; + case ARG_DEC: + gemu_log("%d %s(%d,%s," TARGET_ABI_FMT_ld ")", + getpid(), def->name, fd, ent->name, arg); + break; + case ARG_PTR: + gemu_log("%d %s(%d,%s,0x" TARGET_ABI_FMT_lx ")", + getpid(), def->name, fd, ent->name, arg); + break; + default: + g_assert_not_reached(); + } +} + +#ifdef TARGET_NR_fcntl +SYSCALL_IMPL(fcntl) +{ + return do_fcntl(arg1, arg2, arg3, 0); +} + +static void print_fcntl(const SyscallDef *def, int64_t in[6]) +{ + return do_print_fcntl(def, in[0], in[1], in[2], 0); +} +#endif + +#if TARGET_ABI_BITS =3D=3D 32 +SYSCALL_IMPL(fcntl64) +{ + int is_64 =3D 1; +#ifdef TARGET_ARM + if (!cpu_env->eabi) { + is_64 =3D -1; + } +#endif + return do_fcntl(arg1, arg2, arg3, is_64); +} + +static void print_fcntl64(const SyscallDef *def, int64_t in[6]) +{ + return do_print_fcntl(def, in[0], in[1], in[2], 1); +} +#endif diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 5871d3e711..45fe05ac78 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -3513,102 +3513,6 @@ static void *clone_func(void *arg) return NULL; } =20 -/* warning : doesn't handle linux specific flags... */ -static int target_to_host_fcntl_cmd(int cmd) -{ - int ret; - - switch(cmd) { - case TARGET_F_DUPFD: - case TARGET_F_GETFD: - case TARGET_F_SETFD: - case TARGET_F_GETFL: - case TARGET_F_SETFL: - ret =3D cmd; - break; - case TARGET_F_GETLK: - ret =3D F_GETLK64; - break; - case TARGET_F_SETLK: - ret =3D F_SETLK64; - break; - case TARGET_F_SETLKW: - ret =3D F_SETLKW64; - break; - case TARGET_F_GETOWN: - ret =3D F_GETOWN; - break; - case TARGET_F_SETOWN: - ret =3D F_SETOWN; - break; - case TARGET_F_GETSIG: - ret =3D F_GETSIG; - break; - case TARGET_F_SETSIG: - ret =3D F_SETSIG; - break; -#if TARGET_ABI_BITS =3D=3D 32 - case TARGET_F_GETLK64: - ret =3D F_GETLK64; - break; - case TARGET_F_SETLK64: - ret =3D F_SETLK64; - break; - case TARGET_F_SETLKW64: - ret =3D F_SETLKW64; - break; -#endif - case TARGET_F_SETLEASE: - ret =3D F_SETLEASE; - break; - case TARGET_F_GETLEASE: - ret =3D F_GETLEASE; - break; -#ifdef F_DUPFD_CLOEXEC - case TARGET_F_DUPFD_CLOEXEC: - ret =3D F_DUPFD_CLOEXEC; - break; -#endif - case TARGET_F_NOTIFY: - ret =3D F_NOTIFY; - break; -#ifdef F_GETOWN_EX - case TARGET_F_GETOWN_EX: - ret =3D F_GETOWN_EX; - break; -#endif -#ifdef F_SETOWN_EX - case TARGET_F_SETOWN_EX: - ret =3D F_SETOWN_EX; - break; -#endif -#ifdef F_SETPIPE_SZ - case TARGET_F_SETPIPE_SZ: - ret =3D F_SETPIPE_SZ; - break; - case TARGET_F_GETPIPE_SZ: - ret =3D F_GETPIPE_SZ; - break; -#endif - default: - ret =3D -TARGET_EINVAL; - break; - } - -#if defined(__powerpc64__) - /* On PPC64, glibc headers has the F_*LK* defined to 12, 13 and 14 and - * is not supported by kernel. The glibc fcntl call actually adjusts - * them to 5, 6 and 7 before making the syscall(). Since we make the - * syscall directly, adjust to what is supported by the kernel. - */ - if (ret >=3D F_GETLK64 && ret <=3D F_SETLKW64) { - ret -=3D F_GETLK64 - 5; - } -#endif - - return ret; -} - #define FLOCK_TRANSTBL \ switch (type) { \ TRANSTBL_CONVERT(F_RDLCK); \ @@ -3774,114 +3678,6 @@ static inline abi_long copy_to_user_flock64(abi_ulo= ng target_flock_addr, return 0; } =20 -static abi_long do_fcntl(int fd, int cmd, abi_ulong arg) -{ - struct flock64 fl64; -#ifdef F_GETOWN_EX - struct f_owner_ex fox; - struct target_f_owner_ex *target_fox; -#endif - abi_long ret; - int host_cmd =3D target_to_host_fcntl_cmd(cmd); - - if (host_cmd =3D=3D -TARGET_EINVAL) - return host_cmd; - - switch(cmd) { - case TARGET_F_GETLK: - ret =3D copy_from_user_flock(&fl64, arg); - if (ret) { - return ret; - } - ret =3D get_errno(safe_fcntl(fd, host_cmd, &fl64)); - if (ret =3D=3D 0) { - ret =3D copy_to_user_flock(arg, &fl64); - } - break; - - case TARGET_F_SETLK: - case TARGET_F_SETLKW: - ret =3D copy_from_user_flock(&fl64, arg); - if (ret) { - return ret; - } - ret =3D get_errno(safe_fcntl(fd, host_cmd, &fl64)); - break; - - case TARGET_F_GETLK64: - ret =3D copy_from_user_flock64(&fl64, arg); - if (ret) { - return ret; - } - ret =3D get_errno(safe_fcntl(fd, host_cmd, &fl64)); - if (ret =3D=3D 0) { - ret =3D copy_to_user_flock64(arg, &fl64); - } - break; - case TARGET_F_SETLK64: - case TARGET_F_SETLKW64: - ret =3D copy_from_user_flock64(&fl64, arg); - if (ret) { - return ret; - } - ret =3D get_errno(safe_fcntl(fd, host_cmd, &fl64)); - break; - - case TARGET_F_GETFL: - ret =3D get_errno(safe_fcntl(fd, host_cmd, arg)); - if (ret >=3D 0) { - ret =3D host_to_target_bitmask(ret, fcntl_flags_tbl); - } - break; - - case TARGET_F_SETFL: - ret =3D get_errno(safe_fcntl(fd, host_cmd, - target_to_host_bitmask(arg, - fcntl_flags_tbl)= )); - break; - -#ifdef F_GETOWN_EX - case TARGET_F_GETOWN_EX: - ret =3D get_errno(safe_fcntl(fd, host_cmd, &fox)); - if (ret >=3D 0) { - if (!lock_user_struct(VERIFY_WRITE, target_fox, arg, 0)) - return -TARGET_EFAULT; - target_fox->type =3D tswap32(fox.type); - target_fox->pid =3D tswap32(fox.pid); - unlock_user_struct(target_fox, arg, 1); - } - break; -#endif - -#ifdef F_SETOWN_EX - case TARGET_F_SETOWN_EX: - if (!lock_user_struct(VERIFY_READ, target_fox, arg, 1)) - return -TARGET_EFAULT; - fox.type =3D tswap32(target_fox->type); - fox.pid =3D tswap32(target_fox->pid); - unlock_user_struct(target_fox, arg, 0); - ret =3D get_errno(safe_fcntl(fd, host_cmd, &fox)); - break; -#endif - - case TARGET_F_SETOWN: - case TARGET_F_GETOWN: - case TARGET_F_SETSIG: - case TARGET_F_GETSIG: - case TARGET_F_SETLEASE: - case TARGET_F_GETLEASE: - case TARGET_F_SETPIPE_SZ: - case TARGET_F_GETPIPE_SZ: - ret =3D get_errno(safe_fcntl(fd, host_cmd, arg)); - break; - - default: - ret =3D get_errno(safe_fcntl(fd, cmd, arg)); - break; - } - return ret; -} - #ifdef USE_UID16 =20 static inline int high2lowuid(int uid) @@ -4445,10 +4241,6 @@ static abi_long do_syscall1(void *cpu_env, int num, = abi_long arg1, void *p; =20 switch(num) { -#ifdef TARGET_NR_fcntl - case TARGET_NR_fcntl: - return do_fcntl(arg1, arg2, arg3); -#endif case TARGET_NR_setpgid: return get_errno(setpgid(arg1, arg2)); case TARGET_NR_umask: @@ -7015,53 +6807,6 @@ static abi_long do_syscall1(void *cpu_env, int num, = abi_long arg1, This is a hint, so ignoring and returning success is ok. */ return 0; #endif -#if TARGET_ABI_BITS =3D=3D 32 - case TARGET_NR_fcntl64: - { - int cmd; - struct flock64 fl; - from_flock64_fn *copyfrom =3D copy_from_user_flock64; - to_flock64_fn *copyto =3D copy_to_user_flock64; - -#ifdef TARGET_ARM - if (!((CPUARMState *)cpu_env)->eabi) { - copyfrom =3D copy_from_user_oabi_flock64; - copyto =3D copy_to_user_oabi_flock64; - } -#endif - - cmd =3D target_to_host_fcntl_cmd(arg2); - if (cmd =3D=3D -TARGET_EINVAL) { - return cmd; - } - - switch(arg2) { - case TARGET_F_GETLK64: - ret =3D copyfrom(&fl, arg3); - if (ret) { - break; - } - ret =3D get_errno(safe_fcntl(arg1, cmd, &fl)); - if (ret =3D=3D 0) { - ret =3D copyto(arg3, &fl); - } - break; - - case TARGET_F_SETLK64: - case TARGET_F_SETLKW64: - ret =3D copyfrom(&fl, arg3); - if (ret) { - break; - } - ret =3D get_errno(safe_fcntl(arg1, cmd, &fl)); - break; - default: - ret =3D do_fcntl(arg1, arg2, arg3); - break; - } - return ret; - } -#endif #ifdef TARGET_NR_cacheflush case TARGET_NR_cacheflush: /* self-modifying code is handled automatically, so nothing needed= */ @@ -8048,6 +7793,7 @@ static abi_long do_syscall1(void *cpu_env, int num, a= bi_long arg1, int64_t arg2, int64_t arg3, int64_t arg4, \ int64_t arg5, int64_t arg6) =20 +#include "syscall-fcntl.inc.c" #include "syscall-file.inc.c" #include "syscall-ioctl.inc.c" #include "syscall-ipc.inc.c" diff --git a/linux-user/strace.list b/linux-user/strace.list index efc64cd29f..68e202ca15 100644 --- a/linux-user/strace.list +++ b/linux-user/strace.list @@ -157,12 +157,6 @@ #ifdef TARGET_NR_fchownat { TARGET_NR_fchownat, "fchownat" , NULL, print_fchownat, NULL }, #endif -#ifdef TARGET_NR_fcntl -{ TARGET_NR_fcntl, "fcntl" , NULL, print_fcntl, NULL }, -#endif -#ifdef TARGET_NR_fcntl64 -{ TARGET_NR_fcntl64, "fcntl64" , NULL, print_fcntl64, NULL }, -#endif #ifdef TARGET_NR_fdatasync { TARGET_NR_fdatasync, "fdatasync" , NULL, NULL, NULL }, #endif --=20 2.17.1 From nobody Thu May 9 22:44:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1558301396; cv=none; d=zoho.com; s=zohoarc; b=VecUqZKWf5V5xXCNNh5UtmrU5ubUeyGQjCw10pz0/ZVyIM3BzPSAyy86y/4R3i6LFj8SCvUwuPMjQiMnl00HfLKySXqS8U+CchvpEusElGPsQHoELbR3EkZrQJ0kwgbrmHkpdi7r9s/UXpPHhUlweDaH686K1vLh1bEZWiDgj70= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1558301396; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=15I+Dq5Rg7507HNEwiC18Z0vUWpngHfr2VdrwlZdjRg=; b=DlY5SkUs49m2mXfz6fM/eBxVX4pX3+ztHjgB45EEIdymR9M/wOlZb3bv+BOs8RCj2NWarb50KEyBFCbtkDYn/Pj5s9bf9X6zUhBD9Mx6iQhCQpKI2eRs3G7xp0vlZQmOSzN7JBIWIMKI06uWmBsE5mee1UWNthREV/g2UHVLrks= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (209.51.188.17 [209.51.188.17]) by mx.zohomail.com with SMTPS id 1558301396767205.24535456303875; Sun, 19 May 2019 14:29:56 -0700 (PDT) Received: from localhost ([127.0.0.1]:53876 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSTNN-0006Ct-IR for importer@patchew.org; Sun, 19 May 2019 17:29:49 -0400 Received: from eggs.gnu.org ([209.51.188.92]:50866) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSZn-0003nx-TY for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:36 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hSSZm-0004dC-OX for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:35 -0400 Received: from mail-pf1-x442.google.com ([2607:f8b0:4864:20::442]:34963) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hSSZm-0004cc-Ix for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:34 -0400 Received: by mail-pf1-x442.google.com with SMTP id t87so6175430pfa.2 for ; Sun, 19 May 2019 13:38:34 -0700 (PDT) Received: from localhost.localdomain (97-113-13-231.tukw.qwest.net. [97.113.13.231]) by smtp.gmail.com with ESMTPSA id i7sm11397448pfo.19.2019.05.19.13.38.32 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 19 May 2019 13:38:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=15I+Dq5Rg7507HNEwiC18Z0vUWpngHfr2VdrwlZdjRg=; b=e92Pq6GScDIB/U3McwgwB4NOwZ33hkNI/s+n+3qt06GaxocxfmeeVfdlvCxbf68HZz NE+q3UkNzPh59OnF7sG8wVyoyIhLmaU8y5N6mwHktBV+vMEvIOvHjGmZN1l0We1rP0uk BlZQa9N6psUTe+RGiY8SOkFGK60r09PjJj9Ka/DjaptVYsyLLXfVdQY70oR18PwN/zGT cSzzs1YZOhEcXhCViOhMWkGQJWcvVvMan5pLpyAo2jU26N/jlATImui5GWzHVMlzYRst D+3qPiQNocrrq4JY9FNaFd1Stvw2YrUSSQkQOePrxKtXZjSe0I+cPjEfSWc4Ak5Fd6uW nODw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=15I+Dq5Rg7507HNEwiC18Z0vUWpngHfr2VdrwlZdjRg=; b=X+gg0I57HnJxUqocJd75TpSHFUk0nb/RuPJQBl70WsuZr2o2VVtaf0l3WVdbZELuQM QIKWRZ6fFDxunzByZjj2IvR6ciNirJgO7QksdtY/XowXnvldSMO8dohoZPU74XH7dzed D7CiCZtctp5K/UPQGaqSDdKHrqOmbaBdLiajR+Rn+yQLFYWvuzQl1C7HI5GDKV5dtu0r K3EYCZoe8A0H88WrU8dCMXTbUtnf87mZ0FZW1AacfOC0g/uKnuhDFKbpmTCLtKk6A9Qf KRuh1TDt7U5DKdtmm38o3vhuRTUdcUEV2ex3+elp7vsoAKld8KhxzHlBFIXw7mWx6Hk1 nkSg== X-Gm-Message-State: APjAAAWKHuYmUr6VYZ6WKr13aq26HXBuCN50rreaLd6QY7Hzo0VcrU3h 7dqFETWsxO6yb1e8zCYTxDisEG9xdN8= X-Google-Smtp-Source: APXvYqyMHYcgYcDE0SWOhwmK6GWfGdPCrZlwTibUXea9P0y5Oh5hPhmFbE3HuLZVXEsgztTcvQ36/Q== X-Received: by 2002:aa7:860a:: with SMTP id p10mr58741919pfn.214.1558298313395; Sun, 19 May 2019 13:38:33 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sun, 19 May 2019 13:37:03 -0700 Message-Id: <20190519203726.20729-52-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190519203726.20729-1-richard.henderson@linaro.org> References: <20190519203726.20729-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::442 Subject: [Qemu-devel] [PATCH v7 51/74] linux-user: Split out setpgid X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: laurent@vivier.eu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Richard Henderson --- linux-user/syscall-defs.h | 1 + linux-user/syscall-proc.inc.c | 5 +++++ linux-user/syscall.c | 2 -- linux-user/strace.list | 3 --- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/linux-user/syscall-defs.h b/linux-user/syscall-defs.h index 5cf39f2bb9..6de7b84351 100644 --- a/linux-user/syscall-defs.h +++ b/linux-user/syscall-defs.h @@ -187,6 +187,7 @@ SYSCALL_DEF(semctl, ARG_DEC, ARG_DEC, ARG_DEC, ARG_HEX); #if !defined(SYSCALL_TABLE) || defined(TARGET_NR_semget) SYSCALL_DEF(semget, ARG_DEC, ARG_DEC, ARG_HEX); #endif +SYSCALL_DEF(setpgid, ARG_DEC, ARG_DEC); #if !defined(SYSCALL_TABLE) || defined(TARGET_NR_semop) SYSCALL_DEF(semop, ARG_DEC, ARG_PTR, ARG_DEC); #endif diff --git a/linux-user/syscall-proc.inc.c b/linux-user/syscall-proc.inc.c index 517f84e139..5bd27d1d4b 100644 --- a/linux-user/syscall-proc.inc.c +++ b/linux-user/syscall-proc.inc.c @@ -468,6 +468,11 @@ SYSCALL_IMPL(nice) } #endif =20 +SYSCALL_IMPL(setpgid) +{ + return get_errno(setpgid(arg1, arg2)); +} + SYSCALL_IMPL(times) { abi_ulong target_buf =3D arg1; diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 45fe05ac78..dcb35e1228 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -4241,8 +4241,6 @@ static abi_long do_syscall1(void *cpu_env, int num, a= bi_long arg1, void *p; =20 switch(num) { - case TARGET_NR_setpgid: - return get_errno(setpgid(arg1, arg2)); case TARGET_NR_umask: return get_errno(umask(arg1)); case TARGET_NR_chroot: diff --git a/linux-user/strace.list b/linux-user/strace.list index 68e202ca15..4a527b0c65 100644 --- a/linux-user/strace.list +++ b/linux-user/strace.list @@ -1073,9 +1073,6 @@ #ifdef TARGET_NR_setns { TARGET_NR_setns, "setns" , NULL, NULL, NULL }, #endif -#ifdef TARGET_NR_setpgid -{ TARGET_NR_setpgid, "setpgid" , NULL, NULL, NULL }, -#endif #ifdef TARGET_NR_setpgrp { TARGET_NR_setpgrp, "setpgrp" , NULL, NULL, NULL }, #endif --=20 2.17.1 From nobody Thu May 9 22:44:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1558300408; cv=none; d=zoho.com; s=zohoarc; b=iajN89UgbjVKMgUfK6u6ajIawSOz8Xxq+X4RMdvWd2WTP26RnkINXlyHkOZ3LEWPdyeum8QLypWFvMqEH+yJvp+QznSDxqz53MyPHVnNSa0rL8OC0WmI37a35kIvGp7cdTmmevLhzWjtjX1+dk3IXJIYXmnlNBPNghkOwUbisUs= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1558300408; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=oFRsgmqF2zgcYNLWzzaBWoMP1N3UdMw/D2eCjGA4dbU=; b=DH+Xdr9AdiCQ5Hwv/Eikzeask8TLizopmNa3ja1KRzAiETmPbw+4p7rihihMexFWQIgdcJeEz2ech8adm2Id8xE86snWlwP6XSPC96SWvdhWSFkk0VllxXyvgfZ//A4FmdcIuBPWarKMHgI7apIT7bmml98o8VBFG+H5JRKmlrE= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (209.51.188.17 [209.51.188.17]) by mx.zohomail.com with SMTPS id 1558300408116582.2923067349367; Sun, 19 May 2019 14:13:28 -0700 (PDT) Received: from localhost ([127.0.0.1]:53620 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hST7S-0008HM-0C for importer@patchew.org; Sun, 19 May 2019 17:13:22 -0400 Received: from eggs.gnu.org ([209.51.188.92]:50883) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSZo-0003op-SP for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:37 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hSSZn-0004ee-TD for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:36 -0400 Received: from mail-pf1-x443.google.com ([2607:f8b0:4864:20::443]:44492) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hSSZn-0004dm-NT for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:35 -0400 Received: by mail-pf1-x443.google.com with SMTP id g9so6149183pfo.11 for ; Sun, 19 May 2019 13:38:35 -0700 (PDT) Received: from localhost.localdomain (97-113-13-231.tukw.qwest.net. [97.113.13.231]) by smtp.gmail.com with ESMTPSA id i7sm11397448pfo.19.2019.05.19.13.38.33 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 19 May 2019 13:38:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=oFRsgmqF2zgcYNLWzzaBWoMP1N3UdMw/D2eCjGA4dbU=; b=HRJ6Ux3gg5LIul/AE9nq+zSXlQfOw3QbDX5D8Hwrps9d0CKvLXGTQPUh0lqD3TPzhA KkzrSWknpFoS0uA9nfTnWoOZP5+2rLxnusQMl44kXg8Y8ffsQVBI/JM1LwtL4qAQltaP UAcn/OA3cM7r10zYsPTUtgM0jP+u8TI/tpSbREMYvsBc3oJw057s4rjnfHaNFgikYsHN /lOSfQghorpWtHNEC+G7G+J8ri/2cQTZweGxZaksBrIwc5UWiRC1S+3DX8mh+jk7p05b 0nhF24eYBwnG3qapea/k3jhzs8PSflrUVSM5nlXVbrZ00vt6P+gPmt/1pPU4/dl8+Lt7 +j4Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=oFRsgmqF2zgcYNLWzzaBWoMP1N3UdMw/D2eCjGA4dbU=; b=Tcy6i261W/Z+aJFBtf6GH51lGfVICEeZhjFeevUmZYNCT6oR+8bAjeejyqC1wMC1wB AUDCNooxJFMH4xVevqvlTsay7hC16mM++eztPYkug7Er7/MJszB7UcDtkaSuaBRyZx20 OrWIIUdU7+Xips09S3a2qPwBBvc9wKe/4UfvSvVs7LHq1iIjUL3X/EwWRwESxpEruR0W YwBXMvcLEtxcQAIrWNlSg/T8gS4N7bul+WT6hAFo7ghFGa/QRJ2502suo7kE1TIm+G3Z zGFaeMTCEGo4YclKfVJxyoLM726mGo/7DksPC9XijygG+Z/MnfIWui/MEwAowiqI1lki SNog== X-Gm-Message-State: APjAAAXWcQrG2qhKk8jDe/eqToxs0HcXz9xRNGh8vKHuim7zhpMcJNri KdYxxFcG7yhKfDUcQIm8IEpgsQ00pqw= X-Google-Smtp-Source: APXvYqzPLhhXMbW4tWgkJtT698t22Lo4lgn2vW79AX7AvT762mEr5VHeG2iuRVTdutyZFa5Wjh4heg== X-Received: by 2002:a62:4d04:: with SMTP id a4mr4173256pfb.177.1558298314536; Sun, 19 May 2019 13:38:34 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sun, 19 May 2019 13:37:04 -0700 Message-Id: <20190519203726.20729-53-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190519203726.20729-1-richard.henderson@linaro.org> References: <20190519203726.20729-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::443 Subject: [Qemu-devel] [PATCH v7 52/74] linux-user: Split out umask X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: laurent@vivier.eu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Richard Henderson --- linux-user/syscall-defs.h | 1 + linux-user/syscall-file.inc.c | 5 +++++ linux-user/syscall.c | 2 -- linux-user/strace.list | 3 --- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/linux-user/syscall-defs.h b/linux-user/syscall-defs.h index 6de7b84351..b6538350a3 100644 --- a/linux-user/syscall-defs.h +++ b/linux-user/syscall-defs.h @@ -214,6 +214,7 @@ SYSCALL_DEF(syncfs, ARG_DEC); SYSCALL_DEF(time, ARG_PTR); #endif SYSCALL_DEF(times, ARG_PTR); +SYSCALL_DEF(umask, ARG_OCT); #ifdef TARGET_NR_umount SYSCALL_DEF(umount, ARG_STR); #endif diff --git a/linux-user/syscall-file.inc.c b/linux-user/syscall-file.inc.c index 4080ab250e..cbde6d906f 100644 --- a/linux-user/syscall-file.inc.c +++ b/linux-user/syscall-file.inc.c @@ -1117,6 +1117,11 @@ SYSCALL_IMPL(rmdir) } #endif =20 +SYSCALL_IMPL(umask) +{ + return get_errno(umask(arg1)); +} + SYSCALL_IMPL(unlinkat) { return do_unlinkat(arg1, arg2, arg3); diff --git a/linux-user/syscall.c b/linux-user/syscall.c index dcb35e1228..419edceab2 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -4241,8 +4241,6 @@ static abi_long do_syscall1(void *cpu_env, int num, a= bi_long arg1, void *p; =20 switch(num) { - case TARGET_NR_umask: - return get_errno(umask(arg1)); case TARGET_NR_chroot: if (!(p =3D lock_user_string(arg1))) return -TARGET_EFAULT; diff --git a/linux-user/strace.list b/linux-user/strace.list index 4a527b0c65..61d22ad16b 100644 --- a/linux-user/strace.list +++ b/linux-user/strace.list @@ -1293,9 +1293,6 @@ #ifdef TARGET_NR_ulimit { TARGET_NR_ulimit, "ulimit" , NULL, NULL, NULL }, #endif -#ifdef TARGET_NR_umask -{ TARGET_NR_umask, "umask" , "%s(%#o)", NULL, NULL }, -#endif #ifdef TARGET_NR_uname { TARGET_NR_uname, "uname" , "%s(%p)", NULL, NULL }, #endif --=20 2.17.1 From nobody Thu May 9 22:44:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1558300689; cv=none; d=zoho.com; s=zohoarc; b=PaDoi5GkUScS3vNOtp0A72pBm+uTZcFmNfLbg0XJUYjCT9eGQ/dC9N2cgw4p8IuXkBiHjnu8c4AflMIuOaNyNBLai2jg4yNLoB5TJyavAHbOvlGqSih7UBRNdISNjq5wTBPLaDMFlPVLdlmFEAFErDcRgstDL46tBTgu3sS7nJ0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1558300689; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=7L7bsUhZiRxWJXbYkbn2Jh3ZaH0xfMhZkbZE3Jd/+Dw=; b=oaGHNlFsXXeLlmumlzikdLs+lp3bq7AR6DWL5e4T8wC1FPgV1SSzrsZymQhaMp8dTvDNrM++bu59t+Jro2AFU5CBEb73wo9eAK5SPEmalyZyedBWO7BYdXZP+/CxMVZ+Qqrqs4+DEqEB31SmQT+jmelCOgyyLA5EXaYKXvFAuZ8= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1558300689118670.4578141286112; Sun, 19 May 2019 14:18:09 -0700 (PDT) Received: from localhost ([127.0.0.1]:53694 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSTBx-0003y8-Ut for importer@patchew.org; Sun, 19 May 2019 17:18:02 -0400 Received: from eggs.gnu.org ([209.51.188.92]:50914) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSZq-0003pv-12 for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:42 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hSSZo-0004gH-VR for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:37 -0400 Received: from mail-pl1-x643.google.com ([2607:f8b0:4864:20::643]:44240) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hSSZo-0004fA-Ot for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:36 -0400 Received: by mail-pl1-x643.google.com with SMTP id c5so5690934pll.11 for ; Sun, 19 May 2019 13:38:36 -0700 (PDT) Received: from localhost.localdomain (97-113-13-231.tukw.qwest.net. [97.113.13.231]) by smtp.gmail.com with ESMTPSA id i7sm11397448pfo.19.2019.05.19.13.38.34 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 19 May 2019 13:38:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=7L7bsUhZiRxWJXbYkbn2Jh3ZaH0xfMhZkbZE3Jd/+Dw=; b=Sh/K3TeNlrzQweyPs5RsuWLIuhsyEjrp8RDmgd0ctRv5apJNlUDqc3U+eYEtcPr4lf K350UkXahxGVZIEJPVx1hjBBh+OUn0clBfjwW+3cLw8/8w0bGbb0VqlcRl/+BwwEGpai A8NgRzav+1LoPLKRnTRFCOqEShack4gUCdS19Fy/PItScn2fDCDNvsE3aY3A3LX9ZqKV 1gSBM5YR+HCmoBxHiPCFqTvm487Y4UrFHT4+2IY56RIN7YtZrVWFHSViOnqtoaa7XN3n 6IGtOqATAkcyVhhXB5H6vqcBGbGLzIjoU5fw9B92ckhMouLcb4CU2tTqQyoMsnzvocXq RYFA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=7L7bsUhZiRxWJXbYkbn2Jh3ZaH0xfMhZkbZE3Jd/+Dw=; b=N7y7UJ9BsGBelNGj50g6CwBKGK2Vsqy9Z2bPVO0l7QSAvYy53dxb+NhGqS0zhgHbRL S1W+2HO6dT3HUrlJJ+Yi0D91+tT7+FgMFwJ9KeZ/aj7RBiIPt8yeZG0nT/vyxK2TRNKD ryQuNiDjkCiIGBNomKoo7HQVufEww4KbMgKkW41veRyUw0MvYSeOrIrnrHSqBEabzx0F 6LNcVZaDB14twxS48mQZ41uV/Ice1m0+3UJ6MbO7skpxSWWUs5bvKrM4J6pVKAMI/YAE 0X+yG929hUbjCP/fP4c2wImPR80TwDxB6hRGK5sGTAZfwGCJhq2cpC8bmEmfua4dtOsl Gryg== X-Gm-Message-State: APjAAAXlVM3epFQcX/Mo86JGlXhmq9Ghgac/LaSoqj4R+iLDUimeATPy 1bXksEvrmVIQnhK/HVksi7Aebvu+jzs= X-Google-Smtp-Source: APXvYqwKFyhMYZjOoT+d63FJWNx6YbFVi9a1vaIAo5Np8RjehN8JWK0EC3cS5j0cO1FIeiKk58iXbQ== X-Received: by 2002:a17:902:59c3:: with SMTP id d3mr1085000plj.273.1558298315567; Sun, 19 May 2019 13:38:35 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sun, 19 May 2019 13:37:05 -0700 Message-Id: <20190519203726.20729-54-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190519203726.20729-1-richard.henderson@linaro.org> References: <20190519203726.20729-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::643 Subject: [Qemu-devel] [PATCH v7 53/74] linux-user: Split out chroot X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: laurent@vivier.eu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Richard Henderson --- linux-user/syscall-defs.h | 1 + linux-user/strace.c | 12 ------------ linux-user/syscall-file.inc.c | 13 +++++++++++++ linux-user/syscall.c | 6 ------ linux-user/strace.list | 3 --- 5 files changed, 14 insertions(+), 21 deletions(-) diff --git a/linux-user/syscall-defs.h b/linux-user/syscall-defs.h index b6538350a3..b93ca1f78a 100644 --- a/linux-user/syscall-defs.h +++ b/linux-user/syscall-defs.h @@ -30,6 +30,7 @@ SYSCALL_DEF(chdir, ARG_STR); #ifdef TARGET_NR_chmod SYSCALL_DEF(chmod, ARG_STR, ARG_MODEFLAG); #endif +SYSCALL_DEF(chroot, ARG_STR); SYSCALL_DEF_ARGS(clone, ARG_CLONEFLAG, ARG_PTR, ARG_PTR, ARG_PTR, ARG_PTR); SYSCALL_DEF(close, ARG_DEC); #ifdef TARGET_NR_creat diff --git a/linux-user/strace.c b/linux-user/strace.c index 560284b3c3..787bf41307 100644 --- a/linux-user/strace.c +++ b/linux-user/strace.c @@ -1130,18 +1130,6 @@ print_accept(const struct syscallname *name, } #endif =20 -#ifdef TARGET_NR_chroot -static void -print_chroot(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - print_syscall_prologue(name); - print_string(arg0, 1); - print_syscall_epilogue(name); -} -#endif - #ifdef TARGET_NR_clock_adjtime static void print_clock_adjtime(const struct syscallname *name, diff --git a/linux-user/syscall-file.inc.c b/linux-user/syscall-file.inc.c index cbde6d906f..6e730e3152 100644 --- a/linux-user/syscall-file.inc.c +++ b/linux-user/syscall-file.inc.c @@ -88,6 +88,19 @@ SYSCALL_IMPL(chmod) } #endif =20 +SYSCALL_IMPL(chroot) +{ + char *p =3D lock_user_string(arg1); + abi_long ret; + + if (!p) { + return -TARGET_EFAULT; + } + ret =3D get_errno(chroot(p)); + unlock_user(p, arg1, 0); + return ret; +} + SYSCALL_IMPL(close) { int fd =3D arg1; diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 419edceab2..255765aaa7 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -4241,12 +4241,6 @@ static abi_long do_syscall1(void *cpu_env, int num, = abi_long arg1, void *p; =20 switch(num) { - case TARGET_NR_chroot: - if (!(p =3D lock_user_string(arg1))) - return -TARGET_EFAULT; - ret =3D get_errno(chroot(p)); - unlock_user(p, arg1, 0); - return ret; #ifdef TARGET_NR_getpgrp case TARGET_NR_getpgrp: return get_errno(getpgrp()); diff --git a/linux-user/strace.list b/linux-user/strace.list index 61d22ad16b..7679e844b6 100644 --- a/linux-user/strace.list +++ b/linux-user/strace.list @@ -58,9 +58,6 @@ #ifdef TARGET_NR_chown32 { TARGET_NR_chown32, "chown32" , NULL, NULL, NULL }, #endif -#ifdef TARGET_NR_chroot -{ TARGET_NR_chroot, "chroot" , NULL, print_chroot, NULL }, -#endif #ifdef TARGET_NR_clock_adjtime { TARGET_NR_clock_adjtime, "clock_adjtime" , NULL, print_clock_adjtime, NU= LL }, #endif --=20 2.17.1 From nobody Thu May 9 22:44:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1558300725; cv=none; d=zoho.com; s=zohoarc; b=KO1f6BEZY7UfVlT0fdMkfJdNgU6gmGZTVFHHrsk9kEatGB/bjOU1ny8tWLkzVpO1lkrRvThsebnpauD3XX22YskVGjzRzvze4t6PvOU6QmT2chV1xt92PHXz5zANiyQjF98sCamvVfyp4w/yPu5pceFB2UA4BFEIIx6Qlkw3iMw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1558300725; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=MSnLx4TEMgAogxZCRA6zSvqXurn3uaPFvTU6tGKAUTY=; b=DJJJHt8uKH1nMAfzzsfYz6iGbPgQcGpIcakXvY04xy4l/Lj9EzUT8J5AzqiZd41zb6+PNJisITOn4ao/88xcaeEj2Cjhg63RRGqu2JqCc92GN8IOKTmA8EHniih4SSQcCyxCYcYNT37OIdybTQErRrjWUczR0UspDUAcVawSlIM= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1558300725447126.21952800627264; Sun, 19 May 2019 14:18:45 -0700 (PDT) Received: from localhost ([127.0.0.1]:53700 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSTCb-0004X7-A1 for importer@patchew.org; Sun, 19 May 2019 17:18:41 -0400 Received: from eggs.gnu.org ([209.51.188.92]:50936) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSZr-0003rA-57 for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:42 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hSSZq-0004hg-1f for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:39 -0400 Received: from mail-pl1-x642.google.com ([2607:f8b0:4864:20::642]:41410) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hSSZp-0004gf-QO for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:37 -0400 Received: by mail-pl1-x642.google.com with SMTP id f12so5707321plt.8 for ; Sun, 19 May 2019 13:38:37 -0700 (PDT) Received: from localhost.localdomain (97-113-13-231.tukw.qwest.net. [97.113.13.231]) by smtp.gmail.com with ESMTPSA id i7sm11397448pfo.19.2019.05.19.13.38.35 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 19 May 2019 13:38:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=MSnLx4TEMgAogxZCRA6zSvqXurn3uaPFvTU6tGKAUTY=; b=yOdEk4RBWdpJRxv5GrOS2C+3ELsjxW6DTlLQXge1/VAhTA2M30GV6M0ZwzyotMj/T9 8DraWkYKjUgJ16N9+SME7qtxLqrIlsWYBhcszL9x10kpqMLDuUOQ6x9xKk55IVwCVPgA YAxA1jQkHnikbkRcAtYJrGhIZ27Jmu4tTfdYurD8qkBlwFejOM8JlC6J5LQC7Z6x1gdn RUJ9go/PemRQ1Q3AstEEXA8DRLLh8AOW+1tYHOjlZ0191WMfX814acBPWv1EZZDkpKLC WF5S4mXRbKA+3dk6q6Pwyga0vQhLiegklfTLanzvpU6LqwBE0K8TDMmW3Vhpd3Nliep9 KZVQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=MSnLx4TEMgAogxZCRA6zSvqXurn3uaPFvTU6tGKAUTY=; b=dWg1bxegxo8MwwGHVxeimbCS850pNAg8bmYYqb/kZsht+6DHptdT77Xi2//5UmiUZe GhwSeArOr9zURXb+GlwZ135Uuiou4cBuVwV8cRsO5oY9WKW1uYDb7inmkYbQu9oXKsCU 1xpSdhPQnHsJzfVYmBqIjouEAIM/Yl62a/d7hzp897PtvdKcXJegI3hQ5Lf86MFOy0Jf ympUtjZE4fcjUl/KJzV+rxXDYpi+5oNhI6uVkdwI99G4Az+Mc83KxSxAZubjDgEnSvVB xZLxb5lUS+P0dfhcZuypJgeZlgnftYKj0k05/v/Sg3vkaWzJYA+ef0psrFMLAk20FcmZ 7wHQ== X-Gm-Message-State: APjAAAVwjhN8FmxdZA1UYO7+qcej1F3yjEAJG7YWs+v0d64wBi70UNSP NIpsWpu6GkKidByqxngOrNQi7lBx1D8= X-Google-Smtp-Source: APXvYqzDjf6RKJ/fR5vhWZXIxBWEEDgbv9oW7hDd1e5T9mtfv3Y/ABrzwTZWsmFbfrj8+NP+J+1njQ== X-Received: by 2002:a17:902:70c6:: with SMTP id l6mr54073267plt.84.1558298316633; Sun, 19 May 2019 13:38:36 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sun, 19 May 2019 13:37:06 -0700 Message-Id: <20190519203726.20729-55-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190519203726.20729-1-richard.henderson@linaro.org> References: <20190519203726.20729-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::642 Subject: [Qemu-devel] [PATCH v7 54/74] linux-user: Split out getpgid, getpgrp X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: laurent@vivier.eu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Richard Henderson --- linux-user/syscall-defs.h | 4 ++++ linux-user/syscall-proc.inc.c | 12 ++++++++++++ linux-user/syscall.c | 6 ------ linux-user/strace.list | 6 ------ 4 files changed, 16 insertions(+), 12 deletions(-) diff --git a/linux-user/syscall-defs.h b/linux-user/syscall-defs.h index b93ca1f78a..2ade9ec749 100644 --- a/linux-user/syscall-defs.h +++ b/linux-user/syscall-defs.h @@ -59,6 +59,10 @@ SYSCALL_DEF(futimesat, ARG_ATDIRFD, ARG_STR, ARG_PTR); #ifdef TARGET_NR_fork SYSCALL_DEF(fork); #endif +SYSCALL_DEF(getpgid, ARG_DEC); +#ifdef TARGET_NR_getpgrp +SYSCALL_DEF(getpgrp); +#endif #ifdef TARGET_NR_getpid SYSCALL_DEF(getpid); #endif diff --git a/linux-user/syscall-proc.inc.c b/linux-user/syscall-proc.inc.c index 5bd27d1d4b..39de5b7863 100644 --- a/linux-user/syscall-proc.inc.c +++ b/linux-user/syscall-proc.inc.c @@ -438,6 +438,18 @@ SYSCALL_IMPL(fork) } #endif =20 +SYSCALL_IMPL(getpgid) +{ + return get_errno(getpgid(arg1)); +} + +#ifdef TARGET_NR_getpgrp +SYSCALL_IMPL(getpgrp) +{ + return get_errno(getpgrp()); +} +#endif + #ifdef TARGET_NR_getpid SYSCALL_IMPL(getpid) { diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 255765aaa7..75989a01bf 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -4241,10 +4241,6 @@ static abi_long do_syscall1(void *cpu_env, int num, = abi_long arg1, void *p; =20 switch(num) { -#ifdef TARGET_NR_getpgrp - case TARGET_NR_getpgrp: - return get_errno(getpgrp()); -#endif case TARGET_NR_setsid: return get_errno(setsid()); #ifdef TARGET_NR_sigaction @@ -5388,8 +5384,6 @@ static abi_long do_syscall1(void *cpu_env, int num, a= bi_long arg1, } return ret; #endif - case TARGET_NR_getpgid: - return get_errno(getpgid(arg1)); case TARGET_NR_fchdir: return get_errno(fchdir(arg1)); case TARGET_NR_personality: diff --git a/linux-user/strace.list b/linux-user/strace.list index 7679e844b6..d283c924a7 100644 --- a/linux-user/strace.list +++ b/linux-user/strace.list @@ -262,12 +262,6 @@ #ifdef TARGET_NR_getpeername { TARGET_NR_getpeername, "getpeername" , NULL, NULL, NULL }, #endif -#ifdef TARGET_NR_getpgid -{ TARGET_NR_getpgid, "getpgid" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_getpgrp -{ TARGET_NR_getpgrp, "getpgrp" , NULL, NULL, NULL }, -#endif #ifdef TARGET_NR_getpmsg { TARGET_NR_getpmsg, "getpmsg" , NULL, NULL, NULL }, #endif --=20 2.17.1 From nobody Thu May 9 22:44:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1558300578; cv=none; d=zoho.com; s=zohoarc; b=iAF7l3IywtJnqRyBRiseunDVOi2HEIJO9kMK25C0LNfINMyZB1btJSsbdRGPO84ChlIyKBahKcau7A+TTd5JDUiTKRhSMDtJ0jbCcWFlxIpIGP3MWSaIUz6p8KRNKksds1wwu35CgxxwE5AipVmAMVl/6yh7GAqAQsNpvXbatlU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1558300578; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=ttWxbzBbz5ihBAO0dy5RNz6XPVqQZ5W6pS6uncyoUTw=; b=gaMmMsPugpPCOrhdICYmtHWRM9rnSTswKsWh0ufHrTt+MiYIg3iKaU1v1ij8yzIWwq7SFwl6jsqtWsodvu/INnqnNbPfg8JIpY0H97JqYFH7RWHQ1P5XO2CQ0Qkmjz94j93+jsF4awhBovsg32YOvYmXc54GcHwqIrJ06Rx3XS4= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (209.51.188.17 [209.51.188.17]) by mx.zohomail.com with SMTPS id 1558300578735349.1913396922736; Sun, 19 May 2019 14:16:18 -0700 (PDT) Received: from localhost ([127.0.0.1]:53672 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hST9x-00029O-CC for importer@patchew.org; Sun, 19 May 2019 17:15:57 -0400 Received: from eggs.gnu.org ([209.51.188.92]:50953) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSZs-0003rB-AF for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:42 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hSSZr-0004iz-5w for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:40 -0400 Received: from mail-pg1-x544.google.com ([2607:f8b0:4864:20::544]:42367) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hSSZq-0004i4-V6 for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:39 -0400 Received: by mail-pg1-x544.google.com with SMTP id 145so5730522pgg.9 for ; Sun, 19 May 2019 13:38:38 -0700 (PDT) Received: from localhost.localdomain (97-113-13-231.tukw.qwest.net. [97.113.13.231]) by smtp.gmail.com with ESMTPSA id i7sm11397448pfo.19.2019.05.19.13.38.36 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 19 May 2019 13:38:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=ttWxbzBbz5ihBAO0dy5RNz6XPVqQZ5W6pS6uncyoUTw=; b=ceaU80lFl0hNLo3mamAAuO33hhZrmGbtyI7ycPbYg50IMB1ddBC4BHTkQ00WvE1pW+ qFdLzn5KItuiHl30u+GRqXYe7xaZhA4aI8yMyLyh1MRP+yTG3KXXqLR6LEBhcRNj+Wza cfL4hD3ql9eSVgmhDPwZMpsHGpN+lv2WTFlUYF4uazb+C+lWTAuWg+tXH6hcSCtKsRSc +DUL44+j1eREW2mmqeOizZFkht7KJs8ND+6MQK3Qa+OYMOhWkKE3ZOdM0GTGd0Km+olw tFJbI6eTrYtiqNNUSsYw8kycgw76MjTMNORCpWkQG8/uvatR9lFGTr08bqaMzmBYdFdp XcGw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=ttWxbzBbz5ihBAO0dy5RNz6XPVqQZ5W6pS6uncyoUTw=; b=DRJKQKBQXh5jDF65mjlI3LLX7D25OUD/BMCLwJ4hRvRjwiSimyx1eke2NLIRXFnabB tC11R9A8mhjJixuDh8+7yYFV30PUD9sBZqvnjvj10zkdWnuNL/V2P5o+9H5LPHeGUoDF rlR+BlpvFhMmxWXoTG2c2WaSKNkGHXA23FSTteu9LqVYcK/1nF1djuXDCQqU7oAtlarM Nvz69BAfPlzOFhhV9/GVkFbbZUySVnHoknp8WFwsh0D9TWaVExx0TllAatunvQwgYJON 3TkTAfpc6gKz7j31JjZlbg2ui90DWjfQTxmpM+VrWwncgkOvG36lFNnu4cqoxv2l0nZE smSg== X-Gm-Message-State: APjAAAVBSOJ6lk85Qsoeiu0Zc1Nk/VhY1NiPSbQhbWzSq5MHH79LZlhm Lvrfp4x1EaNLuiVQpTQH7hn+uqA8gxA= X-Google-Smtp-Source: APXvYqzESC3LlQaQGPZnHpVh7OjjN/hl2NcJX/DzavPCN82jKNjwnfYR935celpeRsO0Ules0sZsLw== X-Received: by 2002:a65:6559:: with SMTP id a25mr47363983pgw.33.1558298317681; Sun, 19 May 2019 13:38:37 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sun, 19 May 2019 13:37:07 -0700 Message-Id: <20190519203726.20729-56-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190519203726.20729-1-richard.henderson@linaro.org> References: <20190519203726.20729-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::544 Subject: [Qemu-devel] [PATCH v7 55/74] linux-user: Split out getsid, setsid X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: laurent@vivier.eu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Richard Henderson --- linux-user/syscall-defs.h | 2 ++ linux-user/syscall-proc.inc.c | 10 ++++++++++ linux-user/syscall.c | 4 ---- linux-user/strace.list | 6 ------ 4 files changed, 12 insertions(+), 10 deletions(-) diff --git a/linux-user/syscall-defs.h b/linux-user/syscall-defs.h index 2ade9ec749..cd2c127c41 100644 --- a/linux-user/syscall-defs.h +++ b/linux-user/syscall-defs.h @@ -69,6 +69,7 @@ SYSCALL_DEF(getpid); #ifdef TARGET_NR_getppid SYSCALL_DEF(getppid); #endif +SYSCALL_DEF(getsid, ARG_DEC); #ifdef TARGET_NR_getxpid SYSCALL_DEF(getxpid); #endif @@ -193,6 +194,7 @@ SYSCALL_DEF(semctl, ARG_DEC, ARG_DEC, ARG_DEC, ARG_HEX); SYSCALL_DEF(semget, ARG_DEC, ARG_DEC, ARG_HEX); #endif SYSCALL_DEF(setpgid, ARG_DEC, ARG_DEC); +SYSCALL_DEF(setsid); #if !defined(SYSCALL_TABLE) || defined(TARGET_NR_semop) SYSCALL_DEF(semop, ARG_DEC, ARG_PTR, ARG_DEC); #endif diff --git a/linux-user/syscall-proc.inc.c b/linux-user/syscall-proc.inc.c index 39de5b7863..567df54581 100644 --- a/linux-user/syscall-proc.inc.c +++ b/linux-user/syscall-proc.inc.c @@ -464,6 +464,11 @@ SYSCALL_IMPL(getppid) } #endif =20 +SYSCALL_IMPL(getsid) +{ + return get_errno(getsid(arg1)); +} + #ifdef TARGET_NR_getxpid SYSCALL_IMPL(getxpid) { @@ -485,6 +490,11 @@ SYSCALL_IMPL(setpgid) return get_errno(setpgid(arg1, arg2)); } =20 +SYSCALL_IMPL(setsid) +{ + return get_errno(setsid()); +} + SYSCALL_IMPL(times) { abi_ulong target_buf =3D arg1; diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 75989a01bf..0e9f4fd5ae 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -4241,8 +4241,6 @@ static abi_long do_syscall1(void *cpu_env, int num, a= bi_long arg1, void *p; =20 switch(num) { - case TARGET_NR_setsid: - return get_errno(setsid()); #ifdef TARGET_NR_sigaction case TARGET_NR_sigaction: { @@ -5664,8 +5662,6 @@ static abi_long do_syscall1(void *cpu_env, int num, a= bi_long arg1, /* NOTE: the flock constant seems to be the same for every Linux platform */ return get_errno(safe_flock(arg1, arg2)); - case TARGET_NR_getsid: - return get_errno(getsid(arg1)); #if defined(TARGET_NR_fdatasync) /* Not on alpha (osf_datasync ?) */ case TARGET_NR_fdatasync: return get_errno(fdatasync(arg1)); diff --git a/linux-user/strace.list b/linux-user/strace.list index d283c924a7..bf87a6d4cb 100644 --- a/linux-user/strace.list +++ b/linux-user/strace.list @@ -292,9 +292,6 @@ #ifdef TARGET_NR_getrusage { TARGET_NR_getrusage, "getrusage" , NULL, NULL, NULL }, #endif -#ifdef TARGET_NR_getsid -{ TARGET_NR_getsid, "getsid" , NULL, NULL, NULL }, -#endif #ifdef TARGET_NR_getsockname { TARGET_NR_getsockname, "getsockname" , NULL, NULL, NULL }, #endif @@ -1100,9 +1097,6 @@ #ifdef TARGET_NR_set_robust_list { TARGET_NR_set_robust_list, "set_robust_list" , NULL, NULL, NULL }, #endif -#ifdef TARGET_NR_setsid -{ TARGET_NR_setsid, "setsid" , NULL, NULL, NULL }, -#endif #ifdef TARGET_NR_setsockopt { TARGET_NR_setsockopt, "setsockopt" , NULL, NULL, NULL }, #endif --=20 2.17.1 From nobody Thu May 9 22:44:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1558300857; cv=none; d=zoho.com; s=zohoarc; b=esK2TK441K06DrAW7QQaITKOyey4PkQz+mmM1H2ttkgFJT0G4TtDHAXNv7xHc0Ghk4lScG/5DmVyZJr2QYHqTt4LsggVSShZfmkTxaBkDWotwuxX0iQI/UzW8ygB3RMp3ejrhbTM6BYdErQtyNwSZzv4ge9lgB41mbCU8iflNZI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1558300857; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=/YpVT18mqqIFScwHIfb0mWiE7uIJJMrlMlrDVbB4UPM=; b=HH6Mlxw2hBZHeDU/6dsyUnBSBIOwjUGbyiTdGYb3JUli/ji/34mRkkrBdYnxkuAJgVvoJUhfVdclrHKMO5R634ftrAdCt6di9xHrm56KmnoZib6W9/HlpNu60KO1DODHo4pwlP49hnt7MouejaKJd+tPcw0pQwTq1zcByNWzQvw= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1558300857080855.862861636855; Sun, 19 May 2019 14:20:57 -0700 (PDT) Received: from localhost ([127.0.0.1]:53749 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSTEc-0006XA-9q for importer@patchew.org; Sun, 19 May 2019 17:20:46 -0400 Received: from eggs.gnu.org ([209.51.188.92]:50974) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSZu-0003rC-1r for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:43 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hSSZs-0004kT-Aa for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:42 -0400 Received: from mail-pl1-x642.google.com ([2607:f8b0:4864:20::642]:43443) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hSSZs-0004jf-1c for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:40 -0400 Received: by mail-pl1-x642.google.com with SMTP id gn7so1547889plb.10 for ; Sun, 19 May 2019 13:38:39 -0700 (PDT) Received: from localhost.localdomain (97-113-13-231.tukw.qwest.net. [97.113.13.231]) by smtp.gmail.com with ESMTPSA id i7sm11397448pfo.19.2019.05.19.13.38.37 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 19 May 2019 13:38:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=/YpVT18mqqIFScwHIfb0mWiE7uIJJMrlMlrDVbB4UPM=; b=hblhk9WWpYxInAWKvveMiaezmyFzVaIhAak7rOQ7Bk1MuxPbXAUsifr203RUG1K0RZ 3mTJtHa61Pv1PxNbtQz6nEV/uhX/EqSkTtB1PSlbdxbqd5lPQSSFsfHgEs8eLS01tWAJ 1HmbEjCdkniopLuUnkMV+5UvTUpUIfFusEW2b9vBlRgXy+TlwwaAqns37uMEobp5MkNp i1b7gVYW/DE+R1+8tHEXsqyn4rPbWceir9IviNeiHXtc4fgn/wKXGELeSnIDrGTcGCcx Wq2e8HeINqGmVUknQzBzZRMzm5goqgvHKAH2itNkmM/JTPY9RWRtAGcA3s1PMXOhTXxD zhug== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=/YpVT18mqqIFScwHIfb0mWiE7uIJJMrlMlrDVbB4UPM=; b=DBiLs47SKVJTArHloHJST/v7gGg3MQiZ+NMALHqKiaL9uQhDaaAa06jImLsAlJOZtQ NDgHks5MuvS7xZe7tVgDNpsOTtZewryUyUu4NochWQmpWdZA+V1KvMjRyQD1512SQo2Y cFU3CLOAQuA/tg20LQrF1+ohYovQXXH/e18eQqpVzAxfJ5eWNh5WKIJW65qAduqD1lmK kyDN96jPnSz5OktHMI/lEkNTMuaS/Ej06C8sN5/AV5A0cb8Ur9sxfxfWHLrNPkCkKRyJ p6gZkLsgwzvO8lEn5Fbfr4/L9pXTOVutA45hoBiVBxHzJt7F044hqWhAJD+baqc0w1+V HkxQ== X-Gm-Message-State: APjAAAXp6SYGXiLy3CjMDcsn9fsbBgDZiH+NZU6/abJEOpPHig94rCcc UDMCDxhipt/EzrdJhgfH9RLDM5E7zqQ= X-Google-Smtp-Source: APXvYqwuKKW7yB/so1+a2uR8VMSJDs56uFAfOGlLkM3fLkp9DLSwiA39u5LXjH7blZrP3kIJW1GyWw== X-Received: by 2002:a17:902:b941:: with SMTP id h1mr13227358pls.289.1558298318825; Sun, 19 May 2019 13:38:38 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sun, 19 May 2019 13:37:08 -0700 Message-Id: <20190519203726.20729-57-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190519203726.20729-1-richard.henderson@linaro.org> References: <20190519203726.20729-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::642 Subject: [Qemu-devel] [PATCH v7 56/74] linux-user: Split out sigaction, rt_sigaction X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: laurent@vivier.eu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Richard Henderson --- linux-user/syscall-defs.h | 10 ++ linux-user/strace.c | 14 --- linux-user/syscall-sig.inc.c | 172 +++++++++++++++++++++++++++++++++++ linux-user/syscall.c | 160 -------------------------------- linux-user/strace.list | 6 -- 5 files changed, 182 insertions(+), 180 deletions(-) diff --git a/linux-user/syscall-defs.h b/linux-user/syscall-defs.h index cd2c127c41..b62bffeb68 100644 --- a/linux-user/syscall-defs.h +++ b/linux-user/syscall-defs.h @@ -187,6 +187,13 @@ SYSCALL_DEF(readv, ARG_DEC, ARG_PTR, ARG_DEC); #ifdef TARGET_NR_rmdir SYSCALL_DEF(rmdir, ARG_STR); #endif +#if defined(TARGET_ALPHA) +SYSCALL_DEF(rt_sigaction, ARG_SIGNAL, ARG_PTR, ARG_PTR, ARG_DEC, ARG_PTR); +#elif defined(TARGET_SPARC) +SYSCALL_DEF(rt_sigaction, ARG_SIGNAL, ARG_PTR, ARG_PTR, ARG_PTR, ARG_DEC); +#else +SYSCALL_DEF(rt_sigaction, ARG_SIGNAL, ARG_PTR, ARG_PTR, ARG_DEC); +#endif #if !defined(SYSCALL_TABLE) || defined(TARGET_NR_semctl) SYSCALL_DEF(semctl, ARG_DEC, ARG_DEC, ARG_DEC, ARG_HEX); #endif @@ -212,6 +219,9 @@ SYSCALL_DEF(shmdt, ARG_PTR); #if !defined(SYSCALL_TABLE) || defined(TARGET_NR_shmget) SYSCALL_DEF(shmget, ARG_DEC, ARG_DEC, ARG_HEX); #endif +#ifdef TARGET_NR_sigaction +SYSCALL_DEF(sigaction, ARG_SIGNAL, ARG_PTR, ARG_PTR); +#endif #ifdef TARGET_NR_stime SYSCALL_DEF(stime, ARG_PTR); #endif diff --git a/linux-user/strace.c b/linux-user/strace.c index 787bf41307..83dd755c73 100644 --- a/linux-user/strace.c +++ b/linux-user/strace.c @@ -1564,20 +1564,6 @@ print_fstat(const struct syscallname *name, #define print_fstat64 print_fstat #endif =20 -#ifdef TARGET_NR_rt_sigaction -static void -print_rt_sigaction(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - print_syscall_prologue(name); - print_signal(arg0, 0); - print_pointer(arg1, 0); - print_pointer(arg2, 1); - print_syscall_epilogue(name); -} -#endif - #ifdef TARGET_NR_rt_sigprocmask static void print_rt_sigprocmask(const struct syscallname *name, diff --git a/linux-user/syscall-sig.inc.c b/linux-user/syscall-sig.inc.c index a4fbcc567d..918d58878f 100644 --- a/linux-user/syscall-sig.inc.c +++ b/linux-user/syscall-sig.inc.c @@ -39,3 +39,175 @@ SYSCALL_IMPL(pause) return -TARGET_EINTR; } #endif + +SYSCALL_IMPL(rt_sigaction) +{ + abi_long ret; +#if defined(TARGET_ALPHA) + /* + * For Alpha and SPARC this is a 5 argument syscall, with + * a 'restorer' parameter which must be copied into the + * sa_restorer field of the sigaction struct. + * For Alpha that 'restorer' is arg5; for SPARC it is arg4, + * and arg5 is the sigsetsize. + * Alpha also has a separate rt_sigaction struct that it uses + * here; SPARC uses the usual sigaction struct. + */ + struct target_rt_sigaction *rt_act; + struct target_sigaction act, oact, *pact =3D NULL; + + if (arg4 !=3D sizeof(target_sigset_t)) { + return -TARGET_EINVAL; + } + if (arg2) { + if (!lock_user_struct(VERIFY_READ, rt_act, arg2, 1)) { + return -TARGET_EFAULT; + } + act._sa_handler =3D rt_act->_sa_handler; + act.sa_mask =3D rt_act->sa_mask; + act.sa_flags =3D rt_act->sa_flags; + act.sa_restorer =3D arg5; + unlock_user_struct(rt_act, arg2, 0); + pact =3D &act; + } + ret =3D get_errno(do_sigaction(arg1, pact, &oact)); + if (!is_error(ret) && arg3) { + if (!lock_user_struct(VERIFY_WRITE, rt_act, arg3, 0)) { + return -TARGET_EFAULT; + } + rt_act->_sa_handler =3D oact._sa_handler; + rt_act->sa_mask =3D oact.sa_mask; + rt_act->sa_flags =3D oact.sa_flags; + unlock_user_struct(rt_act, arg3, 1); + } +#else +# ifdef TARGET_SPARC + target_ulong restorer =3D arg4; + target_ulong sigsetsize =3D arg5; +# else + target_ulong sigsetsize =3D arg4; +# endif + struct target_sigaction act, oact, *pact =3D NULL; + + if (sigsetsize !=3D sizeof(target_sigset_t)) { + return -TARGET_EINVAL; + } + if (arg2) { + if (!lock_user_struct(VERIFY_READ, pact, arg2, 1)) { + return -TARGET_EFAULT; + } + act =3D *pact; + unlock_user_struct(pact, arg2, 0); +# ifdef TARGET_ARCH_HAS_KA_RESTORER + act.ka_restorer =3D restorer; +# endif + pact =3D &act; + } + + ret =3D get_errno(do_sigaction(arg1, pact, &oact)); + + if (!is_error(ret) && arg3) { + if (!lock_user_struct(VERIFY_WRITE, pact, arg3, 0)) { + return -TARGET_EFAULT; + } + *pact =3D oact; + unlock_user_struct(pact, arg3, 1); + } +#endif + return ret; +} + +#ifdef TARGET_NR_sigaction +SYSCALL_IMPL(sigaction) +{ + abi_long ret; +#if defined(TARGET_ALPHA) + struct target_sigaction act, oact, *pact =3D NULL; + struct target_old_sigaction *old_act; + + if (arg2) { + if (!lock_user_struct(VERIFY_READ, old_act, arg2, 1)) { + return -TARGET_EFAULT; + } + act._sa_handler =3D old_act->_sa_handler; + target_siginitset(&act.sa_mask, old_act->sa_mask); + act.sa_flags =3D old_act->sa_flags; + act.sa_restorer =3D 0; + unlock_user_struct(old_act, arg2, 0); + pact =3D &act; + } + + ret =3D get_errno(do_sigaction(arg1, pact, &oact)); + + if (!is_error(ret) && arg3) { + if (!lock_user_struct(VERIFY_WRITE, old_act, arg3, 0)) { + return -TARGET_EFAULT; + } + old_act->_sa_handler =3D oact._sa_handler; + old_act->sa_mask =3D oact.sa_mask.sig[0]; + old_act->sa_flags =3D oact.sa_flags; + unlock_user_struct(old_act, arg3, 1); + } +#elif defined(TARGET_MIPS) + struct target_sigaction act, oact, *pact =3D NULL, *old_act; + + if (arg2) { + if (!lock_user_struct(VERIFY_READ, old_act, arg2, 1)) { + return -TARGET_EFAULT; + } + act._sa_handler =3D old_act->_sa_handler; + target_siginitset(&act.sa_mask, old_act->sa_mask.sig[0]); + act.sa_flags =3D old_act->sa_flags; + unlock_user_struct(old_act, arg2, 0); + pact =3D &act; + } + + ret =3D get_errno(do_sigaction(arg1, pact, &oact)); + + if (!is_error(ret) && arg3) { + if (!lock_user_struct(VERIFY_WRITE, old_act, arg3, 0)) { + return -TARGET_EFAULT; + } + old_act->_sa_handler =3D oact._sa_handler; + old_act->sa_flags =3D oact.sa_flags; + old_act->sa_mask.sig[0] =3D oact.sa_mask.sig[0]; + old_act->sa_mask.sig[1] =3D 0; + old_act->sa_mask.sig[2] =3D 0; + old_act->sa_mask.sig[3] =3D 0; + unlock_user_struct(old_act, arg3, 1); + } +#else + struct target_old_sigaction *old_act; + struct target_sigaction act, oact, *pact =3D NULL; + + if (arg2) { + if (!lock_user_struct(VERIFY_READ, old_act, arg2, 1)) { + return -TARGET_EFAULT; + } + act._sa_handler =3D old_act->_sa_handler; + target_siginitset(&act.sa_mask, old_act->sa_mask); + act.sa_flags =3D old_act->sa_flags; + act.sa_restorer =3D old_act->sa_restorer; +#ifdef TARGET_ARCH_HAS_KA_RESTORER + act.ka_restorer =3D 0; +#endif + unlock_user_struct(old_act, arg2, 0); + pact =3D &act; + } + + ret =3D get_errno(do_sigaction(arg1, pact, &oact)); + + if (!is_error(ret) && arg3) { + if (!lock_user_struct(VERIFY_WRITE, old_act, arg3, 0)) { + return -TARGET_EFAULT; + } + old_act->_sa_handler =3D oact._sa_handler; + old_act->sa_mask =3D oact.sa_mask.sig[0]; + old_act->sa_flags =3D oact.sa_flags; + old_act->sa_restorer =3D oact.sa_restorer; + unlock_user_struct(old_act, arg3, 1); + } +#endif + return ret; +} +#endif diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 0e9f4fd5ae..3ef1bfb4ec 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -4241,166 +4241,6 @@ static abi_long do_syscall1(void *cpu_env, int num,= abi_long arg1, void *p; =20 switch(num) { -#ifdef TARGET_NR_sigaction - case TARGET_NR_sigaction: - { -#if defined(TARGET_ALPHA) - struct target_sigaction act, oact, *pact =3D 0; - struct target_old_sigaction *old_act; - if (arg2) { - if (!lock_user_struct(VERIFY_READ, old_act, arg2, 1)) - return -TARGET_EFAULT; - act._sa_handler =3D old_act->_sa_handler; - target_siginitset(&act.sa_mask, old_act->sa_mask); - act.sa_flags =3D old_act->sa_flags; - act.sa_restorer =3D 0; - unlock_user_struct(old_act, arg2, 0); - pact =3D &act; - } - ret =3D get_errno(do_sigaction(arg1, pact, &oact)); - if (!is_error(ret) && arg3) { - if (!lock_user_struct(VERIFY_WRITE, old_act, arg3, 0)) - return -TARGET_EFAULT; - old_act->_sa_handler =3D oact._sa_handler; - old_act->sa_mask =3D oact.sa_mask.sig[0]; - old_act->sa_flags =3D oact.sa_flags; - unlock_user_struct(old_act, arg3, 1); - } -#elif defined(TARGET_MIPS) - struct target_sigaction act, oact, *pact, *old_act; - - if (arg2) { - if (!lock_user_struct(VERIFY_READ, old_act, arg2, 1)) - return -TARGET_EFAULT; - act._sa_handler =3D old_act->_sa_handler; - target_siginitset(&act.sa_mask, old_act->sa_mask.sig[0]); - act.sa_flags =3D old_act->sa_flags; - unlock_user_struct(old_act, arg2, 0); - pact =3D &act; - } else { - pact =3D NULL; - } - - ret =3D get_errno(do_sigaction(arg1, pact, &oact)); - - if (!is_error(ret) && arg3) { - if (!lock_user_struct(VERIFY_WRITE, old_act, arg3, 0)) - return -TARGET_EFAULT; - old_act->_sa_handler =3D oact._sa_handler; - old_act->sa_flags =3D oact.sa_flags; - old_act->sa_mask.sig[0] =3D oact.sa_mask.sig[0]; - old_act->sa_mask.sig[1] =3D 0; - old_act->sa_mask.sig[2] =3D 0; - old_act->sa_mask.sig[3] =3D 0; - unlock_user_struct(old_act, arg3, 1); - } -#else - struct target_old_sigaction *old_act; - struct target_sigaction act, oact, *pact; - if (arg2) { - if (!lock_user_struct(VERIFY_READ, old_act, arg2, 1)) - return -TARGET_EFAULT; - act._sa_handler =3D old_act->_sa_handler; - target_siginitset(&act.sa_mask, old_act->sa_mask); - act.sa_flags =3D old_act->sa_flags; - act.sa_restorer =3D old_act->sa_restorer; -#ifdef TARGET_ARCH_HAS_KA_RESTORER - act.ka_restorer =3D 0; -#endif - unlock_user_struct(old_act, arg2, 0); - pact =3D &act; - } else { - pact =3D NULL; - } - ret =3D get_errno(do_sigaction(arg1, pact, &oact)); - if (!is_error(ret) && arg3) { - if (!lock_user_struct(VERIFY_WRITE, old_act, arg3, 0)) - return -TARGET_EFAULT; - old_act->_sa_handler =3D oact._sa_handler; - old_act->sa_mask =3D oact.sa_mask.sig[0]; - old_act->sa_flags =3D oact.sa_flags; - old_act->sa_restorer =3D oact.sa_restorer; - unlock_user_struct(old_act, arg3, 1); - } -#endif - } - return ret; -#endif - case TARGET_NR_rt_sigaction: - { -#if defined(TARGET_ALPHA) - /* For Alpha and SPARC this is a 5 argument syscall, with - * a 'restorer' parameter which must be copied into the - * sa_restorer field of the sigaction struct. - * For Alpha that 'restorer' is arg5; for SPARC it is arg4, - * and arg5 is the sigsetsize. - * Alpha also has a separate rt_sigaction struct that it uses - * here; SPARC uses the usual sigaction struct. - */ - struct target_rt_sigaction *rt_act; - struct target_sigaction act, oact, *pact =3D 0; - - if (arg4 !=3D sizeof(target_sigset_t)) { - return -TARGET_EINVAL; - } - if (arg2) { - if (!lock_user_struct(VERIFY_READ, rt_act, arg2, 1)) - return -TARGET_EFAULT; - act._sa_handler =3D rt_act->_sa_handler; - act.sa_mask =3D rt_act->sa_mask; - act.sa_flags =3D rt_act->sa_flags; - act.sa_restorer =3D arg5; - unlock_user_struct(rt_act, arg2, 0); - pact =3D &act; - } - ret =3D get_errno(do_sigaction(arg1, pact, &oact)); - if (!is_error(ret) && arg3) { - if (!lock_user_struct(VERIFY_WRITE, rt_act, arg3, 0)) - return -TARGET_EFAULT; - rt_act->_sa_handler =3D oact._sa_handler; - rt_act->sa_mask =3D oact.sa_mask; - rt_act->sa_flags =3D oact.sa_flags; - unlock_user_struct(rt_act, arg3, 1); - } -#else -#ifdef TARGET_SPARC - target_ulong restorer =3D arg4; - target_ulong sigsetsize =3D arg5; -#else - target_ulong sigsetsize =3D arg4; -#endif - struct target_sigaction *act; - struct target_sigaction *oact; - - if (sigsetsize !=3D sizeof(target_sigset_t)) { - return -TARGET_EINVAL; - } - if (arg2) { - if (!lock_user_struct(VERIFY_READ, act, arg2, 1)) { - return -TARGET_EFAULT; - } -#ifdef TARGET_ARCH_HAS_KA_RESTORER - act->ka_restorer =3D restorer; -#endif - } else { - act =3D NULL; - } - if (arg3) { - if (!lock_user_struct(VERIFY_WRITE, oact, arg3, 0)) { - ret =3D -TARGET_EFAULT; - goto rt_sigaction_fail; - } - } else - oact =3D NULL; - ret =3D get_errno(do_sigaction(arg1, act, oact)); - rt_sigaction_fail: - if (act) - unlock_user_struct(act, arg2, 0); - if (oact) - unlock_user_struct(oact, arg3, 1); -#endif - } - return ret; #ifdef TARGET_NR_sgetmask /* not on alpha */ case TARGET_NR_sgetmask: { diff --git a/linux-user/strace.list b/linux-user/strace.list index bf87a6d4cb..20a71adc21 100644 --- a/linux-user/strace.list +++ b/linux-user/strace.list @@ -926,9 +926,6 @@ #ifdef TARGET_NR_rmdir { TARGET_NR_rmdir, "rmdir" , NULL, NULL, NULL }, #endif -#ifdef TARGET_NR_rt_sigaction -{ TARGET_NR_rt_sigaction, "rt_sigaction" , NULL, print_rt_sigaction, NULL = }, -#endif #ifdef TARGET_NR_rt_sigpending { TARGET_NR_rt_sigpending, "rt_sigpending" , NULL, NULL, NULL }, #endif @@ -1125,9 +1122,6 @@ #ifdef TARGET_NR_shutdown { TARGET_NR_shutdown, "shutdown" , NULL, NULL, NULL }, #endif -#ifdef TARGET_NR_sigaction -{ TARGET_NR_sigaction, "sigaction" , NULL, NULL, NULL }, -#endif #ifdef TARGET_NR_sigaltstack { TARGET_NR_sigaltstack, "sigaltstack" , "%s(%p,%p)", NULL, NULL }, #endif --=20 2.17.1 From nobody Thu May 9 22:44:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1558300888; cv=none; d=zoho.com; s=zohoarc; b=oNkU3GFVz4qj1EsXCNP/E1OZjHC8yYdGqdj/FlCK+ynwTt4dDS3SHVcL2UXZBXkHd9VIRVzqVD4XNVH4yranVIjFL08s6mez9aJAWj/Jt+pn7pWrl5kMjZ4wi3RNtWcT1+SH1aLsPzLFspuk5N3uQyPcdAEdAbDPGET01B/DSbE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1558300888; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=ZHIm//oI2ZITpFYguBWDThC46F/4JpJyOJc3fr98jRM=; b=XDhOGJ6NMkVNwjPKrdT5gwKhKVXId3gS9xAQZHgjAYaNivwUoWs9WEV9yWhbT2NiO6jLk/lQxFHCid83ckZbHO0bev+0FfWHSWnM1xh5+TFcsR8cEx1d17g0MZBYAhBiEYRRDkPUfyJ7kGeloEQ0HyOUQoSA5QIfV3eKnzP6ub0= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1558300888928793.010381301065; Sun, 19 May 2019 14:21:28 -0700 (PDT) Received: from localhost ([127.0.0.1]:53755 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSTFB-00074G-KS for importer@patchew.org; Sun, 19 May 2019 17:21:21 -0400 Received: from eggs.gnu.org ([209.51.188.92]:50977) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSZu-0003rD-Fo for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:43 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hSSZt-0004lf-CO for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:42 -0400 Received: from mail-pl1-x643.google.com ([2607:f8b0:4864:20::643]:37919) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hSSZt-0004kr-5Q for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:41 -0400 Received: by mail-pl1-x643.google.com with SMTP id f97so5703959plb.5 for ; Sun, 19 May 2019 13:38:41 -0700 (PDT) Received: from localhost.localdomain (97-113-13-231.tukw.qwest.net. [97.113.13.231]) by smtp.gmail.com with ESMTPSA id i7sm11397448pfo.19.2019.05.19.13.38.38 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 19 May 2019 13:38:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=ZHIm//oI2ZITpFYguBWDThC46F/4JpJyOJc3fr98jRM=; b=V1H717qlgfK0j7xr/K+RYpqiyrSw3a5X8rIJyQvsx4ZKaPMHgXjq2nC/xJxbdghty1 b7140T3IvFhmX24cDwTJv2PBAs9jxLzXpHM4W/IeuE8FenUsUM8YTEtGyTc2KI82fPNg zEte2582fTIdNkjIKMkYXquxIvy3aFPyLTkEA/2BbZwyW7aQULkezQTzVO/dS16RU9Hk 1jxPPc8GeJnECeD8Y8BhYQeJKG0fUbXOQBNvbc3KS5qwDsRlhgpOyLEQuxRm6KTi5bJA /8UOTuM61dkVC1XROCMI1ZhZx5SZ8lmi6fFzwhDFgr7pYt2/41ASQEsC/ANYFawBVgFi xX8A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=ZHIm//oI2ZITpFYguBWDThC46F/4JpJyOJc3fr98jRM=; b=lqutc3OBXGPbuP2PR5mvJAS8J3t1Bd7dP+FLn/p9T2KhOiZ96CvohUeDCe+JAD9jGt RHxYCmSYYpa+DeKDU9fQV2T1kWI6sLDbkeRfl4aa1CbtrgbHMezcAgy3OxyN2nsm25sP pbKdE25/o3+JLkJUjgvUzrxdRiH+8sYzHq5qeEBElViEBMGc2CGWeZkd+Sy++TNBNw+b pqKuJszXI9JIStXuqmWSmuHNwu05ePoi2FMV9wdsuz0NxuPUpEhexIJvSeTmnmjiOnWv O2YrZav6iYZaaE35vVOyTT5eBK+TUJ/9pN7n786unfoKtPKTDKQYjAdMAWIFcoAKCUBf Kfng== X-Gm-Message-State: APjAAAWNHG6XXlcrimC7AWnfmtMKixslPcsmnIomcm7IE7vu/91N27qZ QkGm3vZXI76yMxNHCNuDcN+ruCogNcc= X-Google-Smtp-Source: APXvYqyH8BmX6Iagc0HRXl0DNv6TQqioo3y7I68t+qOj1meuLt8r9crCRb0tshOYZPBAhmQDolmwwQ== X-Received: by 2002:a17:902:bd95:: with SMTP id q21mr35436912pls.159.1558298319969; Sun, 19 May 2019 13:38:39 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sun, 19 May 2019 13:37:09 -0700 Message-Id: <20190519203726.20729-58-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190519203726.20729-1-richard.henderson@linaro.org> References: <20190519203726.20729-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::643 Subject: [Qemu-devel] [PATCH v7 57/74] linux-user: Split out sgetmask, ssetmask X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: laurent@vivier.eu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Richard Henderson --- linux-user/syscall-defs.h | 6 ++++++ linux-user/syscall-sig.inc.c | 32 ++++++++++++++++++++++++++++++++ linux-user/syscall.c | 27 --------------------------- linux-user/strace.list | 6 ------ 4 files changed, 38 insertions(+), 33 deletions(-) diff --git a/linux-user/syscall-defs.h b/linux-user/syscall-defs.h index b62bffeb68..99532f75b2 100644 --- a/linux-user/syscall-defs.h +++ b/linux-user/syscall-defs.h @@ -222,6 +222,12 @@ SYSCALL_DEF(shmget, ARG_DEC, ARG_DEC, ARG_HEX); #ifdef TARGET_NR_sigaction SYSCALL_DEF(sigaction, ARG_SIGNAL, ARG_PTR, ARG_PTR); #endif +#ifdef TARGET_NR_sgetmask +SYSCALL_DEF(sgetmask); +#endif +#ifdef TARGET_NR_ssetmask +SYSCALL_DEF(ssetmask, ARG_HEX); +#endif #ifdef TARGET_NR_stime SYSCALL_DEF(stime, ARG_PTR); #endif diff --git a/linux-user/syscall-sig.inc.c b/linux-user/syscall-sig.inc.c index 918d58878f..f50ed16b74 100644 --- a/linux-user/syscall-sig.inc.c +++ b/linux-user/syscall-sig.inc.c @@ -211,3 +211,35 @@ SYSCALL_IMPL(sigaction) return ret; } #endif + +#ifdef TARGET_NR_sgetmask +SYSCALL_IMPL(sgetmask) +{ + sigset_t cur_set; + abi_ulong target_set; + abi_long ret =3D do_sigprocmask(0, NULL, &cur_set); + + if (!ret) { + host_to_target_old_sigset(&target_set, &cur_set); + ret =3D target_set; + } + return ret; +} +#endif + +#ifdef TARGET_NR_ssetmask +SYSCALL_IMPL(ssetmask) +{ + sigset_t set, oset; + abi_ulong target_set =3D arg1; + abi_long ret; + + target_to_host_old_sigset(&set, &target_set); + ret =3D do_sigprocmask(SIG_SETMASK, &set, &oset); + if (!ret) { + host_to_target_old_sigset(&target_set, &oset); + ret =3D target_set; + } + return ret; +} +#endif diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 3ef1bfb4ec..7bd410bcf0 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -4241,33 +4241,6 @@ static abi_long do_syscall1(void *cpu_env, int num, = abi_long arg1, void *p; =20 switch(num) { -#ifdef TARGET_NR_sgetmask /* not on alpha */ - case TARGET_NR_sgetmask: - { - sigset_t cur_set; - abi_ulong target_set; - ret =3D do_sigprocmask(0, NULL, &cur_set); - if (!ret) { - host_to_target_old_sigset(&target_set, &cur_set); - ret =3D target_set; - } - } - return ret; -#endif -#ifdef TARGET_NR_ssetmask /* not on alpha */ - case TARGET_NR_ssetmask: - { - sigset_t set, oset; - abi_ulong target_set =3D arg1; - target_to_host_old_sigset(&set, &target_set); - ret =3D do_sigprocmask(SIG_SETMASK, &set, &oset); - if (!ret) { - host_to_target_old_sigset(&target_set, &oset); - ret =3D target_set; - } - } - return ret; -#endif #ifdef TARGET_NR_sigprocmask case TARGET_NR_sigprocmask: { diff --git a/linux-user/strace.list b/linux-user/strace.list index 20a71adc21..3cad68e081 100644 --- a/linux-user/strace.list +++ b/linux-user/strace.list @@ -1116,9 +1116,6 @@ #ifdef TARGET_NR_setxattr { TARGET_NR_setxattr, "setxattr" , NULL, NULL, NULL }, #endif -#ifdef TARGET_NR_sgetmask -{ TARGET_NR_sgetmask, "sgetmask" , NULL, NULL, NULL }, -#endif #ifdef TARGET_NR_shutdown { TARGET_NR_shutdown, "shutdown" , NULL, NULL, NULL }, #endif @@ -1158,9 +1155,6 @@ #ifdef TARGET_NR_splice { TARGET_NR_splice, "splice" , NULL, NULL, NULL }, #endif -#ifdef TARGET_NR_ssetmask -{ TARGET_NR_ssetmask, "ssetmask" , NULL, NULL, NULL }, -#endif #ifdef TARGET_NR_stat { TARGET_NR_stat, "stat" , NULL, print_stat, NULL }, #endif --=20 2.17.1 From nobody Thu May 9 22:44:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1558301548; cv=none; d=zoho.com; s=zohoarc; b=OaCB5btBGjzRudbKWlJiKFK0UeIBKR3I5prWznay/2cmJpeNqFu0dgqM9gfUFbWXiDe5dfPH2ACrjzYde1lJEygg9Wy9kcOlpM9mL71IEJDpsj4BwvdyYoRyzSRmx1DTSQCzip5f3rvuh0FnB9ddmpBmpCCvAKjwtYNgBbvbJOc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1558301548; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=eD3ERAgN2Y5dS3+RsjRbX33QhXWDkyWUDS3x/SCrsg8=; b=ccNNErjwSWHxSknQtGt5dmiMXZXmHYL3iZLgRL1t18B/9AkXDu/5zfx+yIdoxRMKnvSt3ZngFCWTLN/6+Vlui03k8OhVREejyTuxhhRhkAFpDgYdqX1KqOm2qLyb2FutPZbBVorqlC08YXijCBA778P+X0e4ZF48lLqeMgPZfL4= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (209.51.188.17 [209.51.188.17]) by mx.zohomail.com with SMTPS id 1558301548114976.1971391792567; Sun, 19 May 2019 14:32:28 -0700 (PDT) Received: from localhost ([127.0.0.1]:53939 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSTPk-0008Qa-0C for importer@patchew.org; Sun, 19 May 2019 17:32:16 -0400 Received: from eggs.gnu.org ([209.51.188.92]:51000) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSZw-0003tT-8s for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:45 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hSSZu-0004nJ-Oa for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:44 -0400 Received: from mail-pg1-x541.google.com ([2607:f8b0:4864:20::541]:42365) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hSSZu-0004mR-GS for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:42 -0400 Received: by mail-pg1-x541.google.com with SMTP id 145so5730546pgg.9 for ; Sun, 19 May 2019 13:38:42 -0700 (PDT) Received: from localhost.localdomain (97-113-13-231.tukw.qwest.net. [97.113.13.231]) by smtp.gmail.com with ESMTPSA id i7sm11397448pfo.19.2019.05.19.13.38.40 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 19 May 2019 13:38:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=eD3ERAgN2Y5dS3+RsjRbX33QhXWDkyWUDS3x/SCrsg8=; b=hUrq3AIPxwR1z9E8UTuLi1JhZDec7hoB2OnfvhChro7DkS6v1PNKGntVyMnwXh/hiU 5jtbvr7jUG1kb40D6gdB+fknv2jwd5jabqHIrmSDf3JKNntnbjenKXBRKa8r/9NEG5B0 Mw5m6e7nHH6dhGKtO0IYyGo3F1mX+k6sH65THR+taomf2zVtofNttX0qqtxkVAlbItti 2gCI+x0Dn7oGhGiVF+LXZfBjcS3JRyy7kjBpl6/vM7Oz7koaJ2FDAR099qpJQ0kRv+Xf BguZCtPvgox66804ZNNOweMQ6f/zPi2G04oj5U15h9XRR0HRLGJ/b4B4MLdjLrzB6Eql ZidA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=eD3ERAgN2Y5dS3+RsjRbX33QhXWDkyWUDS3x/SCrsg8=; b=pR3/nabuX23DWV6eZJt1cEkVtz3RkDT9Gj4MCZoscpKpIByht9T07NYgV/i/7MuuXi 8vbbFYXbSyux9cJHaWiYBr3J4p1FrTRq6mv4po81zDR6VxMMIi2Gh8ni/GHmYOa8kt/c JuEOjy0+MKx2nm0tKC8n0MZUiNT+iQsHNquiQvQAn7LG125EtTmeI0WofFyMpbqb/qkR qN/A/AxONsQ13D4PHMxSjMlv28DxnlGmkUIXKBZP9BBieJch7RibE0J2+w9EInQlL0lW GhgHXB0M/CNO5rlccFt+E+HuPG3SE0JYQpFoBBKiUo8C/Vq1w6LERWJTogKF/faAcrA4 ai2g== X-Gm-Message-State: APjAAAUXmhei0GkgxkaDsdHzoXWpMSnK5mx1MNUOSeQUeidsvnalXvaz GNApqOZMA7yithRRS7lvkQw3ZVDGXNY= X-Google-Smtp-Source: APXvYqzz1SrZiHumI4YmdRsi5GPRwHbdxmEkXltyrIthjJ4NAiU3p7HTCuLD483kWBVdfEd2ryryUQ== X-Received: by 2002:aa7:8c1a:: with SMTP id c26mr75650225pfd.25.1558298321226; Sun, 19 May 2019 13:38:41 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sun, 19 May 2019 13:37:10 -0700 Message-Id: <20190519203726.20729-59-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190519203726.20729-1-richard.henderson@linaro.org> References: <20190519203726.20729-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::541 Subject: [Qemu-devel] [PATCH v7 58/74] linux-user: Split out sigprocmask, rt_sigprocmask X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: laurent@vivier.eu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Richard Henderson --- linux-user/syscall-defs.h | 6 ++ linux-user/syscall.h | 1 + linux-user/strace.c | 44 +++++++------ linux-user/syscall-sig.inc.c | 123 +++++++++++++++++++++++++++++++++++ linux-user/syscall.c | 109 ------------------------------- linux-user/strace.list | 6 -- 6 files changed, 154 insertions(+), 135 deletions(-) diff --git a/linux-user/syscall-defs.h b/linux-user/syscall-defs.h index 99532f75b2..ef77f60524 100644 --- a/linux-user/syscall-defs.h +++ b/linux-user/syscall-defs.h @@ -194,6 +194,7 @@ SYSCALL_DEF(rt_sigaction, ARG_SIGNAL, ARG_PTR, ARG_PTR,= ARG_PTR, ARG_DEC); #else SYSCALL_DEF(rt_sigaction, ARG_SIGNAL, ARG_PTR, ARG_PTR, ARG_DEC); #endif +SYSCALL_DEF(rt_sigprocmask, ARG_SIGPROCMASKHOW, ARG_PTR, ARG_PTR, ARG_DEC); #if !defined(SYSCALL_TABLE) || defined(TARGET_NR_semctl) SYSCALL_DEF(semctl, ARG_DEC, ARG_DEC, ARG_DEC, ARG_HEX); #endif @@ -222,6 +223,11 @@ SYSCALL_DEF(shmget, ARG_DEC, ARG_DEC, ARG_HEX); #ifdef TARGET_NR_sigaction SYSCALL_DEF(sigaction, ARG_SIGNAL, ARG_PTR, ARG_PTR); #endif +#if defined(TARGET_ALPHA) +SYSCALL_DEF(sigprocmask, ARG_SIGPROCMASKHOW, ARG_HEX); +#elif defined(TARGET_NR_sigprocmask) +SYSCALL_DEF(sigprocmask, ARG_SIGPROCMASKHOW, ARG_PTR, ARG_PTR); +#endif #ifdef TARGET_NR_sgetmask SYSCALL_DEF(sgetmask); #endif diff --git a/linux-user/syscall.h b/linux-user/syscall.h index 7b197840f5..cf9f3e5e55 100644 --- a/linux-user/syscall.h +++ b/linux-user/syscall.h @@ -59,6 +59,7 @@ typedef enum { ARG_ATDIRFD, ARG_SIGNAL, ARG_LSEEKWHENCE, + ARG_SIGPROCMASKHOW, =20 /* These print as sets of flags. */ ARG_ACCESSFLAG, diff --git a/linux-user/strace.c b/linux-user/strace.c index 83dd755c73..886663af2e 100644 --- a/linux-user/strace.c +++ b/linux-user/strace.c @@ -102,6 +102,27 @@ add_signal(char *buf, int size, int sig) } } =20 +static int +add_sigprocmaskhow(char *buf, int size, int how) +{ + const char *str; + + switch (how) { + case TARGET_SIG_BLOCK: + str =3D "SIG_BLOCK"; + break; + case TARGET_SIG_UNBLOCK: + str =3D "SIG_UNBLOCK"; + break; + case TARGET_SIG_SETMASK: + str =3D "SIG_SETMASK"; + break; + default: + return snprintf(buf, size, "%d", how); + } + return snprintf(buf, size, "%s", str); +} + static void print_signal(abi_ulong arg, int last) { @@ -1564,26 +1585,6 @@ print_fstat(const struct syscallname *name, #define print_fstat64 print_fstat #endif =20 -#ifdef TARGET_NR_rt_sigprocmask -static void -print_rt_sigprocmask(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - const char *how =3D "UNKNOWN"; - print_syscall_prologue(name); - switch(arg0) { - case TARGET_SIG_BLOCK: how =3D "SIG_BLOCK"; break; - case TARGET_SIG_UNBLOCK: how =3D "SIG_UNBLOCK"; break; - case TARGET_SIG_SETMASK: how =3D "SIG_SETMASK"; break; - } - gemu_log("%s,",how); - print_pointer(arg1, 0); - print_pointer(arg2, 1); - print_syscall_epilogue(name); -} -#endif - #ifdef TARGET_NR_rt_sigqueueinfo static void print_rt_sigqueueinfo(const struct syscallname *name, @@ -2015,6 +2016,9 @@ static void print_syscall_def1(const SyscallDef *def,= int64_t args[6]) case ARG_SIGNAL: len =3D add_signal(b, rest, arg); break; + case ARG_SIGPROCMASKHOW: + len =3D add_sigprocmaskhow(b, rest, arg); + break; case ARG_ACCESSFLAG: len =3D add_flags(b, rest, access_flags, arg, false); break; diff --git a/linux-user/syscall-sig.inc.c b/linux-user/syscall-sig.inc.c index f50ed16b74..8a6518bdaa 100644 --- a/linux-user/syscall-sig.inc.c +++ b/linux-user/syscall-sig.inc.c @@ -117,6 +117,53 @@ SYSCALL_IMPL(rt_sigaction) return ret; } =20 +SYSCALL_IMPL(rt_sigprocmask) +{ + int how =3D 0; + sigset_t set, oldset, *set_ptr =3D NULL; + abi_long ret; + void *p; + + if (arg4 !=3D sizeof(target_sigset_t)) { + return -TARGET_EINVAL; + } + + if (arg2) { + switch (arg1) { + case TARGET_SIG_BLOCK: + how =3D SIG_BLOCK; + break; + case TARGET_SIG_UNBLOCK: + how =3D SIG_UNBLOCK; + break; + case TARGET_SIG_SETMASK: + how =3D SIG_SETMASK; + break; + default: + return -TARGET_EINVAL; + } + p =3D lock_user(VERIFY_READ, arg2, sizeof(target_sigset_t), 1); + if (!p) { + return -TARGET_EFAULT; + } + target_to_host_sigset(&set, p); + unlock_user(p, arg2, 0); + set_ptr =3D &set; + } + + ret =3D do_sigprocmask(how, set_ptr, &oldset); + + if (!is_error(ret) && arg3) { + p =3D lock_user(VERIFY_WRITE, arg3, sizeof(target_sigset_t), 0); + if (!p) { + return -TARGET_EFAULT; + } + host_to_target_sigset(p, &oldset); + unlock_user(p, arg3, sizeof(target_sigset_t)); + } + return ret; +} + #ifdef TARGET_NR_sigaction SYSCALL_IMPL(sigaction) { @@ -212,6 +259,82 @@ SYSCALL_IMPL(sigaction) } #endif =20 +#ifdef TARGET_NR_sigprocmask +SYSCALL_IMPL(sigprocmask) +{ +#if defined(TARGET_ALPHA) + sigset_t set, oldset; + abi_ulong mask; + int how; + abi_long ret; + + switch (arg1) { + case TARGET_SIG_BLOCK: + how =3D SIG_BLOCK; + break; + case TARGET_SIG_UNBLOCK: + how =3D SIG_UNBLOCK; + break; + case TARGET_SIG_SETMASK: + how =3D SIG_SETMASK; + break; + default: + return -TARGET_EINVAL; + } + mask =3D arg2; + target_to_host_old_sigset(&set, &mask); + + ret =3D do_sigprocmask(how, &set, &oldset); + + if (!is_error(ret)) { + host_to_target_old_sigset(&mask, &oldset); + ret =3D mask; + ((CPUAlphaState *)cpu_env)->ir[IR_V0] =3D 0; /* force no error */ + } +#else + sigset_t set, oldset, *set_ptr =3D NULL; + int how =3D 0; + abi_long ret; + void *p; + + if (arg2) { + switch (arg1) { + case TARGET_SIG_BLOCK: + how =3D SIG_BLOCK; + break; + case TARGET_SIG_UNBLOCK: + how =3D SIG_UNBLOCK; + break; + case TARGET_SIG_SETMASK: + how =3D SIG_SETMASK; + break; + default: + return -TARGET_EINVAL; + } + p =3D lock_user(VERIFY_READ, arg2, sizeof(target_sigset_t), 1); + if (!p) { + return -TARGET_EFAULT; + } + target_to_host_old_sigset(&set, p); + unlock_user(p, arg2, 0); + set_ptr =3D &set; + } + + ret =3D do_sigprocmask(how, set_ptr, &oldset); + + if (!is_error(ret) && arg3) { + p =3D lock_user(VERIFY_WRITE, arg3, sizeof(target_sigset_t), 0); + if (!p) { + return -TARGET_EFAULT; + } + host_to_target_old_sigset(p, &oldset); + unlock_user(p, arg3, sizeof(target_sigset_t)); + } +#endif + return ret; +} +#endif + #ifdef TARGET_NR_sgetmask SYSCALL_IMPL(sgetmask) { diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 7bd410bcf0..11bbdfade4 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -4241,115 +4241,6 @@ static abi_long do_syscall1(void *cpu_env, int num,= abi_long arg1, void *p; =20 switch(num) { -#ifdef TARGET_NR_sigprocmask - case TARGET_NR_sigprocmask: - { -#if defined(TARGET_ALPHA) - sigset_t set, oldset; - abi_ulong mask; - int how; - - switch (arg1) { - case TARGET_SIG_BLOCK: - how =3D SIG_BLOCK; - break; - case TARGET_SIG_UNBLOCK: - how =3D SIG_UNBLOCK; - break; - case TARGET_SIG_SETMASK: - how =3D SIG_SETMASK; - break; - default: - return -TARGET_EINVAL; - } - mask =3D arg2; - target_to_host_old_sigset(&set, &mask); - - ret =3D do_sigprocmask(how, &set, &oldset); - if (!is_error(ret)) { - host_to_target_old_sigset(&mask, &oldset); - ret =3D mask; - ((CPUAlphaState *)cpu_env)->ir[IR_V0] =3D 0; /* force no e= rror */ - } -#else - sigset_t set, oldset, *set_ptr; - int how; - - if (arg2) { - switch (arg1) { - case TARGET_SIG_BLOCK: - how =3D SIG_BLOCK; - break; - case TARGET_SIG_UNBLOCK: - how =3D SIG_UNBLOCK; - break; - case TARGET_SIG_SETMASK: - how =3D SIG_SETMASK; - break; - default: - return -TARGET_EINVAL; - } - if (!(p =3D lock_user(VERIFY_READ, arg2, sizeof(target_sig= set_t), 1))) - return -TARGET_EFAULT; - target_to_host_old_sigset(&set, p); - unlock_user(p, arg2, 0); - set_ptr =3D &set; - } else { - how =3D 0; - set_ptr =3D NULL; - } - ret =3D do_sigprocmask(how, set_ptr, &oldset); - if (!is_error(ret) && arg3) { - if (!(p =3D lock_user(VERIFY_WRITE, arg3, sizeof(target_si= gset_t), 0))) - return -TARGET_EFAULT; - host_to_target_old_sigset(p, &oldset); - unlock_user(p, arg3, sizeof(target_sigset_t)); - } -#endif - } - return ret; -#endif - case TARGET_NR_rt_sigprocmask: - { - int how =3D arg1; - sigset_t set, oldset, *set_ptr; - - if (arg4 !=3D sizeof(target_sigset_t)) { - return -TARGET_EINVAL; - } - - if (arg2) { - switch(how) { - case TARGET_SIG_BLOCK: - how =3D SIG_BLOCK; - break; - case TARGET_SIG_UNBLOCK: - how =3D SIG_UNBLOCK; - break; - case TARGET_SIG_SETMASK: - how =3D SIG_SETMASK; - break; - default: - return -TARGET_EINVAL; - } - if (!(p =3D lock_user(VERIFY_READ, arg2, sizeof(target_sig= set_t), 1))) - return -TARGET_EFAULT; - target_to_host_sigset(&set, p); - unlock_user(p, arg2, 0); - set_ptr =3D &set; - } else { - how =3D 0; - set_ptr =3D NULL; - } - ret =3D do_sigprocmask(how, set_ptr, &oldset); - if (!is_error(ret) && arg3) { - if (!(p =3D lock_user(VERIFY_WRITE, arg3, sizeof(target_si= gset_t), 0))) - return -TARGET_EFAULT; - host_to_target_sigset(p, &oldset); - unlock_user(p, arg3, sizeof(target_sigset_t)); - } - } - return ret; #ifdef TARGET_NR_sigpending case TARGET_NR_sigpending: { diff --git a/linux-user/strace.list b/linux-user/strace.list index 3cad68e081..7157876302 100644 --- a/linux-user/strace.list +++ b/linux-user/strace.list @@ -929,9 +929,6 @@ #ifdef TARGET_NR_rt_sigpending { TARGET_NR_rt_sigpending, "rt_sigpending" , NULL, NULL, NULL }, #endif -#ifdef TARGET_NR_rt_sigprocmask -{ TARGET_NR_rt_sigprocmask, "rt_sigprocmask" , NULL, print_rt_sigprocmask,= NULL }, -#endif #ifdef TARGET_NR_rt_sigqueueinfo { TARGET_NR_rt_sigqueueinfo, "rt_sigqueueinfo" , NULL, print_rt_sigqueuein= fo, NULL }, #endif @@ -1134,9 +1131,6 @@ #ifdef TARGET_NR_sigpending { TARGET_NR_sigpending, "sigpending" , NULL, NULL, NULL }, #endif -#ifdef TARGET_NR_sigprocmask -{ TARGET_NR_sigprocmask, "sigprocmask" , NULL, NULL, NULL }, -#endif #ifdef TARGET_NR_sigreturn { TARGET_NR_sigreturn, "sigreturn" , NULL, NULL, NULL }, #endif --=20 2.17.1 From nobody Thu May 9 22:44:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1558300772; cv=none; d=zoho.com; s=zohoarc; b=AzBmtrDX4hHcHoRCx/+tdMrfLY269xM+1PZ3IRHcErZxn2GFirRGPvnWl/io0U8aebEPy53LY82M/IoKvj5+cJ9fpFdW+N00bPYSmxL2UVsGHw2FjZRRe+e6emtQUi0wkNcVs+okgautdPTvGFWwdUxhrpJClwuKfn6uc4K+0jk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1558300772; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=ECmaTCfEAMemyN6xkmuxaTzKq2RyHXzLJFeHp0RKqwc=; b=eYTAx1NhkpFjGRodbOZoR2qRpnqkX0yZLkiVTUiYxM6nue8Q/8Hg1E6LdnFVVWcslp/GseNmbn0l055t+kNJxxqY8qCGO3KyDHGcuiraRhqZG5RSa0H9FybzRvX7uKm0q6+J+Cm+whPPtceiN7UB/tJTPfUsqQQE2Ekvpy8ZFkQ= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1558300772624927.3842474675033; Sun, 19 May 2019 14:19:32 -0700 (PDT) Received: from localhost ([127.0.0.1]:53704 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSTDJ-0005Ej-DF for importer@patchew.org; Sun, 19 May 2019 17:19:25 -0400 Received: from eggs.gnu.org ([209.51.188.92]:51008) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSZx-0003uD-2f for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:46 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hSSZv-0004og-Rs for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:45 -0400 Received: from mail-pf1-x442.google.com ([2607:f8b0:4864:20::442]:40703) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hSSZv-0004np-Lt for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:43 -0400 Received: by mail-pf1-x442.google.com with SMTP id u17so6164928pfn.7 for ; Sun, 19 May 2019 13:38:43 -0700 (PDT) Received: from localhost.localdomain (97-113-13-231.tukw.qwest.net. [97.113.13.231]) by smtp.gmail.com with ESMTPSA id i7sm11397448pfo.19.2019.05.19.13.38.41 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 19 May 2019 13:38:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=ECmaTCfEAMemyN6xkmuxaTzKq2RyHXzLJFeHp0RKqwc=; b=q7VaexYd+7If+cN2hjhaFwAKNkcPwnI0/CufIkGx5LDTc1sAzpKs8XJ+C2gfl+pADo JelSOM/p0qBipRdZdeO8FnD7I0Sfl3uduomlcO7xgAptqH+93GIaC/UY2EJNEQc+nc0s ais6vaUpRo6PhKvkeLIFBtto7go/wo9GoFnd6J9DGCxP5iImwhOJyGnDu6ejYdAIFbrN penQZzl50WLzHt8qszsFQlmrQR4zaiVTsSvbZ19cqsNgKTJ4g4URjeYojzVbsL5N5z1s CQ88qFOKGuCeArEIMLxAOInDYdHZi6GvDbbGSSsn5bA0Q+bXkk9RFs4HITNHasWJSwUK oboQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=ECmaTCfEAMemyN6xkmuxaTzKq2RyHXzLJFeHp0RKqwc=; b=CxvpAYh6jRdUMUSlpLRl0tZ4GS3AIe18vjkFeRlidFzlKM5lGMzXe6/ShrpH/7KKV1 VgBSCU0nX2k+4NujshiXqSJcIYy81ao56IjP/s0i4+mxpsk+87boHS1d0m7wZkmNfERz NGqDZdtRvwN3kfZGtY3Vet0hk7tDLtD1zZ0mqrBUB+iRahqrSdYqO0YS91ycysu72zBY 2EuTfE9T5GzciKSrcM4NIsJCVjZ68EdN5cIvdkJYP4ben/+b3zWwtnEFFixFAwF3VGip 5SahACBbFaRl47BGdzYT+byGpET30rfHYUWnR+/kbD+VaaqEvB4u5PyK3jpPCCvWmdfk qKRA== X-Gm-Message-State: APjAAAUtuwL7c1YkIn2FhUTEbx4cTn0JdIUXlUYa9fFxtFC2psShbrq/ W0oYfpDi4HgkWMWzEf4AbE0MZ0tdESk= X-Google-Smtp-Source: APXvYqzggcw1zSdAw87EM5N5dtLrHHGvV3GeoHFhPMaI+6JWg8krXfz8lNcTZv3IdbQhDPxZVsNTWg== X-Received: by 2002:a62:5487:: with SMTP id i129mr75484904pfb.68.1558298322438; Sun, 19 May 2019 13:38:42 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sun, 19 May 2019 13:37:11 -0700 Message-Id: <20190519203726.20729-60-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190519203726.20729-1-richard.henderson@linaro.org> References: <20190519203726.20729-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::442 Subject: [Qemu-devel] [PATCH v7 59/74] linux-user: Split out sigpending, rt_sigpending X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: laurent@vivier.eu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Richard Henderson --- linux-user/syscall-defs.h | 4 ++++ linux-user/syscall-sig.inc.c | 45 ++++++++++++++++++++++++++++++++++++ linux-user/syscall.c | 36 ----------------------------- linux-user/strace.list | 6 ----- 4 files changed, 49 insertions(+), 42 deletions(-) diff --git a/linux-user/syscall-defs.h b/linux-user/syscall-defs.h index ef77f60524..83a69246d0 100644 --- a/linux-user/syscall-defs.h +++ b/linux-user/syscall-defs.h @@ -194,6 +194,7 @@ SYSCALL_DEF(rt_sigaction, ARG_SIGNAL, ARG_PTR, ARG_PTR,= ARG_PTR, ARG_DEC); #else SYSCALL_DEF(rt_sigaction, ARG_SIGNAL, ARG_PTR, ARG_PTR, ARG_DEC); #endif +SYSCALL_DEF(rt_sigpending, ARG_PTR, ARG_DEC); SYSCALL_DEF(rt_sigprocmask, ARG_SIGPROCMASKHOW, ARG_PTR, ARG_PTR, ARG_DEC); #if !defined(SYSCALL_TABLE) || defined(TARGET_NR_semctl) SYSCALL_DEF(semctl, ARG_DEC, ARG_DEC, ARG_DEC, ARG_HEX); @@ -223,6 +224,9 @@ SYSCALL_DEF(shmget, ARG_DEC, ARG_DEC, ARG_HEX); #ifdef TARGET_NR_sigaction SYSCALL_DEF(sigaction, ARG_SIGNAL, ARG_PTR, ARG_PTR); #endif +#ifdef TARGET_NR_sigpending +SYSCALL_DEF(sigpending, ARG_PTR); +#endif #if defined(TARGET_ALPHA) SYSCALL_DEF(sigprocmask, ARG_SIGPROCMASKHOW, ARG_HEX); #elif defined(TARGET_NR_sigprocmask) diff --git a/linux-user/syscall-sig.inc.c b/linux-user/syscall-sig.inc.c index 8a6518bdaa..fe717a5121 100644 --- a/linux-user/syscall-sig.inc.c +++ b/linux-user/syscall-sig.inc.c @@ -117,6 +117,33 @@ SYSCALL_IMPL(rt_sigaction) return ret; } =20 +SYSCALL_IMPL(rt_sigpending) +{ + sigset_t set; + abi_long ret; + + /* + * Yes, this check is >, not !=3D like most. We follow the kernel's + * logic and it does it like this because it implements + * NR_sigpending through the same code path, and in that case + * the old_sigset_t is smaller in size. + */ + if (arg2 > sizeof(target_sigset_t)) { + return -TARGET_EINVAL; + } + + ret =3D get_errno(sigpending(&set)); + if (!is_error(ret)) { + void *p =3D lock_user(VERIFY_WRITE, arg1, sizeof(target_sigset_t),= 0); + if (!p) { + return -TARGET_EFAULT; + } + host_to_target_sigset(p, &set); + unlock_user(p, arg1, sizeof(target_sigset_t)); + } + return ret; +} + SYSCALL_IMPL(rt_sigprocmask) { int how =3D 0; @@ -259,6 +286,24 @@ SYSCALL_IMPL(sigaction) } #endif =20 +#ifdef TARGET_NR_sigpending +SYSCALL_IMPL(sigpending) +{ + sigset_t set; + abi_long ret =3D get_errno(sigpending(&set)); + + if (!is_error(ret)) { + void *p =3D lock_user(VERIFY_WRITE, arg1, sizeof(target_sigset_t),= 0); + if (!p) { + return -TARGET_EFAULT; + } + host_to_target_old_sigset(p, &set); + unlock_user(p, arg1, sizeof(target_sigset_t)); + } + return ret; +} +#endif + #ifdef TARGET_NR_sigprocmask SYSCALL_IMPL(sigprocmask) { diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 11bbdfade4..7dda237c95 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -4241,42 +4241,6 @@ static abi_long do_syscall1(void *cpu_env, int num, = abi_long arg1, void *p; =20 switch(num) { -#ifdef TARGET_NR_sigpending - case TARGET_NR_sigpending: - { - sigset_t set; - ret =3D get_errno(sigpending(&set)); - if (!is_error(ret)) { - if (!(p =3D lock_user(VERIFY_WRITE, arg1, sizeof(target_si= gset_t), 0))) - return -TARGET_EFAULT; - host_to_target_old_sigset(p, &set); - unlock_user(p, arg1, sizeof(target_sigset_t)); - } - } - return ret; -#endif - case TARGET_NR_rt_sigpending: - { - sigset_t set; - - /* Yes, this check is >, not !=3D like most. We follow the ker= nel's - * logic and it does it like this because it implements - * NR_sigpending through the same code path, and in that case - * the old_sigset_t is smaller in size. - */ - if (arg2 > sizeof(target_sigset_t)) { - return -TARGET_EINVAL; - } - - ret =3D get_errno(sigpending(&set)); - if (!is_error(ret)) { - if (!(p =3D lock_user(VERIFY_WRITE, arg1, sizeof(target_si= gset_t), 0))) - return -TARGET_EFAULT; - host_to_target_sigset(p, &set); - unlock_user(p, arg1, sizeof(target_sigset_t)); - } - } - return ret; #ifdef TARGET_NR_sigsuspend case TARGET_NR_sigsuspend: { diff --git a/linux-user/strace.list b/linux-user/strace.list index 7157876302..978e47bf0e 100644 --- a/linux-user/strace.list +++ b/linux-user/strace.list @@ -926,9 +926,6 @@ #ifdef TARGET_NR_rmdir { TARGET_NR_rmdir, "rmdir" , NULL, NULL, NULL }, #endif -#ifdef TARGET_NR_rt_sigpending -{ TARGET_NR_rt_sigpending, "rt_sigpending" , NULL, NULL, NULL }, -#endif #ifdef TARGET_NR_rt_sigqueueinfo { TARGET_NR_rt_sigqueueinfo, "rt_sigqueueinfo" , NULL, print_rt_sigqueuein= fo, NULL }, #endif @@ -1128,9 +1125,6 @@ #ifdef TARGET_NR_signalfd4 { TARGET_NR_signalfd4, "signalfd4" , NULL, NULL, NULL }, #endif -#ifdef TARGET_NR_sigpending -{ TARGET_NR_sigpending, "sigpending" , NULL, NULL, NULL }, -#endif #ifdef TARGET_NR_sigreturn { TARGET_NR_sigreturn, "sigreturn" , NULL, NULL, NULL }, #endif --=20 2.17.1 From nobody Thu May 9 22:44:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1558301047; cv=none; d=zoho.com; s=zohoarc; b=Df26WOaLgmQVBqLZPzURWmCNIwBwUDB6CoeHVe6yU4+sM5an3u/6OekCqg6snAkM7yTuN+80U66LlyWBN9pvSHpRWUAkF3ShAM4hF+NH0KpfFrSplYfJqDJpsEyZv8UDEOWTEJJBNfHnGFyd8KB5EJk8/cOdH0ANiJtc800weC4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1558301047; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=76+mjrN9dH89H5/Svkq5qWa063W+g+MfoJgRAxm+Ooc=; b=aI9LRpS9KuJlAlVIe6XtlkioohMoRWKBD34DCSTSJn5Sgp7HrmR+qnuXlItnY/xJi1b9c373dXU3fk4SC9S8WPNx0iN3xI/Rbl7U506apMElFWE4AiCBrygZZa0FKRQIFMpD1hTbJJOyzYnc5aypRxPElzTVlB4JAmTY2Geir6Q= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (209.51.188.17 [209.51.188.17]) by mx.zohomail.com with SMTPS id 1558301047685529.0016118833405; Sun, 19 May 2019 14:24:07 -0700 (PDT) Received: from localhost ([127.0.0.1]:53784 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSTHl-0000wT-HH for importer@patchew.org; Sun, 19 May 2019 17:24:01 -0400 Received: from eggs.gnu.org ([209.51.188.92]:51026) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSZy-0003vO-C3 for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:48 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hSSZx-0004q8-3g for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:46 -0400 Received: from mail-pg1-x544.google.com ([2607:f8b0:4864:20::544]:35287) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hSSZw-0004pR-T1 for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:45 -0400 Received: by mail-pg1-x544.google.com with SMTP id t1so4322877pgc.2 for ; Sun, 19 May 2019 13:38:44 -0700 (PDT) Received: from localhost.localdomain (97-113-13-231.tukw.qwest.net. [97.113.13.231]) by smtp.gmail.com with ESMTPSA id i7sm11397448pfo.19.2019.05.19.13.38.42 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 19 May 2019 13:38:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=76+mjrN9dH89H5/Svkq5qWa063W+g+MfoJgRAxm+Ooc=; b=Edxlms5o54PZXlEF5kPdWDXQ4iTGf95k5hqzTjWT+BcEys4GQDYYRXX6bDuMS/HkUZ rW08V+EwLSK6Z+sh1Fe05z1zYUErudvuhAAB4ecpPuMou4bY98ZbO0oIjjvNDtE7lqyP boenIk/yvjt379MUEK6C3N0uBsy1hgAcUMIUbJxjFfTtQMqG/pZsaamaFoi/btMTjY4V NYDQxmIonrxBBgLe79B9vTnhP5j1yssVtfS3JyvBGOSHpYXJbnqrzywyRivvJjb9Azhr 7ofNQP9aVjO5ksoXar31E0uj9jpvG4/cpDjaiSb8FF0Xe12daTPvnJkG9+R114+e+Lq9 0Zow== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=76+mjrN9dH89H5/Svkq5qWa063W+g+MfoJgRAxm+Ooc=; b=Kw7AkimgssylYhsfuIdqpQZbC1Hu2CqeoJCoyhcsjOJckc4qLurFzxonuZ3Ck3CYl3 fH9BWN6qhebIMIgP6izLNCsblp/07zw+6Pnf507ocKMpwNkovy6QYxg0alwHPLHhEpAv wsRL8RsUOWW1rPCQVDdIDh4086eSWwBTIOkyApDXd6iO+XSngcyqFDbOmCswQiquJQe1 bnEApqpd3ymbDSwhdRey6T9Y3gfb6oYF6vryjWt9z5nfLAJPiaMR9JXzaHNQ0ChvNuhP uHFhdGACwLmWnomyyIFTQA/OS4y9V9MCd+GcBUQhlJ4monkBnh/FgJWXEkgRsvUX50Iz H1Vg== X-Gm-Message-State: APjAAAUGDH9Telk523lYL4nv8kI/NODrrDsmYUQzCEKHt6ZXP2OaywOc K1SpEmTESaQMcbgTgFs+tjiiX6FRXdY= X-Google-Smtp-Source: APXvYqyTyHDaPORyWwg7KN7CpY1LHEjClFKVWTB8y+EiA6mpUmfSMCapq+nVnZNyq5MbjjP4x3LeHg== X-Received: by 2002:a63:d150:: with SMTP id c16mr71008417pgj.439.1558298323712; Sun, 19 May 2019 13:38:43 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sun, 19 May 2019 13:37:12 -0700 Message-Id: <20190519203726.20729-61-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190519203726.20729-1-richard.henderson@linaro.org> References: <20190519203726.20729-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::544 Subject: [Qemu-devel] [PATCH v7 60/74] linux-user: Split out sigsuspend, rt_sigsuspend X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: laurent@vivier.eu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Richard Henderson --- linux-user/syscall-defs.h | 6 +++++ linux-user/syscall-sig.inc.c | 51 ++++++++++++++++++++++++++++++++++++ linux-user/syscall.c | 42 ++--------------------------- linux-user/strace.list | 6 ----- 4 files changed, 59 insertions(+), 46 deletions(-) diff --git a/linux-user/syscall-defs.h b/linux-user/syscall-defs.h index 83a69246d0..2b930f5599 100644 --- a/linux-user/syscall-defs.h +++ b/linux-user/syscall-defs.h @@ -196,6 +196,7 @@ SYSCALL_DEF(rt_sigaction, ARG_SIGNAL, ARG_PTR, ARG_PTR,= ARG_DEC); #endif SYSCALL_DEF(rt_sigpending, ARG_PTR, ARG_DEC); SYSCALL_DEF(rt_sigprocmask, ARG_SIGPROCMASKHOW, ARG_PTR, ARG_PTR, ARG_DEC); +SYSCALL_DEF(rt_sigsuspend, ARG_PTR, ARG_DEC); #if !defined(SYSCALL_TABLE) || defined(TARGET_NR_semctl) SYSCALL_DEF(semctl, ARG_DEC, ARG_DEC, ARG_DEC, ARG_HEX); #endif @@ -232,6 +233,11 @@ SYSCALL_DEF(sigprocmask, ARG_SIGPROCMASKHOW, ARG_HEX); #elif defined(TARGET_NR_sigprocmask) SYSCALL_DEF(sigprocmask, ARG_SIGPROCMASKHOW, ARG_PTR, ARG_PTR); #endif +#if defined(TARGET_ALPHA) +SYSCALL_DEF(sigsuspend, ARG_HEX); +#elif defined(TARGET_NR_sigsuspend) +SYSCALL_DEF(sigsuspend, ARG_PTR); +#endif #ifdef TARGET_NR_sgetmask SYSCALL_DEF(sgetmask); #endif diff --git a/linux-user/syscall-sig.inc.c b/linux-user/syscall-sig.inc.c index fe717a5121..23ea14e2a6 100644 --- a/linux-user/syscall-sig.inc.c +++ b/linux-user/syscall-sig.inc.c @@ -191,6 +191,30 @@ SYSCALL_IMPL(rt_sigprocmask) return ret; } =20 +SYSCALL_IMPL(rt_sigsuspend) +{ + CPUState *cpu =3D ENV_GET_CPU(cpu_env); + TaskState *ts =3D cpu->opaque; + abi_long ret; + void *p; + + if (arg2 !=3D sizeof(target_sigset_t)) { + return -TARGET_EINVAL; + } + p =3D lock_user(VERIFY_READ, arg1, sizeof(target_sigset_t), 1); + if (!p) { + return -TARGET_EFAULT; + } + target_to_host_sigset(&ts->sigsuspend_mask, p); + unlock_user(p, arg1, 0); + + ret =3D get_errno(safe_rt_sigsuspend(&ts->sigsuspend_mask, SIGSET_T_SI= ZE)); + if (ret !=3D -TARGET_ERESTARTSYS) { + ts->in_sigsuspend =3D 1; + } + return ret; +} + #ifdef TARGET_NR_sigaction SYSCALL_IMPL(sigaction) { @@ -380,6 +404,33 @@ SYSCALL_IMPL(sigprocmask) } #endif =20 +#ifdef TARGET_NR_sigsuspend +SYSCALL_IMPL(sigsuspend) +{ + CPUState *cpu =3D ENV_GET_CPU(cpu_env); + TaskState *ts =3D cpu->opaque; + abi_long ret; + +#if defined(TARGET_ALPHA) + abi_ulong mask =3D arg1; + target_to_host_old_sigset(&ts->sigsuspend_mask, &mask); +#else + void *p =3D lock_user(VERIFY_READ, arg1, sizeof(target_sigset_t), 1); + if (!p) { + return -TARGET_EFAULT; + } + target_to_host_old_sigset(&ts->sigsuspend_mask, p); + unlock_user(p, arg1, 0); +#endif + + ret =3D get_errno(safe_rt_sigsuspend(&ts->sigsuspend_mask, SIGSET_T_SI= ZE)); + if (ret !=3D -TARGET_ERESTARTSYS) { + ts->in_sigsuspend =3D 1; + } + return ret; +} +#endif + #ifdef TARGET_NR_sgetmask SYSCALL_IMPL(sgetmask) { diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 7dda237c95..00f4ba8753 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -4227,7 +4227,6 @@ static abi_long do_syscall1(void *cpu_env, int num, a= bi_long arg1, abi_long arg5, abi_long arg6, abi_long arg7, abi_long arg8) { - CPUState *cpu =3D ENV_GET_CPU(cpu_env); abi_long ret; #if defined(TARGET_NR_stat) || defined(TARGET_NR_stat64) \ || defined(TARGET_NR_lstat) || defined(TARGET_NR_lstat64) \ @@ -4241,45 +4240,6 @@ static abi_long do_syscall1(void *cpu_env, int num, = abi_long arg1, void *p; =20 switch(num) { -#ifdef TARGET_NR_sigsuspend - case TARGET_NR_sigsuspend: - { - TaskState *ts =3D cpu->opaque; -#if defined(TARGET_ALPHA) - abi_ulong mask =3D arg1; - target_to_host_old_sigset(&ts->sigsuspend_mask, &mask); -#else - if (!(p =3D lock_user(VERIFY_READ, arg1, sizeof(target_sigset_= t), 1))) - return -TARGET_EFAULT; - target_to_host_old_sigset(&ts->sigsuspend_mask, p); - unlock_user(p, arg1, 0); -#endif - ret =3D get_errno(safe_rt_sigsuspend(&ts->sigsuspend_mask, - SIGSET_T_SIZE)); - if (ret !=3D -TARGET_ERESTARTSYS) { - ts->in_sigsuspend =3D 1; - } - } - return ret; -#endif - case TARGET_NR_rt_sigsuspend: - { - TaskState *ts =3D cpu->opaque; - - if (arg2 !=3D sizeof(target_sigset_t)) { - return -TARGET_EINVAL; - } - if (!(p =3D lock_user(VERIFY_READ, arg1, sizeof(target_sigset_= t), 1))) - return -TARGET_EFAULT; - target_to_host_sigset(&ts->sigsuspend_mask, p); - unlock_user(p, arg1, 0); - ret =3D get_errno(safe_rt_sigsuspend(&ts->sigsuspend_mask, - SIGSET_T_SIZE)); - if (ret !=3D -TARGET_ERESTARTSYS) { - ts->in_sigsuspend =3D 1; - } - } - return ret; case TARGET_NR_rt_sigtimedwait: { sigset_t set; @@ -6659,6 +6619,7 @@ static abi_long do_syscall1(void *cpu_env, int num, a= bi_long arg1, return do_set_thread_area(cpu_env, arg1); #elif defined(TARGET_M68K) { + CPUState *cpu =3D ENV_GET_CPU(cpu_env); TaskState *ts =3D cpu->opaque; ts->tp_value =3D arg1; return 0; @@ -6673,6 +6634,7 @@ static abi_long do_syscall1(void *cpu_env, int num, a= bi_long arg1, return do_get_thread_area(cpu_env, arg1); #elif defined(TARGET_M68K) { + CPUState *cpu =3D ENV_GET_CPU(cpu_env); TaskState *ts =3D cpu->opaque; return ts->tp_value; } diff --git a/linux-user/strace.list b/linux-user/strace.list index 978e47bf0e..26df8b25cd 100644 --- a/linux-user/strace.list +++ b/linux-user/strace.list @@ -932,9 +932,6 @@ #ifdef TARGET_NR_rt_sigreturn { TARGET_NR_rt_sigreturn, "rt_sigreturn" , NULL, NULL, NULL }, #endif -#ifdef TARGET_NR_rt_sigsuspend -{ TARGET_NR_rt_sigsuspend, "rt_sigsuspend" , NULL, NULL, NULL }, -#endif #ifdef TARGET_NR_rt_sigtimedwait { TARGET_NR_rt_sigtimedwait, "rt_sigtimedwait" , NULL, NULL, NULL }, #endif @@ -1128,9 +1125,6 @@ #ifdef TARGET_NR_sigreturn { TARGET_NR_sigreturn, "sigreturn" , NULL, NULL, NULL }, #endif -#ifdef TARGET_NR_sigsuspend -{ TARGET_NR_sigsuspend, "sigsuspend" , NULL, NULL, NULL }, -#endif #ifdef TARGET_NR_socket { TARGET_NR_socket, "socket" , NULL, print_socket, NULL }, #endif --=20 2.17.1 From nobody Thu May 9 22:44:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1558301072; cv=none; d=zoho.com; s=zohoarc; b=eiqxzKAzPpYtIvBT8Lo1VW5JaXryI2y5Pzm9gf8FiC4PdmAFl7DeAszHhQDKWnUkTYHrV8Ts00RDrwQZl5wma+ADoAoAPEU2zGNb7LrLq3ZVg6dzGZFx0aMThyJ53Y1yldxTOlzHOL64b1gj3DNtNSY60RzL26WColKqtrfuXyA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1558301072; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=Y5HxahaYaY6QYC1uo4aAY7RPOmMGvLOX7tv8PUypEZk=; b=n+1XvTPWhGk7uFvgsKsqgLNPI1GPCjfq2kYcWk3dyEKvLH84l/8UnXtnjjlqh+vSm743OmBukN7mL7z3vEFk63FOcOyuMhgCDZhVOTP5QlJpqTQmEO7wXD92Tzwo+F4wyTYT1G90n+M6HMnHG5pN7HobF7ph5uVcAovufUg2MTc= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (209.51.188.17 [209.51.188.17]) by mx.zohomail.com with SMTPS id 1558301072381105.28692269802241; Sun, 19 May 2019 14:24:32 -0700 (PDT) Received: from localhost ([127.0.0.1]:53786 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSTIA-0001IO-8u for importer@patchew.org; Sun, 19 May 2019 17:24:26 -0400 Received: from eggs.gnu.org ([209.51.188.92]:51035) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSZz-0003vo-8Y for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:48 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hSSZy-0004rK-4v for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:47 -0400 Received: from mail-pg1-x541.google.com ([2607:f8b0:4864:20::541]:38181) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hSSZx-0004qY-V9 for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:46 -0400 Received: by mail-pg1-x541.google.com with SMTP id j26so5741184pgl.5 for ; Sun, 19 May 2019 13:38:45 -0700 (PDT) Received: from localhost.localdomain (97-113-13-231.tukw.qwest.net. [97.113.13.231]) by smtp.gmail.com with ESMTPSA id i7sm11397448pfo.19.2019.05.19.13.38.43 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 19 May 2019 13:38:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=Y5HxahaYaY6QYC1uo4aAY7RPOmMGvLOX7tv8PUypEZk=; b=DoYXlx3PoHm8K+tZgACald1wGeogE569sqfxk9pncSL5eWSgZiCOOAfBTZUTBk7KuF 05qBqU1l1+cXBY7RkbZ3GSsZgV/jWVTMILzW3HDstXMXcaRdU+sljGNESKbrz8T91oJN RqDb+1eozWltuCG0t8tjjiM8nOZO8jBVL+vqe86sCTwjkc6TorTRvlV1IVNCXzMVLuec yXZ7pM1qHmQoeTnurS3HNCXlqIuYrdcTy9zfSb81RJvh85FApQbIaCf5NYdNIY1i4zuM P3LW+i1k+52A1bOFnU/9mygqWT9fz4wMoytl5uxThSeXiuPltdpQjfAcKQFjPefsI2FM XolA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=Y5HxahaYaY6QYC1uo4aAY7RPOmMGvLOX7tv8PUypEZk=; b=p6rTunQPXRxfQkVlcagCD/xHYB45UWkXrA2RXuAZw3/b3jDFjpFtzL95p8dzKhC59v 5Js0XH5B3r6/0V7bPZSP3KwsF4B3iNB0wS3c0KWYSSi9MxD/BzSGCK1GlqfepmvLrsfV ueuv8BN0P8dD7Q8sDSb9BkJJMFI6pfLcFnCzP5aC77uNRUqTGA4SPMzMrIe7NmdWvMbG yZ/S2jEodZVctvQXDatqfoIXNmD8rfXqmBUiv6CM/jATvsg5lfQUE0c9SB4YzJoowRbU kIdfBgJwkRgB54Nb518NCuhYyOiVxe6Fp3A+AuDOGn65L+O1eKaDv3L15SYGR7MvOhfQ 8TBQ== X-Gm-Message-State: APjAAAX9qBBYQARh0cPUnmASYtpG76OcTg/VL+3NYkjsRqYcNlZ7oab6 P1uizuKFwQ7CZoMNpWE7dODbHap+LZE= X-Google-Smtp-Source: APXvYqzgchWjEJoori1VjJOXpF6YoQvh0AmSNfpgaarnx1R3pqp4sfDeg/0glECZmJG1VOd2Ad/+sw== X-Received: by 2002:a62:117:: with SMTP id 23mr47169063pfb.156.1558298324723; Sun, 19 May 2019 13:38:44 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sun, 19 May 2019 13:37:13 -0700 Message-Id: <20190519203726.20729-62-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190519203726.20729-1-richard.henderson@linaro.org> References: <20190519203726.20729-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::541 Subject: [Qemu-devel] [PATCH v7 61/74] linux-user: Split out rt_sigtimedwait X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: laurent@vivier.eu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Richard Henderson --- linux-user/syscall-defs.h | 1 + linux-user/syscall-sig.inc.c | 37 ++++++++++++++++++++++++++++++++++++ linux-user/syscall.c | 36 ----------------------------------- linux-user/strace.list | 3 --- 4 files changed, 38 insertions(+), 39 deletions(-) diff --git a/linux-user/syscall-defs.h b/linux-user/syscall-defs.h index 2b930f5599..24289ed413 100644 --- a/linux-user/syscall-defs.h +++ b/linux-user/syscall-defs.h @@ -197,6 +197,7 @@ SYSCALL_DEF(rt_sigaction, ARG_SIGNAL, ARG_PTR, ARG_PTR,= ARG_DEC); SYSCALL_DEF(rt_sigpending, ARG_PTR, ARG_DEC); SYSCALL_DEF(rt_sigprocmask, ARG_SIGPROCMASKHOW, ARG_PTR, ARG_PTR, ARG_DEC); SYSCALL_DEF(rt_sigsuspend, ARG_PTR, ARG_DEC); +SYSCALL_DEF(rt_sigtimedwait, ARG_PTR, ARG_PTR, ARG_PTR, ARG_DEC); #if !defined(SYSCALL_TABLE) || defined(TARGET_NR_semctl) SYSCALL_DEF(semctl, ARG_DEC, ARG_DEC, ARG_DEC, ARG_HEX); #endif diff --git a/linux-user/syscall-sig.inc.c b/linux-user/syscall-sig.inc.c index 23ea14e2a6..5f2c0ba499 100644 --- a/linux-user/syscall-sig.inc.c +++ b/linux-user/syscall-sig.inc.c @@ -215,6 +215,43 @@ SYSCALL_IMPL(rt_sigsuspend) return ret; } =20 +SYSCALL_IMPL(rt_sigtimedwait) +{ + sigset_t set; + struct timespec uts, *puts =3D NULL; + siginfo_t uinfo; + abi_long ret; + void *p; + + if (arg4 !=3D sizeof(target_sigset_t)) { + return -TARGET_EINVAL; + } + p =3D lock_user(VERIFY_READ, arg1, sizeof(target_sigset_t), 1); + if (!p) { + return -TARGET_EFAULT; + } + target_to_host_sigset(&set, p); + unlock_user(p, arg1, 0); + if (arg3) { + puts =3D &uts; + target_to_host_timespec(puts, arg3); + } + + ret =3D get_errno(safe_rt_sigtimedwait(&set, &uinfo, puts, SIGSET_T_SI= ZE)); + if (!is_error(ret)) { + if (arg2) { + p =3D lock_user(VERIFY_WRITE, arg2, sizeof(target_siginfo_t), = 0); + if (!p) { + return -TARGET_EFAULT; + } + host_to_target_siginfo(p, &uinfo); + unlock_user(p, arg2, sizeof(target_siginfo_t)); + } + ret =3D host_to_target_signal(ret); + } + return ret; +} + #ifdef TARGET_NR_sigaction SYSCALL_IMPL(sigaction) { diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 00f4ba8753..8a05d3e32a 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -4240,42 +4240,6 @@ static abi_long do_syscall1(void *cpu_env, int num, = abi_long arg1, void *p; =20 switch(num) { - case TARGET_NR_rt_sigtimedwait: - { - sigset_t set; - struct timespec uts, *puts; - siginfo_t uinfo; - - if (arg4 !=3D sizeof(target_sigset_t)) { - return -TARGET_EINVAL; - } - - if (!(p =3D lock_user(VERIFY_READ, arg1, sizeof(target_sigset_= t), 1))) - return -TARGET_EFAULT; - target_to_host_sigset(&set, p); - unlock_user(p, arg1, 0); - if (arg3) { - puts =3D &uts; - target_to_host_timespec(puts, arg3); - } else { - puts =3D NULL; - } - ret =3D get_errno(safe_rt_sigtimedwait(&set, &uinfo, puts, - SIGSET_T_SIZE)); - if (!is_error(ret)) { - if (arg2) { - p =3D lock_user(VERIFY_WRITE, arg2, sizeof(target_sigi= nfo_t), - 0); - if (!p) { - return -TARGET_EFAULT; - } - host_to_target_siginfo(p, &uinfo); - unlock_user(p, arg2, sizeof(target_siginfo_t)); - } - ret =3D host_to_target_signal(ret); - } - } - return ret; case TARGET_NR_rt_sigqueueinfo: { siginfo_t uinfo; diff --git a/linux-user/strace.list b/linux-user/strace.list index 26df8b25cd..0b2c057673 100644 --- a/linux-user/strace.list +++ b/linux-user/strace.list @@ -932,9 +932,6 @@ #ifdef TARGET_NR_rt_sigreturn { TARGET_NR_rt_sigreturn, "rt_sigreturn" , NULL, NULL, NULL }, #endif -#ifdef TARGET_NR_rt_sigtimedwait -{ TARGET_NR_rt_sigtimedwait, "rt_sigtimedwait" , NULL, NULL, NULL }, -#endif #ifdef TARGET_NR_rt_tgsigqueueinfo { TARGET_NR_rt_tgsigqueueinfo, "rt_tgsigqueueinfo" , NULL, print_rt_tgsigq= ueueinfo, NULL }, #endif --=20 2.17.1 From nobody Thu May 9 22:44:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1558301235; cv=none; d=zoho.com; s=zohoarc; b=aaL0Q5IOrBcSNtNXxUNKLTgBdPwAoM4yy+NofEpo3iSWWiPKJt37U81mGhvBzFwLc7DwuQQSAJAe3lHgHs+FJQnPuXQ4YZmHyvvUbJ0LLHyRxmUYQncxxdgBUWzAIRV0pkAFRJixON4PSjIpJIQzVH5BwtXW+87HsuVmDrd4uTo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1558301235; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=H+hAO3lCLGHX0woDMYAcESGWkiYaW7BEOcuLvxL4WTY=; b=WK8MjiqqomwOKAUK7urrQbOpt5iIQbNDOQ1HEDEuilf9g7GvIKkNSNpFmacIR3BHMo4N5jm2wIS7OPyAusbGRlMfLEgAsJVUrSsbcToRxAgaDfLBqtVM6H8yJlE1XRn2urQzwLkDLFargyJlTY04snkgKs541DMhoEuIsR6XY7Q= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1558301235352152.45775270247975; Sun, 19 May 2019 14:27:15 -0700 (PDT) Received: from localhost ([127.0.0.1]:53841 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSTKl-0003nn-TN for importer@patchew.org; Sun, 19 May 2019 17:27:08 -0400 Received: from eggs.gnu.org ([209.51.188.92]:51064) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSa0-0003xH-W7 for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:50 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hSSZz-0004t4-F0 for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:48 -0400 Received: from mail-pf1-x443.google.com ([2607:f8b0:4864:20::443]:34965) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hSSZz-0004s4-7E for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:47 -0400 Received: by mail-pf1-x443.google.com with SMTP id t87so6175534pfa.2 for ; Sun, 19 May 2019 13:38:47 -0700 (PDT) Received: from localhost.localdomain (97-113-13-231.tukw.qwest.net. [97.113.13.231]) by smtp.gmail.com with ESMTPSA id i7sm11397448pfo.19.2019.05.19.13.38.44 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 19 May 2019 13:38:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=H+hAO3lCLGHX0woDMYAcESGWkiYaW7BEOcuLvxL4WTY=; b=QeJ25agBxzK7WHQT5PUY2JNCKaE7N/t8OMwnVfB4Jz6xK/ME4pC8V7B+D/HErzmbZY AGaHXD0ea/A6XBxMFg+EDYe2ch5M2bBVtCARpqGJ4Xg0UN2WSNw+Tup3xHGl0K6on85+ KKTUezVm26GhujnhMNxL6hA57SLHUQzFTjceowQ6j+RNGE7A0gsJY+pwjQQ7KWoM3NAX spssYvD4E25qQcv3RCwq4n+L/sCTsJOdMD0jwCAlVxNz3Ab5/EBUqopTSV1IJnu1YFEC opIvh7R8FasIff62tnB2jcVPBgeqHHN96YCMYOoUfwkqL3huV3GOjUYwbn01B/mheNFh fDiQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=H+hAO3lCLGHX0woDMYAcESGWkiYaW7BEOcuLvxL4WTY=; b=X/znZy22DLmxwck6GuvPqOpznXC8bLFETfzzIxddoTdhxV9hwPgEe9qHJw4ZpU6Mgm L0cBRW+UKduUj8PcYGnqA26RuCRxOGMCLLUxQXhm/5KkLfAz/5u7KxJEDj8uKMSNg+2x Y6xVUlDrfxMvIWvUod+Gleq0kIWrXB3dQw2MXL3zy1yzSbfcZvnfPdPAemDPEHFcwzfe TAt2r3DmJei8I2mSC8353zIsG9IpGBr04COmi7OUBtqQDWna3500JS03HTCY4PTSVEaz IUks2qs0UIIdNpA6zzQl2NswmCs/xS09a9WHRRzogxe1ig7p+woYtmhLPVw/Gjrosz+Y k08Q== X-Gm-Message-State: APjAAAVFQUgmW1dbSd+2Ey8dkVgyM4icV7HwBMsBhIIrt583OOAX4qrx 6610ESCGCISiPIZLy4ytSvIA0a3hVKg= X-Google-Smtp-Source: APXvYqydOrAFec0LLtyWEoAKOtxVXXSzpIDG56yM9iF+dEct/HxlYFAGucY+QMERmZQOXXBm//xEJg== X-Received: by 2002:a63:d354:: with SMTP id u20mr23001764pgi.129.1558298325924; Sun, 19 May 2019 13:38:45 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sun, 19 May 2019 13:37:14 -0700 Message-Id: <20190519203726.20729-63-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190519203726.20729-1-richard.henderson@linaro.org> References: <20190519203726.20729-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::443 Subject: [Qemu-devel] [PATCH v7 62/74] linux-user: Split out rt_sigqueueinfo, rt_tgsigqueueinfo X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: laurent@vivier.eu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" This does drop the (questionable) siginfo_t printing. But since we already do not handle more important things in this area like sigset_t, this does not feel a loss. Signed-off-by: Richard Henderson --- linux-user/syscall-defs.h | 2 + linux-user/strace.c | 138 ----------------------------------- linux-user/syscall-sig.inc.c | 30 ++++++++ linux-user/syscall.c | 26 ------- linux-user/strace.list | 6 -- 5 files changed, 32 insertions(+), 170 deletions(-) diff --git a/linux-user/syscall-defs.h b/linux-user/syscall-defs.h index 24289ed413..11851535e1 100644 --- a/linux-user/syscall-defs.h +++ b/linux-user/syscall-defs.h @@ -196,8 +196,10 @@ SYSCALL_DEF(rt_sigaction, ARG_SIGNAL, ARG_PTR, ARG_PTR= , ARG_DEC); #endif SYSCALL_DEF(rt_sigpending, ARG_PTR, ARG_DEC); SYSCALL_DEF(rt_sigprocmask, ARG_SIGPROCMASKHOW, ARG_PTR, ARG_PTR, ARG_DEC); +SYSCALL_DEF(rt_sigqueueinfo, ARG_DEC, ARG_SIGNAL, ARG_PTR); SYSCALL_DEF(rt_sigsuspend, ARG_PTR, ARG_DEC); SYSCALL_DEF(rt_sigtimedwait, ARG_PTR, ARG_PTR, ARG_PTR, ARG_DEC); +SYSCALL_DEF(rt_tgsigqueueinfo, ARG_DEC, ARG_DEC, ARG_SIGNAL, ARG_PTR); #if !defined(SYSCALL_TABLE) || defined(TARGET_NR_semctl) SYSCALL_DEF(semctl, ARG_DEC, ARG_DEC, ARG_DEC, ARG_HEX); #endif diff --git a/linux-user/strace.c b/linux-user/strace.c index 886663af2e..2e70a3910c 100644 --- a/linux-user/strace.c +++ b/linux-user/strace.c @@ -167,93 +167,6 @@ static void print_si_code(int arg) gemu_log("%s", codename); } =20 -static void get_target_siginfo(target_siginfo_t *tinfo, - const target_siginfo_t *info) -{ - abi_ulong sival_ptr; - - int sig; - int si_errno; - int si_code; - int si_type; - - __get_user(sig, &info->si_signo); - __get_user(si_errno, &tinfo->si_errno); - __get_user(si_code, &info->si_code); - - tinfo->si_signo =3D sig; - tinfo->si_errno =3D si_errno; - tinfo->si_code =3D si_code; - - /* Ensure we don't leak random junk to the guest later */ - memset(tinfo->_sifields._pad, 0, sizeof(tinfo->_sifields._pad)); - - /* This is awkward, because we have to use a combination of - * the si_code and si_signo to figure out which of the union's - * members are valid. (Within the host kernel it is always possible - * to tell, but the kernel carefully avoids giving userspace the - * high 16 bits of si_code, so we don't have the information to - * do this the easy way...) We therefore make our best guess, - * bearing in mind that a guest can spoof most of the si_codes - * via rt_sigqueueinfo() if it likes. - * - * Once we have made our guess, we record it in the top 16 bits of - * the si_code, so that print_siginfo() later can use it. - * print_siginfo() will strip these top bits out before printing - * the si_code. - */ - - switch (si_code) { - case SI_USER: - case SI_TKILL: - case SI_KERNEL: - /* Sent via kill(), tkill() or tgkill(), or direct from the kernel. - * These are the only unspoofable si_code values. - */ - __get_user(tinfo->_sifields._kill._pid, &info->_sifields._kill._pi= d); - __get_user(tinfo->_sifields._kill._uid, &info->_sifields._kill._ui= d); - si_type =3D QEMU_SI_KILL; - break; - default: - /* Everything else is spoofable. Make best guess based on signal */ - switch (sig) { - case TARGET_SIGCHLD: - __get_user(tinfo->_sifields._sigchld._pid, - &info->_sifields._sigchld._pid); - __get_user(tinfo->_sifields._sigchld._uid, - &info->_sifields._sigchld._uid); - __get_user(tinfo->_sifields._sigchld._status, - &info->_sifields._sigchld._status); - __get_user(tinfo->_sifields._sigchld._utime, - &info->_sifields._sigchld._utime); - __get_user(tinfo->_sifields._sigchld._stime, - &info->_sifields._sigchld._stime); - si_type =3D QEMU_SI_CHLD; - break; - case TARGET_SIGIO: - __get_user(tinfo->_sifields._sigpoll._band, - &info->_sifields._sigpoll._band); - __get_user(tinfo->_sifields._sigpoll._fd, - &info->_sifields._sigpoll._fd); - si_type =3D QEMU_SI_POLL; - break; - default: - /* Assume a sigqueue()/mq_notify()/rt_sigqueueinfo() source. */ - __get_user(tinfo->_sifields._rt._pid, &info->_sifields._rt._pi= d); - __get_user(tinfo->_sifields._rt._uid, &info->_sifields._rt._ui= d); - /* XXX: potential problem if 64 bit */ - __get_user(sival_ptr, &info->_sifields._rt._sigval.sival_ptr); - tinfo->_sifields._rt._sigval.sival_ptr =3D sival_ptr; - - si_type =3D QEMU_SI_RT; - break; - } - break; - } - - tinfo->si_code =3D deposit32(si_code, 16, 16, si_type); -} - static void print_siginfo(const target_siginfo_t *tinfo) { /* Print a target_siginfo_t in the format desired for printing @@ -1585,57 +1498,6 @@ print_fstat(const struct syscallname *name, #define print_fstat64 print_fstat #endif =20 -#ifdef TARGET_NR_rt_sigqueueinfo -static void -print_rt_sigqueueinfo(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - void *p; - target_siginfo_t uinfo; - - print_syscall_prologue(name); - print_raw_param("%d", arg0, 0); - print_signal(arg1, 0); - p =3D lock_user(VERIFY_READ, arg2, sizeof(target_siginfo_t), 1); - if (p) { - get_target_siginfo(&uinfo, p); - print_siginfo(&uinfo); - - unlock_user(p, arg2, 0); - } else { - print_pointer(arg2, 1); - } - print_syscall_epilogue(name); -} -#endif - -#ifdef TARGET_NR_rt_tgsigqueueinfo -static void -print_rt_tgsigqueueinfo(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - void *p; - target_siginfo_t uinfo; - - print_syscall_prologue(name); - print_raw_param("%d", arg0, 0); - print_raw_param("%d", arg1, 0); - print_signal(arg2, 0); - p =3D lock_user(VERIFY_READ, arg3, sizeof(target_siginfo_t), 1); - if (p) { - get_target_siginfo(&uinfo, p); - print_siginfo(&uinfo); - - unlock_user(p, arg3, 0); - } else { - print_pointer(arg3, 1); - } - print_syscall_epilogue(name); -} -#endif - #ifdef TARGET_NR_syslog static void print_syslog_action(abi_ulong arg, int last) diff --git a/linux-user/syscall-sig.inc.c b/linux-user/syscall-sig.inc.c index 5f2c0ba499..774346838b 100644 --- a/linux-user/syscall-sig.inc.c +++ b/linux-user/syscall-sig.inc.c @@ -191,6 +191,21 @@ SYSCALL_IMPL(rt_sigprocmask) return ret; } =20 +SYSCALL_IMPL(rt_sigqueueinfo) +{ + siginfo_t uinfo; + void *p; + + p =3D lock_user(VERIFY_READ, arg3, sizeof(target_siginfo_t), 1); + if (!p) { + return -TARGET_EFAULT; + } + target_to_host_siginfo(&uinfo, p); + unlock_user(p, arg3, 0); + + return get_errno(sys_rt_sigqueueinfo(arg1, arg2, &uinfo)); +} + SYSCALL_IMPL(rt_sigsuspend) { CPUState *cpu =3D ENV_GET_CPU(cpu_env); @@ -252,6 +267,21 @@ SYSCALL_IMPL(rt_sigtimedwait) return ret; } =20 +SYSCALL_IMPL(rt_tgsigqueueinfo) +{ + siginfo_t uinfo; + void *p; + + p =3D lock_user(VERIFY_READ, arg4, sizeof(target_siginfo_t), 1); + if (!p) { + return -TARGET_EFAULT; + } + target_to_host_siginfo(&uinfo, p); + unlock_user(p, arg4, 0); + + return get_errno(sys_rt_tgsigqueueinfo(arg1, arg2, arg3, &uinfo)); +} + #ifdef TARGET_NR_sigaction SYSCALL_IMPL(sigaction) { diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 8a05d3e32a..e489d12103 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -4240,32 +4240,6 @@ static abi_long do_syscall1(void *cpu_env, int num, = abi_long arg1, void *p; =20 switch(num) { - case TARGET_NR_rt_sigqueueinfo: - { - siginfo_t uinfo; - - p =3D lock_user(VERIFY_READ, arg3, sizeof(target_siginfo_t), 1= ); - if (!p) { - return -TARGET_EFAULT; - } - target_to_host_siginfo(&uinfo, p); - unlock_user(p, arg3, 0); - ret =3D get_errno(sys_rt_sigqueueinfo(arg1, arg2, &uinfo)); - } - return ret; - case TARGET_NR_rt_tgsigqueueinfo: - { - siginfo_t uinfo; - - p =3D lock_user(VERIFY_READ, arg4, sizeof(target_siginfo_t), 1= ); - if (!p) { - return -TARGET_EFAULT; - } - target_to_host_siginfo(&uinfo, p); - unlock_user(p, arg4, 0); - ret =3D get_errno(sys_rt_tgsigqueueinfo(arg1, arg2, arg3, &uin= fo)); - } - return ret; #ifdef TARGET_NR_sigreturn case TARGET_NR_sigreturn: if (block_signals()) { diff --git a/linux-user/strace.list b/linux-user/strace.list index 0b2c057673..57445a8d81 100644 --- a/linux-user/strace.list +++ b/linux-user/strace.list @@ -926,15 +926,9 @@ #ifdef TARGET_NR_rmdir { TARGET_NR_rmdir, "rmdir" , NULL, NULL, NULL }, #endif -#ifdef TARGET_NR_rt_sigqueueinfo -{ TARGET_NR_rt_sigqueueinfo, "rt_sigqueueinfo" , NULL, print_rt_sigqueuein= fo, NULL }, -#endif #ifdef TARGET_NR_rt_sigreturn { TARGET_NR_rt_sigreturn, "rt_sigreturn" , NULL, NULL, NULL }, #endif -#ifdef TARGET_NR_rt_tgsigqueueinfo -{ TARGET_NR_rt_tgsigqueueinfo, "rt_tgsigqueueinfo" , NULL, print_rt_tgsigq= ueueinfo, NULL }, -#endif #ifdef TARGET_NR_sched_getaffinity { TARGET_NR_sched_getaffinity, "sched_getaffinity" , NULL, NULL, NULL }, #endif --=20 2.17.1 From nobody Thu May 9 22:44:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1558301389; cv=none; d=zoho.com; s=zohoarc; b=HLaSrRywpiHzbxCgzplX8dMtvKI4Nlj7KLKQBiZoCZR2Fk8VOs28BXDK0DDJxFaOx8h74+Z+y+gSCkTYh8Py6cXx2e1D2SM50nYcn3qz14mUbyCTuwHp7xX62ejPA7Js2TCdN8xNPL0LN8zCyGNq/DC3uEphJFvZ7Vkc4spRwMk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1558301389; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=nKLZCrlKSTO+R1LDAJ7MTC0/n6ttp1lefRgjBzvM1II=; b=CDhhdAeT6aR3H9g4cnEiuoquWPyAJ6JYbyiZcFZ1QNvFVd3VF7fwxU3YxZ5r5DmmZhGA5iLnWqpzzsB581jOalAfajG9KmKO31cEAkH/NPIVk9Bj8Az+HkElLBXiKovuFYRg1u5cCOvaYHPK0vnwOVjzedo3HxhSV6HfFUiGkkw= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (209.51.188.17 [209.51.188.17]) by mx.zohomail.com with SMTPS id 1558301389672138.03389063105521; Sun, 19 May 2019 14:29:49 -0700 (PDT) Received: from localhost ([127.0.0.1]:53874 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSTNH-00067J-Hm for importer@patchew.org; Sun, 19 May 2019 17:29:43 -0400 Received: from eggs.gnu.org ([209.51.188.92]:51083) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSa1-0003xz-QC for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:51 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hSSa0-0004ub-Lo for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:49 -0400 Received: from mail-pl1-x642.google.com ([2607:f8b0:4864:20::642]:34651) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hSSa0-0004to-EG for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:48 -0400 Received: by mail-pl1-x642.google.com with SMTP id w7so5728149plz.1 for ; Sun, 19 May 2019 13:38:48 -0700 (PDT) Received: from localhost.localdomain (97-113-13-231.tukw.qwest.net. [97.113.13.231]) by smtp.gmail.com with ESMTPSA id i7sm11397448pfo.19.2019.05.19.13.38.46 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 19 May 2019 13:38:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=nKLZCrlKSTO+R1LDAJ7MTC0/n6ttp1lefRgjBzvM1II=; b=brmejX2yIcPNjbKuVHCqV8AiCa1JJMdtPGr20MMLPBmCbCH8F8nnPJLHfbogkaawYS 5MWYoLGmRdwxv176WTA+TIj0WRt7ds8eDGCjowF36zkM3oTIhPG3UX5RHX75QmX9g0Bj 6M/v8WVOfulZJHBQ3O4Ni3A/c7faz1hQuBBJxe2CWZqUR2RsUGvTiCdCspP44hAuJPXJ UuiP0ArLKSf57V3ghQKN5nnGFHdcqtHuVz9I/3+VSeeim6MKiAFQ18nIZ2o7OMaOS9mW KH5iNAtVlaiVKV5Pa3XDzdIVwYIYTC1HGLWmt8otn3ZeyoyLyHeAYmcBNRWQXUdkuWkD Rl4A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=nKLZCrlKSTO+R1LDAJ7MTC0/n6ttp1lefRgjBzvM1II=; b=VYF5SPZW3eA+olqHHN5qPYjtbo0NHq4eNBh5e7U3Wx+dkXB9x+1kusPmsALi1Gh5zi LFVjGi9bpn1wXCfAi381Mx+O5MPywFtD7jYHSjXbh6K6hH1ItkmQ4OHHF3gohT2X4YwQ QwloM/C50HRC7OiWoonVnMP4+tTgtmVOR1OiVfskmBjhAptsfPAkt3ZQH67uA/j6u9PJ FB55phQ+uQS+jkkjTJkSjOwLq4aLnB59YXF6Sbrg3cQCUxEY3OopYdMLey44X0bNbg7I ixXXf37Dzry4Ph8GIoQLqKGxYryM+SC1LufJMzCHsze03HIlqK2KUMqCiCoJ2vY9z0o2 ByjA== X-Gm-Message-State: APjAAAW70IJ/xRNSiC+Zp2zcY6Y+afgs/cupL6GVyuoGBKyu+ZYIO1u3 Lz8ykUumjDzUShHqOSBRafWToesiFNg= X-Google-Smtp-Source: APXvYqwoY8LIbknPgI3tt0tbzZjCgLVQxU2Mu8tnrIdcxpWjztN2tUOZRLeefEWnWx8tw+TmhxixdQ== X-Received: by 2002:a17:902:6b8b:: with SMTP id p11mr70527578plk.225.1558298327154; Sun, 19 May 2019 13:38:47 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sun, 19 May 2019 13:37:15 -0700 Message-Id: <20190519203726.20729-64-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190519203726.20729-1-richard.henderson@linaro.org> References: <20190519203726.20729-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::642 Subject: [Qemu-devel] [PATCH v7 63/74] linux-user: Split out sigreturn, rt_sigreturn X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: laurent@vivier.eu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Richard Henderson --- linux-user/syscall-defs.h | 4 ++++ linux-user/syscall-sig.inc.c | 18 ++++++++++++++++++ linux-user/syscall.c | 12 ------------ linux-user/strace.list | 6 ------ 4 files changed, 22 insertions(+), 18 deletions(-) diff --git a/linux-user/syscall-defs.h b/linux-user/syscall-defs.h index 11851535e1..77d750f66f 100644 --- a/linux-user/syscall-defs.h +++ b/linux-user/syscall-defs.h @@ -197,6 +197,7 @@ SYSCALL_DEF(rt_sigaction, ARG_SIGNAL, ARG_PTR, ARG_PTR,= ARG_DEC); SYSCALL_DEF(rt_sigpending, ARG_PTR, ARG_DEC); SYSCALL_DEF(rt_sigprocmask, ARG_SIGPROCMASKHOW, ARG_PTR, ARG_PTR, ARG_DEC); SYSCALL_DEF(rt_sigqueueinfo, ARG_DEC, ARG_SIGNAL, ARG_PTR); +SYSCALL_DEF(rt_sigreturn); SYSCALL_DEF(rt_sigsuspend, ARG_PTR, ARG_DEC); SYSCALL_DEF(rt_sigtimedwait, ARG_PTR, ARG_PTR, ARG_PTR, ARG_DEC); SYSCALL_DEF(rt_tgsigqueueinfo, ARG_DEC, ARG_DEC, ARG_SIGNAL, ARG_PTR); @@ -236,6 +237,9 @@ SYSCALL_DEF(sigprocmask, ARG_SIGPROCMASKHOW, ARG_HEX); #elif defined(TARGET_NR_sigprocmask) SYSCALL_DEF(sigprocmask, ARG_SIGPROCMASKHOW, ARG_PTR, ARG_PTR); #endif +#ifdef TARGET_NR_sigreturn +SYSCALL_DEF(sigreturn); +#endif #if defined(TARGET_ALPHA) SYSCALL_DEF(sigsuspend, ARG_HEX); #elif defined(TARGET_NR_sigsuspend) diff --git a/linux-user/syscall-sig.inc.c b/linux-user/syscall-sig.inc.c index 774346838b..d5c0ccdcc3 100644 --- a/linux-user/syscall-sig.inc.c +++ b/linux-user/syscall-sig.inc.c @@ -206,6 +206,14 @@ SYSCALL_IMPL(rt_sigqueueinfo) return get_errno(sys_rt_sigqueueinfo(arg1, arg2, &uinfo)); } =20 +SYSCALL_IMPL(rt_sigreturn) +{ + if (block_signals()) { + return -TARGET_ERESTARTSYS; + } + return do_rt_sigreturn(cpu_env); +} + SYSCALL_IMPL(rt_sigsuspend) { CPUState *cpu =3D ENV_GET_CPU(cpu_env); @@ -471,6 +479,16 @@ SYSCALL_IMPL(sigprocmask) } #endif =20 +#ifdef TARGET_NR_sigreturn +SYSCALL_IMPL(sigreturn) +{ + if (block_signals()) { + return -TARGET_ERESTARTSYS; + } + return do_sigreturn(cpu_env); +} +#endif + #ifdef TARGET_NR_sigsuspend SYSCALL_IMPL(sigsuspend) { diff --git a/linux-user/syscall.c b/linux-user/syscall.c index e489d12103..b8b18ac1de 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -4240,18 +4240,6 @@ static abi_long do_syscall1(void *cpu_env, int num, = abi_long arg1, void *p; =20 switch(num) { -#ifdef TARGET_NR_sigreturn - case TARGET_NR_sigreturn: - if (block_signals()) { - return -TARGET_ERESTARTSYS; - } - return do_sigreturn(cpu_env); -#endif - case TARGET_NR_rt_sigreturn: - if (block_signals()) { - return -TARGET_ERESTARTSYS; - } - return do_rt_sigreturn(cpu_env); case TARGET_NR_sethostname: if (!(p =3D lock_user_string(arg1))) return -TARGET_EFAULT; diff --git a/linux-user/strace.list b/linux-user/strace.list index 57445a8d81..b1c2f7851e 100644 --- a/linux-user/strace.list +++ b/linux-user/strace.list @@ -926,9 +926,6 @@ #ifdef TARGET_NR_rmdir { TARGET_NR_rmdir, "rmdir" , NULL, NULL, NULL }, #endif -#ifdef TARGET_NR_rt_sigreturn -{ TARGET_NR_rt_sigreturn, "rt_sigreturn" , NULL, NULL, NULL }, -#endif #ifdef TARGET_NR_sched_getaffinity { TARGET_NR_sched_getaffinity, "sched_getaffinity" , NULL, NULL, NULL }, #endif @@ -1113,9 +1110,6 @@ #ifdef TARGET_NR_signalfd4 { TARGET_NR_signalfd4, "signalfd4" , NULL, NULL, NULL }, #endif -#ifdef TARGET_NR_sigreturn -{ TARGET_NR_sigreturn, "sigreturn" , NULL, NULL, NULL }, -#endif #ifdef TARGET_NR_socket { TARGET_NR_socket, "socket" , NULL, print_socket, NULL }, #endif --=20 2.17.1 From nobody Thu May 9 22:44:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1558301547; cv=none; d=zoho.com; s=zohoarc; b=UB5ltyR2UNe3VJ8hSJ/kQA4k3dWNnz1KlE3bAtU2ZKK9wABC1wYuwb3XLm5Eh3QtXdxRf+MR798M6dGevXtbTDhCJss9pZlCsAefE+s4TweceEcVyKdrxk67XGhdkhZ2ls+1TWnDfrNBXUtiJ6yo3l0uD/znvGIJ9Cq6sb4K36A= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1558301547; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=+4pgGcHqpI/1ayoviAyV/bToyhUBomMihY7gyQ1lsgY=; b=WLKxyzzGR5EeM3G5sps8NSVbsfrQ577pj9zUXuQUTz0117QDW7zJijsCOtWniiV168RgkC9mdg91lAp2EAJ89svLk+5XbG/7Grt0ozYZ2D5WaCufMcOcH9dHDTzs0PBfcgNNyKimhfTeaqAjtrehT/tNCKXtj097j+5LCf5DX9k= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1558301547776381.1944780971005; Sun, 19 May 2019 14:32:27 -0700 (PDT) Received: from localhost ([127.0.0.1]:53937 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSTPe-0008MK-RX for importer@patchew.org; Sun, 19 May 2019 17:32:10 -0400 Received: from eggs.gnu.org ([209.51.188.92]:51108) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSa3-0003zR-5a for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:52 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hSSa1-0004w6-Rg for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:51 -0400 Received: from mail-pf1-x442.google.com ([2607:f8b0:4864:20::442]:32992) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hSSa1-0004vH-HJ for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:49 -0400 Received: by mail-pf1-x442.google.com with SMTP id z28so6189151pfk.0 for ; Sun, 19 May 2019 13:38:49 -0700 (PDT) Received: from localhost.localdomain (97-113-13-231.tukw.qwest.net. [97.113.13.231]) by smtp.gmail.com with ESMTPSA id i7sm11397448pfo.19.2019.05.19.13.38.47 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 19 May 2019 13:38:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=+4pgGcHqpI/1ayoviAyV/bToyhUBomMihY7gyQ1lsgY=; b=yNOh/qnBcfc5fIBsPkbMKp0aWj5JMGBfKFKQuWBaSZTKRjfxkpgNhxvNaDzlLjCYqs TBrqkqUE3q6+xcHx14kx7BGthawXJrn7hA6SwtgdfUST9H87q10uzV7pgPHZy5xoBmmT njOXPTa/zL8C2VlkoQLT1vPUn1nfwFF67WuZJy8lPiVxL2/aAZlYNpvW5sKBCYrBTFoP 3UX52KZDgSlYFnIGePYlIvDdzCAm8d1porwbeQENJQxcYceAIlqQxH1GAGMdlFVaL4DX mu1/gDeY8HF0lX2dupdU/NoxBswx5V5zRU/b70NHoKPMb1f6fYv+k2p/X8i/W189OSV8 FtMw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=+4pgGcHqpI/1ayoviAyV/bToyhUBomMihY7gyQ1lsgY=; b=EkKP9tFDzIMKcPTOMkMn3YrKn5NCj9LZBsDIWBaIEXsVbAM7m7dDNeDHBhFwDnE9d6 U/7D1qkKygAI7azu3yJ3UdwXAo3kjG5dskyMMhITJKP9dJvd9LX3jZeHFReHK0dnZdI0 xvZ2xVPw+f7qyvWs7BgvdrC2bIRpNapJkzZBcmWOIfe+qUdE6AAPtfZKF1s6nDuDVFvC 5eb38mh+uChI8gaHyG7ae3Pk4pKoWeqIPcYprpxJf1ZODv8XJnm5EUB3Aup5VY+n0qnm FotfYPh8pR/thmm6NMsgpLRADP4aokVaisT/F0VLOJmZJzSmsgnKqXbStHwXgUMcXCgf tAuw== X-Gm-Message-State: APjAAAV0yZh26cL2FLaRrBmJhBneTXzNWUR2zC7dgWWo/MVBF+O7jgtn F+ysKiJuRGrTWCen//gmYZDvp045ZYU= X-Google-Smtp-Source: APXvYqxkqJAtq4uIY7sdluBmYGdBzclSAejJp4b/ZEH3udkVuuRfNTMJV3T0YIVrbWFXy/u+dzH5Sw== X-Received: by 2002:a63:6a4a:: with SMTP id f71mr70548969pgc.44.1558298328375; Sun, 19 May 2019 13:38:48 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sun, 19 May 2019 13:37:16 -0700 Message-Id: <20190519203726.20729-65-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190519203726.20729-1-richard.henderson@linaro.org> References: <20190519203726.20729-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::442 Subject: [Qemu-devel] [PATCH v7 64/74] linux-user: Split out gethostname, sethostname X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: laurent@vivier.eu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Richard Henderson --- linux-user/syscall-defs.h | 4 ++++ linux-user/syscall-proc.inc.c | 28 ++++++++++++++++++++++++++++ linux-user/syscall.c | 19 ------------------- linux-user/strace.list | 6 ------ 4 files changed, 32 insertions(+), 25 deletions(-) diff --git a/linux-user/syscall-defs.h b/linux-user/syscall-defs.h index 77d750f66f..3ba697fd53 100644 --- a/linux-user/syscall-defs.h +++ b/linux-user/syscall-defs.h @@ -59,6 +59,9 @@ SYSCALL_DEF(futimesat, ARG_ATDIRFD, ARG_STR, ARG_PTR); #ifdef TARGET_NR_fork SYSCALL_DEF(fork); #endif +#ifdef TARGET_NR_gethostname +SYSCALL_DEF(gethostname, ARG_PTR, ARG_DEC); +#endif SYSCALL_DEF(getpgid, ARG_DEC); #ifdef TARGET_NR_getpgrp SYSCALL_DEF(getpgrp); @@ -207,6 +210,7 @@ SYSCALL_DEF(semctl, ARG_DEC, ARG_DEC, ARG_DEC, ARG_HEX); #if !defined(SYSCALL_TABLE) || defined(TARGET_NR_semget) SYSCALL_DEF(semget, ARG_DEC, ARG_DEC, ARG_HEX); #endif +SYSCALL_DEF(sethostname, ARG_STR); SYSCALL_DEF(setpgid, ARG_DEC, ARG_DEC); SYSCALL_DEF(setsid); #if !defined(SYSCALL_TABLE) || defined(TARGET_NR_semop) diff --git a/linux-user/syscall-proc.inc.c b/linux-user/syscall-proc.inc.c index 567df54581..b1a801fb62 100644 --- a/linux-user/syscall-proc.inc.c +++ b/linux-user/syscall-proc.inc.c @@ -438,6 +438,21 @@ SYSCALL_IMPL(fork) } #endif =20 +#ifdef TARGET_NR_gethostname +SYSCALL_IMPL(gethostname) +{ + char *name =3D lock_user(VERIFY_WRITE, arg1, arg2, 0); + abi_long ret; + =20 + if (!name) { + return -TARGET_EFAULT; + } + ret =3D get_errno(gethostname(name, arg2)); + unlock_user(name, arg1, arg2); + return ret; +} +#endif + SYSCALL_IMPL(getpgid) { return get_errno(getpgid(arg1)); @@ -485,6 +500,19 @@ SYSCALL_IMPL(nice) } #endif =20 +SYSCALL_IMPL(sethostname) +{ + void *p =3D lock_user_string(arg1); + abi_long ret; + + if (!p) { + return -TARGET_EFAULT; + } + ret =3D get_errno(sethostname(p, arg2)); + unlock_user(p, arg1, 0); + return ret; +} + SYSCALL_IMPL(setpgid) { return get_errno(setpgid(arg1, arg2)); diff --git a/linux-user/syscall.c b/linux-user/syscall.c index b8b18ac1de..6dd4196647 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -4240,12 +4240,6 @@ static abi_long do_syscall1(void *cpu_env, int num, = abi_long arg1, void *p; =20 switch(num) { - case TARGET_NR_sethostname: - if (!(p =3D lock_user_string(arg1))) - return -TARGET_EFAULT; - ret =3D get_errno(sethostname(p, arg2)); - unlock_user(p, arg1, 0); - return ret; #ifdef TARGET_NR_setrlimit case TARGET_NR_setrlimit: { @@ -7078,19 +7072,6 @@ static abi_long do_syscall1(void *cpu_env, int num, = abi_long arg1, return ret; } #endif -#ifdef TARGET_NR_gethostname - case TARGET_NR_gethostname: - { - char *name =3D lock_user(VERIFY_WRITE, arg1, arg2, 0); - if (name) { - ret =3D get_errno(gethostname(name, arg2)); - unlock_user(name, arg1, arg2); - } else { - ret =3D -TARGET_EFAULT; - } - return ret; - } -#endif #ifdef TARGET_NR_atomic_cmpxchg_32 case TARGET_NR_atomic_cmpxchg_32: { diff --git a/linux-user/strace.list b/linux-user/strace.list index b1c2f7851e..361ceec853 100644 --- a/linux-user/strace.list +++ b/linux-user/strace.list @@ -244,9 +244,6 @@ #ifdef TARGET_NR_getgroups32 { TARGET_NR_getgroups32, "getgroups32" , NULL, NULL, NULL }, #endif -#ifdef TARGET_NR_gethostname -{ TARGET_NR_gethostname, "gethostname" , NULL, NULL, NULL }, -#endif #ifdef TARGET_NR_getitimer { TARGET_NR_getitimer, "getitimer" , NULL, NULL, NULL }, #endif @@ -1025,9 +1022,6 @@ #ifdef TARGET_NR_sethae { TARGET_NR_sethae, "sethae" , NULL, NULL, NULL }, #endif -#ifdef TARGET_NR_sethostname -{ TARGET_NR_sethostname, "sethostname" , NULL, NULL, NULL }, -#endif #ifdef TARGET_NR_setitimer { TARGET_NR_setitimer, "setitimer" , NULL, NULL, NULL }, #endif --=20 2.17.1 From nobody Thu May 9 22:44:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1558300929; cv=none; d=zoho.com; s=zohoarc; b=klClOlZ7DC4oqxehen+JPNuJLX9SG+05Dcb/qgpMR3JkRt3G/K5jExr6Nk29xjT6Fledf/HrmHbsWBzy8smWpMEbuBkWrzsJ+ZYwjv+1xUmmW9VH+bQ6NyFV7bgTWtIYtLaiMx92g404a8dwaehtdFa4I8eMmf+3S3sQE8NdDbo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1558300929; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=C4XNH+VeEXaL+6UuHWZfoss3TaaEPTbmJNRx30bs8d0=; b=UbgeUvWjUCtvZnxXtMZzJLOuTepicDLv/M9h8D03p0qFtj84OO/g2kT1KB1E1VtqjcNzI3XGWYTKvbzDUg7hRixeSVhkubiMXYYFQ6eX7K/pMNfScCpz2DRdc2g7+pMt6LOlleIdwfxq53oQKjLg/DgM0kh518vzh1AY+H6ZP4U= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (209.51.188.17 [209.51.188.17]) by mx.zohomail.com with SMTPS id 1558300929509361.08189576633606; Sun, 19 May 2019 14:22:09 -0700 (PDT) Received: from localhost ([127.0.0.1]:53758 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSTFo-0007f7-4E for importer@patchew.org; Sun, 19 May 2019 17:22:00 -0400 Received: from eggs.gnu.org ([209.51.188.92]:51127) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSa4-00040f-C0 for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:53 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hSSa3-0004xw-26 for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:52 -0400 Received: from mail-pf1-x442.google.com ([2607:f8b0:4864:20::442]:38314) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hSSa2-0004wx-S0 for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:51 -0400 Received: by mail-pf1-x442.google.com with SMTP id b76so6171951pfb.5 for ; Sun, 19 May 2019 13:38:50 -0700 (PDT) Received: from localhost.localdomain (97-113-13-231.tukw.qwest.net. [97.113.13.231]) by smtp.gmail.com with ESMTPSA id i7sm11397448pfo.19.2019.05.19.13.38.48 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 19 May 2019 13:38:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=C4XNH+VeEXaL+6UuHWZfoss3TaaEPTbmJNRx30bs8d0=; b=HlkoJCccjOovpX7qB2H7RM3LLddUnfOgcGNq2r9L7iv7jBhxc4TCfALr2Y0kJQhGLi pjcI4vJFA9mvNMBTOvit2RyzS3Qob7XGGdTKwnpXLhQsYKZuy2M8pSLa62n1RTdKIkTT WaDGdYAdlGBkk2KOioZ3lOcaJgThBANn7WM6StZ5btJKz13q24nHkg/2GdC/bf/wnDCP QMgong0Msl/4hTc/Kpebl7C42rDwkBQVNyY7PWmT5no5HqK77UY1Fqg8XK5vtg/HOuzL aJCZ7pLozOS3xLbkRONCiDyhwfbtSSauoLIDJA3mDU59PBr+kr0zgCkQSGyKaTQH7UX1 RgpA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=C4XNH+VeEXaL+6UuHWZfoss3TaaEPTbmJNRx30bs8d0=; b=NkVmQrVicfGwbqRlEoBJ01vRuIVLNcHYebUZO7946E7xpqtjLf9RgQZxosLX1LxD5P 45y/htrNSTQWbSJZ8vB5tpSXDUCO0oWoi+ZelHgRJxgVfIKqoJ2ONnL7H76cJna08yxj M0qPqbV6SzJX4GcFWOm5tWlXM3U+qWZSQD7EGC1zcHPx2dcgOYL4grsiGErwXrr2Quc8 su53dwQ7/bfSEnIhQl1/SjuSqa+eBkvh6J1RWaNqR41gLwx73ik8bnHm9IKUg6oQY5dM hXpV/KxOvScIjCPWX/xbUBnxcW93QS/IlHKBCZzclIa489zaDixDqfeLeGde1z8qMZrQ nMYg== X-Gm-Message-State: APjAAAW19lCwXShHSmc01ASaKEk3YyIVYLCmJhWpXZ+ekX6R59EREg44 62U84PEnQiXwOEjfxnx91IExM+85k+k= X-Google-Smtp-Source: APXvYqwRibmGPBZo54XXGUUlLz7h9gaOzcKGbe+MteJY0zpvS1tc2MDPCqBQTEnjj4Q0U0lPb0Ej+Q== X-Received: by 2002:a63:5659:: with SMTP id g25mr72010606pgm.59.1558298329635; Sun, 19 May 2019 13:38:49 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sun, 19 May 2019 13:37:17 -0700 Message-Id: <20190519203726.20729-66-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190519203726.20729-1-richard.henderson@linaro.org> References: <20190519203726.20729-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::442 Subject: [Qemu-devel] [PATCH v7 65/74] linux-user: Split out getrlimit, setrlimit X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: laurent@vivier.eu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Richard Henderson --- linux-user/syscall-defs.h | 6 ++++ linux-user/syscall-proc.inc.c | 52 +++++++++++++++++++++++++++++++++++ linux-user/syscall.c | 46 ------------------------------- linux-user/strace.list | 6 ---- 4 files changed, 58 insertions(+), 52 deletions(-) diff --git a/linux-user/syscall-defs.h b/linux-user/syscall-defs.h index 3ba697fd53..34426a2e23 100644 --- a/linux-user/syscall-defs.h +++ b/linux-user/syscall-defs.h @@ -72,6 +72,9 @@ SYSCALL_DEF(getpid); #ifdef TARGET_NR_getppid SYSCALL_DEF(getppid); #endif +#ifdef TARGET_NR_getrlimit +SYSCALL_DEF(getrlimit, ARG_DEC, ARG_PTR); +#endif SYSCALL_DEF(getsid, ARG_DEC); #ifdef TARGET_NR_getxpid SYSCALL_DEF(getxpid); @@ -212,6 +215,9 @@ SYSCALL_DEF(semget, ARG_DEC, ARG_DEC, ARG_HEX); #endif SYSCALL_DEF(sethostname, ARG_STR); SYSCALL_DEF(setpgid, ARG_DEC, ARG_DEC); +#ifdef TARGET_NR_setrlimit +SYSCALL_DEF(setrlimit, ARG_DEC, ARG_PTR); +#endif SYSCALL_DEF(setsid); #if !defined(SYSCALL_TABLE) || defined(TARGET_NR_semop) SYSCALL_DEF(semop, ARG_DEC, ARG_PTR, ARG_DEC); diff --git a/linux-user/syscall-proc.inc.c b/linux-user/syscall-proc.inc.c index b1a801fb62..1238b08191 100644 --- a/linux-user/syscall-proc.inc.c +++ b/linux-user/syscall-proc.inc.c @@ -479,6 +479,26 @@ SYSCALL_IMPL(getppid) } #endif =20 +#ifdef TARGET_NR_getrlimit +SYSCALL_IMPL(getrlimit) +{ + int resource =3D target_to_host_resource(arg1); + struct target_rlimit *target_rlim; + struct rlimit rlim; + abi_long ret; + + ret =3D get_errno(getrlimit(resource, &rlim)); + if (!is_error(ret)) { + if (!lock_user_struct(VERIFY_WRITE, target_rlim, arg2, 0)) { + return -TARGET_EFAULT; + } + target_rlim->rlim_cur =3D host_to_target_rlim(rlim.rlim_cur); + target_rlim->rlim_max =3D host_to_target_rlim(rlim.rlim_max); + unlock_user_struct(target_rlim, arg2, 1); + } + return ret; +} +#endif SYSCALL_IMPL(getsid) { return get_errno(getsid(arg1)); @@ -518,6 +538,38 @@ SYSCALL_IMPL(setpgid) return get_errno(setpgid(arg1, arg2)); } =20 +#ifdef TARGET_NR_setrlimit +SYSCALL_IMPL(setrlimit) +{ + int resource =3D target_to_host_resource(arg1); + struct target_rlimit *target_rlim; + struct rlimit rlim; + + if (!lock_user_struct(VERIFY_READ, target_rlim, arg2, 1)) { + return -TARGET_EFAULT; + } + rlim.rlim_cur =3D target_to_host_rlim(target_rlim->rlim_cur); + rlim.rlim_max =3D target_to_host_rlim(target_rlim->rlim_max); + unlock_user_struct(target_rlim, arg2, 0); + + /* + * If we just passed through resource limit settings for memory then + * they would also apply to QEMU's own allocations, and QEMU will + * crash or hang or die if its allocations fail. Ideally we would + * track the guest allocations in QEMU and apply the limits ourselves. + * For now, just tell the guest the call succeeded but don't actually + * limit anything. + */ + if (resource !=3D RLIMIT_AS && + resource !=3D RLIMIT_DATA && + resource !=3D RLIMIT_STACK) { + return get_errno(setrlimit(resource, &rlim)); + } else { + return 0; + } +} +#endif + SYSCALL_IMPL(setsid) { return get_errno(setsid()); diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 6dd4196647..401450b0e3 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -4240,52 +4240,6 @@ static abi_long do_syscall1(void *cpu_env, int num, = abi_long arg1, void *p; =20 switch(num) { -#ifdef TARGET_NR_setrlimit - case TARGET_NR_setrlimit: - { - int resource =3D target_to_host_resource(arg1); - struct target_rlimit *target_rlim; - struct rlimit rlim; - if (!lock_user_struct(VERIFY_READ, target_rlim, arg2, 1)) - return -TARGET_EFAULT; - rlim.rlim_cur =3D target_to_host_rlim(target_rlim->rlim_cur); - rlim.rlim_max =3D target_to_host_rlim(target_rlim->rlim_max); - unlock_user_struct(target_rlim, arg2, 0); - /* - * If we just passed through resource limit settings for memor= y then - * they would also apply to QEMU's own allocations, and QEMU w= ill - * crash or hang or die if its allocations fail. Ideally we wo= uld - * track the guest allocations in QEMU and apply the limits ou= rselves. - * For now, just tell the guest the call succeeded but don't a= ctually - * limit anything. - */ - if (resource !=3D RLIMIT_AS && - resource !=3D RLIMIT_DATA && - resource !=3D RLIMIT_STACK) { - return get_errno(setrlimit(resource, &rlim)); - } else { - return 0; - } - } -#endif -#ifdef TARGET_NR_getrlimit - case TARGET_NR_getrlimit: - { - int resource =3D target_to_host_resource(arg1); - struct target_rlimit *target_rlim; - struct rlimit rlim; - - ret =3D get_errno(getrlimit(resource, &rlim)); - if (!is_error(ret)) { - if (!lock_user_struct(VERIFY_WRITE, target_rlim, arg2, 0)) - return -TARGET_EFAULT; - target_rlim->rlim_cur =3D host_to_target_rlim(rlim.rlim_cu= r); - target_rlim->rlim_max =3D host_to_target_rlim(rlim.rlim_ma= x); - unlock_user_struct(target_rlim, arg2, 1); - } - } - return ret; -#endif case TARGET_NR_getrusage: { struct rusage rusage; diff --git a/linux-user/strace.list b/linux-user/strace.list index 361ceec853..711ad9c0aa 100644 --- a/linux-user/strace.list +++ b/linux-user/strace.list @@ -280,9 +280,6 @@ #ifdef TARGET_NR_getresuid32 { TARGET_NR_getresuid32, "getresuid32" , NULL, NULL, NULL }, #endif -#ifdef TARGET_NR_getrlimit -{ TARGET_NR_getrlimit, "getrlimit" , NULL, NULL, NULL }, -#endif #ifdef TARGET_NR_get_robust_list { TARGET_NR_get_robust_list, "get_robust_list" , NULL, NULL, NULL }, #endif @@ -1061,9 +1058,6 @@ #ifdef TARGET_NR_setreuid32 { TARGET_NR_setreuid32, "setreuid32" , NULL, NULL, NULL }, #endif -#ifdef TARGET_NR_setrlimit -{ TARGET_NR_setrlimit, "setrlimit" , NULL, NULL, NULL }, -#endif #ifdef TARGET_NR_set_robust_list { TARGET_NR_set_robust_list, "set_robust_list" , NULL, NULL, NULL }, #endif --=20 2.17.1 From nobody Thu May 9 22:44:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1558301084; cv=none; d=zoho.com; s=zohoarc; b=aQCvdpxjxOXYpidUMuiZSOlXyAnf/5WINKqKJijxtN13KYXfyPp4offYtDks6mcOU75UPztNyRve5CquIC6INcFyZNtHGIr2cXC+R67OUCGD1ebIam5BJBjKJdTv1Wk3a6YgZsfArxj3amO4z2Ne2feWidhr8Mh/OQoGNihq6sY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1558301084; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=bykKUGCflVir5L1X693JNtqoexPRstJK20ieV2db78g=; b=Jr+0o/8J70jt7+oGUm5Gc9qygd9LOPkZ1Gh+2P6Cg8GRwHcCJnPHRSazdSOJ23jYPe+l5zB7ze3bHv8WkngvM2i2iLjt2hk100nrBbdiwT1QDazro+vNqX1erbKOS79kmf6fsruxXNt2w/f2gKJVlaZ1OiHoDrtRt/2V7RoD1k8= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (209.51.188.17 [209.51.188.17]) by mx.zohomail.com with SMTPS id 1558301084529694.7400109310842; Sun, 19 May 2019 14:24:44 -0700 (PDT) Received: from localhost ([127.0.0.1]:53790 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSTIM-0001Sf-Bm for importer@patchew.org; Sun, 19 May 2019 17:24:38 -0400 Received: from eggs.gnu.org ([209.51.188.92]:51135) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSa5-00041U-5E for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:54 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hSSa4-0004zA-7B for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:53 -0400 Received: from mail-pl1-x641.google.com ([2607:f8b0:4864:20::641]:46929) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hSSa4-0004yQ-1X for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:52 -0400 Received: by mail-pl1-x641.google.com with SMTP id r18so5699095pls.13 for ; Sun, 19 May 2019 13:38:51 -0700 (PDT) Received: from localhost.localdomain (97-113-13-231.tukw.qwest.net. [97.113.13.231]) by smtp.gmail.com with ESMTPSA id i7sm11397448pfo.19.2019.05.19.13.38.49 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 19 May 2019 13:38:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=bykKUGCflVir5L1X693JNtqoexPRstJK20ieV2db78g=; b=DiXkK1HULs1qZQr6XHCdONJlFdr4Z6wp5i2+/yVPGm4ltSd06UxUbj88jhjOY5yS6r 6b1sM7jbMixUzHUW+5NthhDJvTSJF03KlzWTOlbK5InvaNLIA1fkm+yjQ7/gQeSL0fML 8h+ErZgLWozYoGlaBs6ASRdFSZ6btkE6gs1zJM80kehykFEi+tug1yeRWaU7yv+xflof B6ubZwuKSNswz4iTYBcGz7phNibpZautwa8NQAJuZSPjrXLKHUxSnM9YLMXR3JDP2ogz oezydmOdVFGjkpUf40jWHnaE0Z8wJ7C/0nOTKVVQj/zdEBN2yPWLnnXAhuUJhA95KRga uZ1w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=bykKUGCflVir5L1X693JNtqoexPRstJK20ieV2db78g=; b=j1z1MskPmqtoE442rE1OhoQDl4l/o+D4Ew48E355XrAljMbcDSH0RYqTAO3cuJWuQ8 cMfvblFtvvBJWWdseZvBPDPZxT+5UFFQQvi7YURV/pyaXjdFZPfg/gFsCtmNUhuw3AdT xbmTz8CT/Rai9NWE0iIQIXM0FnNcGiK/UdzLJCVBOdIj7D7QjilH235HPEynF4on7/4q xXJwrchVTpU5/a1uZvLkU8wbAXW0rAcuMX2HWZyD3QfZxx+AFQazd1XE6UPjGpEKm0du bjiAB27I6+HnNOn/+G/vyMiwZf/TB4ROdmhhgL7iyLBK6dXUiHRWcCff2ACScgs8WMTh gz0Q== X-Gm-Message-State: APjAAAUf7+DETbkHq9X8c8ykwM1EWIgJIdcG4P9oq5NCt81IaAGvXsLh 79/+9Le4T78QZm4hukD6c+8UXKDAXh0= X-Google-Smtp-Source: APXvYqy7Xo55keKIjpgFUODNPw2D3QNNSkcUJwmFzso98SAZGdgswnm8e1cMYGeXjaCxvQNXA3ZY5g== X-Received: by 2002:a17:902:7617:: with SMTP id k23mr28208583pll.175.1558298330853; Sun, 19 May 2019 13:38:50 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sun, 19 May 2019 13:37:18 -0700 Message-Id: <20190519203726.20729-67-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190519203726.20729-1-richard.henderson@linaro.org> References: <20190519203726.20729-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::641 Subject: [Qemu-devel] [PATCH v7 66/74] linux-user: Split out getrusage X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: laurent@vivier.eu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Richard Henderson --- linux-user/syscall-defs.h | 1 + linux-user/syscall-proc.inc.c | 12 ++++++++++++ linux-user/syscall.c | 9 --------- linux-user/strace.list | 3 --- 4 files changed, 13 insertions(+), 12 deletions(-) diff --git a/linux-user/syscall-defs.h b/linux-user/syscall-defs.h index 34426a2e23..446175af84 100644 --- a/linux-user/syscall-defs.h +++ b/linux-user/syscall-defs.h @@ -75,6 +75,7 @@ SYSCALL_DEF(getppid); #ifdef TARGET_NR_getrlimit SYSCALL_DEF(getrlimit, ARG_DEC, ARG_PTR); #endif +SYSCALL_DEF(getrusage, ARG_DEC, ARG_PTR); SYSCALL_DEF(getsid, ARG_DEC); #ifdef TARGET_NR_getxpid SYSCALL_DEF(getxpid); diff --git a/linux-user/syscall-proc.inc.c b/linux-user/syscall-proc.inc.c index 1238b08191..bf9e278bf0 100644 --- a/linux-user/syscall-proc.inc.c +++ b/linux-user/syscall-proc.inc.c @@ -499,6 +499,18 @@ SYSCALL_IMPL(getrlimit) return ret; } #endif + +SYSCALL_IMPL(getrusage) +{ + struct rusage rusage; + abi_long ret =3D get_errno(getrusage(arg1, &rusage)); + + if (!is_error(ret)) { + ret =3D host_to_target_rusage(arg2, &rusage); + } + return ret; +} + SYSCALL_IMPL(getsid) { return get_errno(getsid(arg1)); diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 401450b0e3..5fe52c775d 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -4240,15 +4240,6 @@ static abi_long do_syscall1(void *cpu_env, int num, = abi_long arg1, void *p; =20 switch(num) { - case TARGET_NR_getrusage: - { - struct rusage rusage; - ret =3D get_errno(getrusage(arg1, &rusage)); - if (!is_error(ret)) { - ret =3D host_to_target_rusage(arg2, &rusage); - } - } - return ret; case TARGET_NR_gettimeofday: { struct timeval tv; diff --git a/linux-user/strace.list b/linux-user/strace.list index 711ad9c0aa..00a32bc616 100644 --- a/linux-user/strace.list +++ b/linux-user/strace.list @@ -283,9 +283,6 @@ #ifdef TARGET_NR_get_robust_list { TARGET_NR_get_robust_list, "get_robust_list" , NULL, NULL, NULL }, #endif -#ifdef TARGET_NR_getrusage -{ TARGET_NR_getrusage, "getrusage" , NULL, NULL, NULL }, -#endif #ifdef TARGET_NR_getsockname { TARGET_NR_getsockname, "getsockname" , NULL, NULL, NULL }, #endif --=20 2.17.1 From nobody Thu May 9 22:44:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1558301239; cv=none; d=zoho.com; s=zohoarc; b=ogbN2MXblMEfFWT9svPhnhCbaqtKdXEE8Yrt4c3betobSyiXBHhoSukqGx3OW9WkbE/O84eC7XJT0yCVF2WYw2Pl9c3gQW78cGk+FcJQCZxWJlNQq7znNJsjlhO4ma7xZ9E7WojN2L1QGvPccHhtOYz6/1+0R/CmCVXnmpfS5H0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1558301239; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=aU9d9lkpIFkrBaZRLnqRF/xt/eULyJKQva2sHtEVO2Y=; b=ek1joy8A5YXBCELGBreUY0yCU2uxqt4zw/o0zxAGPX/qaKl45683eLyC/4DCH5M5dtRAzQOaMQCc89xhWSjgRZ/hlXJ8bTT13H2yYS5gGpJKzzM43io/DxkYqGyGSkrns/tVeonxW6PknE/ZsgdQ++11SEo5MdIm2TDUgiHwhH4= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 15583012399361012.7381835727433; Sun, 19 May 2019 14:27:19 -0700 (PDT) Received: from localhost ([127.0.0.1]:53845 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSTKt-0003uy-Ck for importer@patchew.org; Sun, 19 May 2019 17:27:15 -0400 Received: from eggs.gnu.org ([209.51.188.92]:51154) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSa6-00043I-PW for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:55 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hSSa5-00050k-La for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:54 -0400 Received: from mail-pf1-x441.google.com ([2607:f8b0:4864:20::441]:43849) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hSSa5-0004zu-Fl for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:53 -0400 Received: by mail-pf1-x441.google.com with SMTP id c6so6150984pfa.10 for ; Sun, 19 May 2019 13:38:53 -0700 (PDT) Received: from localhost.localdomain (97-113-13-231.tukw.qwest.net. [97.113.13.231]) by smtp.gmail.com with ESMTPSA id i7sm11397448pfo.19.2019.05.19.13.38.51 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 19 May 2019 13:38:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=aU9d9lkpIFkrBaZRLnqRF/xt/eULyJKQva2sHtEVO2Y=; b=Wyiyg66mNE27W+tMaD3QGbxM7UM/xGOPeWqBMI2iw8v8/TM3SiNv2LyrY6PucPGRPn nTXLOyc6CPNeeg/zdB4Br3Q/tmlsS9mccTrAgBpNcye/HHfi0l5TZwXp+5uCBSFJd2xM IrCJrgIEpTgdoR1W9+0GFZRoDTuI09wDdIHJ9DtBEh8JvqELkA21k7IgkF/VYxFw+yKa JRLkxnt1zrdXAEi8FuY2M2oWbsOWo1xLjZ+yqPZXw8Wn7dCdQdS8Gx+E+TKo8huuQ3ci Uiz56Xp3/bSIiEOYhAYc9g45vFxCZteZkydvKb8QnIt+7kfCkAxiefDFzC7ZOFhw7vCp LcyA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=aU9d9lkpIFkrBaZRLnqRF/xt/eULyJKQva2sHtEVO2Y=; b=YnFUYpEHkqFbc/jXdkEBSYEEWVz6FoMGH8oJTyPh0Rx+YOz0vUQnQ0BPhqQsW6VWsd HG/XQ5OjTlV2nEmNGJ4CFtScD74n1sYppBd11LHEH904/tHPQfR0NXxyDYMXVpkEGuMR pkdawOiv8Rk+BTsf0wV1UmcEIoGjjbqa3IKuGXoog4ppK14wnzu3CiA2L6kSXbK7gZHn uRokgKi5l/CakCBYMDw1uEGdlGkNIqpZrHGlJIHTjEB3SDmFQVJkxex1Bv+32qB87y0e VrCP3srtGa4MR8LNbHs40RsR0qaXLi/oKVkGR2ckImJ0FMS80QiX1pzZgxDY2E3BtNcM khpw== X-Gm-Message-State: APjAAAVH0706r+GBJh3Pijzjl7eCpl7c3bL1rIjXVRaYfqMEAfWJ5Mku DVLZV6XbNmTR/CiWPyx59Wamgea6FjI= X-Google-Smtp-Source: APXvYqwbQEu8iczkhLqkzwJvVvTaBqPi2+RANP+nmsrZ0pChsJd+oZzF3lMPyfOcRHF533TDTFnucw== X-Received: by 2002:a63:2d6:: with SMTP id 205mr70853544pgc.114.1558298332183; Sun, 19 May 2019 13:38:52 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sun, 19 May 2019 13:37:19 -0700 Message-Id: <20190519203726.20729-68-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190519203726.20729-1-richard.henderson@linaro.org> References: <20190519203726.20729-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::441 Subject: [Qemu-devel] [PATCH v7 67/74] linux-user: Split out gettimeofday, settimeofday X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: laurent@vivier.eu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Richard Henderson --- linux-user/syscall-defs.h | 2 ++ linux-user/syscall-time.inc.c | 33 +++++++++++++++++++++++++++++++++ linux-user/syscall.c | 31 ------------------------------- linux-user/strace.list | 6 ------ 4 files changed, 35 insertions(+), 37 deletions(-) diff --git a/linux-user/syscall-defs.h b/linux-user/syscall-defs.h index 446175af84..d109754c5f 100644 --- a/linux-user/syscall-defs.h +++ b/linux-user/syscall-defs.h @@ -77,6 +77,7 @@ SYSCALL_DEF(getrlimit, ARG_DEC, ARG_PTR); #endif SYSCALL_DEF(getrusage, ARG_DEC, ARG_PTR); SYSCALL_DEF(getsid, ARG_DEC); +SYSCALL_DEF(gettimeofday, ARG_PTR); #ifdef TARGET_NR_getxpid SYSCALL_DEF(getxpid); #endif @@ -220,6 +221,7 @@ SYSCALL_DEF(setpgid, ARG_DEC, ARG_DEC); SYSCALL_DEF(setrlimit, ARG_DEC, ARG_PTR); #endif SYSCALL_DEF(setsid); +SYSCALL_DEF(settimeofday, ARG_PTR, ARG_PTR); #if !defined(SYSCALL_TABLE) || defined(TARGET_NR_semop) SYSCALL_DEF(semop, ARG_DEC, ARG_PTR, ARG_DEC); #endif diff --git a/linux-user/syscall-time.inc.c b/linux-user/syscall-time.inc.c index d1fb72bde0..1308af64ac 100644 --- a/linux-user/syscall-time.inc.c +++ b/linux-user/syscall-time.inc.c @@ -16,6 +16,39 @@ * along with this program; if not, see . */ =20 +SYSCALL_IMPL(gettimeofday) +{ + struct timeval tv; + abi_long ret =3D get_errno(gettimeofday(&tv, NULL)); + + if (!is_error(ret) && copy_to_user_timeval(arg1, &tv)) { + return -TARGET_EFAULT; + } + return ret; +} + +SYSCALL_IMPL(settimeofday) +{ + struct timeval tv, *ptv =3D NULL; + struct timezone tz, *ptz =3D NULL; + + if (arg1) { + if (copy_from_user_timeval(&tv, arg1)) { + return -TARGET_EFAULT; + } + ptv =3D &tv; + } + + if (arg2) { + if (copy_from_user_timezone(&tz, arg2)) { + return -TARGET_EFAULT; + } + ptz =3D &tz; + } + + return get_errno(settimeofday(ptv, ptz)); +} + #ifdef TARGET_NR_stime SYSCALL_IMPL(stime) { diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 5fe52c775d..b8bc44364d 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -4240,37 +4240,6 @@ static abi_long do_syscall1(void *cpu_env, int num, = abi_long arg1, void *p; =20 switch(num) { - case TARGET_NR_gettimeofday: - { - struct timeval tv; - ret =3D get_errno(gettimeofday(&tv, NULL)); - if (!is_error(ret)) { - if (copy_to_user_timeval(arg1, &tv)) - return -TARGET_EFAULT; - } - } - return ret; - case TARGET_NR_settimeofday: - { - struct timeval tv, *ptv =3D NULL; - struct timezone tz, *ptz =3D NULL; - - if (arg1) { - if (copy_from_user_timeval(&tv, arg1)) { - return -TARGET_EFAULT; - } - ptv =3D &tv; - } - - if (arg2) { - if (copy_from_user_timezone(&tz, arg2)) { - return -TARGET_EFAULT; - } - ptz =3D &tz; - } - - return get_errno(settimeofday(ptv, ptz)); - } #if defined(TARGET_NR_select) case TARGET_NR_select: #if defined(TARGET_WANT_NI_OLD_SELECT) diff --git a/linux-user/strace.list b/linux-user/strace.list index 00a32bc616..635b952d2f 100644 --- a/linux-user/strace.list +++ b/linux-user/strace.list @@ -296,9 +296,6 @@ #ifdef TARGET_NR_gettid { TARGET_NR_gettid, "gettid" , "%s()", NULL, NULL }, #endif -#ifdef TARGET_NR_gettimeofday -{ TARGET_NR_gettimeofday, "gettimeofday" , NULL, NULL, NULL }, -#endif #ifdef TARGET_NR_getuid { TARGET_NR_getuid, "getuid" , "%s()", NULL, NULL }, #endif @@ -1068,9 +1065,6 @@ #ifdef TARGET_NR_set_tid_address { TARGET_NR_set_tid_address, "set_tid_address" , NULL, NULL, NULL }, #endif -#ifdef TARGET_NR_settimeofday -{ TARGET_NR_settimeofday, "settimeofday" , NULL, NULL, NULL }, -#endif #ifdef TARGET_NR_setuid { TARGET_NR_setuid, "setuid" , NULL, NULL, NULL }, #endif --=20 2.17.1 From nobody Thu May 9 22:44:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1558301686; cv=none; d=zoho.com; s=zohoarc; b=mIclCiHbj5ghIA4/py/8zQlecWEAl+nYa/oXhIiFn0s65NbbiOdvGChpw8lESxilyAa92zRfPXBVVrMH6L2RrLjFgZvnF5dQXWpJ+302kht5uZRvOElmXwd5nps3iTXSmkyKlQX1apgBzgfnSffOdI67XA25bh+0T03kcyeUTzs= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1558301686; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=o7AFcCu8y5gdO0mRc0XjobU0Yr+t3Strmr55hIlxmiM=; b=gviGkpBqRO7tMX0CxXejWtjfdvc3TieaAxwjr33UyxHUjT+V08Cv9dVGAxXuHWf+ho7qGogYMTtnD9n/dO9uETphioJMmaEttZsmPwiu4XQPk26D/6Iz+NsqxNQB/E2rXMONDY922ASxHDvUuo7CCtsZiwdVk5Ui25VSXy1StDI= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1558301686003867.6478017674536; Sun, 19 May 2019 14:34:46 -0700 (PDT) Received: from localhost ([127.0.0.1]:53972 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSTS4-0001mM-I0 for importer@patchew.org; Sun, 19 May 2019 17:34:40 -0400 Received: from eggs.gnu.org ([209.51.188.92]:51167) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSa8-000451-EZ for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:58 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hSSa6-00052U-PZ for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:56 -0400 Received: from mail-pf1-x444.google.com ([2607:f8b0:4864:20::444]:39719) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hSSa6-00051F-H0 for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:54 -0400 Received: by mail-pf1-x444.google.com with SMTP id z26so6167808pfg.6 for ; Sun, 19 May 2019 13:38:54 -0700 (PDT) Received: from localhost.localdomain (97-113-13-231.tukw.qwest.net. [97.113.13.231]) by smtp.gmail.com with ESMTPSA id i7sm11397448pfo.19.2019.05.19.13.38.52 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 19 May 2019 13:38:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=o7AFcCu8y5gdO0mRc0XjobU0Yr+t3Strmr55hIlxmiM=; b=lpvANjtSI7lKnu/+zJ6QveUZsZDVZlSbyv1cZsxjnyq+A6/wQJlbnJ9YU7g4qE3S8b XJ8+pDOjwBKTB291OqqeetSnOEaT0knmxQoRD7OxbeBIheMu61VLTS1CAPXgSg0aUVMA cQ1roKveUKIoWkTiqbtQkOflcLxyKTJXVsje/acHiARS73SkNRE9jpUPq9+n5dvgLsLP Iopw41bEK5mzpaGI2ghNGp5ONBy3JQcKsSGjzW5u9s/hOvLJLAcx/9b7RsZ60vnYlwSs 3X9DNgDlwu9GUlfX0bCZZ4PHiugfsVeiLCtDNEb87FtmlbytV9c9fz7N12MUJ3z7ugL/ uDxQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=o7AFcCu8y5gdO0mRc0XjobU0Yr+t3Strmr55hIlxmiM=; b=Ki5g+51HSIJ9Q+bwQx7DH3ixIHlHRcFwaPlbNg7d0udg/EzSg594Lx/ZKVaLo2UFvw kBx7Aw5Ch0gx1zVqvp5q1sCsfvv1Dm9Ue7C0mBnDOjFGWGB8Wke6obXgyKuH+TEwjH5I lyrckssfESjlE7Gy1ErmgOgyfqiJRo2Pf/kX6vbCP03ksu5LEC285KOhOb7wlvqbCF+l p+MMruggJPi4HxJ2YqfWeIYw5bKTyqMU/WxaNWOHDL+lMvjCLcJRxGi2shPiXEjUz1Uy Y/LJxDoPDvsHbkBwgEcz/5P6gmz9WoBZ6WCfvv+NE7oNoD4+FC+XlM5I+TEoJiB2XCMm j0nQ== X-Gm-Message-State: APjAAAVcQ/8YUYP+M8yQais+xVkdLlz8kJmIOUMrk+Bc/OLzozZit1ef +qf6a1hujL8iU9MHe4ObkZBEgUOPOr8= X-Google-Smtp-Source: APXvYqw8mo4Q/D9t844CXh5TvfA0Cnyv0ka2+AEUYsJ+JPO1lh4kkcF3+LNJucaiUtI24mC5QE3xAw== X-Received: by 2002:a62:d044:: with SMTP id p65mr55694443pfg.37.1558298333214; Sun, 19 May 2019 13:38:53 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sun, 19 May 2019 13:37:20 -0700 Message-Id: <20190519203726.20729-69-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190519203726.20729-1-richard.henderson@linaro.org> References: <20190519203726.20729-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::444 Subject: [Qemu-devel] [PATCH v7 68/74] linux-user: Split out select, _newselect X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: laurent@vivier.eu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" This removes the printing of the fdset outputs. It's hard to see how this could have been reliable in a multi-threaded program, saving syscall arguments to global variables. Signed-off-by: Richard Henderson --- linux-user/syscall-defs.h | 11 ++++ linux-user/strace.c | 80 ------------------------- linux-user/syscall-file.inc.c | 91 ++++++++++++++++++++++++++++ linux-user/syscall.c | 110 ++++------------------------------ linux-user/strace.list | 6 -- 5 files changed, 112 insertions(+), 186 deletions(-) diff --git a/linux-user/syscall-defs.h b/linux-user/syscall-defs.h index d109754c5f..01143414c7 100644 --- a/linux-user/syscall-defs.h +++ b/linux-user/syscall-defs.h @@ -143,6 +143,10 @@ SYSCALL_DEF(munlockall); SYSCALL_DEF(munmap, ARG_PTR, ARG_DEC); SYSCALL_DEF(name_to_handle_at, ARG_ATDIRFD, ARG_STR, ARG_PTR, ARG_PTR, ARG_ATFLAG); +#ifdef TARGET_NR__newselect +SYSCALL_DEF_FULL(_newselect, .impl =3D impl_select, + .arg_type =3D { ARG_DEC, ARG_PTR, ARG_PTR, ARG_PTR, ARG_P= TR }); +#endif #ifdef TARGET_NR_nice SYSCALL_DEF(nice, ARG_DEC); #endif @@ -209,6 +213,13 @@ SYSCALL_DEF(rt_sigreturn); SYSCALL_DEF(rt_sigsuspend, ARG_PTR, ARG_DEC); SYSCALL_DEF(rt_sigtimedwait, ARG_PTR, ARG_PTR, ARG_PTR, ARG_DEC); SYSCALL_DEF(rt_tgsigqueueinfo, ARG_DEC, ARG_DEC, ARG_SIGNAL, ARG_PTR); +#ifdef TARGET_NR_select +# if defined(TARGET_WANT_NI_OLD_SELECT) +SYSCALL_DEF_NOSYS(select); +# else +SYSCALL_DEF_ARGS(select, ARG_DEC, ARG_PTR, ARG_PTR, ARG_PTR, ARG_PTR); +# endif +#endif #if !defined(SYSCALL_TABLE) || defined(TARGET_NR_semctl) SYSCALL_DEF(semctl, ARG_DEC, ARG_DEC, ARG_DEC, ARG_HEX); #endif diff --git a/linux-user/strace.c b/linux-user/strace.c index 2e70a3910c..669eca7fa6 100644 --- a/linux-user/strace.c +++ b/linux-user/strace.c @@ -384,34 +384,6 @@ print_socket_protocol(int domain, int type, int protoc= ol) } =20 =20 -#ifdef TARGET_NR__newselect -static void -print_fdset(int n, abi_ulong target_fds_addr) -{ - int i; - - gemu_log("["); - if( target_fds_addr ) { - abi_long *target_fds; - - target_fds =3D lock_user(VERIFY_READ, - target_fds_addr, - sizeof(*target_fds)*(n / TARGET_ABI_BITS + = 1), - 1); - - if (!target_fds) - return; - - for (i=3Dn; i>=3D0; i--) { - if ((tswapal(target_fds[i / TARGET_ABI_BITS]) >> (i & (TARGET_= ABI_BITS - 1))) & 1) - gemu_log("%d,", i ); - } - unlock_user(target_fds, target_fds_addr, 0); - } - gemu_log("]"); -} -#endif - #ifdef TARGET_NR_clock_adjtime /* IDs of the various system clocks */ #define TARGET_CLOCK_REALTIME 0 @@ -479,58 +451,6 @@ print_clockid(int clockid, int last) * Sysycall specific output functions */ =20 -/* select */ -#ifdef TARGET_NR__newselect -static long newselect_arg1 =3D 0; -static long newselect_arg2 =3D 0; -static long newselect_arg3 =3D 0; -static long newselect_arg4 =3D 0; -static long newselect_arg5 =3D 0; - -static void -print_newselect(const struct syscallname *name, - abi_long arg1, abi_long arg2, abi_long arg3, - abi_long arg4, abi_long arg5, abi_long arg6) -{ - gemu_log("%s(" TARGET_ABI_FMT_ld ",", name->name, arg1); - print_fdset(arg1, arg2); - gemu_log(","); - print_fdset(arg1, arg3); - gemu_log(","); - print_fdset(arg1, arg4); - gemu_log(","); - print_timeval(arg5, 1); - gemu_log(")"); - - /* save for use in the return output function below */ - newselect_arg1=3Darg1; - newselect_arg2=3Darg2; - newselect_arg3=3Darg3; - newselect_arg4=3Darg4; - newselect_arg5=3Darg5; -} -#endif - -/* - * Variants for the return value output function - */ - -#ifdef TARGET_NR__newselect -static void -print_syscall_ret_newselect(const struct syscallname *name, abi_long ret) -{ - gemu_log(" =3D 0x" TARGET_ABI_FMT_lx " (", ret); - print_fdset(newselect_arg1,newselect_arg2); - gemu_log(","); - print_fdset(newselect_arg1,newselect_arg3); - gemu_log(","); - print_fdset(newselect_arg1,newselect_arg4); - gemu_log(","); - print_timeval(newselect_arg5, 1); - gemu_log(")\n"); -} -#endif - /* special meanings of adjtimex()' non-negative return values */ #define TARGET_TIME_OK 0 /* clock synchronized, no leap second */ #define TARGET_TIME_INS 1 /* insert leap second */ diff --git a/linux-user/syscall-file.inc.c b/linux-user/syscall-file.inc.c index 6e730e3152..1d66dc3323 100644 --- a/linux-user/syscall-file.inc.c +++ b/linux-user/syscall-file.inc.c @@ -1067,6 +1067,97 @@ SYSCALL_IMPL(renameat2) return do_renameat2(arg1, arg2, arg3, arg4, arg5); } =20 +#if defined(TARGET_NR_select) && defined(TARGET_WANT_OLD_SYS_SELECT) +SYSCALL_ARGS(select) +{ + struct target_sel_arg_struct *sel; + abi_ulong inp, outp, exp, tvp; + abi_long nsel; + + if (!lock_user_struct(VERIFY_READ, sel, in[0], 1)) { + errno =3D EFAULT; + return NULL; + } + nsel =3D tswapal(sel->n); + inp =3D tswapal(sel->inp); + outp =3D tswapal(sel->outp); + exp =3D tswapal(sel->exp); + tvp =3D tswapal(sel->tvp); + unlock_user_struct(sel, in[0], 0); + + out[0] =3D nsel; + out[1] =3D inp; + out[2] =3D outp; + out[3] =3D exp; + out[4] =3D tvp; + return def; +} +#else +# define args_select NULL +#endif + +#if (defined(TARGET_NR_select) && !defined(TARGET_WANT_NI_OLD_SELECT)) \ + || defined(TARGET_NR__newselect) +SYSCALL_IMPL(select) +{ + int n =3D arg1; + abi_ulong rfd_addr =3D arg2; + abi_ulong wfd_addr =3D arg3; + abi_ulong efd_addr =3D arg4; + abi_ulong target_tv_addr =3D arg5; + fd_set rfds, wfds, efds; + fd_set *rfds_ptr, *wfds_ptr, *efds_ptr; + struct timeval tv; + struct timespec ts, *ts_ptr =3D NULL; + abi_long ret; + + ret =3D copy_from_user_fdset_ptr(&rfds, &rfds_ptr, rfd_addr, n); + if (ret) { + return ret; + } + ret =3D copy_from_user_fdset_ptr(&wfds, &wfds_ptr, wfd_addr, n); + if (ret) { + return ret; + } + ret =3D copy_from_user_fdset_ptr(&efds, &efds_ptr, efd_addr, n); + if (ret) { + return ret; + } + + if (target_tv_addr) { + if (copy_from_user_timeval(&tv, target_tv_addr)) + return -TARGET_EFAULT; + ts.tv_sec =3D tv.tv_sec; + ts.tv_nsec =3D tv.tv_usec * 1000; + ts_ptr =3D &ts; + } + + ret =3D get_errno(safe_pselect6(n, rfds_ptr, wfds_ptr, efds_ptr, + ts_ptr, NULL)); + + if (!is_error(ret)) { + if (rfd_addr && copy_to_user_fdset(rfd_addr, &rfds, n)) { + return -TARGET_EFAULT; + } + if (wfd_addr && copy_to_user_fdset(wfd_addr, &wfds, n)) { + return -TARGET_EFAULT; + } + if (efd_addr && copy_to_user_fdset(efd_addr, &efds, n)) { + return -TARGET_EFAULT; + } + if (target_tv_addr) { + tv.tv_sec =3D ts.tv_sec; + tv.tv_usec =3D ts.tv_nsec / 1000; + if (copy_to_user_timeval(target_tv_addr, &tv)) { + return -TARGET_EFAULT; + } + } + } + + return ret; +} +#endif + SYSCALL_IMPL(sync) { sync(); diff --git a/linux-user/syscall.c b/linux-user/syscall.c index b8bc44364d..2c8d74a450 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -1055,88 +1055,6 @@ static inline abi_long copy_to_user_mq_attr(abi_ulon= g target_mq_attr_addr, } #endif =20 -#if defined(TARGET_NR_select) || defined(TARGET_NR__newselect) -/* do_select() must return target values and target errnos. */ -static abi_long do_select(int n, - abi_ulong rfd_addr, abi_ulong wfd_addr, - abi_ulong efd_addr, abi_ulong target_tv_addr) -{ - fd_set rfds, wfds, efds; - fd_set *rfds_ptr, *wfds_ptr, *efds_ptr; - struct timeval tv; - struct timespec ts, *ts_ptr; - abi_long ret; - - ret =3D copy_from_user_fdset_ptr(&rfds, &rfds_ptr, rfd_addr, n); - if (ret) { - return ret; - } - ret =3D copy_from_user_fdset_ptr(&wfds, &wfds_ptr, wfd_addr, n); - if (ret) { - return ret; - } - ret =3D copy_from_user_fdset_ptr(&efds, &efds_ptr, efd_addr, n); - if (ret) { - return ret; - } - - if (target_tv_addr) { - if (copy_from_user_timeval(&tv, target_tv_addr)) - return -TARGET_EFAULT; - ts.tv_sec =3D tv.tv_sec; - ts.tv_nsec =3D tv.tv_usec * 1000; - ts_ptr =3D &ts; - } else { - ts_ptr =3D NULL; - } - - ret =3D get_errno(safe_pselect6(n, rfds_ptr, wfds_ptr, efds_ptr, - ts_ptr, NULL)); - - if (!is_error(ret)) { - if (rfd_addr && copy_to_user_fdset(rfd_addr, &rfds, n)) - return -TARGET_EFAULT; - if (wfd_addr && copy_to_user_fdset(wfd_addr, &wfds, n)) - return -TARGET_EFAULT; - if (efd_addr && copy_to_user_fdset(efd_addr, &efds, n)) - return -TARGET_EFAULT; - - if (target_tv_addr) { - tv.tv_sec =3D ts.tv_sec; - tv.tv_usec =3D ts.tv_nsec / 1000; - if (copy_to_user_timeval(target_tv_addr, &tv)) { - return -TARGET_EFAULT; - } - } - } - - return ret; -} - -#if defined(TARGET_WANT_OLD_SYS_SELECT) -static abi_long do_old_select(abi_ulong arg1) -{ - struct target_sel_arg_struct *sel; - abi_ulong inp, outp, exp, tvp; - long nsel; - - if (!lock_user_struct(VERIFY_READ, sel, arg1, 1)) { - return -TARGET_EFAULT; - } - - nsel =3D tswapal(sel->n); - inp =3D tswapal(sel->inp); - outp =3D tswapal(sel->outp); - exp =3D tswapal(sel->exp); - tvp =3D tswapal(sel->tvp); - - unlock_user_struct(sel, arg1, 0); - - return do_select(nsel, inp, outp, exp, tvp); -} -#endif -#endif - static inline abi_long target_to_host_ip_mreq(struct ip_mreqn *mreqn, abi_ulong target_addr, socklen_t len) @@ -4240,20 +4158,6 @@ static abi_long do_syscall1(void *cpu_env, int num, = abi_long arg1, void *p; =20 switch(num) { -#if defined(TARGET_NR_select) - case TARGET_NR_select: -#if defined(TARGET_WANT_NI_OLD_SELECT) - /* some architectures used to have old_select here - * but now ENOSYS it. - */ - ret =3D -TARGET_ENOSYS; -#elif defined(TARGET_WANT_OLD_SYS_SELECT) - ret =3D do_old_select(arg1); -#else - ret =3D do_select(arg1, arg2, arg3, arg4, arg5); -#endif - return ret; -#endif #ifdef TARGET_NR_pselect6 case TARGET_NR_pselect6: { @@ -5007,10 +4911,6 @@ static abi_long do_syscall1(void *cpu_env, int num, = abi_long arg1, } return ret; #endif /* TARGET_NR_getdents64 */ -#if defined(TARGET_NR__newselect) - case TARGET_NR__newselect: - return do_select(arg1, arg2, arg3, arg4, arg5); -#endif #if defined(TARGET_NR_poll) || defined(TARGET_NR_ppoll) # ifdef TARGET_NR_poll case TARGET_NR_poll: @@ -7233,6 +7133,12 @@ static abi_long do_syscall1(void *cpu_env, int num, = abi_long arg1, #include "syscall-sig.inc.c" #include "syscall-time.inc.c" =20 +static SyscallImplFn impl_enosys __attribute__((unused)); +SYSCALL_IMPL(enosys) +{ + return -TARGET_ENOSYS; +} + #undef SYSCALL_IMPL #undef SYSCALL_ARGS =20 @@ -7254,6 +7160,10 @@ static abi_long do_syscall1(void *cpu_env, int num, = abi_long arg1, SYSCALL_DEF_FULL(NAME, .impl =3D impl_##NAME, .args =3D args_##NAME, \ .arg_type =3D { __VA_ARGS__ }) =20 +/* Emit a definition that always produces ENOSYS without logging. */ +#define SYSCALL_DEF_NOSYS(NAME) \ + SYSCALL_DEF_FULL(NAME, .impl =3D impl_enosys) + #include "syscall-defs.h" =20 #undef SYSCALL_DEF diff --git a/linux-user/strace.list b/linux-user/strace.list index 635b952d2f..297180d94f 100644 --- a/linux-user/strace.list +++ b/linux-user/strace.list @@ -470,9 +470,6 @@ #ifdef TARGET_NR_newfstatat { TARGET_NR_newfstatat, "newfstatat" , NULL, print_newfstatat, NULL }, #endif -#ifdef TARGET_NR__newselect -{ TARGET_NR__newselect, "_newselect" , NULL, print_newselect, print_syscal= l_ret_newselect }, -#endif #ifdef TARGET_NR_nfsservctl { TARGET_NR_nfsservctl, "nfsservctl" , NULL, NULL, NULL }, #endif @@ -962,9 +959,6 @@ #ifdef TARGET_NR_security { TARGET_NR_security, "security" , NULL, NULL, NULL }, #endif -#ifdef TARGET_NR_select -{ TARGET_NR_select, "select" , NULL, NULL, NULL }, -#endif #ifdef TARGET_NR_send { TARGET_NR_send, "send" , NULL, NULL, NULL }, #endif --=20 2.17.1 From nobody Thu May 9 22:44:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1558301742; cv=none; d=zoho.com; s=zohoarc; b=ggrSC5oUOtVWKAewruSopVhiGAGyeO2+TxgjaYHxNwrWCl+oCpbqkLA3pwNWNZ4e3X05j7C0L/5IqXY7VevPvqjacMgGZab5ScKQsWUXkjzoouWS4vFWGqwjcRfM6HnHBVj4QBzuSWsOXiXqtkg5tsJHHQQaTpgQTtxWqsU8LJY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1558301742; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=OxzuqNW/UFIgrfGQ+3fG4I/RITK819AGJzrnscRZcbA=; b=L2cf6K/ySOkPekHgLhqzOJRRRMMOfl0A+eawFvR8AawovFMLDZHQTkTq9C/KLUrjC1hbFusacXG8gf0oi32QFRVTjLUFBj16oN6v6Xb81233al0hfVO1k+HpqEGKLwAjm0lQBMsLaaUM8qJvcIpxOXYjducPq8nY1qWb6DQ7n3k= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (209.51.188.17 [209.51.188.17]) by mx.zohomail.com with SMTPS id 1558301742026735.6202005980091; Sun, 19 May 2019 14:35:42 -0700 (PDT) Received: from localhost ([127.0.0.1]:53983 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSTSv-0002Kk-T9 for importer@patchew.org; Sun, 19 May 2019 17:35:33 -0400 Received: from eggs.gnu.org ([209.51.188.92]:51175) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSa9-000464-7u for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:58 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hSSa7-00053u-V8 for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:57 -0400 Received: from mail-pf1-x443.google.com ([2607:f8b0:4864:20::443]:32993) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hSSa7-00053D-Mr for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:55 -0400 Received: by mail-pf1-x443.google.com with SMTP id z28so6189204pfk.0 for ; Sun, 19 May 2019 13:38:55 -0700 (PDT) Received: from localhost.localdomain (97-113-13-231.tukw.qwest.net. [97.113.13.231]) by smtp.gmail.com with ESMTPSA id i7sm11397448pfo.19.2019.05.19.13.38.53 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 19 May 2019 13:38:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=OxzuqNW/UFIgrfGQ+3fG4I/RITK819AGJzrnscRZcbA=; b=I8gqlqkuGq0N6crXd3nyY2kU5jfyEDab7KvBndm9AouProIG005uLWbKDgldeojNuy xV9jwzOtUvS6HgJP+st5Dvs6lVuQIhwY3j75LcCgqtxO+yQPA0srcltvknFkUBw8qml1 nLXVVQN7NilIZRk2oK+JliyKclsb+s7sODvdDFPl9ycq6N6GwTRC/rUU4kXW3sWsb3gM CwHXhkYoJkL3QbAniRCjKs4FBm9GCMuaaA5upIpjeP2rbuetsi9NV3Xr+EhTIhiHZd6a G4/i9dZ7sILCyufM1VmrLpjgFth45cQrBEekOLEnRbd5GkScZ5hI1p0gVYvUPYKfXhOW ccZg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=OxzuqNW/UFIgrfGQ+3fG4I/RITK819AGJzrnscRZcbA=; b=nqU0Rdjq8fGELluz3fv7hLujknN6V9sIKc/EeAfftxcl1TVPDI1+BW1GrikEN+XRgZ VQPgzBKTRudoU4RPpOKEBUxJ3ECFXnEdhyCMhDSNVO/yXq3lXSuG8h+REai0TygY3Ojs MLzz6SFRPl3cgzVs98lXGxyty6nFkZ19KoUcDFXhDQdfQHDkB9hymL6/HaKEcMdBo2hQ w/FUIGm3SXG2CEqWdc5nxd02pHJn81B+1l7xWtrjmXdWixeQGhRKhjHQcvG/4yLmo4eK Jb6MPAq2yD07f8jsEcYS+jywq/rua0LLEhMOPeQMjoqtzhZaXvuwtHJF2zc+KCtG3Jto NP0g== X-Gm-Message-State: APjAAAXfNSNIMcVUm/4oB/aTVyGtgqQWO+LJiFtkuS7XmOLScvBrf03X twnGWr2LlgivRI8X+ParVnpAqmRBZGE= X-Google-Smtp-Source: APXvYqxHkryZgQ0seLFwW9zU8DsM3NK0C0gwxQm9KC3TN8uM4nVouBzD8F8+pRD0jT/wMHIHb65kAQ== X-Received: by 2002:a62:4281:: with SMTP id h1mr76217177pfd.162.1558298334457; Sun, 19 May 2019 13:38:54 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sun, 19 May 2019 13:37:21 -0700 Message-Id: <20190519203726.20729-70-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190519203726.20729-1-richard.henderson@linaro.org> References: <20190519203726.20729-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::443 Subject: [Qemu-devel] [PATCH v7 69/74] linux-user: Split out pselect6 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: laurent@vivier.eu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Richard Henderson --- linux-user/syscall-defs.h | 1 + linux-user/syscall-file.inc.c | 96 +++++++++++++++++++++++++++++++ linux-user/syscall.c | 103 ---------------------------------- linux-user/strace.list | 3 - 4 files changed, 97 insertions(+), 106 deletions(-) diff --git a/linux-user/syscall-defs.h b/linux-user/syscall-defs.h index 01143414c7..c179f69d9f 100644 --- a/linux-user/syscall-defs.h +++ b/linux-user/syscall-defs.h @@ -180,6 +180,7 @@ SYSCALL_DEF_FULL(preadv, .impl =3D impl_preadv, SYSCALL_DEF_FULL(pwritev, .impl =3D impl_pwritev, .args =3D args_preadv_pwritev, .arg_type =3D { ARG_DEC, ARG_PTR, ARG_DEC, ARG_DEC64 }); +SYSCALL_DEF(pselect6, ARG_DEC, ARG_PTR, ARG_PTR, ARG_PTR, ARG_PTR, ARG_PTR= ); SYSCALL_DEF(read, ARG_DEC, ARG_PTR, ARG_DEC); #ifdef TARGET_NR_readlink SYSCALL_DEF(readlink, ARG_STR, ARG_PTR, ARG_DEC); diff --git a/linux-user/syscall-file.inc.c b/linux-user/syscall-file.inc.c index 1d66dc3323..0a25d39d28 100644 --- a/linux-user/syscall-file.inc.c +++ b/linux-user/syscall-file.inc.c @@ -934,6 +934,102 @@ SYSCALL_IMPL(pwritev) return ret; } =20 +SYSCALL_IMPL(pselect6) +{ + abi_long n =3D arg1; + abi_ulong rfd_addr =3D arg2; + abi_ulong wfd_addr =3D arg3; + abi_ulong efd_addr =3D arg4; + abi_ulong ts_addr =3D arg5; + fd_set rfds, wfds, efds; + fd_set *rfds_ptr, *wfds_ptr, *efds_ptr; + struct timespec ts, *ts_ptr =3D NULL; + abi_long ret; + + /* + * The 6th arg is actually two args smashed together, and since + * we are using safe_syscall, we must handle this ourselves. + */ + sigset_t set; + struct { + sigset_t *set; + size_t size; + } sig, *sig_ptr =3D NULL; + + abi_ulong arg_sigset, arg_sigsize, *arg7; + target_sigset_t *target_sigset; + + ret =3D copy_from_user_fdset_ptr(&rfds, &rfds_ptr, rfd_addr, n); + if (ret) { + return ret; + } + ret =3D copy_from_user_fdset_ptr(&wfds, &wfds_ptr, wfd_addr, n); + if (ret) { + return ret; + } + ret =3D copy_from_user_fdset_ptr(&efds, &efds_ptr, efd_addr, n); + if (ret) { + return ret; + } + + if (ts_addr) { + if (target_to_host_timespec(&ts, ts_addr)) { + return -TARGET_EFAULT; + } + ts_ptr =3D &ts; + } + + /* Extract the two packed args for the sigset */ + if (arg6) { + sig_ptr =3D &sig; + sig.size =3D SIGSET_T_SIZE; + + arg7 =3D lock_user(VERIFY_READ, arg6, sizeof(*arg7) * 2, 1); + if (!arg7) { + return -TARGET_EFAULT; + } + arg_sigset =3D tswapal(arg7[0]); + arg_sigsize =3D tswapal(arg7[1]); + unlock_user(arg7, arg6, 0); + + if (arg_sigset) { + sig.set =3D &set; + if (arg_sigsize !=3D sizeof(*target_sigset)) { + /* Like the kernel, we enforce correct size sigsets */ + return -TARGET_EINVAL; + } + target_sigset =3D lock_user(VERIFY_READ, arg_sigset, + sizeof(*target_sigset), 1); + if (!target_sigset) { + return -TARGET_EFAULT; + } + target_to_host_sigset(&set, target_sigset); + unlock_user(target_sigset, arg_sigset, 0); + } else { + sig.set =3D NULL; + } + } + + ret =3D get_errno(safe_pselect6(n, rfds_ptr, wfds_ptr, efds_ptr, + ts_ptr, sig_ptr)); + + if (!is_error(ret)) { + if (rfd_addr && copy_to_user_fdset(rfd_addr, &rfds, n)) { + return -TARGET_EFAULT; + } + if (wfd_addr && copy_to_user_fdset(wfd_addr, &wfds, n)) { + return -TARGET_EFAULT; + } + if (efd_addr && copy_to_user_fdset(efd_addr, &efds, n)) { + return -TARGET_EFAULT; + } + if (ts_addr && host_to_target_timespec(ts_addr, &ts)) { + return -TARGET_EFAULT; + } + } + return ret; +} + SYSCALL_IMPL(read) { int fd =3D arg1; diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 2c8d74a450..6355fd62d8 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -4158,109 +4158,6 @@ static abi_long do_syscall1(void *cpu_env, int num,= abi_long arg1, void *p; =20 switch(num) { -#ifdef TARGET_NR_pselect6 - case TARGET_NR_pselect6: - { - abi_long rfd_addr, wfd_addr, efd_addr, n, ts_addr; - fd_set rfds, wfds, efds; - fd_set *rfds_ptr, *wfds_ptr, *efds_ptr; - struct timespec ts, *ts_ptr; - - /* - * The 6th arg is actually two args smashed together, - * so we cannot use the C library. - */ - sigset_t set; - struct { - sigset_t *set; - size_t size; - } sig, *sig_ptr; - - abi_ulong arg_sigset, arg_sigsize, *arg7; - target_sigset_t *target_sigset; - - n =3D arg1; - rfd_addr =3D arg2; - wfd_addr =3D arg3; - efd_addr =3D arg4; - ts_addr =3D arg5; - - ret =3D copy_from_user_fdset_ptr(&rfds, &rfds_ptr, rfd_addr, n= ); - if (ret) { - return ret; - } - ret =3D copy_from_user_fdset_ptr(&wfds, &wfds_ptr, wfd_addr, n= ); - if (ret) { - return ret; - } - ret =3D copy_from_user_fdset_ptr(&efds, &efds_ptr, efd_addr, n= ); - if (ret) { - return ret; - } - - /* - * This takes a timespec, and not a timeval, so we cannot - * use the do_select() helper ... - */ - if (ts_addr) { - if (target_to_host_timespec(&ts, ts_addr)) { - return -TARGET_EFAULT; - } - ts_ptr =3D &ts; - } else { - ts_ptr =3D NULL; - } - - /* Extract the two packed args for the sigset */ - if (arg6) { - sig_ptr =3D &sig; - sig.size =3D SIGSET_T_SIZE; - - arg7 =3D lock_user(VERIFY_READ, arg6, sizeof(*arg7) * 2, 1= ); - if (!arg7) { - return -TARGET_EFAULT; - } - arg_sigset =3D tswapal(arg7[0]); - arg_sigsize =3D tswapal(arg7[1]); - unlock_user(arg7, arg6, 0); - - if (arg_sigset) { - sig.set =3D &set; - if (arg_sigsize !=3D sizeof(*target_sigset)) { - /* Like the kernel, we enforce correct size sigset= s */ - return -TARGET_EINVAL; - } - target_sigset =3D lock_user(VERIFY_READ, arg_sigset, - sizeof(*target_sigset), 1); - if (!target_sigset) { - return -TARGET_EFAULT; - } - target_to_host_sigset(&set, target_sigset); - unlock_user(target_sigset, arg_sigset, 0); - } else { - sig.set =3D NULL; - } - } else { - sig_ptr =3D NULL; - } - - ret =3D get_errno(safe_pselect6(n, rfds_ptr, wfds_ptr, efds_pt= r, - ts_ptr, sig_ptr)); - - if (!is_error(ret)) { - if (rfd_addr && copy_to_user_fdset(rfd_addr, &rfds, n)) - return -TARGET_EFAULT; - if (wfd_addr && copy_to_user_fdset(wfd_addr, &wfds, n)) - return -TARGET_EFAULT; - if (efd_addr && copy_to_user_fdset(efd_addr, &efds, n)) - return -TARGET_EFAULT; - - if (ts_addr && host_to_target_timespec(ts_addr, &ts)) - return -TARGET_EFAULT; - } - } - return ret; -#endif #ifdef TARGET_NR_symlink case TARGET_NR_symlink: { diff --git a/linux-user/strace.list b/linux-user/strace.list index 297180d94f..1bb9224b5e 100644 --- a/linux-user/strace.list +++ b/linux-user/strace.list @@ -848,9 +848,6 @@ #ifdef TARGET_NR_profil { TARGET_NR_profil, "profil" , NULL, NULL, NULL }, #endif -#ifdef TARGET_NR_pselect6 -{ TARGET_NR_pselect6, "pselect6" , NULL, NULL, NULL }, -#endif #ifdef TARGET_NR_ptrace { TARGET_NR_ptrace, "ptrace" , NULL, NULL, NULL }, #endif --=20 2.17.1 From nobody Thu May 9 22:44:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1558301225; cv=none; d=zoho.com; s=zohoarc; b=j9YP6P8RYO1FXJxNIdnL2YC5gRXHAJ1IteSD0jyVTzQ5hWX3OAtQ7eA+oGF7ym0ZelAlekqZb7taA0ysu4X+NLXpLaM/HKQ2o8zo//t6Wb13z3l6LmIJlZCcC2wYcK+9fhJYRX6TTFInKEZpj/Ue23z9u1Ow3DaGlTBl7o/7D50= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1558301225; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=uYnsHq9/MDxU+MhAeWsJGfGuVRcPuHSPILqSnflq808=; b=lo+ctf7RYOPuQFhX0FGCJvKwdypTeLnrfcSfdE1KtFBoGLftUheuB1NLgNgY411eWJnuDFHEKRSUeYawEoIXluEXDDdH/nSOKiODrxI5UtatRW97Yeam5M55L+IzMu3bECQqLW5dd4xrj/rDNJ+0y2FwT4zrD81qn+dxw5gF9kU= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1558301225306611.2278470971609; Sun, 19 May 2019 14:27:05 -0700 (PDT) Received: from localhost ([127.0.0.1]:53839 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSTKL-0003R8-Pv for importer@patchew.org; Sun, 19 May 2019 17:26:41 -0400 Received: from eggs.gnu.org ([209.51.188.92]:51190) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSaA-000470-3A for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:59 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hSSa8-00054w-US for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:58 -0400 Received: from mail-pf1-x441.google.com ([2607:f8b0:4864:20::441]:37552) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hSSa8-00054H-OA for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:56 -0400 Received: by mail-pf1-x441.google.com with SMTP id g3so6171976pfi.4 for ; Sun, 19 May 2019 13:38:56 -0700 (PDT) Received: from localhost.localdomain (97-113-13-231.tukw.qwest.net. [97.113.13.231]) by smtp.gmail.com with ESMTPSA id i7sm11397448pfo.19.2019.05.19.13.38.54 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 19 May 2019 13:38:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=uYnsHq9/MDxU+MhAeWsJGfGuVRcPuHSPILqSnflq808=; b=Zyt1ejbOQKCVf+XkZU0o42hrxBobvNvTQ5mQdNaqW8Z7iXyO8kgx8f55V6lr4b9tp8 dFcwC+paPo2Agj1uHZ6Bwdp+X21fNY9b5fSZKIGI3prnirUeVqwZFqx2L9BHux6OhyKs r5/S1/gMGxYO9PMTRgCLahsMbOtFD0Kl3OduRsVU3rARg+dKPboZrvPS3sxQJsJU9NfT R2s4P0um+Z1SE8vKLOQf0ynfTpo4HtvPjPBXfHxg+q2dgGV5iIBBbqwbmr4U1Riiv6tF gQMnwJo5ajOpVUFqoBvkWjp/Smmjd8w5bDWafbCll4HOmuH0n9Lo+kv6zUJKu7/Euw/T orbQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=uYnsHq9/MDxU+MhAeWsJGfGuVRcPuHSPILqSnflq808=; b=eIah9cSOUCQaF8m29ZyH7kB8n1dtoKwFe8V4ffS7BDP498vkPZG8OdwvCgnSKCg8WM 2rQxaqPvyJzQaGVrPnwm9O6UkIZSelBPStgTVZ1w95DORRBHuyr31QnNwLwzNwefpF0A 1FVDg6r4ixnGI4KRAaw4pmJ1UIcPsH/ITnGWTZufNv+rj1zehJC2RB+5m1I1E6p/tk/F DGM21esxUmcZVzHKQatxDIy4oFG6UJaxNXo3epCCXZg4mjN7gdDnJQMD3VlX7EOd+5Xg r9nq9erUpr5T8HzgctvOLvvprzmtTcCUIEcA60sfYqoZ4WWbNXg9N/xfn1h7Bd/O6QjM F6lQ== X-Gm-Message-State: APjAAAVraEhEjyT4vXUrz8/SSuSRP04hUbPW3QbCgBNUDHoejDeQTFpn HAdrcruKB5LPfaS2yqhUO/IRvkpGZdY= X-Google-Smtp-Source: APXvYqz4IyVjzScE+VVKwCcS5tzEOcdkabwMWNMQf6SP8/LRDhPJS+vHc8Qj7HMM1amz1bfaMIsfZA== X-Received: by 2002:a63:6ac1:: with SMTP id f184mr72586068pgc.25.1558298335548; Sun, 19 May 2019 13:38:55 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sun, 19 May 2019 13:37:22 -0700 Message-Id: <20190519203726.20729-71-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190519203726.20729-1-richard.henderson@linaro.org> References: <20190519203726.20729-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::441 Subject: [Qemu-devel] [PATCH v7 70/74] linux-user: Split out symlink, symlinkat X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: laurent@vivier.eu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Richard Henderson --- linux-user/syscall-defs.h | 4 ++++ linux-user/strace.c | 27 --------------------------- linux-user/syscall-file.inc.c | 28 ++++++++++++++++++++++++++++ linux-user/syscall.c | 30 ------------------------------ linux-user/strace.list | 6 ------ 5 files changed, 32 insertions(+), 63 deletions(-) diff --git a/linux-user/syscall-defs.h b/linux-user/syscall-defs.h index c179f69d9f..5625c268c3 100644 --- a/linux-user/syscall-defs.h +++ b/linux-user/syscall-defs.h @@ -279,6 +279,10 @@ SYSCALL_DEF(ssetmask, ARG_HEX); #ifdef TARGET_NR_stime SYSCALL_DEF(stime, ARG_PTR); #endif +#ifdef TARGET_NR_symlink +SYSCALL_DEF(symlink, ARG_STR, ARG_STR); +#endif +SYSCALL_DEF(symlinkat, ARG_STR, ARG_ATDIRFD, ARG_STR); SYSCALL_DEF(sync); SYSCALL_DEF(syncfs, ARG_DEC); #ifdef TARGET_NR_time diff --git a/linux-user/strace.c b/linux-user/strace.c index 669eca7fa6..97755458d3 100644 --- a/linux-user/strace.c +++ b/linux-user/strace.c @@ -1563,33 +1563,6 @@ print_statfs64(const struct syscallname *name, } #endif =20 -#ifdef TARGET_NR_symlink -static void -print_symlink(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - print_syscall_prologue(name); - print_string(arg0, 0); - print_string(arg1, 1); - print_syscall_epilogue(name); -} -#endif - -#ifdef TARGET_NR_symlinkat -static void -print_symlinkat(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - print_syscall_prologue(name); - print_string(arg0, 0); - print_at_dirfd(arg1, 0); - print_string(arg2, 1); - print_syscall_epilogue(name); -} -#endif - #ifdef TARGET_NR_utimensat static void print_utimensat(const struct syscallname *name, diff --git a/linux-user/syscall-file.inc.c b/linux-user/syscall-file.inc.c index 0a25d39d28..e3749f0fb4 100644 --- a/linux-user/syscall-file.inc.c +++ b/linux-user/syscall-file.inc.c @@ -1254,6 +1254,34 @@ SYSCALL_IMPL(select) } #endif =20 +static abi_long do_symlinkat(abi_ulong guest_target, int dirfd, + abi_ulong guest_path) +{ + char *target =3D lock_user_string(guest_target); + char *path =3D lock_user_string(guest_path); + abi_long ret =3D -TARGET_EFAULT; + + if (target && path) { + ret =3D get_errno(symlinkat(target, dirfd, path)); + } + unlock_user(path, guest_path, 0); + unlock_user(target, guest_target, 0); + + return ret; +} + +#ifdef TARGET_NR_symlink +SYSCALL_IMPL(symlink) +{ + return do_symlinkat(arg1, AT_FDCWD, arg2); +} +#endif + +SYSCALL_IMPL(symlinkat) +{ + return do_symlinkat(arg1, arg2, arg3); +} + SYSCALL_IMPL(sync) { sync(); diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 6355fd62d8..fccf9ee184 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -4158,36 +4158,6 @@ static abi_long do_syscall1(void *cpu_env, int num, = abi_long arg1, void *p; =20 switch(num) { -#ifdef TARGET_NR_symlink - case TARGET_NR_symlink: - { - void *p2; - p =3D lock_user_string(arg1); - p2 =3D lock_user_string(arg2); - if (!p || !p2) - ret =3D -TARGET_EFAULT; - else - ret =3D get_errno(symlink(p, p2)); - unlock_user(p2, arg2, 0); - unlock_user(p, arg1, 0); - } - return ret; -#endif -#if defined(TARGET_NR_symlinkat) - case TARGET_NR_symlinkat: - { - void *p2; - p =3D lock_user_string(arg1); - p2 =3D lock_user_string(arg3); - if (!p || !p2) - ret =3D -TARGET_EFAULT; - else - ret =3D get_errno(symlinkat(p, arg2, p2)); - unlock_user(p2, arg3, 0); - unlock_user(p, arg1, 0); - } - return ret; -#endif #ifdef TARGET_NR_swapon case TARGET_NR_swapon: if (!(p =3D lock_user_string(arg1))) diff --git a/linux-user/strace.list b/linux-user/strace.list index 1bb9224b5e..d9db80335d 100644 --- a/linux-user/strace.list +++ b/linux-user/strace.list @@ -1122,12 +1122,6 @@ #ifdef TARGET_NR_swapon { TARGET_NR_swapon, "swapon" , NULL, NULL, NULL }, #endif -#ifdef TARGET_NR_symlink -{ TARGET_NR_symlink, "symlink" , NULL, print_symlink, NULL }, -#endif -#ifdef TARGET_NR_symlinkat -{ TARGET_NR_symlinkat, "symlinkat", NULL, print_symlinkat, NULL }, -#endif #ifdef TARGET_NR_syscall { TARGET_NR_syscall, "syscall" , NULL, NULL, NULL }, #endif --=20 2.17.1 From nobody Thu May 9 22:44:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1558301397; cv=none; d=zoho.com; s=zohoarc; b=kcoaFd1nqo6AZi55B9iawIuBBNbSu9vxDaiNjPx/9m1sXH2iFWJ4w9drKQHXMPeCHaU2jdIBjLXrhx02vi6lNJk8pu9pCSC3qYIHorVfiyMg1bl+BatKyHmMgwsQoTp9/R7B1dbt3G9MkSIwnpCXcpnYZKttFBYHSI33Q8NsNKA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1558301397; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=AwkKxT6hgxGUbnCawP7ML0rY671AUDoxnoeEokerBT8=; b=Bg7v2ec2pAZD2dvwsJ3qTgUY0loq3famvMxl+9+KzTtC0VOxCXL9cJc17ESO5UFT5I7V+fydK4A6DFV3L54cdqv7xFBwfbIWYpyC7mtfoCdaQw4KPcu6vrDzSyKe02bcteSgPIzRcVTKmkHjOE+O5DmJ5Gans9/axBIVmzFmSjU= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (209.51.188.17 [209.51.188.17]) by mx.zohomail.com with SMTPS id 1558301397737372.29376627699753; Sun, 19 May 2019 14:29:57 -0700 (PDT) Received: from localhost ([127.0.0.1]:53878 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSTNP-0006DI-Fp for importer@patchew.org; Sun, 19 May 2019 17:29:51 -0400 Received: from eggs.gnu.org ([209.51.188.92]:51209) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSaB-000483-5N for qemu-devel@nongnu.org; Sun, 19 May 2019 16:39:00 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hSSaA-00056K-42 for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:59 -0400 Received: from mail-pf1-x443.google.com ([2607:f8b0:4864:20::443]:44494) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hSSa9-00055d-Tl for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:58 -0400 Received: by mail-pf1-x443.google.com with SMTP id g9so6149356pfo.11 for ; Sun, 19 May 2019 13:38:57 -0700 (PDT) Received: from localhost.localdomain (97-113-13-231.tukw.qwest.net. [97.113.13.231]) by smtp.gmail.com with ESMTPSA id i7sm11397448pfo.19.2019.05.19.13.38.55 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 19 May 2019 13:38:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=AwkKxT6hgxGUbnCawP7ML0rY671AUDoxnoeEokerBT8=; b=geyLX6mRxlcwdztvehOJoVihDXVuFrvzPKzOHjfE52+WR6W5LXbZRhSZovgXDjj/s5 Rpv+56ZNUtlwmLfAdrPaEm5bdgDCVZlGvkJ7JRGMm5oi7Ooo/SEG2AmC6vbTtrSWU2U1 KHY83aLr+EU0NC/utnT2IFq204cIyERYQ6zXj6X6G6seqxqccTZ5mEPbmR1n8fvQ+eDj J/41cojmPZvLot3lmXnjgEBe7eVoj74cioFSiaD3RRQlWwE+Riqr3ZFzv6GCt+U5VupW 7s0elB2xOG6RvI0p/YlV04Z2Y8hT1yJBL9lKTfElXE8v3237rFFMXSOYO+CcdOPM0uFr wfKQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=AwkKxT6hgxGUbnCawP7ML0rY671AUDoxnoeEokerBT8=; b=Z7eFkQUVLutE06d2qjGsb3fQTHebo05mu9Ef6Y4xAdCjp2wRGi03iCZQFrDjv0quup O3zG97xhEdRU3kZYgUO46KFEUmPJFB40vrsJLR8KHbG1YKU/Ta/hXVeO0R4UlxdjVe5O LzRM0tMjryoLDObY8x7v6PS9/gnLx74YFkOtFHwdCa8qxxnjH1XgwNt7VVgmYX+LbAvI hIBrU1/hPYWa3PjxbUsCPTL+M5IqrnL8BQXXQCt6jaDw1URB0FPC7MuHHTNsBoduby9l 3z8j/pKvZlgfAzIqLemcK+AKaCw3L3wmbii9IiV6ji+7J5sR+/JlmYYuDn7nJXYsYWFB eCfw== X-Gm-Message-State: APjAAAWQ2vqkhNVPTvKrC5MscUvIeGQlvJS0/YISzCMyA6NPMqBfrnUz sw8om7sRw49MN2eI8g4p1eewhVIDkMU= X-Google-Smtp-Source: APXvYqx6AVKNXkSdU322RfLmkkcvT1LyZSJkcIyfhBdLeyoLZJeJKW2fH5Ir7OJgcEenWQO4enZr3w== X-Received: by 2002:a65:5cca:: with SMTP id b10mr71649844pgt.444.1558298336768; Sun, 19 May 2019 13:38:56 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sun, 19 May 2019 13:37:23 -0700 Message-Id: <20190519203726.20729-72-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190519203726.20729-1-richard.henderson@linaro.org> References: <20190519203726.20729-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::443 Subject: [Qemu-devel] [PATCH v7 71/74] linux-user: Split out swapon, swapoff X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: laurent@vivier.eu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Richard Henderson --- linux-user/syscall-defs.h | 2 ++ linux-user/syscall-file.inc.c | 26 ++++++++++++++++++++++++++ linux-user/syscall.c | 16 ---------------- linux-user/strace.list | 6 ------ 4 files changed, 28 insertions(+), 22 deletions(-) diff --git a/linux-user/syscall-defs.h b/linux-user/syscall-defs.h index 5625c268c3..34e799d206 100644 --- a/linux-user/syscall-defs.h +++ b/linux-user/syscall-defs.h @@ -279,6 +279,8 @@ SYSCALL_DEF(ssetmask, ARG_HEX); #ifdef TARGET_NR_stime SYSCALL_DEF(stime, ARG_PTR); #endif +SYSCALL_DEF(swapoff, ARG_STR); +SYSCALL_DEF(swapon, ARG_STR, ARG_HEX); #ifdef TARGET_NR_symlink SYSCALL_DEF(symlink, ARG_STR, ARG_STR); #endif diff --git a/linux-user/syscall-file.inc.c b/linux-user/syscall-file.inc.c index e3749f0fb4..bdf42ad437 100644 --- a/linux-user/syscall-file.inc.c +++ b/linux-user/syscall-file.inc.c @@ -1254,6 +1254,32 @@ SYSCALL_IMPL(select) } #endif =20 +SYSCALL_IMPL(swapoff) +{ + char *p =3D lock_user_string(arg1); + abi_long ret; + + if (!p) { + return -TARGET_EFAULT; + } + ret =3D get_errno(swapoff(p)); + unlock_user(p, arg1, 0); + return ret; +} + +SYSCALL_IMPL(swapon) +{ + char *p =3D lock_user_string(arg1); + abi_long ret; + + if (!p) { + return -TARGET_EFAULT; + } + ret =3D get_errno(swapon(p, arg2)); + unlock_user(p, arg1, 0); + return ret; +} + static abi_long do_symlinkat(abi_ulong guest_target, int dirfd, abi_ulong guest_path) { diff --git a/linux-user/syscall.c b/linux-user/syscall.c index fccf9ee184..ead2e5c2b8 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -4158,14 +4158,6 @@ static abi_long do_syscall1(void *cpu_env, int num, = abi_long arg1, void *p; =20 switch(num) { -#ifdef TARGET_NR_swapon - case TARGET_NR_swapon: - if (!(p =3D lock_user_string(arg1))) - return -TARGET_EFAULT; - ret =3D get_errno(swapon(p, arg2)); - unlock_user(p, arg1, 0); - return ret; -#endif case TARGET_NR_reboot: if (arg3 =3D=3D LINUX_REBOOT_CMD_RESTART2) { /* arg4 must be ignored in all other cases */ @@ -4503,14 +4495,6 @@ static abi_long do_syscall1(void *cpu_env, int num, = abi_long arg1, case TARGET_NR_syscall: return do_syscall(cpu_env, arg1 & 0xffff, arg2, arg3, arg4, arg5, arg6, arg7, arg8, 0); -#endif -#ifdef TARGET_NR_swapoff - case TARGET_NR_swapoff: - if (!(p =3D lock_user_string(arg1))) - return -TARGET_EFAULT; - ret =3D get_errno(swapoff(p)); - unlock_user(p, arg1, 0); - return ret; #endif case TARGET_NR_sysinfo: { diff --git a/linux-user/strace.list b/linux-user/strace.list index d9db80335d..3d2e398439 100644 --- a/linux-user/strace.list +++ b/linux-user/strace.list @@ -1116,12 +1116,6 @@ #ifdef TARGET_NR_swapcontext { TARGET_NR_swapcontext, "swapcontext" , NULL, NULL, NULL }, #endif -#ifdef TARGET_NR_swapoff -{ TARGET_NR_swapoff, "swapoff" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_swapon -{ TARGET_NR_swapon, "swapon" , NULL, NULL, NULL }, -#endif #ifdef TARGET_NR_syscall { TARGET_NR_syscall, "syscall" , NULL, NULL, NULL }, #endif --=20 2.17.1 From nobody Thu May 9 22:44:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1558301882; cv=none; d=zoho.com; s=zohoarc; b=YadyWsPtTnY9EnMQd122v5UJbHzxRF7hX780IfF4czlguWLheueXr4XRajYKLWFY2p55m++5n77qR7/dBJQoFVaN4x6IIAEBPdoUKkyIO6v4RnFUZ3m3OuBOq82isLEu2PNW0O3BkJxoDANmwU8OuQwrrJhQwBP1T07HKrrewCs= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1558301882; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=fHCmInnpNa2F4K91jX190NfL9NDB7tdazRZM5/cuyRM=; b=m4n52VZ5gvrW67ZhIJpkPAqGAYT77uwNALxRpGuN5/bMBx3568fqDdcxYDOlS3ERqntyLO4UjIOnC2rW7rXFfivB2/qJboFP2Hd8DwNnRZIuQ3RGlzkh+PlX7yGKMKtXlqG9E07VWPwnZJ3D31e7WWG5xUjyQfMtH0fHrU7ncrs= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1558301882743511.7958895848992; Sun, 19 May 2019 14:38:02 -0700 (PDT) Received: from localhost ([127.0.0.1]:54030 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSTUw-0003uJ-K8 for importer@patchew.org; Sun, 19 May 2019 17:37:38 -0400 Received: from eggs.gnu.org ([209.51.188.92]:51232) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSaC-00049G-Ch for qemu-devel@nongnu.org; Sun, 19 May 2019 16:39:01 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hSSaB-00058F-Cm for qemu-devel@nongnu.org; Sun, 19 May 2019 16:39:00 -0400 Received: from mail-pg1-x544.google.com ([2607:f8b0:4864:20::544]:38185) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hSSaB-00057F-6n for qemu-devel@nongnu.org; Sun, 19 May 2019 16:38:59 -0400 Received: by mail-pg1-x544.google.com with SMTP id j26so5741282pgl.5 for ; Sun, 19 May 2019 13:38:59 -0700 (PDT) Received: from localhost.localdomain (97-113-13-231.tukw.qwest.net. [97.113.13.231]) by smtp.gmail.com with ESMTPSA id i7sm11397448pfo.19.2019.05.19.13.38.56 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 19 May 2019 13:38:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=fHCmInnpNa2F4K91jX190NfL9NDB7tdazRZM5/cuyRM=; b=sTKWJdqst8ArJHRiRxt07TQwIJU6RCXBO228h/fitWQRQV+gAWRLw3XhJUQFXbt3OO EDh2ENMmYnXniUJJiSmTmPll/n5NHAa/GA+ZwCcsA/Ifhpx9W+f1AvCG9hz1NdUd+a1L e8GAFapdATIWLxV3+lUTI8X4WN2qs14xRnJ6TMxsbyd3UTQA3Xgb0nbHF8nIRhisImh8 kUZNpS2NOoctyHTVHXuSGff1miHNnutSWM/8yHMOdUdp7/nLJWNh2o3NtyJV7CppKxNL VaaBMCwSwAKiQvSXUkIw5gMtxYqRhTIxXLtFpHVd01+nbxWxYtWvUBspZwzGIB3olzKa oebw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=fHCmInnpNa2F4K91jX190NfL9NDB7tdazRZM5/cuyRM=; b=Kzj+cFPwwQpSoYfOpkveRmQiI3wY74CqcZWen0edC8JOnKqastfGT4o9Gq3qqw6MrF Y6IsEFDHq8G/WYkL3xNqa9vevOMNn+O2VHq726llD5HzjvITD+XKkVTlYQwkIhGO0Tt4 m8lw2j3OXcGHUtATJnbD/FoywHeivUQAKh7DnWBIo87VNvYbs617yqJqN9WilA0R0jRP BSmjhZvaO6xsoNOl2xyX7ll8e7dSkCnVjI5TnJ4O7md6L4/jTE2YVuzDEx+3pyYfvtqE cKMsAZiOs6HzfoXebKu9fQg7IMaFA7NVFsHiXKUF2kdm7j/3OKwbqtkdtQ2szStIlWRq 3Rrg== X-Gm-Message-State: APjAAAUHJFmcJ77GaHV6PqXhvjeZWRCuAo3pMQrJNtAYAXB0NwJ4uIDe QZmL0iWiEYDhkAc8AgH09P51LOX6bmQ= X-Google-Smtp-Source: APXvYqycOTSXjG/2xZDFv4fezhz+hvy3BagZ3hG0hURYReQZMB/M1Ip2x7f9rBA0WEryBgONjYfYOg== X-Received: by 2002:a65:52c3:: with SMTP id z3mr18674927pgp.56.1558298338013; Sun, 19 May 2019 13:38:58 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sun, 19 May 2019 13:37:24 -0700 Message-Id: <20190519203726.20729-73-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190519203726.20729-1-richard.henderson@linaro.org> References: <20190519203726.20729-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::544 Subject: [Qemu-devel] [PATCH v7 72/74] linux-user: Split out reboot X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: laurent@vivier.eu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Richard Henderson --- linux-user/syscall-defs.h | 1 + linux-user/syscall-proc.inc.c | 18 ++++++++++++++++++ linux-user/syscall.c | 13 ------------- linux-user/strace.list | 3 --- 4 files changed, 19 insertions(+), 16 deletions(-) diff --git a/linux-user/syscall-defs.h b/linux-user/syscall-defs.h index 34e799d206..67c908448d 100644 --- a/linux-user/syscall-defs.h +++ b/linux-user/syscall-defs.h @@ -188,6 +188,7 @@ SYSCALL_DEF(readlink, ARG_STR, ARG_PTR, ARG_DEC); #ifdef TARGET_NR_readlinkat SYSCALL_DEF(readlinkat, ARG_ATDIRFD, ARG_STR, ARG_PTR, ARG_DEC); #endif +SYSCALL_DEF(reboot, ARG_HEX, ARG_HEX, ARG_DEC, ARG_PTR); #ifdef TARGET_NR_rename SYSCALL_DEF(rename, ARG_STR, ARG_STR); #endif diff --git a/linux-user/syscall-proc.inc.c b/linux-user/syscall-proc.inc.c index bf9e278bf0..408e96a834 100644 --- a/linux-user/syscall-proc.inc.c +++ b/linux-user/syscall-proc.inc.c @@ -532,6 +532,24 @@ SYSCALL_IMPL(nice) } #endif =20 +SYSCALL_IMPL(reboot) +{ + abi_long ret; + + if (arg3 =3D=3D LINUX_REBOOT_CMD_RESTART2) { + /* arg4 must be ignored in all other cases */ + char *p =3D lock_user_string(arg4); + if (!p) { + return -TARGET_EFAULT; + } + ret =3D get_errno(reboot(arg1, arg2, arg3, p)); + unlock_user(p, arg4, 0); + } else { + ret =3D get_errno(reboot(arg1, arg2, arg3, NULL)); + } + return ret; +} + SYSCALL_IMPL(sethostname) { void *p =3D lock_user_string(arg1); diff --git a/linux-user/syscall.c b/linux-user/syscall.c index ead2e5c2b8..80e8b360a9 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -4158,19 +4158,6 @@ static abi_long do_syscall1(void *cpu_env, int num, = abi_long arg1, void *p; =20 switch(num) { - case TARGET_NR_reboot: - if (arg3 =3D=3D LINUX_REBOOT_CMD_RESTART2) { - /* arg4 must be ignored in all other cases */ - p =3D lock_user_string(arg4); - if (!p) { - return -TARGET_EFAULT; - } - ret =3D get_errno(reboot(arg1, arg2, arg3, p)); - unlock_user(p, arg4, 0); - } else { - ret =3D get_errno(reboot(arg1, arg2, arg3, NULL)); - } - return ret; #ifdef TARGET_NR_truncate case TARGET_NR_truncate: if (!(p =3D lock_user_string(arg1))) diff --git a/linux-user/strace.list b/linux-user/strace.list index 3d2e398439..3326541f17 100644 --- a/linux-user/strace.list +++ b/linux-user/strace.list @@ -866,9 +866,6 @@ #ifdef TARGET_NR_readdir { TARGET_NR_readdir, "readdir" , NULL, NULL, NULL }, #endif -#ifdef TARGET_NR_reboot -{ TARGET_NR_reboot, "reboot" , NULL, NULL, NULL }, -#endif #ifdef TARGET_NR_recv { TARGET_NR_recv, "recv" , NULL, NULL, NULL }, #endif --=20 2.17.1 From nobody Thu May 9 22:44:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1558301546; cv=none; d=zoho.com; s=zohoarc; b=DGBHIrLHZunhGJyr1SB3J9Dh4D3ebzmu13dRa43EA0Z0Bu4Vh/wbk3yh97tS6GYBMCOahBiycvrWHcPMr08lSTr8fk3nLQ35ynlabyXFRvtQ4+/ELxV9nn+/9yckKm6HSVhxpErX/EhFHfV1QcetoiQWvajKwB4saTbrC1sn3Ug= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1558301546; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=81B5oVWex5Gu+YUrZz7czpuJcnBNioLb7beqWXgK+Ug=; b=Q6TLfXZ/78Oy6CUSi1cHyysuH5JowC5lYXhiwVYMwNaJPHeQz5lb4ykrAqI3rA/dc/X7TYTA6R4tPr2mDLT7cLtPZyGecdB45BjvnThsHTgONCQKqzTBEC1naTSXVcoYqoeDd450G23DZFnGnO94PjLiH8snKS2/xvN2I4siW6g= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1558301546806313.74019418835815; Sun, 19 May 2019 14:32:26 -0700 (PDT) Received: from localhost ([127.0.0.1]:53941 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSTPk-0008Qj-Lu for importer@patchew.org; Sun, 19 May 2019 17:32:16 -0400 Received: from eggs.gnu.org ([209.51.188.92]:51248) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSaD-0004Ab-Sd for qemu-devel@nongnu.org; Sun, 19 May 2019 16:39:03 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hSSaC-00059o-L2 for qemu-devel@nongnu.org; Sun, 19 May 2019 16:39:01 -0400 Received: from mail-pg1-x544.google.com ([2607:f8b0:4864:20::544]:34659) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hSSaC-00058x-EW for qemu-devel@nongnu.org; Sun, 19 May 2019 16:39:00 -0400 Received: by mail-pg1-x544.google.com with SMTP id c13so5748377pgt.1 for ; Sun, 19 May 2019 13:39:00 -0700 (PDT) Received: from localhost.localdomain (97-113-13-231.tukw.qwest.net. [97.113.13.231]) by smtp.gmail.com with ESMTPSA id i7sm11397448pfo.19.2019.05.19.13.38.58 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 19 May 2019 13:38:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=81B5oVWex5Gu+YUrZz7czpuJcnBNioLb7beqWXgK+Ug=; b=MW276PEeOF33ylNFozQxdOOz4TXNh6y0F6sLo8pPFZpkVOf33zi0mx3NAOsdQbdU3+ 7uho8rBFL2KXgpj5fqeWy7CVguXwrPipVelVHIcoKAg+4WL/hjTuDwIBvjKTZ4Q0+ZKX vNYAiXFY+DOKMHCHwESEySq3ZdqaICyfZBhy29W/aa1xUQAV9wpw40srFj2paVYrZf7/ y7x9Cs5PBJtN9MBzlbeWV8qJTcu1j0IMXl2wR5qtS4oc7CNPOnRnOD3muDf2RL/3+TvB 8WkIrnTB1Lx5zaf9Wlljd9AmFWYrw5Pdn6H4RGZd47sn6T2dJDDApZyveZUlYBIrmduo 73Cw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=81B5oVWex5Gu+YUrZz7czpuJcnBNioLb7beqWXgK+Ug=; b=Eud5Ar/3PYTi++pMudBeCJnx3ZVyE4BCun9M4vo5E8HhOtKiiJ168IyC5bnHSGOK3a c5mLU6R2IdOpWli2L1kNghnCE1YiGqSZhw+K4/9+kfsN6Et+bRPpzfAvLcS6MWoCra1R QBTZgquNws2PmjoOqNicb/kLqNEAmm+ABlkmoC4VqM2PfKNxo8KBKqo5ZJM0vOzAXFJ5 T3nrBmbDpV6dvfNIuIiXYmeAf7pmO20+bL5eW3jFCOq+gXIUAtNkThsob3bDgDNmGjfP QARoQ758KciYx1DbhaWDXTocpo1FB9uPpVvfoedgZFDpluEgcYTzlwiNFeyGeEUOwdUC oW8w== X-Gm-Message-State: APjAAAVQozMJ5yO9qMG7VrExIoKOgszP4SM3GYH9wdMlZB3/XD7qvTWY Xh3qbrHpagXmZ6c1Cpnd1gVpUH8xr+E= X-Google-Smtp-Source: APXvYqxzxnOih+PS0wJcjWM1nHFueQiUhsKcRChRuuaorbMD3oMf4t+3zDc1Msz1qPIJ8+kxuRYyxA== X-Received: by 2002:a63:374b:: with SMTP id g11mr15575741pgn.421.1558298339261; Sun, 19 May 2019 13:38:59 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sun, 19 May 2019 13:37:25 -0700 Message-Id: <20190519203726.20729-74-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190519203726.20729-1-richard.henderson@linaro.org> References: <20190519203726.20729-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::544 Subject: [Qemu-devel] [PATCH v7 73/74] linux-user: Split out truncate, truncate64, ftruncate, ftruncate64 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: laurent@vivier.eu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Richard Henderson --- linux-user/syscall-defs.h | 16 +++++++++++++++ linux-user/syscall-file.inc.c | 32 +++++++++++++++++++++++++++++ linux-user/syscall.c | 38 ----------------------------------- linux-user/strace.list | 12 ----------- 4 files changed, 48 insertions(+), 50 deletions(-) diff --git a/linux-user/syscall-defs.h b/linux-user/syscall-defs.h index 67c908448d..8b2d95d19e 100644 --- a/linux-user/syscall-defs.h +++ b/linux-user/syscall-defs.h @@ -59,6 +59,14 @@ SYSCALL_DEF(futimesat, ARG_ATDIRFD, ARG_STR, ARG_PTR); #ifdef TARGET_NR_fork SYSCALL_DEF(fork); #endif +#ifdef TARGET_NR_ftruncate +SYSCALL_DEF(ftruncate, ARG_DEC, ARG_DEC); +#endif +#ifdef TARGET_NR_ftruncate64 +SYSCALL_DEF_FULL(ftruncate64, .impl =3D impl_ftruncate, + .args =3D args_ftruncate64_truncate64, + .arg_type =3D { ARG_DEC, ARG_DEC64 }); +#endif #ifdef TARGET_NR_gethostname SYSCALL_DEF(gethostname, ARG_PTR, ARG_DEC); #endif @@ -292,6 +300,14 @@ SYSCALL_DEF(syncfs, ARG_DEC); SYSCALL_DEF(time, ARG_PTR); #endif SYSCALL_DEF(times, ARG_PTR); +#ifdef TARGET_NR_truncate +SYSCALL_DEF(truncate, ARG_STR, ARG_DEC); +#endif +#ifdef TARGET_NR_truncate64 +SYSCALL_DEF_FULL(truncate64, .impl =3D impl_truncate, + .args =3D args_ftruncate64_truncate64, + .arg_type =3D { ARG_STR, ARG_DEC64 }); +#endif SYSCALL_DEF(umask, ARG_OCT); #ifdef TARGET_NR_umount SYSCALL_DEF(umount, ARG_STR); diff --git a/linux-user/syscall-file.inc.c b/linux-user/syscall-file.inc.c index bdf42ad437..7697cb304a 100644 --- a/linux-user/syscall-file.inc.c +++ b/linux-user/syscall-file.inc.c @@ -182,6 +182,25 @@ SYSCALL_IMPL(fchmodat) return do_fchmodat(arg1, arg2, arg3); } =20 +#ifdef TARGET_NR_ftruncate64 +# if TARGET_ABI_BITS =3D=3D 32 +SYSCALL_ARGS(ftruncate64_truncate64) +{ + /* We have already assigned out[0]. */ + int off =3D regpairs_aligned(cpu_env, TARGET_NR_ftruncate64); + out[1] =3D target_offset64(in[1 + off], in[2 + off]); + return def; +} +# else +# define args_ftruncate64_truncate64 NULL +# endif +#endif + +SYSCALL_IMPL(ftruncate) +{ + return get_errno(ftruncate(arg1, arg2)); +} + #ifdef TARGET_NR_futimesat SYSCALL_IMPL(futimesat) { @@ -1319,6 +1338,19 @@ SYSCALL_IMPL(syncfs) return get_errno(syncfs(arg1)); } =20 +SYSCALL_IMPL(truncate) +{ + char *p =3D lock_user_string(arg1); + abi_long ret; + + if (!p) { + return -TARGET_EFAULT; + } + ret =3D get_errno(truncate(p, arg2)); + unlock_user(p, arg1, 0); + return ret; +} + static abi_long do_umount2(abi_ulong target_path, int flags) { char *p =3D lock_user_string(target_path); diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 80e8b360a9..1b1d44bf32 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -3721,20 +3721,6 @@ static inline abi_long target_truncate64(void *cpu_e= nv, const char *arg1, } #endif =20 -#ifdef TARGET_NR_ftruncate64 -static inline abi_long target_ftruncate64(void *cpu_env, abi_long arg1, - abi_long arg2, - abi_long arg3, - abi_long arg4) -{ - if (regpairs_aligned(cpu_env, TARGET_NR_ftruncate64)) { - arg2 =3D arg3; - arg3 =3D arg4; - } - return get_errno(ftruncate64(arg1, target_offset64(arg2, arg3))); -} -#endif - static inline abi_long target_to_host_timespec(struct timespec *host_ts, abi_ulong target_addr) { @@ -4158,18 +4144,6 @@ static abi_long do_syscall1(void *cpu_env, int num, = abi_long arg1, void *p; =20 switch(num) { -#ifdef TARGET_NR_truncate - case TARGET_NR_truncate: - if (!(p =3D lock_user_string(arg1))) - return -TARGET_EFAULT; - ret =3D get_errno(truncate(p, arg2)); - unlock_user(p, arg1, 0); - return ret; -#endif -#ifdef TARGET_NR_ftruncate - case TARGET_NR_ftruncate: - return get_errno(ftruncate(arg1, arg2)); -#endif case TARGET_NR_getpriority: /* Note that negative values are valid for getpriority, so we must differentiate based on errno settings. */ @@ -5371,18 +5345,6 @@ static abi_long do_syscall1(void *cpu_env, int num, = abi_long arg1, return ret; } #endif -#ifdef TARGET_NR_truncate64 - case TARGET_NR_truncate64: - if (!(p =3D lock_user_string(arg1))) - return -TARGET_EFAULT; - ret =3D target_truncate64(cpu_env, p, arg2, arg3, arg4); - unlock_user(p, arg1, 0); - return ret; -#endif -#ifdef TARGET_NR_ftruncate64 - case TARGET_NR_ftruncate64: - return target_ftruncate64(cpu_env, arg1, arg2, arg3, arg4); -#endif #ifdef TARGET_NR_stat64 case TARGET_NR_stat64: if (!(p =3D lock_user_string(arg1))) { diff --git a/linux-user/strace.list b/linux-user/strace.list index 3326541f17..55b617239c 100644 --- a/linux-user/strace.list +++ b/linux-user/strace.list @@ -193,12 +193,6 @@ #ifdef TARGET_NR_ftime { TARGET_NR_ftime, "ftime" , NULL, NULL, NULL }, #endif -#ifdef TARGET_NR_ftruncate -{ TARGET_NR_ftruncate, "ftruncate" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_ftruncate64 -{ TARGET_NR_ftruncate64, "ftruncate64" , NULL, NULL, NULL }, -#endif #ifdef TARGET_NR_futex { TARGET_NR_futex, "futex" , NULL, print_futex, NULL }, #endif @@ -1173,12 +1167,6 @@ #ifdef TARGET_NR_tkill { TARGET_NR_tkill, "tkill" , NULL, print_tkill, NULL }, #endif -#ifdef TARGET_NR_truncate -{ TARGET_NR_truncate, "truncate" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_truncate64 -{ TARGET_NR_truncate64, "truncate64" , NULL, NULL, NULL }, -#endif #ifdef TARGET_NR_tuxcall { TARGET_NR_tuxcall, "tuxcall" , NULL, NULL, NULL }, #endif --=20 2.17.1 From nobody Thu May 9 22:44:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1558301945; cv=none; d=zoho.com; s=zohoarc; b=KN5tnODhcb072MOU9xOit4vbOZ2uglxSGkAwuRL+WzUkmrtx1FK7Wgo7q7LOuHJDR4HQE9855CVI4t84hS2TO95/DN4oHRoQxRY7p/czVXEQk1Zi762Zd2FQcO11JQ8eJOoIrkysG9s4X9roebPDnW6IcwubCdeFlQNCXqtpQk8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1558301945; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=EjoYPrl44jrQeXa6UK02T5QS4VIgYMGR1w3phRnmDY0=; b=T/I0wlVExBIjKF18RUHC2kc0PUd68B8+uNsdLhKTJXxJDf9L+uGtXMTE8OgWphHzWKTYm+bwZGD59HQRpk1pgUJxslvTXMK0PaaRjxKLZotwRFLazpdlnhYf9z2Z6AXG4yzAZPWYUkn94OqtJQP8XVSpG3Vv2td/MluYaGjvlOQ= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1558301945939937.8668717644482; Sun, 19 May 2019 14:39:05 -0700 (PDT) Received: from localhost ([127.0.0.1]:54054 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSTWE-0004g2-TA for importer@patchew.org; Sun, 19 May 2019 17:38:58 -0400 Received: from eggs.gnu.org ([209.51.188.92]:51267) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hSSaE-0004BD-Q1 for qemu-devel@nongnu.org; Sun, 19 May 2019 16:39:03 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hSSaD-0005Av-Ld for qemu-devel@nongnu.org; Sun, 19 May 2019 16:39:02 -0400 Received: from mail-pg1-x541.google.com ([2607:f8b0:4864:20::541]:38183) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hSSaD-0005AS-FZ for qemu-devel@nongnu.org; Sun, 19 May 2019 16:39:01 -0400 Received: by mail-pg1-x541.google.com with SMTP id j26so5741300pgl.5 for ; Sun, 19 May 2019 13:39:01 -0700 (PDT) Received: from localhost.localdomain (97-113-13-231.tukw.qwest.net. [97.113.13.231]) by smtp.gmail.com with ESMTPSA id i7sm11397448pfo.19.2019.05.19.13.38.59 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 19 May 2019 13:38:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=EjoYPrl44jrQeXa6UK02T5QS4VIgYMGR1w3phRnmDY0=; b=z5F6WQF52rpJo3PQhy2+twbWWJQFDoZoEePUHYzj82TmKnjvzvY5uXYPkFCbsuEr07 HjfI5nNwOrnbdyELuTn3C59hgaV9BZtN8XtBmp3vzq7XPBwCr6KO1we6KNf2gBww9wmZ yUcFH6KgkzN+qhIt1Rvz13Ese9e4L0Ai/1SJUamSkRzYOqxG1xE300HxH6VNdAkgVbRX sTpU8GlNq/J9/Rk3Ns2+kby1AiO5Z4kTvnCdEK3gp0zMRwAwL2owtrXZ658Nbu1XfIpv zcsdgoDBh4yiXc5PBn9S5KIw+l9ff/y0hXOUHOwPdRTESnx0V8ckvrtLspf1lxNcfoVx K/IQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=EjoYPrl44jrQeXa6UK02T5QS4VIgYMGR1w3phRnmDY0=; b=dI4xfd8Nx1rSEjdAP8pklXWylPlaHXnsfu5GDc01SEd/4wtWaQkLPZpeBHgoJbWqf4 HRSC7M7SNtYgNuSL7pynjYhApB5v+d6uufXUST9GEuRELv4GnmiSTN9Nb3tFVq5R65Dv WNQcGYvZYB5eO9yJgVBTQWkCgjIq/O7W484l8mH3FIBoVqfq5V9uW9I0HPOkYUN2VmOz qQimN/b6pUkqoa4ZR/1FJeP7bUn1uXOYA19XoIWA4nwU9ml0B+nfwzDJLEfLw0BE7cW3 YTS7qWIG5WnFBYwuorbyKNXMw5Wey5imz0YII8vltfemWI2Fs2wDEhU+FsB/4W0A2bAz WZXw== X-Gm-Message-State: APjAAAUPoSg01a3b1HhA1AB5qfM3ZWqZ6/ujOrmEuoc5lNZGSYzCTEsG VKwINVxMRsJx06E+jiHm43YZFrHfrxI= X-Google-Smtp-Source: APXvYqxpaTq8MLBN20Ug41nodAifBY6Mtb/Bmf/aU78dCh9S603k9xkI9NaLkjyBWkRv8Y1qe3sC1g== X-Received: by 2002:a65:5c89:: with SMTP id a9mr71876407pgt.334.1558298340290; Sun, 19 May 2019 13:39:00 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sun, 19 May 2019 13:37:26 -0700 Message-Id: <20190519203726.20729-75-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190519203726.20729-1-richard.henderson@linaro.org> References: <20190519203726.20729-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::541 Subject: [Qemu-devel] [PATCH v7 74/74] linux-user: Split out getpriority, setpriority X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: laurent@vivier.eu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Richard Henderson --- linux-user/syscall-defs.h | 2 ++ linux-user/syscall-proc.inc.c | 28 ++++++++++++++++++++++++++++ linux-user/syscall.c | 18 ------------------ linux-user/strace.list | 6 ------ 4 files changed, 30 insertions(+), 24 deletions(-) diff --git a/linux-user/syscall-defs.h b/linux-user/syscall-defs.h index 8b2d95d19e..3b45250977 100644 --- a/linux-user/syscall-defs.h +++ b/linux-user/syscall-defs.h @@ -80,6 +80,7 @@ SYSCALL_DEF(getpid); #ifdef TARGET_NR_getppid SYSCALL_DEF(getppid); #endif +SYSCALL_DEF(getpriority, ARG_DEC, ARG_DEC); #ifdef TARGET_NR_getrlimit SYSCALL_DEF(getrlimit, ARG_DEC, ARG_PTR); #endif @@ -238,6 +239,7 @@ SYSCALL_DEF(semget, ARG_DEC, ARG_DEC, ARG_HEX); #endif SYSCALL_DEF(sethostname, ARG_STR); SYSCALL_DEF(setpgid, ARG_DEC, ARG_DEC); +SYSCALL_DEF(setpriority, ARG_DEC, ARG_DEC, ARG_DEC); #ifdef TARGET_NR_setrlimit SYSCALL_DEF(setrlimit, ARG_DEC, ARG_PTR); #endif diff --git a/linux-user/syscall-proc.inc.c b/linux-user/syscall-proc.inc.c index 408e96a834..e85151cc2e 100644 --- a/linux-user/syscall-proc.inc.c +++ b/linux-user/syscall-proc.inc.c @@ -479,6 +479,29 @@ SYSCALL_IMPL(getppid) } #endif =20 +SYSCALL_IMPL(getpriority) +{ + abi_long ret; + + /* + * Note that negative values are valid for getpriority, so we must + * differentiate based on errno settings. + */ + errno =3D 0; + ret =3D getpriority(arg1, arg2); + if (ret =3D=3D -1 && errno !=3D 0) { + return -host_to_target_errno(errno); + } +#ifdef TARGET_ALPHA + /* Return value is the unbiased priority. Signal no error. */ + ((CPUAlphaState *)cpu_env)->ir[IR_V0] =3D 0; +#else + /* Return value is a biased priority to avoid negative numbers. */ + ret =3D 20 - ret; +#endif + return ret; +} + #ifdef TARGET_NR_getrlimit SYSCALL_IMPL(getrlimit) { @@ -568,6 +591,11 @@ SYSCALL_IMPL(setpgid) return get_errno(setpgid(arg1, arg2)); } =20 +SYSCALL_IMPL(setpriority) +{ + return get_errno(setpriority(arg1, arg2, arg3)); +} + #ifdef TARGET_NR_setrlimit SYSCALL_IMPL(setrlimit) { diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 1b1d44bf32..6e7cccbdd5 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -4144,24 +4144,6 @@ static abi_long do_syscall1(void *cpu_env, int num, = abi_long arg1, void *p; =20 switch(num) { - case TARGET_NR_getpriority: - /* Note that negative values are valid for getpriority, so we must - differentiate based on errno settings. */ - errno =3D 0; - ret =3D getpriority(arg1, arg2); - if (ret =3D=3D -1 && errno !=3D 0) { - return -host_to_target_errno(errno); - } -#ifdef TARGET_ALPHA - /* Return value is the unbiased priority. Signal no error. */ - ((CPUAlphaState *)cpu_env)->ir[IR_V0] =3D 0; -#else - /* Return value is a biased priority to avoid negative numbers. */ - ret =3D 20 - ret; -#endif - return ret; - case TARGET_NR_setpriority: - return get_errno(setpriority(arg1, arg2, arg3)); #ifdef TARGET_NR_statfs case TARGET_NR_statfs: if (!(p =3D lock_user_string(arg1))) { diff --git a/linux-user/strace.list b/linux-user/strace.list index 55b617239c..a0d2b3f9c5 100644 --- a/linux-user/strace.list +++ b/linux-user/strace.list @@ -256,9 +256,6 @@ #ifdef TARGET_NR_getpmsg { TARGET_NR_getpmsg, "getpmsg" , NULL, NULL, NULL }, #endif -#ifdef TARGET_NR_getpriority -{ TARGET_NR_getpriority, "getpriority", "%s(%#x,%#x)", NULL, NULL }, -#endif #ifdef TARGET_NR_getrandom { TARGET_NR_getrandom, "getrandom", NULL, NULL, NULL }, #endif @@ -1007,9 +1004,6 @@ #ifdef TARGET_NR_setpgrp { TARGET_NR_setpgrp, "setpgrp" , NULL, NULL, NULL }, #endif -#ifdef TARGET_NR_setpriority -{ TARGET_NR_setpriority, "setpriority" , NULL, NULL, NULL }, -#endif #ifdef TARGET_NR_setregid { TARGET_NR_setregid, "setregid" , NULL, NULL, NULL }, #endif --=20 2.17.1