[PATCH 08/13] hw/riscv: add n-trace ResourceFull rv-trace-message

Konstantin Semichastnov <[email protected]>
Newsgroups org.nongnu.qemu-riscv,org.nongnu.qemu-devel
Message-ID <[email protected]>
Add generation, encoding and sending logic for N-Trace ResourceFull
message.

Signed-off-by: Konstantin Semichastnov <[email protected]>
---
 hw/riscv/rv-trace-messages.c | 29 +++++++++++++++++++++++++++++
 hw/riscv/rv-trace-messages.h |  1 +
 hw/riscv/trace-encoder.c     |  5 +++--
 3 files changed, 33 insertions(+), 2 deletions(-)

diff --git a/hw/riscv/rv-trace-messages.c b/hw/riscv/rv-trace-messages.c
index 2ee38c4354..8a9a3c6955 100644
--- a/hw/riscv/rv-trace-messages.c
+++ b/hw/riscv/rv-trace-messages.c
@@ -359,10 +359,12 @@ typedef enum {
     WIDTH_FADDR  = 63,
     WIDTH_UADDR  = 63,
     WIDTH_HIST   = 32,
+    WIDTH_RCODE  = 4,
 } NTraceFieldWidth;
 
 typedef enum {
     TCODE_PROG_TRACE_SYNC        = 0x9,
+    TCODE_RESOURCE_FULL          = 0x1b,
     TCODE_INDIRECT_BRANCH_HIST   = 0x1c,
 } NTraceTcodeFieldValues;
 
@@ -371,6 +373,10 @@ typedef enum {
     SYNC_TRACE_ENABLED = 5,
 } NTraceSyncFieldValues;
 
+typedef enum {
+    RCODE_HIST_PRESENT = 1,
+} NTraceRcodeFieldValues;
+
 typedef struct NTraceFieldPayload {
     NTraceFieldType type;
     NTraceFieldWidth width;
@@ -425,6 +431,14 @@ typedef struct NTraceFieldPayload {
         .width = WIDTH_HIST, \
         .value = (val),      \
     }
+
+#define PAYLOAD_RCODE(val)    \
+    {                         \
+        .type = FIELD_FIXED,  \
+        .width = WIDTH_RCODE, \
+        .value = (val),       \
+    }
+
 #define PAYLOAD_END()      \
     {                      \
         .type = FIELD_END, \
@@ -517,6 +531,21 @@ size_t rv_ntrace_gen_encoded_prog_trace_sync_msg(uint8_t *buf, uint64_t faddr)
     return rv_ntrace_gen_encoded_msg(buf, msg_fields);
 }
 
+size_t rv_ntrace_gen_encoded_resource_full_msg(uint8_t *buf, uint32_t hist)
+{
+    const NTraceFieldPayload msg_fields[] = {
+        PAYLOAD_TCODE(TCODE_RESOURCE_FULL),
+        /* SRC field is not supported for now */
+        PAYLOAD_RCODE(RCODE_HIST_PRESENT),
+        /* I-CNT overflow is not supported for now */
+        PAYLOAD_HIST(hist),
+        /* TSTAMP field is not supported for now */
+        PAYLOAD_END(),
+    };
+
+    return rv_ntrace_gen_encoded_msg(buf, msg_fields);
+}
+
 size_t rv_ntrace_gen_indirect_branch_hist_msg(uint8_t *buf, uint8_t btype,
                                               uint32_t icnt, uint64_t uaddr,
                                               uint32_t hist)
diff --git a/hw/riscv/rv-trace-messages.h b/hw/riscv/rv-trace-messages.h
index d113129d65..7ed8737d14 100644
--- a/hw/riscv/rv-trace-messages.h
+++ b/hw/riscv/rv-trace-messages.h
@@ -38,6 +38,7 @@ size_t rv_etrace_gen_encoded_format1(uint8_t *buf,
                                      bool notify, bool updiscon);
 
 size_t rv_ntrace_gen_encoded_prog_trace_sync_msg(uint8_t *buf, uint64_t faddr);
+size_t rv_ntrace_gen_encoded_resource_full_msg(uint8_t *buf, uint32_t hist);
 size_t rv_ntrace_gen_indirect_branch_hist_msg(uint8_t *buf, uint8_t btype,
                                               uint32_t icnt, uint64_t uaddr,
                                               uint32_t hist);
diff --git a/hw/riscv/trace-encoder.c b/hw/riscv/trace-encoder.c
index face6f83b7..302458bfba 100644
--- a/hw/riscv/trace-encoder.c
+++ b/hw/riscv/trace-encoder.c
@@ -694,8 +694,9 @@ static void trencoder_send_branch_map(Object *trencoder_obj)
     uint8_t msg_size;
 
     if (te->ntrace) {
-        /* send ResourceFull message */
-        return;
+        uint32_t hist = rv_ntrace_encode_and_reset_branch_map(te);
+
+        msg_size = rv_ntrace_gen_encoded_resource_full_msg(msg, hist);
     } else {
         msg_size = rv_etrace_gen_encoded_format1_noaddr(msg,
                                                         te->branches,

-- 
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.