All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 0/7] monitor: Merge hmp-cmds-target.c within hmp-cmds.c
@ 2025-12-29 23:15 Philippe Mathieu-Daudé
  2025-12-29 23:15 ` [PATCH v2 1/7] monitor/hmp: Replace target_ulong -> vaddr in hmp_gva2gpa() Philippe Mathieu-Daudé
                   ` (7 more replies)
  0 siblings, 8 replies; 15+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-12-29 23:15 UTC (permalink / raw)
  To: qemu-devel
  Cc: Pierrick Bouvier, Anton Johansson, Manos Pitsidianakis,
	Dr. David Alan Gilbert, Philippe Mathieu-Daudé

Missing review: #2 (new)

Since v1:
- Make @is_physical a boolean (Dave)
- Use correct meson.build style (Manos)

Requiered for single-binary work, remove target-specific
parts of hmp-cmds-target.c, eventually allowing to merge
within hmp-cmds.c.

tag: https://gitlab.com/philmd/qemu/-/tags/endian_hmp-v2
CI: https://gitlab.com/philmd/qemu/-/pipelines/2231223066

Philippe Mathieu-Daudé (7):
  monitor/hmp: Replace target_ulong -> vaddr in hmp_gva2gpa()
  monitor/hmp: Make memory_dump() @is_physical argument a boolean
  monitor/hmp: Use plain uint64_t @addr argument in memory_dump()
  monitor/hmp: Remove target_long uses in memory_dump()
  monitor/hmp: Inline ld[uw,l,q]_p() calls in memory_dump()
  monitor/hmp: Fix coding style in hmp-cmds-target.c
  monitor/hmp: Merge hmp-cmds-target.c within hmp-cmds.c

 monitor/hmp-cmds-target.c | 381 --------------------------------------
 monitor/hmp-cmds.c        | 354 +++++++++++++++++++++++++++++++++++
 monitor/meson.build       |   2 +-
 3 files changed, 355 insertions(+), 382 deletions(-)
 delete mode 100644 monitor/hmp-cmds-target.c

-- 
2.52.0



^ permalink raw reply	[flat|nested] 15+ messages in thread

* [PATCH v2 1/7] monitor/hmp: Replace target_ulong -> vaddr in hmp_gva2gpa()
  2025-12-29 23:15 [PATCH v2 0/7] monitor: Merge hmp-cmds-target.c within hmp-cmds.c Philippe Mathieu-Daudé
@ 2025-12-29 23:15 ` Philippe Mathieu-Daudé
  2026-01-08  7:30   ` Markus Armbruster
  2025-12-29 23:15 ` [PATCH v2 2/7] monitor/hmp: Make memory_dump() @is_physical argument a boolean Philippe Mathieu-Daudé
                   ` (6 subsequent siblings)
  7 siblings, 1 reply; 15+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-12-29 23:15 UTC (permalink / raw)
  To: qemu-devel
  Cc: Pierrick Bouvier, Anton Johansson, Manos Pitsidianakis,
	Dr. David Alan Gilbert, Philippe Mathieu-Daudé

cpu_get_phys_page_debug() takes a vaddr type since commit
00b941e581b ("cpu: Turn cpu_get_phys_page_debug() into a CPUClass
hook").

Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>
Reviewed-by: Dr. David Alan Gilbert <dave@treblig.org>
---
 monitor/hmp-cmds-target.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/monitor/hmp-cmds-target.c b/monitor/hmp-cmds-target.c
index e9820611466..2976f986d35 100644
--- a/monitor/hmp-cmds-target.c
+++ b/monitor/hmp-cmds-target.c
@@ -301,7 +301,7 @@ void hmp_gpa2hva(Monitor *mon, const QDict *qdict)
 
 void hmp_gva2gpa(Monitor *mon, const QDict *qdict)
 {
-    target_ulong addr = qdict_get_int(qdict, "addr");
+    vaddr addr = qdict_get_int(qdict, "addr");
     CPUState *cs = mon_get_cpu(mon);
     hwaddr gpa;
 
-- 
2.52.0



^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH v2 2/7] monitor/hmp: Make memory_dump() @is_physical argument a boolean
  2025-12-29 23:15 [PATCH v2 0/7] monitor: Merge hmp-cmds-target.c within hmp-cmds.c Philippe Mathieu-Daudé
  2025-12-29 23:15 ` [PATCH v2 1/7] monitor/hmp: Replace target_ulong -> vaddr in hmp_gva2gpa() Philippe Mathieu-Daudé
@ 2025-12-29 23:15 ` Philippe Mathieu-Daudé
  2025-12-29 23:48   ` Dr. David Alan Gilbert
  2025-12-30  6:20   ` Manos Pitsidianakis
  2025-12-29 23:15 ` [PATCH v2 3/7] monitor/hmp: Use plain uint64_t @addr argument in memory_dump() Philippe Mathieu-Daudé
                   ` (5 subsequent siblings)
  7 siblings, 2 replies; 15+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-12-29 23:15 UTC (permalink / raw)
  To: qemu-devel
  Cc: Pierrick Bouvier, Anton Johansson, Manos Pitsidianakis,
	Dr. David Alan Gilbert, Philippe Mathieu-Daudé

Suggested-by: Dr. David Alan Gilbert <dave@treblig.org>
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
 monitor/hmp-cmds-target.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/monitor/hmp-cmds-target.c b/monitor/hmp-cmds-target.c
index 2976f986d35..51dcb9e314c 100644
--- a/monitor/hmp-cmds-target.c
+++ b/monitor/hmp-cmds-target.c
@@ -122,7 +122,7 @@ void hmp_info_registers(Monitor *mon, const QDict *qdict)
 }
 
 static void memory_dump(Monitor *mon, int count, int format, int wsize,
-                        hwaddr addr, int is_physical)
+                        hwaddr addr, bool is_physical)
 {
     int l, line_size, i, max_digits, len;
     uint8_t buf[16];
@@ -237,7 +237,7 @@ void hmp_memory_dump(Monitor *mon, const QDict *qdict)
     int size = qdict_get_int(qdict, "size");
     target_long addr = qdict_get_int(qdict, "addr");
 
-    memory_dump(mon, count, format, size, addr, 0);
+    memory_dump(mon, count, format, size, addr, false);
 }
 
 void hmp_physical_memory_dump(Monitor *mon, const QDict *qdict)
@@ -247,7 +247,7 @@ void hmp_physical_memory_dump(Monitor *mon, const QDict *qdict)
     int size = qdict_get_int(qdict, "size");
     hwaddr addr = qdict_get_int(qdict, "addr");
 
-    memory_dump(mon, count, format, size, addr, 1);
+    memory_dump(mon, count, format, size, addr, true);
 }
 
 void *gpa2hva(MemoryRegion **p_mr, hwaddr addr, uint64_t size, Error **errp)
-- 
2.52.0



^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH v2 3/7] monitor/hmp: Use plain uint64_t @addr argument in memory_dump()
  2025-12-29 23:15 [PATCH v2 0/7] monitor: Merge hmp-cmds-target.c within hmp-cmds.c Philippe Mathieu-Daudé
  2025-12-29 23:15 ` [PATCH v2 1/7] monitor/hmp: Replace target_ulong -> vaddr in hmp_gva2gpa() Philippe Mathieu-Daudé
  2025-12-29 23:15 ` [PATCH v2 2/7] monitor/hmp: Make memory_dump() @is_physical argument a boolean Philippe Mathieu-Daudé
