From patchwork Mon Aug 29 18:38:49 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Aleksandar Markovic X-Patchwork-Id: 9304331 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 082966077C for ; Mon, 29 Aug 2016 18:42:51 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id EE2BE288E3 for ; Mon, 29 Aug 2016 18:42:50 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id E2D1C28964; Mon, 29 Aug 2016 18:42:50 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.9 required=2.0 tests=BAYES_00,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 66E86288E3 for ; Mon, 29 Aug 2016 18:42:50 +0000 (UTC) Received: from localhost ([::1]:45198 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1beRWD-0006Oj-Ly for patchwork-qemu-devel@patchwork.kernel.org; Mon, 29 Aug 2016 14:42:49 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:34630) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1beRTC-0004XJ-Hx for qemu-devel@nongnu.org; Mon, 29 Aug 2016 14:39:45 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1beRT3-0000aj-Tt for qemu-devel@nongnu.org; Mon, 29 Aug 2016 14:39:41 -0400 Received: from mx2.rt-rk.com ([89.216.37.149]:37155 helo=mail.rt-rk.com) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1beRT3-0000Rv-Gj for qemu-devel@nongnu.org; Mon, 29 Aug 2016 14:39:33 -0400 Received: from localhost (localhost [127.0.0.1]) by mail.rt-rk.com (Postfix) with ESMTP id 58B3D1A4148; Mon, 29 Aug 2016 20:39:09 +0200 (CEST) X-Virus-Scanned: amavisd-new at rt-rk.com Received: from mcs19.ba.imgtec.org (unknown [82.117.201.26]) by mail.rt-rk.com (Postfix) with ESMTPSA id 3DC4F1A23A8; Mon, 29 Aug 2016 20:39:09 +0200 (CEST) From: Aleksandar Markovic To: riku.voipio@iki.fi Date: Mon, 29 Aug 2016 20:38:49 +0200 Message-Id: <1472495930-15155-3-git-send-email-aleksandar.markovic@rt-rk.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1472495930-15155-1-git-send-email-aleksandar.markovic@rt-rk.com> References: <1472495930-15155-1-git-send-email-aleksandar.markovic@rt-rk.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 89.216.37.149 Subject: [Qemu-devel] [PATCH 2/3] linux-user: Add support for sysfs() syscall 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: miodrag.dinic@imgtec.com, aleksandar.markovic@imgtec.com, aleksandar.rikalo@imgtec.com, qemu-devel@nongnu.org, petar.jovanovic@imgtec.com Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" X-Virus-Scanned: ClamAV using ClamSMTP From: Aleksandar Markovic This patch implements Qemu user mode sysfs() syscall support. Syscall sysfs() involves returning information about the filesystem types currently present in the kernel, and can operate in three distinct flavors, depending on its first argument. The implementation is based on invocation of host's sysfs(), and its key part is in the correspondent case segment of the main switch statement of the function do_syscall(), in file linux-user/syscalls.c. All necessary conversions of data structures from target to host and from host to target are covered. Based on the value of the first argument, three cases are distinguished, and such conversions are implemented separately for each case. Relevant support for "-strace" option is included in files linux-user/strace.c and linux-user/strace.list. This patch also fixes failures of LTP tests sysfs01, sysfs02, sysfs03, sysfs04, sysfs05, and sysfs06, if executed in Qemu user mode. Signed-off-by: Aleksandar Markovic --- linux-user/strace.c | 25 +++++++++++++++++++++++++ linux-user/strace.list | 2 +- linux-user/syscall.c | 42 +++++++++++++++++++++++++++++++++++++++++- 3 files changed, 67 insertions(+), 2 deletions(-) diff --git a/linux-user/strace.c b/linux-user/strace.c index 7ddcaf8..a52ff58 100644 --- a/linux-user/strace.c +++ b/linux-user/strace.c @@ -2138,6 +2138,31 @@ print_kill(const struct syscallname *name, } #endif +#if defined(TARGET_NR_sysfs) +static void +print_sysfs(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); + switch (arg0) { + case 1: + print_raw_param("%d", arg0, 1); + print_string(arg1, 1); + break; + case 2: + print_raw_param("%d", arg0, 0); + print_raw_param("%u", arg1, 0); + print_pointer(arg2, 1); + break; + default: + print_raw_param("%d", arg0, 1); + break; + } + print_syscall_epilogue(name); +} +#endif + /* * An array of all of the syscalls we know about */ diff --git a/linux-user/strace.list b/linux-user/strace.list index 9a665a8..e8133b0 100644 --- a/linux-user/strace.list +++ b/linux-user/strace.list @@ -1368,7 +1368,7 @@ { TARGET_NR_sys_epoll_wait, "sys_epoll_wait" , NULL, NULL, NULL }, #endif #ifdef TARGET_NR_sysfs -{ TARGET_NR_sysfs, "sysfs" , NULL, NULL, NULL }, +{ TARGET_NR_sysfs, "sysfs" , NULL, print_sysfs, NULL }, #endif #ifdef TARGET_NR_sysinfo { TARGET_NR_sysinfo, "sysinfo" , NULL, NULL, NULL }, diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 2190d41..3234f9c 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -9528,7 +9528,47 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, #endif #ifdef TARGET_NR_sysfs case TARGET_NR_sysfs: - goto unimplemented; + switch (arg1) { + case 1: + { + if (arg2 != 0) { + p = lock_user_string(arg2); + if (!p) { + goto efault; + } + ret = get_errno(syscall(__NR_sysfs, arg1, p)); + unlock_user(p, arg2, 0); + } else { + ret = get_errno(syscall(__NR_sysfs, arg1, NULL)); + } + } + break; + case 2: + { + if (arg3 != 0) { + char buf[PATH_MAX]; + int len; + memset(buf, 0, PATH_MAX); + ret = get_errno(syscall(__NR_sysfs, arg1, arg2, buf)); + len = PATH_MAX; + if (len > strlen(buf)) { + len = strlen(buf); + } + if (copy_to_user(arg3, buf, len) != 0) { + goto efault; + } + } else { + ret = get_errno(syscall(__NR_sysfs, arg1, arg2, NULL)); + } + } + break; + case 3: + ret = get_errno(syscall(__NR_sysfs, arg1)); + break; + default: + ret = -EINVAL; + } + break; #endif case TARGET_NR_personality: ret = get_errno(personality(arg1));