All of lore.kernel.org
 help / color / mirror / Atom feed
From: Mikhail Ilin <m.ilin@samsung.com>
To: qemu-devel@nongnu.org
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
Date: Mon, 28 Jul 2014 16:02:46 +0400	[thread overview]
Message-ID: <53D63BE6.4090806@samsung.com> (raw)

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 <m.ilin@samsung.com>
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 <m.ilin@samsung.com>
---
  include/exec/cpu-all.h |  2 ++
  linux-user/syscall.c   | 25 ++++++++++---------------
  2 files changed, 12 insertions(+), 15 deletions(-)

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;
      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;
  }

-- 
1.9.1

             reply	other threads:[~2014-07-28 12:03 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-07-28 12:02 Mikhail Ilin [this message]
2014-08-05  5:27 ` [Qemu-devel] [PATCH] /proc/self/maps content is not correct for a guest Mikhail Ilin
2014-08-05  7:06   ` Riku Voipio

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=53D63BE6.4090806@samsung.com \
    --to=m.ilin@samsung.com \
    --cc=afaerber@suse.de \
    --cc=anthony@codemonkey.ws \
    --cc=hutao@cn.fujitsu.com \
    --cc=mst@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=riku.voipio@iki.fi \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.