All of lore.kernel.org
 help / color / mirror / Atom feed
From: Simon Ruderich <simon@ruderich.org>
To: qemu-devel@nongnu.org
Subject: [Qemu-devel] [PATCH] qmp: add pmemload command
Date: Tue, 10 Apr 2018 23:24:59 +0200	[thread overview]
Message-ID: <0e59c79ddc01e195ddc59d77d9df2b95bf89b600.1523395243.git.simon@ruderich.org> (raw)

Adapted patch from Baojun Wang [1] with the following commit message:

    I found this could be useful to have qemu-softmmu as a cross
    debugger (launch with -s -S command line option), then if we can
    have a command to load guest physical memory, we can use cross gdb
    to do some target debug which gdb cannot do directly.

pmemload is necessary to directly write physical memory which is not
possible with gdb alone as it uses only logical addresses.

[1]: https://lists.gnu.org/archive/html/qemu-trivial/2014-04/msg00073.html

Based-on-patch-by: Baojun Wang <wangbj@gmail.com>
Signed-off-by: Simon Ruderich <simon@ruderich.org>
---

Hello,

I'm using pmemload to manipulate physical memory in Qemu with
this patch; the existing pmemsave can be used to dump the
physical memory.

I've only used pmemload from qemu's monitor and not via qapi.
This part was taken unchanged from the original patch.

Regards
Simon

 cpus.c           | 30 ++++++++++++++++++++++++++++++
 hmp-commands.hx  | 14 ++++++++++++++
 hmp.c            | 11 +++++++++++
 hmp.h            |  1 +
 qapi-schema.json | 18 ++++++++++++++++++
 5 files changed, 74 insertions(+)

diff --git a/cpus.c b/cpus.c
index 114c29b6a0..b2325dd7bb 100644
--- a/cpus.c
+++ b/cpus.c
@@ -2039,6 +2039,36 @@ exit:
     fclose(f);
 }
 
