[PATCH-for-11.1 v2 3/7] target/xtensa: Have 'info tlb' dump MMU information on monitor

Philippe Mathieu-Daudé posted 7 patches 1 day, 21 hours ago
Maintainers: Laurent Vivier <laurent@vivier.eu>, Nicholas Piggin <npiggin@gmail.com>, Chinmay Rath <rathc@linux.ibm.com>, Glenn Miles <milesg@linux.ibm.com>, Max Filippov <jcmvbkbc@gmail.com>
[PATCH-for-11.1 v2 3/7] target/xtensa: Have 'info tlb' dump MMU information on monitor
Posted by Philippe Mathieu-Daudé 1 day, 21 hours ago
Currently 'info tlb' dumps the MMU information on stdout.
Propagate the @Monitor argument and replace qemu_printf() by
monitor_printf() -- or monitor_puts when no formatting -- to
dump information over the monitor (which is not always stdout).

Fixes: d41160a3e64 ("Sparc: implement monitor command 'info tlb'")
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
 target/xtensa/cpu.h        |  2 +-
 target/xtensa/mmu_helper.c | 44 +++++++++++++++++++-------------------
 target/xtensa/monitor.c    |  2 +-
 3 files changed, 24 insertions(+), 24 deletions(-)

diff --git a/target/xtensa/cpu.h b/target/xtensa/cpu.h
index dfd2ceab7cf..caec22bb742 100644
--- a/target/xtensa/cpu.h
+++ b/target/xtensa/cpu.h
@@ -693,7 +693,7 @@ int xtensa_get_physical_addr(CPUXtensaState *env, bool update_tlb,
         uint32_t vaddr, int is_write, int mmu_idx,
         uint32_t *paddr, uint32_t *page_size, unsigned *access);
 void reset_mmu(CPUXtensaState *env);
-void dump_mmu(CPUXtensaState *env);
+void dump_mmu(Monitor *mon, CPUXtensaState *env);
 
 static inline MemoryRegion *xtensa_get_er_region(CPUXtensaState *env)
 {
diff --git a/target/xtensa/mmu_helper.c b/target/xtensa/mmu_helper.c
index 71330fc84b9..9dbf671228b 100644
--- a/target/xtensa/mmu_helper.c
+++ b/target/xtensa/mmu_helper.c
@@ -27,7 +27,6 @@
 
 #include "qemu/osdep.h"
 #include "qemu/log.h"
-#include "qemu/qemu-print.h"
 #include "qemu/units.h"
 #include "cpu.h"
 #include "exec/helper-proto.h"
@@ -38,6 +37,7 @@
 #include "exec/page-protection.h"
 #include "exec/target_page.h"
 #include "system/memory.h"
+#include "monitor/monitor.h"
 
 #define XTENSA_MPU_SEGMENT_MASK 0x0000001f
 #define XTENSA_MPU_ACC_RIGHTS_MASK 0x00000f00
@@ -1082,7 +1082,7 @@ int xtensa_get_physical_addr(CPUXtensaState *env, bool update_tlb,
     }
 }
 