@ 2025-12-29 23:15 ` Philippe Mathieu-Daudé
  2025-12-29 23:15 ` [PATCH v2 4/7] monitor/hmp: Remove target_long uses " Philippe Mathieu-Daudé
                   ` (4 subsequent siblings)
  7 siblings, 0 replies; 15+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-12-29 23:15 UTC (permalink / raw)
  To: qemu-devel
  Cc: Pierrick Bouvier, Anton Johansson, Manos Pitsidianakis,
	Dr. David Alan Gilbert, Philippe Mathieu-Daudé

memory_dump() takes either hwaddr or vaddr type, depending
on the @is_physical argument. Simply use uint64_t type which
is common to both.
Pad address using field width formatting, removing the need
for the target_ulong type.

Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>
Reviewed-by: Dr. David Alan Gilbert <dave@treblig.org>
---
 monitor/hmp-cmds-target.c | 9 +++------
 1 file changed, 3 insertions(+), 6 deletions(-)

diff --git a/monitor/hmp-cmds-target.c b/monitor/hmp-cmds-target.c
index 51dcb9e314c..e855c0d8a2c 100644
--- a/monitor/hmp-cmds-target.c
+++ b/monitor/hmp-cmds-target.c
@@ -122,12 +122,13 @@ void hmp_info_registers(Monitor *mon, const QDict *qdict)
 }
 
 static void memory_dump(Monitor *mon, int count, int format, int wsize,
-                        hwaddr addr, bool is_physical)
+                        uint64_t addr, bool is_physical)
 {
     int l, line_size, i, max_digits, len;
     uint8_t buf[16];
     uint64_t v;
     CPUState *cs = mon_get_cpu(mon);
+    const unsigned int addr_width = is_physical ? 8 : (target_long_bits() * 2);
 
     if (!cs && (format == 'i' || !is_physical)) {
         monitor_printf(mon, "Can not dump without CPU\n");
@@ -165,11 +166,7 @@ static void memory_dump(Monitor *mon, int count, int format, int wsize,
     }
 
     while (len > 0) {
-        if (is_physical) {
-            monitor_printf(mon, HWADDR_FMT_plx ":", addr);
-        } else {
-            monitor_printf(mon, TARGET_FMT_lx ":", (target_ulong)addr);
-        }
+        monitor_printf(mon, "%0*" PRIx64 ":", addr_width, addr);
         l = len;
         if (l > line_size)
             l = line_size;
-- 
2.52.0



^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH v2 4/7] monitor/hmp: Remove target_long uses in memory_dump()
  2025-12-29 23:15 [PATCH v2 0/7] monitor: Merge hmp-cmds-target.c within hmp-cmds.c Philippe Mathieu-Daudé
                   ` (2 preceding siblings ...)
  2025-12-29 23:15 ` [PATCH v2 3/7] monitor/hmp: Use plain uint64_t @addr argument in memory_dump() Philippe Mathieu-Daudé
@ 2025-12-29 23:15 ` Philippe Mathieu-Daudé
  2025-12-29 23:15 ` [PATCH v2 5/7] monitor/hmp: Inline ld[uw, l, q]_p() calls " Philippe Mathieu-Daudé
                   ` (3 subsequent siblings)
  7 siblings, 0 replies; 15+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-12-29 23:15 UTC (permalink / raw)
  To: qemu-devel
  Cc: Pierrick Bouvier, Anton Johansson, Manos Pitsidianakis,
	Dr. David Alan Gilbert, Philippe Mathieu-Daudé

Pass a plain vaddr type to express virtual address.

Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>
---
 monitor/hmp-cmds-target.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/monitor/hmp-cmds-target.c b/monitor/hmp-cmds-target.c
index e855c0d8a2c..7c8bddabbac 100644
--- a/monitor/hmp-cmds-target.c
+++ b/monitor/hmp-cmds-target.c
@@ -232,7 +232,7 @@ void hmp_memory_dump(Monitor *mon, const QDict *qdict)
     int count = qdict_get_int(qdict, "count");
     int format = qdict_get_int(qdict, "format");
     int size = qdict_get_int(qdict, "size");
-    target_long addr = qdict_get_int(qdict, "addr");
+    vaddr addr = qdict_get_int(qdict, "addr");
 
     memory_dump(mon, count, format, size, addr, false);
 }
-- 
2.52.0



^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH v2 5/7] monitor/hmp: Inline ld[uw, l, q]_p() calls in memory_dump()
  2025-12-29 23:15 [PATCH v2 0/7] monitor: Merge hmp-cmds-target.c within hmp-cmds.c Philippe Mathieu-Daudé
                   ` (3 preceding siblings ...)
  2025-12-29 23:15 ` [PATCH v2 4/7] monitor/hmp: Remove target_long uses " Philippe Mathieu-Daudé
@ 2025-12-29 23:15 ` Philippe Mathieu-Daudé
  2025-12-29 23:15 ` [PATCH v2 6/7] monitor/hmp: Fix coding style in hmp-cmds-target.c Philippe Mathieu-Daudé
                   ` (2 subsequent siblings)
  7 siblings, 0 replies; 15+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-12-29 23:15 UTC (permalink / raw)
  To: qemu-devel
  Cc: Pierrick Bouvier, Anton Johansson, Manos Pitsidianakis,
	Dr. David Alan Gilbert, Philippe Mathieu-Daudé

Remove the last target-specificity in this file.

Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>
---
 monitor/hmp-cmds-target.c | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/monitor/hmp-cmds-target.c b/monitor/hmp-cmds-target.c
index 7c8bddabbac..e782259c3e6 100644
--- a/monitor/hmp-cmds-target.c
+++ b/monitor/hmp-cmds-target.c
@@ -129,6 +129,7 @@ static void memory_dump(Monitor *mon, int count, int format, int wsize,
     uint64_t v;
     CPUState *cs = mon_get_cpu(mon);
     const unsigned int addr_width = is_physical ? 8 : (target_long_bits() * 2);
+    const bool big_endian = target_big_endian();
 
     if (!cs && (format == 'i' || !is_physical)) {
         monitor_printf(mon, "Can not dump without CPU\n");
@@ -192,13 +193,13 @@ static void memory_dump(Monitor *mon, int count, int format, int wsize,
                 v = ldub_p(buf + i);
                 break;
             case 2:
-                v = lduw_p(buf + i);
+                v = (big_endian ? lduw_be_p : lduw_le_p)(buf + i);
                 break;
             case 4:
-                v = (uint32_t)ldl_p(buf + i);
+                v = (uint32_t)(big_endian ? ldl_be_p : ldl_le_p)(buf + i);
                 break;
             case 8:
-                v = ldq_p(buf + i);
+                v = (big_endian ? ldq_be_p : ldq_le_p)(buf + i);
                 break;
             }
             monitor_printf(mon, " ");
-- 
2.52.0



^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH v2 6/7] monitor/hmp: Fix coding style in hmp-cmds-target.c
  2025-12-29 23:15 [PATCH v2 0/7] monitor: Merge hmp-cmds-target.c within hmp-cmds.c Philippe Mathieu-Daudé
                   ` (4 preceding siblings ...)
  2025-12-29 23:15 ` [PATCH v2 5/7] monitor/hmp: Inline ld[uw, l, q]_p() calls " Philippe Mathieu-Daudé
@ 2025-12-29 23:15 ` Philippe Mathieu-Daudé
  2025-12-29 23:15 ` [PATCH v2 7/7] monitor/hmp: Merge hmp-cmds-target.c within hmp-cmds.c Philippe Mathieu-Daudé
  2025-12-30 18:15 ` [PATCH v2 0/7] monitor: " Philippe Mathieu-Daudé
  7 siblings, 0 replies; 15+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-12-29 23:15 UTC (permalink / raw)
  To: qemu-devel
  Cc: Pierrick Bouvier, Anton Johansson, Manos Pitsidianakis,
	Dr. David Alan Gilbert, Philippe Mathieu-Daudé