+void qmp_pmemload(int64_t addr, int64_t size, const char *filename,
+                  Error **errp)
+{
+    FILE *f;
+    size_t l;
+    uint8_t buf[1024];
+
+    f = fopen(filename, "rb");
+    if (!f) {
+        error_setg_file_open(errp, errno, filename);
+        return;
+    }
+
+    while (size != 0) {
+        l = sizeof(buf);
+        if (l > size)
+            l = size;
+        if (fread(buf, 1, l, f) != l) {
+            error_setg(errp, QERR_IO_ERROR);
+            goto exit;
+        }
+        cpu_physical_memory_write(addr, buf, l);
+        addr += l;
+        size -= l;
+    }
+
+exit:
+    fclose(f);
+}
+
 void qmp_inject_nmi(Error **errp)
 {
     nmi_monitor_handle(monitor_get_cpu_index(), errp);
diff --git a/hmp-commands.hx b/hmp-commands.hx
index 4afd57cf5f..cc1956252e 100644
--- a/hmp-commands.hx
+++ b/hmp-commands.hx
@@ -853,6 +853,20 @@ STEXI
 @item pmemsave @var{addr} @var{size} @var{file}
 @findex pmemsave
 save to disk physical memory dump starting at @var{addr} of size @var{size}.
+ETEXI
+
+    {
+        .name       = "pmemload",
+        .args_type  = "val:l,size:i,filename:s",
+        .params     = "addr size file",
+        .help       = "load from disk physical memory dump starting at 'addr' of size 'size'",
+        .cmd        = hmp_pmemload,
+    },
+
+STEXI
+@item pmemload @var{addr} @var{size} @var{file}
+@findex pmemload
+load from disk physical memory dump starting at @var{addr} of size @var{size}.
 ETEXI
 
     {
diff --git a/hmp.c b/hmp.c
index 35a7041824..bec5eac621 100644
--- a/hmp.c
+++ b/hmp.c
@@ -1107,6 +1107,17 @@ void hmp_pmemsave(Monitor *mon, const QDict *qdict)
     hmp_handle_error(mon, &err);
 }
 
+void hmp_pmemload(Monitor *mon, const QDict *qdict)
+{
+    uint32_t size = qdict_get_int(qdict, "size");
+    const char *filename = qdict_get_str(qdict, "filename");
+    uint64_t addr = qdict_get_int(qdict, "val");
+    Error *err = NULL;
+
+    qmp_pmemload(addr, size, filename, &err);
+    hmp_handle_error(mon, &err);
+}
+
 void hmp_ringbuf_write(Monitor *mon, const QDict *qdict)
 {
     const char *chardev = qdict_get_str(qdict, "device");
diff --git a/hmp.h b/hmp.h
index a6f56b1f29..b433d919e9 100644
--- a/hmp.h
+++ b/hmp.h
@@ -49,6 +49,7 @@ void hmp_system_powerdown(Monitor *mon, const QDict *qdict);
 void hmp_cpu(Monitor *mon, const QDict *qdict);
 void hmp_memsave(Monitor *mon, const QDict *qdict);
 void hmp_pmemsave(Monitor *mon, const QDict *qdict);
+void hmp_pmemload(Monitor *mon, const QDict *qdict);
 void hmp_ringbuf_write(Monitor *mon, const QDict *qdict);
 void hmp_ringbuf_read(Monitor *mon, const QDict *qdict);
 void hmp_cont(Monitor *mon, const QDict *qdict);
diff --git a/qapi-schema.json b/qapi-schema.json
index 18457954a8..a013d590c5 100644
--- a/qapi-schema.json
+++ b/qapi-schema.json
@@ -1136,6 +1136,24 @@
 { 'command': 'pmemsave',
   'data': {'val': 'int', 'size': 'int', 'filename': 'str'} }
 
+##
+# @pmemload:
+#
+# Load a portion of guest physical memory from a file.
+#
+# @val: the physical address of the guest to start from
+#
+# @size: the size of memory region to load
+#
+# @filename: the file to load the memory from as binary data
+#
+# Returns: Nothing on success
+#
+# Since: 2.10
+##
+{ 'command': 'pmemload',
+  'data': {'val': 'int', 'size': 'int', 'filename': 'str'} }
+
 ##
 # @cont:
 #
-- 
2.15.0

-- 
+ privacy is necessary
+ using gnupg http://gnupg.org
+ public key id: 0x92FEFDB7E44C32F9

             reply	other threads:[~2018-04-10 21:25 UTC|newest]

Thread overview: 82+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-04-10 21:24 Simon Ruderich [this message]
2018-04-10 21:27 ` [Qemu-devel] [PATCH] qmp: add pmemload command no-reply
2018-04-10 21:33 ` Eric Blake
2018-04-11  7:36   ` Simon Ruderich
2018-04-11 13:02     ` Eric Blake
2018-04-12 12:48       ` Simon Ruderich
2018-04-12 12:50         ` [Qemu-devel] [PATCH v2 1/5] cpus: correct coding style in qmp_memsave/qmp_pmemsave Simon Ruderich
2018-04-12 12:50           ` [Qemu-devel] [PATCH v2 2/5] cpus: convert qmp_memsave/qmp_pmemsave to use qemu_open Simon Ruderich
2018-04-17 20:58             ` Eric Blake
2018-04-12 12:50           ` [Qemu-devel] [PATCH v2 3/5] cpus: use size_t in qmp_memsave/qmp_pmemsave Simon Ruderich
2018-04-17 20:58             ` Eric Blake
2018-04-12 12:50           ` [Qemu-devel] [PATCH v2 4/5] hmp: don't truncate size in hmp_memsave/hmp_pmemsave Simon Ruderich
2018-04-17 20:59             ` Eric Blake
2018-04-12 12:50           ` [Qemu-devel] [PATCH v2 5/5] qmp: add pmemload command Simon Ruderich
2018-04-17 21:18             ` Eric Blake
2018-04-22  9:47               ` Simon Ruderich
2018-04-23 19:46                 ` Eric Blake
2018-04-24 14:50                   ` Simon Ruderich
2018-04-17 20:56           ` [Qemu-devel] [PATCH v2 1/5] cpus: correct coding style in qmp_memsave/qmp_pmemsave Eric Blake
2018-04-22  9:19             ` Simon Ruderich
2018-05-21 15:36 ` [Qemu-devel] [PATCH v3 0/5] qmp: add pmemload command Simon Ruderich
2018-05-21 15:36   ` [Qemu-devel] [PATCH v3 1/5] cpus: correct coding style in qmp_memsave/qmp_pmemsave Simon Ruderich
2018-05-21 15:36   ` [Qemu-devel] [PATCH v3 2/5] cpus: convert qmp_memsave/qmp_pmemsave to use qemu_open Simon Ruderich
2018-05-21 15:36   ` [Qemu-devel] [PATCH v3 3/5] cpus: use size_t in qmp_memsave/qmp_pmemsave Simon Ruderich
2018-05-21 15:36   ` [Qemu-devel] [PATCH v3 4/5] hmp: don't truncate size in hmp_memsave/hmp_pmemsave Simon Ruderich
2018-05-21 15:36   ` [Qemu-devel] [PATCH v3 5/5] qmp: add pmemload command Simon Ruderich
2018-08-09 16:46     ` Eric Blake
2018-08-14 14:16       ` Simon Ruderich
2018-08-10 10:36     ` Dr. David Alan Gilbert
2018-08-14 14:18       ` Simon Ruderich
2018-08-14 15:49         ` Markus Armbruster
2018-08-14 19:03           ` Simon Ruderich
2018-08-15  4:22             ` Markus Armbruster
2018-08-15 12:41               ` Simon Ruderich
2018-08-15 14:29                 ` Markus Armbruster
2018-08-15 15:46                   ` Simon Ruderich
2018-08-16  5:43                     ` Markus Armbruster
2018-08-16  8:13                       ` Simon Ruderich
2018-08-16  8:26                         ` Markus Armbruster
2018-08-16  8:38                           ` Simon Ruderich
2018-08-14 19:30         ` Dr. David Alan Gilbert
2018-08-09 14:43   ` [Qemu-devel] [PATCH v3 0/5] " Simon Ruderich
2018-08-10  6:06     ` Markus Armbruster
2018-08-14 14:16       ` Simon Ruderich
2018-08-14 15:27         ` Markus Armbruster
2018-08-16  9:01 ` [Qemu-devel] [PATCH v4 0/7] qmp/hmp: " Simon Ruderich
2018-08-16  9:01   ` [Qemu-devel] [PATCH v4 1/7] cpus: correct coding style in qmp_memsave/qmp_pmemsave Simon Ruderich
2018-08-16 19:56     ` Eric Blake
2018-08-16  9:01   ` [Qemu-devel] [PATCH v4 2/7] cpus: convert qmp_memsave/qmp_pmemsave to use qemu_open Simon Ruderich
2018-08-16 19:58     ` Eric Blake
2018-08-16  9:01   ` [Qemu-devel] [PATCH v4 3/7] cpus: use size_t in qmp_memsave/qmp_pmemsave Simon Ruderich
2018-08-16 19:58     ` Eric Blake
2018-08-16  9:01   ` [Qemu-devel] [PATCH v4 4/7] hmp: use l for size argument in memsave/pmemsave Simon Ruderich
2018-08-16 18:51     ` Dr. David Alan Gilbert
2018-08-16  9:01   ` [Qemu-devel] [PATCH v4 5/7] hmp: use F for filename arguments " Simon Ruderich
2018-08-16 18:53     ` Dr. David Alan Gilbert
2018-08-16  9:01   ` [Qemu-devel] [PATCH v4 6/7] qmp: add pmemload command Simon Ruderich
2018-08-16 20:01     ` Eric Blake
2018-08-17  7:50       ` Simon Ruderich
2018-08-21 12:38       ` [Qemu-devel] [PATCH v5 5/6] " Simon Ruderich
     [not found]         ` <20180921110205.GA904@ruderich.org>
2018-10-09 12:14           ` Simon Ruderich
2018-08-16  9:01   ` [Qemu-devel] [PATCH v4 7/7] hmp: " Simon Ruderich
2018-08-16 18:57     ` Dr. David Alan Gilbert
2018-11-15 13:01 ` [Qemu-devel] [PATCH v6 0/6] qmp: " Simon Ruderich
2018-11-15 13:01   ` [Qemu-devel] [PATCH v6 1/6] cpus: convert qmp_memsave/qmp_pmemsave to use qemu_open Simon Ruderich
2018-11-15 13:01   ` [Qemu-devel] [PATCH v6 2/6] cpus: use size_t in qmp_memsave/qmp_pmemsave Simon Ruderich
2018-11-15 13:01   ` [Qemu-devel] [PATCH v6 3/6] hmp: use l for size argument in memsave/pmemsave Simon Ruderich
2018-11-15 13:01   ` [Qemu-devel] [PATCH v6 4/6] hmp: use F for filename arguments " Simon Ruderich
2018-11-15 13:01   ` [Qemu-devel] [PATCH v6 5/6] qmp: add pmemload command Simon Ruderich
2018-11-15 13:01   ` [Qemu-devel] [PATCH v6 6/6] hmp: " Simon Ruderich
2018-11-15 13:22 ` [Qemu-devel] [PATCH v7 0/7] qmp: " Simon Ruderich
2018-11-15 13:22   ` [Qemu-devel] [PATCH v7 1/7] cpus: correct coding style in qmp_memsave/qmp_pmemsave Simon Ruderich
2018-11-15 13:46     ` Eric Blake
2018-11-15 13:22   ` [Qemu-devel] [PATCH v7 2/7] cpus: convert qmp_memsave/qmp_pmemsave to use qemu_open Simon Ruderich
2018-11-15 13:49     ` Eric Blake
2018-11-15 13:22   ` [Qemu-devel] [PATCH v7 3/7] cpus: use size_t in qmp_memsave/qmp_pmemsave Simon Ruderich
2018-11-15 13:22   ` [Qemu-devel] [PATCH v7 4/7] hmp: use l for size argument in memsave/pmemsave Simon Ruderich
2018-11-15 13:22   ` [Qemu-devel] [PATCH v7 5/7] hmp: use F for filename arguments " Simon Ruderich
2018-11-15 13:22   ` [Qemu-devel] [PATCH v7 6/7] qmp: add pmemload command Simon Ruderich
2018-11-15 13:22   ` [Qemu-devel] [PATCH v7 7/7] hmp: " Simon Ruderich
2018-11-15 13:45   ` [Qemu-devel] [PATCH v7 0/7] qmp: " Eric Blake
2018-11-15 14:09     ` Simon Ruderich

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=0e59c79ddc01e195ddc59d77d9df2b95bf89b600.1523395243.git.simon@ruderich.org \
    --to=simon@ruderich.org \
    --cc=qemu-devel@nongnu.org \
    /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.