From patchwork Mon Jul 28 12:02:46 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mikhail Ilin X-Patchwork-Id: 374162 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 1424A140114 for ; Mon, 28 Jul 2014 22:03:28 +1000 (EST) Received: from localhost ([::1]:39367 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XBjeI-000433-1g for incoming@patchwork.ozlabs.org; Mon, 28 Jul 2014 08:03:26 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:43916) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XBjdq-0003b4-8y for qemu-devel@nongnu.org; Mon, 28 Jul 2014 08:03:04 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1XBjdk-0005mC-IZ for qemu-devel@nongnu.org; Mon, 28 Jul 2014 08:02:58 -0400 Received: from mailout4.w1.samsung.com ([210.118.77.14]:64228) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XBjdk-0005ly-AG for qemu-devel@nongnu.org; Mon, 28 Jul 2014 08:02:52 -0400 Received: from eucpsbgm1.samsung.com (unknown [203.254.199.244]) by mailout4.w1.samsung.com (Oracle Communications Messaging Server 7u4-24.01(7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0N9F00MXH84DCN60@mailout4.w1.samsung.com> for qemu-devel@nongnu.org; Mon, 28 Jul 2014 13:02:37 +0100 (BST) X-AuditID: cbfec7f4-b7f156d0000063c7-9b-53d63be7300a Received: from eusync3.samsung.com ( [203.254.199.213]) by eucpsbgm1.samsung.com (EUCPMTA) with SMTP id CF.34.25543.7EB36D35; Mon, 28 Jul 2014 13:02:47 +0100 (BST) Received: from [106.109.9.224] by eusync3.samsung.com (Oracle Communications Messaging Server 7u4-23.01(7.0.4.23.0) 64bit (built Aug 10 2011)) with ESMTPA id <0N9F00IDZ84MV090@eusync3.samsung.com>; Mon, 28 Jul 2014 13:02:47 +0100 (BST) Message-id: <53D63BE6.4090806@samsung.com> Date: Mon, 28 Jul 2014 16:02:46 +0400 From: Mikhail Ilin User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.0 MIME-version: 1.0 To: qemu-devel@nongnu.org Content-type: text/plain; charset=utf-8; format=flowed Content-transfer-encoding: 7bit X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrFLMWRmVeSWpSXmKPExsVy+t/xq7rPra8FGxz8yGTRvKnYYs7DZ6wW s8/OZrf4/+sVq8X+bf9YLY737mCxOLnhEpsDu8f/g5OYPaZePMLocfjrQhaPJ9c2M3m833eV zWPz6eoAtigum5TUnMyy1CJ9uwSujINbN7IU/JStOHbmNnMD4z3RLkZODgkBE4ltm/cyQthi EhfurWfrYuTiEBJYyihx+9BDZgjnI6PE60PzWECqeAW0JM7MfMAKYrMIqEo07tjDBmKzCahL rNl/GGySqECYxLNfB5kg6gUlfky+B9YrIiAp8bvrNDOIzSxQI3HwxER2EFtYwFniS/8UNoi4 mcSXl4dZIWx5ic1r3jJPYOSbhWTULCRls5CULWBkXsUomlqaXFCclJ5rqFecmFtcmpeul5yf u4kREr5fdjAuPmZ1iFGAg1GJhzfi5pVgIdbEsuLK3EOMEhzMSiK8U/WvBQvxpiRWVqUW5ccX leakFh9iZOLglGpgTOd+ydmuarqtuXzKt/WftXqNhI2vaPw8p/VAYOEXzuVWoff/Pf+hYfxp ap1rrLti1bawpEmPpgmdfnDt0cRZC9M+ac6ftv+Mj6OIPkM72/p5ckELPSZV2r2/nGhWVJDJ He+pUDQ//6bd3seHvKTV3vC09fpusvDe1KHsmHVD1KW/aMVXZmtjJZbijERDLeai4kQABeJ0 Oj0CAAA= X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 210.118.77.14 Cc: mst@redhat.com, hutao@cn.fujitsu.com, riku.voipio@iki.fi, anthony@codemonkey.ws, pbonzini@redhat.com, afaerber@suse.de Subject: [Qemu-devel] [PATCH] /proc/self/maps content is not correct for a guest X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Hi, As it was posted earlier the output of reading /proc/self/maps is not correct for a guest. There are some issues: https://bugs.launchpad.net/qemu/+bug/1346784 http://lists.nongnu.org/archive/html/qemu-devel/2014-07/msg03085.html http://lists.nongnu.org/archive/html/qemu-devel/2014-07/msg02793.html The patch proposes: build /proc/self/maps doing a match against guest memory translation table and output only that map records which are valid for guest memory layout. Patches in mentioned threads are not relevant and are covered by the current patch. We did some local tests for i386, x86_64 and arm targets. The approach seems correct. From 8479d3dd00194975d7016eeecba13ddf453e9647 Mon Sep 17 00:00:00 2001 From: Mikhail Ilyin Date: Mon, 28 Jul 2014 15:40:31 +0400 Subject: [PATCH] Build /proc/self/maps doing a match against guest memory translation table. Output only that map records which are valid for guest memory layout. Signed-off-by: Mikhail Ilyin --- include/exec/cpu-all.h | 2 ++ linux-user/syscall.c | 25 ++++++++++--------------- 2 files changed, 12 insertions(+), 15 deletions(-) size_t len = 0; @@ -5118,13 +5116,18 @@ static int open_self_maps(void *cpu_env, int fd) if ((fields < 10) || (fields > 11)) { continue; } - if (!strncmp(path, "[stack]", 7)) { - continue; - } - if (h2g_valid(min) && h2g_valid(max)) { + if (h2g_valid(min)) { + int flags = page_get_flags(h2g(min)); + max = h2g_valid(max - 1) ? max : (uint64_t)g2h(GUEST_ADDR_MAX); + if (page_check_range(h2g(min), max - min, flags) == -1) { + continue; + } + if (h2g(min) == ts->info->stack_limit) { + pstrcpy(path, sizeof(path), " [stack]"); + } dprintf(fd, TARGET_ABI_FMT_lx "-" TARGET_ABI_FMT_lx " %c%c%c%c %08" PRIx64 " %02x:%02x %d %s%s\n", - h2g(min), h2g(max), flag_r, flag_w, + h2g(min), h2g(max - 1) + 1, flag_r, flag_w, flag_x, flag_p, offset, dev_maj, dev_min, inode, path[0] ? " " : "", path); } @@ -5133,14 +5136,6 @@ static int open_self_maps(void *cpu_env, int fd) free(line); fclose(fp); -#if defined(TARGET_ARM) || defined(TARGET_M68K) || defined(TARGET_UNICORE32) - dprintf(fd, "%08llx-%08llx rw-p %08llx 00:00 0 [stack]\n", - (unsigned long long)ts->info->stack_limit, - (unsigned long long)(ts->info->start_stack + - (TARGET_PAGE_SIZE - 1)) & TARGET_PAGE_MASK, - (unsigned long long)0); -#endif - return 0; } diff --git a/include/exec/cpu-all.h b/include/exec/cpu-all.h index f91581f..f9d132f 100644 --- a/include/exec/cpu-all.h +++ b/include/exec/cpu-all.h @@ -198,6 +198,8 @@ extern unsigned long reserved_va; #define RESERVED_VA 0ul #endif +#define GUEST_ADDR_MAX (RESERVED_VA ? RESERVED_VA : \ + (1ul << TARGET_VIRT_ADDR_SPACE_BITS) - 1) #endif /* page related stuff */ diff --git a/linux-user/syscall.c b/linux-user/syscall.c index a50229d..189a8c0 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -5092,10 +5092,8 @@ static int open_self_cmdline(void *cpu_env, int fd) static int open_self_maps(void *cpu_env, int fd) { -#if defined(TARGET_ARM) || defined(TARGET_M68K) || defined(TARGET_UNICORE32) CPUState *cpu = ENV_GET_CPU((CPUArchState *)cpu_env); TaskState *ts = cpu->opaque; -#endif FILE *fp; char *line = NULL;