Previous to moving code contained in hmp-cmds-target.c,
fix the coding style. Otherwise the checkpatch.pl script
would report:

  ERROR: space required before the open parenthesis '('
  #134: FILE: monitor/hmp-cmds-target.c:152:
  +    switch(format) {

  ERROR: braces {} are necessary for all arms of this statement
  #154: FILE: monitor/hmp-cmds-target.c:172:
  +        if (l > line_size)
  [...]

  ERROR: space required before the open parenthesis '('
  #172: FILE: monitor/hmp-cmds-target.c:190:
  +            switch(wsize) {

  ERROR: space required before the open parenthesis '('
  #188: FILE: monitor/hmp-cmds-target.c:206:
  +            switch(format) {

  ERROR: Don't use '#' flag of printf format ('%#') in format strings, use '0x' prefix instead
  #190: FILE: monitor/hmp-cmds-target.c:208:
  +                monitor_printf(mon, "%#*" PRIo64, max_digits, v);

  WARNING: line over 80 characters
  #240: FILE: monitor/hmp-cmds-target.c:258:
  +        error_setg(errp, "No memory is mapped at address 0x%" HWADDR_PRIx, addr);

  WARNING: line over 80 characters
  #245: FILE: monitor/hmp-cmds-target.c:263:
  +        error_setg(errp, "Memory at address 0x%" HWADDR_PRIx " is not RAM", addr);

  ERROR: Don't use '#' flag of printf format ('%#') in format strings, use '0x' prefix instead
  #297: FILE: monitor/hmp-cmds-target.c:315:
  +        monitor_printf(mon, "gpa: %#" HWADDR_PRIx "\n",

  WARNING: line over 80 characters
  #329: FILE: monitor/hmp-cmds-target.c:347:
  +    ret = ((pinfo & 0x007fffffffffffffull) * pagesize) | (addr & (pagesize - 1));

Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>
Reviewed-by: Dr. David Alan Gilbert <dave@treblig.org>
---
 monitor/hmp-cmds-target.c | 22 +++++++++++++---------
 1 file changed, 13 insertions(+), 9 deletions(-)

diff --git a/monitor/hmp-cmds-target.c b/monitor/hmp-cmds-target.c
index e782259c3e6..b4360f1f807 100644
--- a/monitor/hmp-cmds-target.c
+++ b/monitor/hmp-cmds-target.c
@@ -149,7 +149,7 @@ static void memory_dump(Monitor *mon, int count, int format, int wsize,
     }
     max_digits = 0;
 
-    switch(format) {
+    switch (format) {
     case 'o':
         max_digits = DIV_ROUND_UP(wsize * 8, 3);
         break;
@@ -169,8 +169,9 @@ static void memory_dump(Monitor *mon, int count, int format, int wsize,
     while (len > 0) {
         monitor_printf(mon, "%0*" PRIx64 ":", addr_width, addr);
         l = len;
-        if (l > line_size)
+        if (l > line_size) {
             l = line_size;
+        }
         if (is_physical) {
             AddressSpace *as = cs ? cs->as : &address_space_memory;
             MemTxResult r = address_space_read(as, addr,
@@ -187,7 +188,7 @@ static void memory_dump(Monitor *mon, int count, int format, int wsize,
         }
         i = 0;
         while (i < l) {
-            switch(wsize) {
+            switch (wsize) {
             default:
             case 1:
                 v = ldub_p(buf + i);
@@ -203,9 +204,9 @@ static void memory_dump(Monitor *mon, int count, int format, int wsize,
                 break;
             }
             monitor_printf(mon, " ");
-            switch(format) {
+            switch (format) {
             case 'o':
-                monitor_printf(mon, "%#*" PRIo64, max_digits, v);
+                monitor_printf(mon, "0%*" PRIo64, max_digits, v);
                 break;
             case 'x':
                 monitor_printf(mon, "0x%0*" PRIx64, max_digits, v);
@@ -255,12 +256,14 @@ void *gpa2hva(MemoryRegion **p_mr, hwaddr addr, uint64_t size, Error **errp)
                                                  addr, size);
 
     if (!mrs.mr) {
-        error_setg(errp, "No memory is mapped at address 0x%" HWADDR_PRIx, addr);
+        error_setg(errp,
+                   "No memory is mapped at address 0x%" HWADDR_PRIx, addr);
         return NULL;
     }
 
     if (!memory_region_is_ram(mrs.mr) && !memory_region_is_romd(mrs.mr)) {
-        error_setg(errp, "Memory at address 0x%" HWADDR_PRIx " is not RAM", addr);
+        error_setg(errp,
+                   "Memory at address 0x%" HWADDR_PRIx " is not RAM", addr);
         memory_region_unref(mrs.mr);
         return NULL;
     }
@@ -312,7 +315,7 @@ void hmp_gva2gpa(Monitor *mon, const QDict *qdict)
     if (gpa == -1) {
         monitor_printf(mon, "Unmapped\n");
     } else {
-        monitor_printf(mon, "gpa: %#" HWADDR_PRIx "\n",
+        monitor_printf(mon, "gpa: 0x%" HWADDR_PRIx "\n",
                        gpa + (addr & ~TARGET_PAGE_MASK));
     }
 }
@@ -344,7 +347,8 @@ static uint64_t vtop(void *ptr, Error **errp)
         error_setg(errp, "Page not present");
         goto out;
     }
-    ret = ((pinfo & 0x007fffffffffffffull) * pagesize) | (addr & (pagesize - 1));
+    ret = (pinfo & 0x007fffffffffffffull) * pagesize;
+    ret |= addr & (pagesize - 1);
 
 out:
     close(fd);
-- 
2.52.0



^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH v2 7/7] monitor/hmp: Merge hmp-cmds-target.c within hmp-cmds.c
  2025-12-29 23:15 [PATCH v2 0/7] monitor: Merge hmp-cmds-target.c within hmp-cmds.c Philippe Mathieu-Daudé
                   ` (5 preceding siblings ...)
  2025-12-29 23:15 ` [PATCH v2 6/7] monitor/hmp: Fix coding style in hmp-cmds-target.c Philippe Mathieu-Daudé
@ 2025-12-29 23:15 ` Philippe Mathieu-Daudé
  2025-12-30 18:15 ` [PATCH v2 0/7] monitor: " Philippe Mathieu-Daudé
  7 siblings, 0 replies; 15+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-12-29 23:15 UTC (permalink / raw)
  To: qemu-devel
  Cc: Pierrick Bouvier, Anton Johansson, Manos Pitsidianakis,
	Dr. David Alan Gilbert, Philippe Mathieu-Daudé

hmp-cmds-target.c is no more target specific, move its code
in hmp-cmds.c, which is built once for all system binaries.

Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>
---
 monitor/hmp-cmds-target.c | 383 --------------------------------------
 monitor/hmp-cmds.c        | 354 +++++++++++++++++++++++++++++++++++
 monitor/meson.build       |   2 +-
 3 files changed, 355 insertions(+), 384 deletions(-)
 delete mode 100644 monitor/hmp-cmds-target.c

diff --git a/monitor/hmp-cmds-target.c b/monitor/hmp-cmds-target.c
deleted file mode 100644
index b4360f1f807..00000000000
--- a/monitor/hmp-cmds-target.c
+++ /dev/null
@@ -1,383 +0,0 @@
-/*
- * Miscellaneous target-dependent HMP commands
- *
- * Copyright (c) 2003-2004 Fabrice Bellard
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-#include "qemu/osdep.h"
-#include "disas/disas.h"
-#include "system/address-spaces.h"
-#include "system/memory.h"
-#include "monitor/hmp-target.h"
-#include "monitor/monitor-internal.h"
-#include "qapi/error.h"
-#include "qobject/qdict.h"
-#include "system/hw_accel.h"
-#include "exec/target_page.h"
-
-/* Set the current CPU defined by the user. Callers must hold BQL. */
-int monitor_set_cpu(Monitor *mon, int cpu_index)
-{
-    CPUState *cpu;
-
-    cpu = qemu_get_cpu(cpu_index);
-    if (cpu == NULL) {
-        return -1;
-    }
-    g_free(mon->mon_cpu_path);
-    mon->mon_cpu_path = object_get_canonical_path(OBJECT(cpu));
-    return 0;
-}
-
-/* Callers must hold BQL. */
-static CPUState *mon_get_cpu_sync(Monitor *mon, bool synchronize)
-{
-    CPUState *cpu = NULL;
-
-    if (mon->mon_cpu_path) {
-        cpu = (CPUState *) object_resolve_path_type(mon->mon_cpu_path,
-                                                    TYPE_CPU, NULL);
-        if (!cpu) {
-            g_free(mon->mon_cpu_path);
-            mon->mon_cpu_path = NULL;
-        }
-    }
-    if (!mon->mon_cpu_path) {
-        if (!first_cpu) {
-            return NULL;
-        }
-        monitor_set_cpu(mon, first_cpu->cpu_index);
-        cpu = first_cpu;
-    }
-    assert(cpu != NULL);
-    if (synchronize) {
-        cpu_synchronize_state(cpu);
-    }
-    return cpu;
-}
-
-CPUState *mon_get_cpu(Monitor *mon)
-{
-    return mon_get_cpu_sync(mon, true);
-}
-
-CPUArchState *mon_get_cpu_env(Monitor *mon)
-{
-    CPUState *cs = mon_get_cpu(mon);
-
-    return cs ? cpu_env(cs) : NULL;
-}
-
-int monitor_get_cpu_index(Monitor *mon)
-{
-    CPUState *cs = mon_get_cpu_sync(mon, false);
-
-    return cs ? cs->cpu_index : UNASSIGNED_CPU_INDEX;
-}
-
-void hmp_info_registers(Monitor *mon, const QDict *qdict)
-{
-    bool all_cpus = qdict_get_try_bool(qdict, "cpustate_all", false);
-    int vcpu = qdict_get_try_int(qdict, "vcpu", -1);
-    CPUState *cs;
-
-    if (all_cpus) {
-        CPU_FOREACH(cs) {
-            monitor_printf(mon, "\nCPU#%d\n", cs->cpu_index);
-            cpu_dump_state(cs, NULL, CPU_DUMP_FPU | CPU_DUMP_VPU);
-        }
-    } else {
-        cs = vcpu >= 0 ? qemu_get_cpu(vcpu) : mon_get_cpu(mon);
-
-        if (!cs) {
-            if (vcpu >= 0) {
-                monitor_printf(mon, "CPU#%d not available\n", vcpu);
-            } else {
-                monitor_printf(mon, "No CPU available\n");
-            }
-            return;
-        }
-
-        monitor_printf(mon, "\nCPU#%d\n", cs->cpu_index);
-        cpu_dump_state(cs, NULL, CPU_DUMP_FPU | CPU_DUMP_VPU);
-    }
-}
-
-static void memory_dump(Monitor *mon, int count, int format, int wsize,
-                        uint64_t addr, bool is_physical)
-{
-    int l, line_size, i, max_digits, len;
-    uint8_t buf[16];
-    uint64_t v;
-    CPUState *cs = mon_get_cpu(mon);
-    const unsigned int addr_width = is_physical ? 8 : (target_long_bits() * 2);
-    const bool big_endian = target_big_endian();
-
-    if (!cs && (format == 'i' || !is_physical)) {
-        monitor_printf(mon, "Can not dump without CPU\n");
-        return;
-    }
-
-    if (format == 'i') {
-        monitor_disas(mon, cs, addr, count, is_physical);
-        return;
-    }
-
-    len = wsize * count;
-    if (wsize == 1) {
-        line_size = 8;
-    } else {
-        line_size = 16;
-    }
-    max_digits = 0;
-
-    switch (format) {
-    case 'o':
-        max_digits = DIV_ROUND_UP(wsize * 8, 3);
-        break;
-    default:
-    case 'x':
-        max_digits = (wsize * 8) / 4;
-        break;
-    case 'u':
-    case 'd':
-        max_digits = DIV_ROUND_UP(wsize * 8 * 10, 33);
-        break;
-    case 'c':
-        wsize = 1;
-        break;
-    }
-
-    while (len > 0) {
-        monitor_printf(mon, "%0*" PRIx64 ":", addr_width, addr);
-        l = len;
-        if (l > line_size) {
-            l = line_size;
-        }
-        if (is_physical) {
-            AddressSpace *as = cs ? cs->as : &address_space_memory;
-            MemTxResult r = address_space_read(as, addr,
-                                               MEMTXATTRS_UNSPECIFIED, buf, l);
-            if (r != MEMTX_OK) {
-                monitor_printf(mon, " Cannot access memory\n");
-                break;
-            }
-        } else {
-            if (cpu_memory_rw_debug(cs, addr, buf, l, 0) < 0) {
-                monitor_printf(mon, " Cannot access memory\n");
-                break;
-            }
-        }
-        i = 0;
-        while (i < l) {
-            switch (wsize) {
-            default:
-            case 1:
-                v = ldub_p(buf + i);
-                break;
-            case 2:
-                v = (big_endian ? lduw_be_p : lduw_le_p)(buf + i);
-                break;
-            case 4:
-                v = (uint32_t)(big_endian ? ldl_be_p : ldl_le_p)(buf + i);
-                break;
-            case 8:
-                v = (big_endian ? ldq_be_p : ldq_le_p)(buf + i);
-                break;
-            }
-            monitor_printf(mon, " ");
-            switch (format) {
-            case 'o':
-                monitor_printf(mon, "0%*" PRIo64, max_digits, v);
-                break;
-            case 'x':
-                monitor_printf(mon, "0x%0*" PRIx64, max_digits, v);
-                break;
-            case 'u':
-                monitor_printf(mon, "%*" PRIu64, max_digits, v);
-                break;
-            case 'd':
-                monitor_printf(mon, "%*" PRId64, max_digits, v);
-                break;
-            case 'c':
-                monitor_printc(mon, v);
-                break;
-            }
-            i += wsize;
-        }
-        monitor_printf(mon, "\n");
-        addr += l;
-        len -= l;
-    }
-}
-
-void hmp_memory_dump(Monitor *mon, const QDict *qdict)
-{
-    int count = qdict_get_int(qdict, "count");
-    int format = qdict_get_int(qdict, "format");
-    int size = qdict_get_int(qdict, "size");
-    vaddr addr = qdict_get_int(qdict, "addr");
-
-    memory_dump(mon, count, format, size, addr, false);
-}
-
-void hmp_physical_memory_dump(Monitor *mon, const QDict *qdict)
-{
-    int count = qdict_get_int(qdict, "count");
-    int format = qdict_get_int(qdict, "format");
-    int size = qdict_get_int(qdict, "size");
-    hwaddr addr = qdict_get_int(qdict, "addr");
-
-    memory_dump(mon, count, format, size, addr, true);
-}
-
-void *gpa2hva(MemoryRegion **p_mr, hwaddr addr, uint64_t size, Error **errp)
-{
-    Int128 gpa_region_size;
-    MemoryRegionSection mrs = memory_region_find(get_system_memory(),
-                                                 addr, size);
-
-    if (!mrs.mr) {
-        error_setg(errp,
-                   "No memory is mapped at address 0x%" HWADDR_PRIx, addr);
-        return NULL;
-    }
-
-    if (!memory_region_is_ram(mrs.mr) && !memory_region_is_romd(mrs.mr)) {
-        error_setg(errp,
-                   "Memory at address 0x%" HWADDR_PRIx " is not RAM", addr);
-        memory_region_unref(mrs.mr);
-        return NULL;
-    }
-
-    gpa_region_size = int128_make64(size);
-    if (int128_lt(mrs.size, gpa_region_size)) {
-        error_setg(errp, "Size of memory region at 0x%" HWADDR_PRIx
-                   " exceeded.", addr);
-        memory_region_unref(mrs.mr);
-        return NULL;
-    }
-
-    *p_mr = mrs.mr;
-    return qemu_map_ram_ptr(mrs.mr->ram_block, mrs.offset_within_region);
-}
-
-void hmp_gpa2hva(Monitor *mon, const QDict *qdict)
-{
-    hwaddr addr = qdict_get_int(qdict, "addr");
-    Error *local_err = NULL;
-    MemoryRegion *mr = NULL;
-    void *ptr;
-
-    ptr = gpa2hva(&mr, addr, 1, &local_err);
-    if (local_err) {
-        error_report_err(local_err);
-        return;
-    }
-
-    monitor_printf(mon, "Host virtual address for 0x%" HWADDR_PRIx
-                   " (%s) is %p\n",
-                   addr, mr->name, ptr);
-
-    memory_region_unref(mr);
-}
-
-void hmp_gva2gpa(Monitor *mon, const QDict *qdict)
-{
-    vaddr addr = qdict_get_int(qdict, "addr");
-    CPUState *cs = mon_get_cpu(mon);
-    hwaddr gpa;
-
-    if (!cs) {
-        monitor_printf(mon, "No cpu\n");
-        return;
-    }
-
-    gpa  = cpu_get_phys_page_debug(cs, addr & TARGET_PAGE_MASK);
-    if (gpa == -1) {
-        monitor_printf(mon, "Unmapped\n");
-    } else {
-        monitor_printf(mon, "gpa: 0x%" HWADDR_PRIx "\n",
-                       gpa + (addr & ~TARGET_PAGE_MASK));
-    }
-}
-
-#ifdef CONFIG_LINUX
-static uint64_t vtop(void *ptr, Error **errp)
-{
-    uint64_t pinfo;
-    uint64_t ret = -1;
-    uintptr_t addr = (uintptr_t) ptr;
-    uintptr_t pagesize = qemu_real_host_page_size();
-    off_t offset = addr / pagesize * sizeof(pinfo);
-    int fd;
-
-    fd = open("/proc/self/pagemap", O_RDONLY);
-    if (fd == -1) {
-        error_setg_errno(errp, errno, "Cannot open /proc/self/pagemap");
-        return -1;
-    }
-
-    /* Force copy-on-write if necessary.  */
-    qatomic_add((uint8_t *)ptr, 0);
-
-    if (pread(fd, &pinfo, sizeof(pinfo), offset) != sizeof(pinfo)) {
-        error_setg_errno(errp, errno, "Cannot read pagemap");
-        goto out;
-    }
-    if ((pinfo & (1ull << 63)) == 0) {
-        error_setg(errp, "Page not present");
-        goto out;
-    }
-    ret = (pinfo & 0x007fffffffffffffull) * pagesize;
-    ret |= addr & (pagesize - 1);
-
-out:
-    close(fd);
-    return ret;
-}
-
-void hmp_gpa2hpa(Monitor *mon, const QDict *qdict)
-{
-    hwaddr addr = qdict_get_int(qdict, "addr");
-    Error *local_err = NULL;
-    MemoryRegion *mr = NULL;
-    void *ptr;
-    uint64_t physaddr;
-
-    ptr = gpa2hva(&mr, addr, 1, &local_err);
-    if (local_err) {
-        error_report_err(local_err);
-        return;
-    }
-
-    physaddr = vtop(ptr, &local_err);
-    if (local_err) {
-        error_report_err(local_err);
-    } else {
-        monitor_printf(mon, "Host physical address for 0x%" HWADDR_PRIx
-                       " (%s) is 0x%" PRIx64 "\n",
-                       addr, mr->name, (uint64_t) physaddr);
-    }
-
-    memory_region_unref(mr);
-}
-#endif
diff --git a/monitor/hmp-cmds.c b/monitor/hmp-cmds.c
index 33a88ce205a..f7ff6ec90ec 100644
--- a/monitor/hmp-cmds.c
+++ b/monitor/hmp-cmds.c
@@ -17,9 +17,11 @@
 #include "system/address-spaces.h"
 #include "system/ioport.h"
 #include "exec/gdbstub.h"
+#include "exec/target_page.h"
 #include "gdbstub/enums.h"
 #include "monitor/hmp.h"
 #include "qemu/help_option.h"
+#include "monitor/hmp-target.h"
 #include "monitor/monitor-internal.h"
 #include "qapi/error.h"
 #include "qapi/qapi-commands-control.h"
@@ -28,7 +30,10 @@
 #include "qobject/qdict.h"
 #include "qemu/cutils.h"
 #include "qemu/log.h"
+#include "system/hw_accel.h"
+#include "system/memory.h"
 #include "system/system.h"
+#include "disas/disas.h"
 
 bool hmp_handle_error(Monitor *mon, Error *err)
 {
@@ -435,3 +440,352 @@ void hmp_dumpdtb(Monitor *mon, const QDict *qdict)
     monitor_printf(mon, "DTB dumped to '%s'\n", filename);
 }
 #endif
+
+/* Set the current CPU defined by the user. Callers must hold BQL. */
+int monitor_set_cpu(Monitor *mon, int cpu_index)
+{
+    CPUState *cpu;
+
+    cpu = qemu_get_cpu(cpu_index);
+    if (cpu == NULL) {
+        return -1;
+    }
+    g_free(mon->mon_cpu_path);
+    mon->mon_cpu_path = object_get_canonical_path(OBJECT(cpu));
+    return 0;
+}
+
+/* Callers must hold BQL. */
+static CPUState *mon_get_cpu_sync(Monitor *mon, bool synchronize)
+{
+    CPUState *cpu = NULL;
+
+    if (mon->mon_cpu_path) {
+        cpu = (CPUState *) object_resolve_path_type(mon->mon_cpu_path,
+                                                    TYPE_CPU, NULL);
+        if (!cpu) {
+            g_free(mon->mon_cpu_path);
+            mon->mon_cpu_path = NULL;
+        }
+    }
+    if (!mon->mon_cpu_path) {
+        if (!first_cpu) {
+            return NULL;
+        }
+        monitor_set_cpu(mon, first_cpu->cpu_index);
+        cpu = first_cpu;
+    }
+    assert(cpu != NULL);
+    if (synchronize) {
+        cpu_synchronize_state(cpu);
+    }
+    return cpu;
+}
+
+CPUState *mon_get_cpu(Monitor *mon)
+{
+    return mon_get_cpu_sync(mon, true);
+}
+
+CPUArchState *mon_get_cpu_env(Monitor *mon)
+{
+    CPUState *cs = mon_get_cpu(mon);
+
+    return cs ? cpu_env(cs) : NULL;
+}
+
+int monitor_get_cpu_index(Monitor *mon)
+{
+    CPUState *cs = mon_get_cpu_sync(mon, false);
+
+    return cs ? cs->cpu_index : UNASSIGNED_CPU_INDEX;
+}
+
+void hmp_info_registers(Monitor *mon, const QDict *qdict)
+{
+    bool all_cpus = qdict_get_try_bool(qdict, "cpustate_all", false);
+    int vcpu = qdict_get_try_int(qdict, "vcpu", -1);
+    CPUState *cs;
+
+    if (all_cpus) {
+        CPU_FOREACH(cs) {
+            monitor_printf(mon, "\nCPU#%d\n", cs->cpu_index);
+            cpu_dump_state(cs, NULL, CPU_DUMP_FPU | CPU_DUMP_VPU);
+        }
+    } else {
+        cs = vcpu >= 0 ? qemu_get_cpu(vcpu) : mon_get_cpu(mon);
+
+        if (!cs) {
+            if (vcpu >= 0) {
+                monitor_printf(mon, "CPU#%d not available\n", vcpu);
+            } else {
+                monitor_printf(mon, "No CPU available\n");
+            }
+            return;
+        }
+
+        monitor_printf(mon, "\nCPU#%d\n", cs->cpu_index);
+        cpu_dump_state(cs, NULL, CPU_DUMP_FPU | CPU_DUMP_VPU);
+    }
+}
+
+static void memory_dump(Monitor *mon, int count, int format, int wsize,
+                        uint64_t addr, bool is_physical)
+{
+    int l, line_size, i, max_digits, len;
+    uint8_t buf[16];
+    uint64_t v;
+    CPUState *cs = mon_get_cpu(mon);
+    const unsigned int addr_width = is_physical ? 8 : (target_long_bits() * 2);
+    const bool big_endian = target_big_endian();
+
+    if (!cs && (format == 'i' || !is_physical)) {
+        monitor_printf(mon, "Can not dump without CPU\n");
+        return;
+    }
+
+    if (format == 'i') {
+        monitor_disas(mon, cs, addr, count, is_physical);
+        return;
+    }
+
+    len = wsize * count;
+    if (wsize == 1) {
+        line_size = 8;
+    } else {
+        line_size = 16;
+    }
+    max_digits = 0;
+
+    switch (format) {
+    case 'o':
+        max_digits = DIV_ROUND_UP(wsize * 8, 3);
+        break;
+    default:
+    case 'x':
+        max_digits = (wsize * 8) / 4;
+        break;
+    case 'u':
+    case 'd':
+        max_digits = DIV_ROUND_UP(wsize * 8 * 10, 33);
+        break;
+    case 'c':
+        wsize = 1;
+        break;
+    }
+
+    while (len > 0) {
+        monitor_printf(mon, "%0*" PRIx64 ":", addr_width, addr);
+        l = len;
+        if (l > line_size) {
+            l = line_size;
+        }
+        if (is_physical) {
+            AddressSpace *as = cs ? cs->as : &address_space_memory;
+            MemTxResult r = address_space_read(as, addr,
+                                               MEMTXATTRS_UNSPECIFIED, buf, l);
+            if (r != MEMTX_OK) {
+                monitor_printf(mon, " Cannot access memory\n");
+                break;
+            }
+        } else {
+            if (cpu_memory_rw_debug(cs, addr, buf, l, 0) < 0) {
+                monitor_printf(mon, " Cannot access memory\n");
+                break;
+            }
+        }
+        i = 0;
+        while (i < l) {
+            switch (wsize) {
+            default:
+            case 1:
+                v = ldub_p(buf + i);
+                break;
+            case 2:
+                v = (big_endian ? lduw_be_p : lduw_le_p)(buf + i);
+                break;
+            case 4:
+                v = (uint32_t)(big_endian ? ldl_be_p : ldl_le_p)(buf + i);
+                break;
+            case 8:
+                v = (big_endian ? ldq_be_p : ldq_le_p)(buf + i);
+                break;
+            }
+            monitor_printf(mon, " ");
+            switch (format) {
+            case 'o':
+                monitor_printf(mon, "0%*" PRIo64, max_digits, v);
+                break;
+            case 'x':
+                monitor_printf(mon, "0x%0*" PRIx64, max_digits, v);
+                break;
+            case 'u':
+                monitor_printf(mon, "%*" PRIu64, max_digits, v);
+                break;
+            case 'd':
+                monitor_printf(mon, "%*" PRId64, max_digits, v);
+                break;
+            case 'c':
+                monitor_printc(mon, v);
+                break;
+            }
+            i += wsize;
+        }
+        monitor_printf(mon, "\n");
+        addr += l;
+        len -= l;
+    }
+}
+
+void hmp_memory_dump(Monitor *mon, const QDict *qdict)
+{
+    int count = qdict_get_int(qdict, "count");
+    int format = qdict_get_int(qdict, "format");
+    int size = qdict_get_int(qdict, "size");
+    vaddr addr = qdict_get_int(qdict, "addr");
+
+    memory_dump(mon, count, format, size, addr, false);
+}
+
+void hmp_physical_memory_dump(Monitor *mon, const QDict *qdict)
+{
+    int count = qdict_get_int(qdict, "count");
+    int format = qdict_get_int(qdict, "format");
+    int size = qdict_get_int(qdict, "size");
+    hwaddr addr = qdict_get_int(qdict, "addr");
+
+    memory_dump(mon, count, format, size, addr, true);
+}
+
+void *gpa2hva(MemoryRegion **p_mr, hwaddr addr, uint64_t size, Error **errp)
+{
+    Int128 gpa_region_size;
+    MemoryRegionSection mrs = memory_region_find(get_system_memory(),
+                                                 addr, size);
+
+    if (!mrs.mr) {
+        error_setg(errp,
+                   "No memory is mapped at address 0x%" HWADDR_PRIx, addr);
+        return NULL;
+    }
+
+    if (!memory_region_is_ram(mrs.mr) && !memory_region_is_romd(mrs.mr)) {
+        error_setg(errp,
+                   "Memory at address 0x%" HWADDR_PRIx " is not RAM", addr);
+        memory_region_unref(mrs.mr);
+        return NULL;
+    }
+
+    gpa_region_size = int128_make64(size);
+    if (int128_lt(mrs.size, gpa_region_size)) {
+        error_setg(errp, "Size of memory region at 0x%" HWADDR_PRIx
+                   " exceeded.", addr);
+        memory_region_unref(mrs.mr);
+        return NULL;
+    }
+
+    *p_mr = mrs.mr;
+    return qemu_map_ram_ptr(mrs.mr->ram_block, mrs.offset_within_region);
+}
+
+void hmp_gpa2hva(Monitor *mon, const QDict *qdict)
+{
+    hwaddr addr = qdict_get_int(qdict, "addr");
+    Error *local_err = NULL;
+    MemoryRegion *mr = NULL;
+    void *ptr;
+
+    ptr = gpa2hva(&mr, addr, 1, &local_err);
+    if (local_err) {
+        error_report_err(local_err);
+        return;
+    }
+
+    monitor_printf(mon, "Host virtual address for 0x%" HWADDR_PRIx
+                   " (%s) is %p\n",
+                   addr, mr->name, ptr);
+
+    memory_region_unref(mr);
+}
+
+void hmp_gva2gpa(Monitor *mon, const QDict *qdict)
+{
+    vaddr addr = qdict_get_int(qdict, "addr");
+    CPUState *cs = mon_get_cpu(mon);
+    hwaddr gpa;
+
+    if (!cs) {
+        monitor_printf(mon, "No cpu\n");
+        return;
+    }
+
+    gpa  = cpu_get_phys_page_debug(cs, addr & TARGET_PAGE_MASK);
+    if (gpa == -1) {
+        monitor_printf(mon, "Unmapped\n");
+    } else {
+        monitor_printf(mon, "gpa: 0x%" HWADDR_PRIx "\n",
+                       gpa + (addr & ~TARGET_PAGE_MASK));
+    }
+}
+
+#ifdef CONFIG_LINUX
+static uint64_t vtop(void *ptr, Error **errp)
+{
+    uint64_t pinfo;
+    uint64_t ret = -1;
+    uintptr_t addr = (uintptr_t) ptr;
+    uintptr_t pagesize = qemu_real_host_page_size();
+    off_t offset = addr / pagesize * sizeof(pinfo);
+    int fd;
+
+    fd = open("/proc/self/pagemap", O_RDONLY);
+    if (fd == -1) {
+        error_setg_errno(errp, errno, "Cannot open /proc/self/pagemap");
+        return -1;
+    }
+
+    /* Force copy-on-write if necessary.  */
+    qatomic_add((uint8_t *)ptr, 0);
+
+    if (pread(fd, &pinfo, sizeof(pinfo), offset) != sizeof(pinfo)) {
+        error_setg_errno(errp, errno, "Cannot read pagemap");
+        goto out;
+    }
+    if ((pinfo & (1ull << 63)) == 0) {
+        error_setg(errp, "Page not present");
+        goto out;
+    }
+    ret = (pinfo & 0x007fffffffffffffull) * pagesize;
+    ret |= addr & (pagesize - 1);
+
+out:
+    close(fd);
+    return ret;
+}
+
+void hmp_gpa2hpa(Monitor *mon, const QDict *qdict)
+{
+    hwaddr addr = qdict_get_int(qdict, "addr");
+    Error *local_err = NULL;
+    MemoryRegion *mr = NULL;
+    void *ptr;
+    uint64_t physaddr;
+
+    ptr = gpa2hva(&mr, addr, 1, &local_err);
+    if (local_err) {
+        error_report_err(local_err);
+        return;
+    }
+
+    physaddr = vtop(ptr, &local_err);
+    if (local_err) {
+        error_report_err(local_err);
+    } else {
+        monitor_printf(mon, "Host physical address for 0x%" HWADDR_PRIx
+                       " (%s) is 0x%" PRIx64 "\n",
+                       addr, mr->name, (uint64_t) physaddr);
+    }
+
+    memory_region_unref(mr);
+}
+#endif
diff --git a/monitor/meson.build b/monitor/meson.build
index a71523a1ce8..2647100e04c 100644
--- a/monitor/meson.build
+++ b/monitor/meson.build
@@ -9,4 +9,4 @@ system_ss.add(files(
 system_ss.add([spice_headers, files('qmp-cmds.c')])
 
 specific_ss.add(when: 'CONFIG_SYSTEM_ONLY',
-		if_true: [files( 'hmp-cmds-target.c', 'hmp-target.c'), spice])
+                if_true: [files('hmp-target.c'), spice])
-- 
2.52.0



^ permalink raw reply related	[flat|nested] 15+ messages in thread

* Re: [PATCH v2 2/7] monitor/hmp: Make memory_dump() @is_physical argument a boolean
  2025-12-29 23:15 ` [PATCH v2 2/7] monitor/hmp: Make memory_dump() @is_physical argument a boolean Philippe Mathieu-Daudé
@ 2025-12-29 23:48   ` Dr. David Alan Gilbert
  2025-12-30  6:20   ` Manos Pitsidianakis
  1 sibling, 0 replies; 15+ messages in thread
From: Dr. David Alan Gilbert @ 2025-12-29 23:48 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé
  Cc: qemu-devel, Pierrick Bouvier, Anton Johansson,
	Manos Pitsidianakis

* Philippe Mathieu-Daudé (philmd@linaro.org) wrote:
> Suggested-by: Dr. David Alan Gilbert <dave@treblig.org>
> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>

Reviewed-by: Dr. David Alan Gilbert <dave@treblig.org>

> ---
>  monitor/hmp-cmds-target.c | 6 +++---
>  1 file changed, 3 insertions(+), 3 deletions(-)
> 
> diff --git a/monitor/hmp-cmds-target.c b/monitor/hmp-cmds-target.c
> index 2976f986d35..51dcb9e314c 100644
> --- a/monitor/hmp-cmds-target.c
> +++ b/monitor/hmp-cmds-target.c
> @@ -122,7 +122,7 @@ void hmp_info_registers(Monitor *mon, const QDict *qdict)
>  }
>  
>  static void memory_dump(Monitor *mon, int count, int format, int wsize,
> -                        hwaddr addr, int is_physical)
> +                        hwaddr addr, bool is_physical)
>  {
>      int l, line_size, i, max_digits, len;
>      uint8_t buf[16];
> @@ -237,7 +237,7 @@ void hmp_memory_dump(Monitor *mon, const QDict *qdict)
>      int size = qdict_get_int(qdict, "size");
>      target_long addr = qdict_get_int(qdict, "addr");
>  
> -    memory_dump(mon, count, format, size, addr, 0);
> +    memory_dump(mon, count, format, size, addr, false);
>  }
>  
>  void hmp_physical_memory_dump(Monitor *mon, const QDict *qdict)
> @@ -247,7 +247,7 @@ void hmp_physical_memory_dump(Monitor *mon, const QDict *qdict)
>      int size = qdict_get_int(qdict, "size");
>      hwaddr addr = qdict_get_int(qdict, "addr");
>  
> -    memory_dump(mon, count, format, size, addr, 1);
> +    memory_dump(mon, count, format, size, addr, true);
>  }
>  
>  void *gpa2hva(MemoryRegion **p_mr, hwaddr addr, uint64_t size, Error **errp)
> -- 
> 2.52.0
> 
-- 
 -----Open up your eyes, open up your mind, open up your code -------   
/ Dr. David Alan Gilbert    |       Running GNU/Linux       | Happy  \ 
\        dave @ treblig.org |                               | In Hex /
 \ _________________________|_____ http://www.treblig.org   |_______/


^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v2 2/7] monitor/hmp: Make memory_dump() @is_physical argument a boolean
  2025-12-29 23:15 ` [PATCH v2 2/7] monitor/hmp: Make memory_dump() @is_physical argument a boolean Philippe Mathieu-Daudé
  2025-12-29 23:48   ` Dr. David Alan Gilbert
@ 2025-12-30  6:20   ` Manos Pitsidianakis
  1 sibling, 0 replies; 15+ messages in thread
From: Manos Pitsidianakis @ 2025-12-30  6:20 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé
  Cc: qemu-devel, Pierrick Bouvier, Anton Johansson,
	Dr. David Alan Gilbert

On Tue, Dec 30, 2025 at 1:16 AM Philippe Mathieu-Daudé
<philmd@linaro.org> wrote:
>
> Suggested-by: Dr. David Alan Gilbert <dave@treblig.org>
> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
> ---

Reviewed-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>

>  monitor/hmp-cmds-target.c | 6 +++---
>  1 file changed, 3 insertions(+), 3 deletions(-)
>
> diff --git a/monitor/hmp-cmds-target.c b/monitor/hmp-cmds-target.c
> index 2976f986d35..51dcb9e314c 100644
> --- a/monitor/hmp-cmds-target.c
> +++ b/monitor/hmp-cmds-target.c
> @@ -122,7 +122,7 @@ void hmp_info_registers(Monitor *mon, const QDict *qdict)
>  }
>
>  static void memory_dump(Monitor *mon, int count, int format, int wsize,
> -                        hwaddr addr, int is_physical)
> +                        hwaddr addr, bool is_physical)
>  {
>      int l, line_size, i, max_digits, len;
>      uint8_t buf[16];
> @@ -237,7 +237,7 @@ void hmp_memory_dump(Monitor *mon, const QDict *qdict)
>      int size = qdict_get_int(qdict, "size");
>      target_long addr = qdict_get_int(qdict, "addr");
>
> -    memory_dump(mon, count, format, size, addr, 0);
> +    memory_dump(mon, count, format, size, addr, false);
>  }
>
>  void hmp_physical_memory_dump(Monitor *mon, const QDict *qdict)
> @@ -247,7 +247,7 @@ void hmp_physical_memory_dump(Monitor *mon, const QDict *qdict)
>      int size = qdict_get_int(qdict, "size");
>      hwaddr addr = qdict_get_int(qdict, "addr");
>
> -    memory_dump(mon, count, format, size, addr, 1);
> +    memory_dump(mon, count, format, size, addr, true);
>  }
>
>  void *gpa2hva(MemoryRegion **p_mr, hwaddr addr, uint64_t size, Error **errp)
> --
> 2.52.0
>


^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v2 0/7] monitor: Merge hmp-cmds-target.c within hmp-cmds.c
  2025-12-29 23:15 [PATCH v2 0/7] monitor: Merge hmp-cmds-target.c within hmp-cmds.c Philippe Mathieu-Daudé
                   ` (6 preceding siblings ...)
  2025-12-29 23:15 ` [PATCH v2 7/7] monitor/hmp: Merge hmp-cmds-target.c within hmp-cmds.c Philippe Mathieu-Daudé
@ 2025-12-30 18:15 ` Philippe Mathieu-Daudé
  7 siblings, 0 replies; 15+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-12-30 18:15 UTC (permalink / raw)
  To: qemu-devel
  Cc: Pierrick Bouvier, Anton Johansson, Manos Pitsidianakis,
	Dr. David Alan Gilbert

On 30/12/25 00:15, Philippe Mathieu-Daudé wrote:

> Philippe Mathieu-Daudé (7):
>    monitor/hmp: Replace target_ulong -> vaddr in hmp_gva2gpa()
>    monitor/hmp: Make memory_dump() @is_physical argument a boolean
>    monitor/hmp: Use plain uint64_t @addr argument in memory_dump()
>    monitor/hmp: Remove target_long uses in memory_dump()
>    monitor/hmp: Inline ld[uw,l,q]_p() calls in memory_dump()
>    monitor/hmp: Fix coding style in hmp-cmds-target.c
>    monitor/hmp: Merge hmp-cmds-target.c within hmp-cmds.c

Series queued, thanks.


^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v2 1/7] monitor/hmp: Replace target_ulong -> vaddr in hmp_gva2gpa()
  2025-12-29 23:15 ` [PATCH v2 1/7] monitor/hmp: Replace target_ulong -> vaddr in hmp_gva2gpa() Philippe Mathieu-Daudé
@ 2026-01-08  7:30   ` Markus Armbruster
  2026-01-11  0:07     ` Richard Henderson
  0 siblings, 1 reply; 15+ messages in thread
From: Markus Armbruster @ 2026-01-08  7:30 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé
  Cc: qemu-devel, Pierrick Bouvier, Anton Johansson,
	Manos Pitsidianakis, Dr. David Alan Gilbert

Philippe Mathieu-Daudé <philmd@linaro.org> writes:

> cpu_get_phys_page_debug() takes a vaddr type since commit
> 00b941e581b ("cpu: Turn cpu_get_phys_page_debug() into a CPUClass
> hook").
>
> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
> Reviewed-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>
> Reviewed-by: Dr. David Alan Gilbert <dave@treblig.org>
> ---
>  monitor/hmp-cmds-target.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/monitor/hmp-cmds-target.c b/monitor/hmp-cmds-target.c
> index e9820611466..2976f986d35 100644
> --- a/monitor/hmp-cmds-target.c
> +++ b/monitor/hmp-cmds-target.c
> @@ -301,7 +301,7 @@ void hmp_gpa2hva(Monitor *mon, const QDict *qdict)
>  
>  void hmp_gva2gpa(Monitor *mon, const QDict *qdict)
>  {
> -    target_ulong addr = qdict_get_int(qdict, "addr");
> +    vaddr addr = qdict_get_int(qdict, "addr");
>      CPUState *cs = mon_get_cpu(mon);
>      hwaddr gpa;

       if (!cs) {
           monitor_printf(mon, "No cpu\n");
           return;
       }

       gpa  = cpu_get_phys_page_debug(cs, addr & TARGET_PAGE_MASK);
       if (gpa == -1) {
           monitor_printf(mon, "Unmapped\n");
       } else {
           monitor_printf(mon, "gpa: 0x%" HWADDR_PRIx "\n",
                          gpa + (addr & ~TARGET_PAGE_MASK));

Pardon my ignorant question: is HWADDR_PRIx appropriate for vaddr?

       }
   }



^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v2 1/7] monitor/hmp: Replace target_ulong -> vaddr in hmp_gva2gpa()
  2026-01-08  7:30   ` Markus Armbruster
@ 2026-01-11  0:07     ` Richard Henderson
  2026-01-12  6:33       ` Markus Armbruster
  0 siblings, 1 reply; 15+ messages in thread
From: Richard Henderson @ 2026-01-11  0:07 UTC (permalink / raw)
  To: qemu-devel

On 1/8/26 18:30, Markus Armbruster wrote:
> Philippe Mathieu-Daudé <philmd@linaro.org> writes:
> 
>> cpu_get_phys_page_debug() takes a vaddr type since commit
>> 00b941e581b ("cpu: Turn cpu_get_phys_page_debug() into a CPUClass
>> hook").
>>
>> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
>> Reviewed-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>
>> Reviewed-by: Dr. David Alan Gilbert <dave@treblig.org>
>> ---
>>   monitor/hmp-cmds-target.c | 2 +-
>>   1 file changed, 1 insertion(+), 1 deletion(-)
>>
>> diff --git a/monitor/hmp-cmds-target.c b/monitor/hmp-cmds-target.c
>> index e9820611466..2976f986d35 100644
>> --- a/monitor/hmp-cmds-target.c
>> +++ b/monitor/hmp-cmds-target.c
>> @@ -301,7 +301,7 @@ void hmp_gpa2hva(Monitor *mon, const QDict *qdict)
>>   
>>   void hmp_gva2gpa(Monitor *mon, const QDict *qdict)
>>   {
>> -    target_ulong addr = qdict_get_int(qdict, "addr");
>> +    vaddr addr = qdict_get_int(qdict, "addr");
>>       CPUState *cs = mon_get_cpu(mon);
>>       hwaddr gpa;
> 
>         if (!cs) {
>             monitor_printf(mon, "No cpu\n");
>             return;
>         }
> 
>         gpa  = cpu_get_phys_page_debug(cs, addr & TARGET_PAGE_MASK);
>         if (gpa == -1) {
>             monitor_printf(mon, "Unmapped\n");
>         } else {
>             monitor_printf(mon, "gpa: 0x%" HWADDR_PRIx "\n",
>                            gpa + (addr & ~TARGET_PAGE_MASK));
> 
> Pardon my ignorant question: is HWADDR_PRIx appropriate for vaddr?

The print argument is gpa + offset, and hpa is hwaddr.


r~


^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v2 1/7] monitor/hmp: Replace target_ulong -> vaddr in hmp_gva2gpa()
  2026-01-11  0:07     ` Richard Henderson
@ 2026-01-12  6:33       ` Markus Armbruster
  2026-01-12 21:26         ` Richard Henderson
  0 siblings, 1 reply; 15+ messages in thread
From: Markus Armbruster @ 2026-01-12  6:33 UTC (permalink / raw)
  To: Richard Henderson; +Cc: qemu-devel

Richard Henderson <richard.henderson@linaro.org> writes:

> On 1/8/26 18:30, Markus Armbruster wrote:
>> Philippe Mathieu-Daudé <philmd@linaro.org> writes:
>> 
>>> cpu_get_phys_page_debug() takes a vaddr type since commit
>>> 00b941e581b ("cpu: Turn cpu_get_phys_page_debug() into a CPUClass
>>> hook").
>>>
>>> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
>>> Reviewed-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>
>>> Reviewed-by: Dr. David Alan Gilbert <dave@treblig.org>
>>> ---
>>>   monitor/hmp-cmds-target.c | 2 +-
>>>   1 file changed, 1 insertion(+), 1 deletion(-)
>>>
>>> diff --git a/monitor/hmp-cmds-target.c b/monitor/hmp-cmds-target.c
>>> index e9820611466..2976f986d35 100644
>>> --- a/monitor/hmp-cmds-target.c
>>> +++ b/monitor/hmp-cmds-target.c
>>> @@ -301,7 +301,7 @@ void hmp_gpa2hva(Monitor *mon, const QDict *qdict)
>>>   
>>>   void hmp_gva2gpa(Monitor *mon, const QDict *qdict)
>>>   {
>>> -    target_ulong addr = qdict_get_int(qdict, "addr");
>>> +    vaddr addr = qdict_get_int(qdict, "addr");
>>>       CPUState *cs = mon_get_cpu(mon);
>>>       hwaddr gpa;
>> 
>>         if (!cs) {
>>             monitor_printf(mon, "No cpu\n");
>>             return;
>>         }
>> 
>>         gpa  = cpu_get_phys_page_debug(cs, addr & TARGET_PAGE_MASK);
>>         if (gpa == -1) {
>>             monitor_printf(mon, "Unmapped\n");
>>         } else {
>>             monitor_printf(mon, "gpa: 0x%" HWADDR_PRIx "\n",
>>                            gpa + (addr & ~TARGET_PAGE_MASK));
>> 
>> Pardon my ignorant question: is HWADDR_PRIx appropriate for vaddr?
>
> The print argument is gpa + offset, and hpa is hwaddr.

So, hwaddr must be at least as wide as vaddr?



^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v2 1/7] monitor/hmp: Replace target_ulong -> vaddr in hmp_gva2gpa()
  2026-01-12  6:33       ` Markus Armbruster
@ 2026-01-12 21:26         ` Richard Henderson
  0 siblings, 0 replies; 15+ messages in thread
From: Richard Henderson @ 2026-01-12 21:26 UTC (permalink / raw)
  To: Markus Armbruster; +Cc: qemu-devel

On 1/12/26 17:33, Markus Armbruster wrote:
>>> Pardon my ignorant question: is HWADDR_PRIx appropriate for vaddr?
>>
>> The print argument is gpa + offset, and hpa is hwaddr.
> 
> So, hwaddr must be at least as wide as vaddr?
> 

They're both uint64_t, always, just with different names.


r~


^ permalink raw reply	[flat|nested] 15+ messages in thread

end of thread, other threads:[~2026-01-12 21:27 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-12-29 23:15 [PATCH v2 0/7] monitor: Merge hmp-cmds-target.c within hmp-cmds.c Philippe Mathieu-Daudé
2025-12-29 23:15 ` [PATCH v2 1/7] monitor/hmp: Replace target_ulong -> vaddr in hmp_gva2gpa() Philippe Mathieu-Daudé
2026-01-08  7:30   ` Markus Armbruster
2026-01-11  0:07     ` Richard Henderson
2026-01-12  6:33       ` Markus Armbruster
2026-01-12 21:26         ` Richard Henderson
2025-12-29 23:15 ` [PATCH v2 2/7] monitor/hmp: Make memory_dump() @is_physical argument a boolean Philippe Mathieu-Daudé
2025-12-29 23:48   ` Dr. David Alan Gilbert
2025-12-30  6:20   ` Manos Pitsidianakis
2025-12-29 23:15 ` [PATCH v2 3/7] monitor/hmp: Use plain uint64_t @addr argument in memory_dump() Philippe Mathieu-Daudé
2025-12-29 23:15 ` [PATCH v2 4/7] monitor/hmp: Remove target_long uses " Philippe Mathieu-Daudé
2025-12-29 23:15 ` [PATCH v2 5/7] monitor/hmp: Inline ld[uw, l, q]_p() calls " Philippe Mathieu-Daudé
2025-12-29 23:15 ` [PATCH v2 6/7] monitor/hmp: Fix coding style in hmp-cmds-target.c Philippe Mathieu-Daudé
2025-12-29 23:15 ` [PATCH v2 7/7] monitor/hmp: Merge hmp-cmds-target.c within hmp-cmds.c Philippe Mathieu-Daudé
2025-12-30 18:15 ` [PATCH v2 0/7] monitor: " Philippe Mathieu-Daudé

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.