[PATCH 04/13] hw/riscv/trace-encoder.c: align ntrace messages with ones

Konstantin Semichastnov <[email protected]>
Newsgroups org.nongnu.qemu-riscv,org.nongnu.qemu-devel
Message-ID <[email protected]>
N-Trace format requires idle bytes to be filled with 0xff, instead of
zeroes, like E-Trace format

Signed-off-by: Konstantin Semichastnov <[email protected]>
---
 hw/riscv/trace-encoder.c | 24 +++++++++++++++++++-----
 1 file changed, 19 insertions(+), 5 deletions(-)

diff --git a/hw/riscv/trace-encoder.c b/hw/riscv/trace-encoder.c
index 10e52e207e..703454c9b7 100644
--- a/hw/riscv/trace-encoder.c
+++ b/hw/riscv/trace-encoder.c
@@ -398,21 +398,35 @@ static void trencoder_send_message_smem(TraceEncoder *trencoder,
     hwaddr dest = trencoder_read_ramsink_writep(trencoder);
     bool wrapped = false;
 
+    if (trencoder->ntrace) {
+        /*
+         * RISC-V N-Trace 3.1. MSEO Sequences:
+         * idle bytes in N-Trace format are filled with 0xff, instead of zeroes
+         */
+        memset(msg + msg_size, 0xff, 4 - msg_size % 4);
+    }
     msg_size = QEMU_ALIGN_UP(msg_size, 4);
 
     /* clear trRamWrap before writing to SMEM */
     dest = FIELD_DP64(dest, TR_RAM_WP_LOW, WRAP, 0);
 
     /*
-     * Fill with null bytes if we can't fit the packet in
+     * Fill with idle bytes if we can't fit the packet in
      * ramlimit, set wrap and write the packet in ramstart.
      */
     if (dest + msg_size > trencoder->ramsink_ramlimit) {
-        g_autofree uint8_t *null_packet = NULL;
-        uint8_t null_size = trencoder->ramsink_ramlimit - dest;
+        g_autofree uint8_t *idle_packet = NULL;
+        uint8_t idle_size = trencoder->ramsink_ramlimit - dest;
 
-        null_packet = g_malloc0(null_size);
-        cpu_physical_memory_write(dest, null_packet, null_size);
+        idle_packet = g_malloc0(idle_size);
+        if (trencoder->ntrace) {
+            /*
+             * RISC-V N-Trace 3.1. MSEO Sequences:
+             * idle bytes in N-Trace format are filled with 0xff, instead of zeroes
+             */
+            memset(idle_packet, 0xff, idle_size);
+        }
+        cpu_physical_memory_write(dest, idle_packet, idle_size);
 
         dest = trencoder->ramsink_ramstart;
         wrapped = true;

-- 
2.43.0
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.