-static void dump_tlb(CPUXtensaState *env, bool dtlb)
+static void dump_tlb(Monitor *mon, CPUXtensaState *env, bool dtlb)
 {
     unsigned wi, ei;
     const xtensa_tlb *conf =
@@ -1121,11 +1121,11 @@ static void dump_tlb(CPUXtensaState *env, bool dtlb)
 
                 if (print_header) {
                     print_header = false;
-                    qemu_printf("Way %u (%d %s)\n", wi, sz, sz_text);
-                    qemu_printf("\tVaddr       Paddr       ASID  Attr RWX Cache\n"
+                    monitor_printf(mon, "Way %u (%d %s)\n", wi, sz, sz_text);
+                    monitor_puts(mon, "\tVaddr       Paddr       ASID  Attr RWX Cache\n"
                                 "\t----------  ----------  ----  ---- --- -------\n");
                 }
-                qemu_printf("\t0x%08x  0x%08x  0x%02x  0x%02x %c%c%c %s\n",
+                monitor_printf(mon, "\t0x%08x  0x%08x  0x%02x  0x%02x %c%c%c %s\n",
                             entry->vaddr,
                             entry->paddr,
                             entry->asid,
@@ -1140,12 +1140,12 @@ static void dump_tlb(CPUXtensaState *env, bool dtlb)
     }
 }
 
-static void dump_mpu(CPUXtensaState *env,
+static void dump_mpu(Monitor *mon, CPUXtensaState *env,
                      const xtensa_mpu_entry *entry, unsigned n)
 {
     unsigned i;
 
-    qemu_printf("\t%s  Vaddr       Attr        Ring0  Ring1  System Type    CPU cache\n"
+    monitor_printf(mon, "\t%s  Vaddr       Attr        Ring0  Ring1  System Type    CPU cache\n"
                 "\t%s  ----------  ----------  -----  -----  -------------  ---------\n",
                 env ? "En" : "  ",
                 env ? "--" : "  ");
@@ -1157,7 +1157,7 @@ static void dump_mpu(CPUXtensaState *env,
         unsigned type = mpu_attr_to_type(attr);
         char cpu_cache = (type & XTENSA_MPU_TYPE_CPU_CACHE) ? '-' : ' ';
 
-        qemu_printf("\t %c  0x%08x  0x%08x   %c%c%c    %c%c%c   ",
+        monitor_printf(mon, "\t %c  0x%08x  0x%08x   %c%c%c    %c%c%c   ",
                     env ?
                     ((env->sregs[MPUENB] & (1u << i)) ? '+' : '-') : ' ',
                     entry[i].vaddr, attr,
@@ -1170,19 +1170,19 @@ static void dump_mpu(CPUXtensaState *env,
 
         switch (type & XTENSA_MPU_SYSTEM_TYPE_MASK) {
         case XTENSA_MPU_SYSTEM_TYPE_DEVICE:
-            qemu_printf("Device %cB %3s\n",
+            monitor_printf(mon, "Device %cB %3s\n",
                         (type & XTENSA_MPU_TYPE_B) ? ' ' : 'n',
                         (type & XTENSA_MPU_TYPE_INT) ? "int" : "");
             break;
         case XTENSA_MPU_SYSTEM_TYPE_NC:
-            qemu_printf("Sys NC %cB      %c%c%c\n",
+            monitor_printf(mon, "Sys NC %cB      %c%c%c\n",
                         (type & XTENSA_MPU_TYPE_B) ? ' ' : 'n',
                         (type & XTENSA_MPU_TYPE_CPU_R) ? 'r' : cpu_cache,
                         (type & XTENSA_MPU_TYPE_CPU_W) ? 'w' : cpu_cache,
                         (type & XTENSA_MPU_TYPE_CPU_C) ? 'c' : cpu_cache);
             break;
         case XTENSA_MPU_SYSTEM_TYPE_C:
-            qemu_printf("Sys  C %c%c%c     %c%c%c\n",
+            monitor_printf(mon, "Sys  C %c%c%c     %c%c%c\n",
                         (type & XTENSA_MPU_TYPE_SYS_R) ? 'R' : '-',
                         (type & XTENSA_MPU_TYPE_SYS_W) ? 'W' : '-',
                         (type & XTENSA_MPU_TYPE_SYS_C) ? 'C' : '-',
@@ -1191,29 +1191,29 @@ static void dump_mpu(CPUXtensaState *env,
                         (type & XTENSA_MPU_TYPE_CPU_C) ? 'c' : cpu_cache);
             break;
         default:
-            qemu_printf("Unknown\n");
+            monitor_puts(mon, "Unknown\n");
             break;
         }
     }
 }
 
-void dump_mmu(CPUXtensaState *env)
+void dump_mmu(Monitor *mon, CPUXtensaState *env)
 {
     if (xtensa_option_bits_enabled(env->config,
                 XTENSA_OPTION_BIT(XTENSA_OPTION_REGION_PROTECTION) |
                 XTENSA_OPTION_BIT(XTENSA_OPTION_REGION_TRANSLATION) |
                 XTENSA_OPTION_BIT(XTENSA_OPTION_MMU))) {
 
-        qemu_printf("ITLB:\n");
-        dump_tlb(env, false);
-        qemu_printf("\nDTLB:\n");
-        dump_tlb(env, true);
+        monitor_puts(mon, "ITLB:\n");
+        dump_tlb(mon, env, false);
+        monitor_puts(mon, "\nDTLB:\n");
+        dump_tlb(mon, env, true);
     } else if (xtensa_option_enabled(env->config, XTENSA_OPTION_MPU)) {
-        qemu_printf("Foreground map:\n");
-        dump_mpu(env, env->mpu_fg, env->config->n_mpu_fg_segments);
-        qemu_printf("\nBackground map:\n");
-        dump_mpu(NULL, env->config->mpu_bg, env->config->n_mpu_bg_segments);
+        monitor_puts(mon, "Foreground map:\n");
+        dump_mpu(mon, env, env->mpu_fg, env->config->n_mpu_fg_segments);
+        monitor_puts(mon, "\nBackground map:\n");
+        dump_mpu(mon, NULL, env->config->mpu_bg, env->config->n_mpu_bg_segments);
     } else {
-        qemu_printf("No TLB for this CPU core\n");
+        monitor_puts(mon, "No TLB for this CPU core\n");
     }
 }
diff --git a/target/xtensa/monitor.c b/target/xtensa/monitor.c
index 2af84934f83..2761735f112 100644
--- a/target/xtensa/monitor.c
+++ b/target/xtensa/monitor.c
@@ -34,5 +34,5 @@ void hmp_info_tlb(Monitor *mon, const QDict *qdict)
         monitor_printf(mon, "No CPU available\n");
         return;
     }
-    dump_mmu(env1);
+    dump_mmu(mon, env1);
 }
-- 
2.53.0


Re: [PATCH-for-11.1 v2 3/7] target/xtensa: Have 'info tlb' dump MMU information on monitor
Posted by Max Filippov 1 day, 20 hours ago
On Fri, Mar 20, 2026 at 9:50 AM Philippe Mathieu-Daudé
<philmd@linaro.org> wrote:
>
> Currently 'info tlb' dumps the MMU information on stdout.
> Propagate the @Monitor argument and replace qemu_printf() by
> monitor_printf() -- or monitor_puts when no formatting -- to
> dump information over the monitor (which is not always stdout).
>
> Fixes: d41160a3e64 ("Sparc: implement monitor command 'info tlb'")

This commit reference doesn't look right, as none of the changed
code was introduced in that commit.

> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
> ---
>  target/xtensa/cpu.h        |  2 +-
>  target/xtensa/mmu_helper.c | 44 +++++++++++++++++++-------------------
>  target/xtensa/monitor.c    |  2 +-
>  3 files changed, 24 insertions(+), 24 deletions(-)
>
> diff --git a/target/xtensa/cpu.h b/target/xtensa/cpu.h
> index dfd2ceab7cf..caec22bb742 100644
> --- a/target/xtensa/cpu.h
> +++ b/target/xtensa/cpu.h
> @@ -693,7 +693,7 @@ int xtensa_get_physical_addr(CPUXtensaState *env, bool update_tlb,
>          uint32_t vaddr, int is_write, int mmu_idx,
>          uint32_t *paddr, uint32_t *page_size, unsigned *access);
>  void reset_mmu(CPUXtensaState *env);
> -void dump_mmu(CPUXtensaState *env);
> +void dump_mmu(Monitor *mon, CPUXtensaState *env);
>
>  static inline MemoryRegion *xtensa_get_er_region(CPUXtensaState *env)
>  {
> diff --git a/target/xtensa/mmu_helper.c b/target/xtensa/mmu_helper.c
> index 71330fc84b9..9dbf671228b 100644
> --- a/target/xtensa/mmu_helper.c
> +++ b/target/xtensa/mmu_helper.c
> @@ -27,7 +27,6 @@
>
>  #include "qemu/osdep.h"
>  #include "qemu/log.h"
> -#include "qemu/qemu-print.h"
>  #include "qemu/units.h"
>  #include "cpu.h"
>  #include "exec/helper-proto.h"
> @@ -38,6 +37,7 @@
>  #include "exec/page-protection.h"
>  #include "exec/target_page.h"
>  #include "system/memory.h"
> +#include "monitor/monitor.h"
>
>  #define XTENSA_MPU_SEGMENT_MASK 0x0000001f
>  #define XTENSA_MPU_ACC_RIGHTS_MASK 0x00000f00
> @@ -1082,7 +1082,7 @@ int xtensa_get_physical_addr(CPUXtensaState *env, bool update_tlb,
>      }
>  }
>
> -static void dump_tlb(CPUXtensaState *env, bool dtlb)
> +static void dump_tlb(Monitor *mon, CPUXtensaState *env, bool dtlb)
>  {
>      unsigned wi, ei;
>      const xtensa_tlb *conf =
> @@ -1121,11 +1121,11 @@ static void dump_tlb(CPUXtensaState *env, bool dtlb)
>
>                  if (print_header) {
>                      print_header = false;
> -                    qemu_printf("Way %u (%d %s)\n", wi, sz, sz_text);
> -                    qemu_printf("\tVaddr       Paddr       ASID  Attr RWX Cache\n"
> +                    monitor_printf(mon, "Way %u (%d %s)\n", wi, sz, sz_text);
> +                    monitor_puts(mon, "\tVaddr       Paddr       ASID  Attr RWX Cache\n"
>                                  "\t----------  ----------  ----  ---- --- -------\n");

These lines are aligned in the code same way as they are aligned
in the output. It'd be nice if this alignment could be preserved.

>                  }
> -                qemu_printf("\t0x%08x  0x%08x  0x%02x  0x%02x %c%c%c %s\n",
> +                monitor_printf(mon, "\t0x%08x  0x%08x  0x%02x  0x%02x %c%c%c %s\n",
>                              entry->vaddr,
>                              entry->paddr,
>                              entry->asid,
> @@ -1140,12 +1140,12 @@ static void dump_tlb(CPUXtensaState *env, bool dtlb)
>      }
>  }
>
> -static void dump_mpu(CPUXtensaState *env,
> +static void dump_mpu(Monitor *mon, CPUXtensaState *env,
>                       const xtensa_mpu_entry *entry, unsigned n)
>  {
>      unsigned i;
>
> -    qemu_printf("\t%s  Vaddr       Attr        Ring0  Ring1  System Type    CPU cache\n"
> +    monitor_printf(mon, "\t%s  Vaddr       Attr        Ring0  Ring1  System Type    CPU cache\n"
>                  "\t%s  ----------  ----------  -----  -----  -------------  ---------\n",

Same here.

>                  env ? "En" : "  ",
>                  env ? "--" : "  ");
> @@ -1157,7 +1157,7 @@ static void dump_mpu(CPUXtensaState *env,
>          unsigned type = mpu_attr_to_type(attr);
>          char cpu_cache = (type & XTENSA_MPU_TYPE_CPU_CACHE) ? '-' : ' ';
>
> -        qemu_printf("\t %c  0x%08x  0x%08x   %c%c%c    %c%c%c   ",
> +        monitor_printf(mon, "\t %c  0x%08x  0x%08x   %c%c%c    %c%c%c   ",
>                      env ?
>                      ((env->sregs[MPUENB] & (1u << i)) ? '+' : '-') : ' ',
>                      entry[i].vaddr, attr,
> @@ -1170,19 +1170,19 @@ static void dump_mpu(CPUXtensaState *env,
>
>          switch (type & XTENSA_MPU_SYSTEM_TYPE_MASK) {
>          case XTENSA_MPU_SYSTEM_TYPE_DEVICE:
> -            qemu_printf("Device %cB %3s\n",
> +            monitor_printf(mon, "Device %cB %3s\n",
>                          (type & XTENSA_MPU_TYPE_B) ? ' ' : 'n',
>                          (type & XTENSA_MPU_TYPE_INT) ? "int" : "");
>              break;
>          case XTENSA_MPU_SYSTEM_TYPE_NC:
> -            qemu_printf("Sys NC %cB      %c%c%c\n",
> +            monitor_printf(mon, "Sys NC %cB      %c%c%c\n",
>                          (type & XTENSA_MPU_TYPE_B) ? ' ' : 'n',
>                          (type & XTENSA_MPU_TYPE_CPU_R) ? 'r' : cpu_cache,
>                          (type & XTENSA_MPU_TYPE_CPU_W) ? 'w' : cpu_cache,
>                          (type & XTENSA_MPU_TYPE_CPU_C) ? 'c' : cpu_cache);
>              break;
>          case XTENSA_MPU_SYSTEM_TYPE_C:
> -            qemu_printf("Sys  C %c%c%c     %c%c%c\n",
> +            monitor_printf(mon, "Sys  C %c%c%c     %c%c%c\n",
>                          (type & XTENSA_MPU_TYPE_SYS_R) ? 'R' : '-',
>                          (type & XTENSA_MPU_TYPE_SYS_W) ? 'W' : '-',
>                          (type & XTENSA_MPU_TYPE_SYS_C) ? 'C' : '-',
> @@ -1191,29 +1191,29 @@ static void dump_mpu(CPUXtensaState *env,
>                          (type & XTENSA_MPU_TYPE_CPU_C) ? 'c' : cpu_cache);
>              break;
>          default:
> -            qemu_printf("Unknown\n");
> +            monitor_puts(mon, "Unknown\n");
>              break;
>          }
>      }
>  }
>
> -void dump_mmu(CPUXtensaState *env)
> +void dump_mmu(Monitor *mon, CPUXtensaState *env)
>  {
>      if (xtensa_option_bits_enabled(env->config,
>                  XTENSA_OPTION_BIT(XTENSA_OPTION_REGION_PROTECTION) |
>                  XTENSA_OPTION_BIT(XTENSA_OPTION_REGION_TRANSLATION) |
>                  XTENSA_OPTION_BIT(XTENSA_OPTION_MMU))) {
>
> -        qemu_printf("ITLB:\n");
> -        dump_tlb(env, false);
> -        qemu_printf("\nDTLB:\n");
> -        dump_tlb(env, true);
> +        monitor_puts(mon, "ITLB:\n");
> +        dump_tlb(mon, env, false);
> +        monitor_puts(mon, "\nDTLB:\n");
> +        dump_tlb(mon, env, true);
>      } else if (xtensa_option_enabled(env->config, XTENSA_OPTION_MPU)) {
> -        qemu_printf("Foreground map:\n");
> -        dump_mpu(env, env->mpu_fg, env->config->n_mpu_fg_segments);
> -        qemu_printf("\nBackground map:\n");
> -        dump_mpu(NULL, env->config->mpu_bg, env->config->n_mpu_bg_segments);
> +        monitor_puts(mon, "Foreground map:\n");
> +        dump_mpu(mon, env, env->mpu_fg, env->config->n_mpu_fg_segments);
> +        monitor_puts(mon, "\nBackground map:\n");
> +        dump_mpu(mon, NULL, env->config->mpu_bg, env->config->n_mpu_bg_segments);
>      } else {
> -        qemu_printf("No TLB for this CPU core\n");
> +        monitor_puts(mon, "No TLB for this CPU core\n");
>      }
>  }
> diff --git a/target/xtensa/monitor.c b/target/xtensa/monitor.c
> index 2af84934f83..2761735f112 100644
> --- a/target/xtensa/monitor.c
> +++ b/target/xtensa/monitor.c
> @@ -34,5 +34,5 @@ void hmp_info_tlb(Monitor *mon, const QDict *qdict)
>          monitor_printf(mon, "No CPU available\n");
>          return;
>      }
> -    dump_mmu(env1);
> +    dump_mmu(mon, env1);
>  }
> --
> 2.53.0
>


-- 
Thanks.
-- Max