@samitouri / QOSamiQemu / commits / bbea2f1a6d

hw/hexagon: Add global register tracing

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> Signed-off-by: Brian Cain <brian.cain@oss.qualcomm.com>

Brian Cain committed Jun 22, 2026 at 15:28 UTC bbea2f1a6d22ad57defddc530d7c92dcb7513a8b
4 files changed +79
hw/hexagon/hexagon_globalreg.c
+73
@@ -16,11 +16,82 @@
16 #include "target/hexagon/cpu.h"
17 #include "target/hexagon/hex_regs.h"
18 #include "qemu/log.h"
19 +#include "trace.h"
20 #include "qapi/error.h"
21
22 #define IMMUTABLE (~0)
23 #define INVALID_REG_VAL 0xdeadbeef
24
25 +static const char *hex_sreg_names[] = {
26 + [HEX_SREG_SGP0] = "sgp0",
27 + [HEX_SREG_SGP1] = "sgp1",
28 + [HEX_SREG_STID] = "stid",
29 + [HEX_SREG_ELR] = "elr",
30 + [HEX_SREG_BADVA0] = "badva0",
31 + [HEX_SREG_BADVA1] = "badva1",
32 + [HEX_SREG_SSR] = "ssr",
33 + [HEX_SREG_CCR] = "ccr",
34 + [HEX_SREG_HTID] = "htid",
35 + [HEX_SREG_BADVA] = "badva",
36 + [HEX_SREG_IMASK] = "imask",
37 + [HEX_SREG_GEVB] = "gevb",
38 + [HEX_SREG_EVB] = "evb",
39 + [HEX_SREG_MODECTL] = "modectl",
40 + [HEX_SREG_SYSCFG] = "syscfg",
41 + [HEX_SREG_IPENDAD] = "ipendad",
42 + [HEX_SREG_VID] = "vid",
43 + [HEX_SREG_VID1] = "vid1",
44 + [HEX_SREG_BESTWAIT] = "bestwait",
45 + [HEX_SREG_IEL] = "iel",
46 + [HEX_SREG_SCHEDCFG] = "schedcfg",
47 + [HEX_SREG_IAHL] = "iahl",
48 + [HEX_SREG_CFGBASE] = "cfgbase",
49 + [HEX_SREG_DIAG] = "diag",
50 + [HEX_SREG_REV] = "rev",
51 + [HEX_SREG_PCYCLELO] = "pcyclelo",
52 + [HEX_SREG_PCYCLEHI] = "pcyclehi",
53 + [HEX_SREG_ISDBST] = "isdbst",
54 + [HEX_SREG_ISDBCFG0] = "isdbcfg0",
55 + [HEX_SREG_ISDBCFG1] = "isdbcfg1",
56 + [HEX_SREG_LIVELOCK] = "livelock",
57 + [HEX_SREG_BRKPTPC0] = "brkptpc0",
58 + [HEX_SREG_BRKPTCFG0] = "brkptcfg0",
59 + [HEX_SREG_BRKPTPC1] = "brkptpc1",
60 + [HEX_SREG_BRKPTCFG1] = "brkptcfg1",
61 + [HEX_SREG_ISDBMBXIN] = "isdbmbxin",
62 + [HEX_SREG_ISDBMBXOUT] = "isdbmbxout",
63 + [HEX_SREG_ISDBEN] = "isdben",
64 + [HEX_SREG_ISDBGPR] = "isdbgpr",
65 + [HEX_SREG_PMUCNT4] = "pmucnt4",
66 + [HEX_SREG_PMUCNT5] = "pmucnt5",
67 + [HEX_SREG_PMUCNT6] = "pmucnt6",
68 + [HEX_SREG_PMUCNT7] = "pmucnt7",
69 + [HEX_SREG_PMUCNT0] = "pmucnt0",
70 + [HEX_SREG_PMUCNT1] = "pmucnt1",
71 + [HEX_SREG_PMUCNT2] = "pmucnt2",
72 + [HEX_SREG_PMUCNT3] = "pmucnt3",
73 + [HEX_SREG_PMUEVTCFG] = "pmuevtcfg",
74 + [HEX_SREG_PMUSTID0] = "pmustid0",
75 + [HEX_SREG_PMUEVTCFG1] = "pmuevtcfg1",
76 + [HEX_SREG_PMUSTID1] = "pmustid1",
77 + [HEX_SREG_TIMERLO] = "timerlo",
78 + [HEX_SREG_TIMERHI] = "timerhi",
79 + [HEX_SREG_PMUCFG] = "pmucfg",
80 + [HEX_SREG_S59] = "s59",
81 + [HEX_SREG_S60] = "s60",
82 + [HEX_SREG_S61] = "s61",
83 + [HEX_SREG_S62] = "s62",
84 + [HEX_SREG_S63] = "s63",
85 +};
86 +
87 +static const char *get_sreg_name(uint32_t reg)
88 +{
89 + if (reg < ARRAY_SIZE(hex_sreg_names) && hex_sreg_names[reg]) {
90 + return hex_sreg_names[reg];
91 + }
92 + return "UNKNOWN";
93 +}
94 +
95 /* Global system register mutability masks */
96 static const uint32_t global_sreg_immut_masks[NUM_SREGS] = {
97 [HEX_SREG_EVB] = 0x000000ff,
@@ -77,6 +148,7 @@ uint32_t hexagon_globalreg_read(HexagonGlobalRegState *s, uint32_t reg,
148
149 value = s->regs[reg];
150
151 + trace_hexagon_globalreg_read(htid, get_sreg_name(reg), value);
152 return value;
153 }
154
@@ -89,6 +161,7 @@ void hexagon_globalreg_write(HexagonGlobalRegState *s, uint32_t reg,
161 g_assert(reg < NUM_SREGS);
162 g_assert(reg >= HEX_SREG_GLB_START);
163 s->regs[reg] = value;
164 + trace_hexagon_globalreg_write(htid, get_sreg_name(reg), value);
165 }
166
167 uint32_t hexagon_globalreg_masked_value(HexagonGlobalRegState *s, uint32_t reg,
hw/hexagon/trace-events new
+3
@@ -0,0 +1,3 @@
1 +# Hexagon global register access
2 +hexagon_globalreg_read(uint32_t htid, const char *reg_name, uint32_t value) "htid=%u reg=%s value=0x%x"
3 +hexagon_globalreg_write(uint32_t htid, const char *reg_name, uint32_t value) "htid=%u reg=%s value=0x%x"
hw/hexagon/trace.h new
+2
@@ -0,0 +1,2 @@
1 +/* SPDX-License-Identifier: GPL-2.0-or-later */
2 +#include "trace/trace-hw_hexagon.h"
meson.build
+1
@@ -3601,6 +3601,7 @@ if have_system
3601 'hw/display',
3602 'hw/dma',
3603 'hw/fsi',
3604 + 'hw/hexagon',
3605 'hw/hyperv',
3606 'hw/i2c',
3607 'hw/i3c',