hw/intc/arm_gicv3_its: Add trace events for commands
When debugging code that's using the ITS, it's helpful to see tracing of the ITS commands that the guest executes. Add suitable trace events. Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20220303202341.2232284-2-peter.maydell@linaro.org
This commit is contained in:
parent
41c5a0f791
commit
e40509801d
@ -366,6 +366,19 @@ static ItsCmdResult process_its_cmd(GICv3ITSState *s, const uint64_t *cmdpkt,
|
||||
|
||||
devid = (cmdpkt[0] & DEVID_MASK) >> DEVID_SHIFT;
|
||||
eventid = cmdpkt[1] & EVENTID_MASK;
|
||||
switch (cmd) {
|
||||
case INTERRUPT:
|
||||
trace_gicv3_its_cmd_int(devid, eventid);
|
||||
break;
|
||||
case CLEAR:
|
||||
trace_gicv3_its_cmd_clear(devid, eventid);
|
||||
break;
|
||||
case DISCARD:
|
||||
trace_gicv3_its_cmd_discard(devid, eventid);
|
||||
break;
|
||||
default:
|
||||
g_assert_not_reached();
|
||||
}
|
||||
return do_process_its_cmd(s, devid, eventid, cmd);
|
||||
}
|
||||
|
||||
@ -382,15 +395,16 @@ static ItsCmdResult process_mapti(GICv3ITSState *s, const uint64_t *cmdpkt,
|
||||
|
||||
devid = (cmdpkt[0] & DEVID_MASK) >> DEVID_SHIFT;
|
||||
eventid = cmdpkt[1] & EVENTID_MASK;
|
||||
icid = cmdpkt[2] & ICID_MASK;
|
||||
|
||||
if (ignore_pInt) {
|
||||
pIntid = eventid;
|
||||
trace_gicv3_its_cmd_mapi(devid, eventid, icid);
|
||||
} else {
|
||||
pIntid = (cmdpkt[1] & pINTID_MASK) >> pINTID_SHIFT;
|
||||
trace_gicv3_its_cmd_mapti(devid, eventid, icid, pIntid);
|
||||
}
|
||||
|
||||
icid = cmdpkt[2] & ICID_MASK;
|
||||
|
||||
if (devid >= s->dt.num_entries) {
|
||||
qemu_log_mask(LOG_GUEST_ERROR,
|
||||
"%s: invalid command attributes: devid %d>=%d",
|
||||
@ -484,6 +498,7 @@ static ItsCmdResult process_mapc(GICv3ITSState *s, const uint64_t *cmdpkt)
|
||||
} else {
|
||||
cte.rdbase = 0;
|
||||
}
|
||||
trace_gicv3_its_cmd_mapc(icid, cte.rdbase, cte.valid);
|
||||
|
||||
if (icid >= s->ct.num_entries) {
|
||||
qemu_log_mask(LOG_GUEST_ERROR, "ITS MAPC: invalid ICID 0x%d", icid);
|
||||
@ -539,6 +554,8 @@ static ItsCmdResult process_mapd(GICv3ITSState *s, const uint64_t *cmdpkt)
|
||||
dte.ittaddr = (cmdpkt[2] & ITTADDR_MASK) >> ITTADDR_SHIFT;
|
||||
dte.valid = cmdpkt[2] & CMD_FIELD_VALID_MASK;
|
||||
|
||||
trace_gicv3_its_cmd_mapd(devid, dte.size, dte.ittaddr, dte.valid);
|
||||
|
||||
if (devid >= s->dt.num_entries) {
|
||||
qemu_log_mask(LOG_GUEST_ERROR,
|
||||
"ITS MAPD: invalid device ID field 0x%x >= 0x%x\n",
|
||||
@ -562,6 +579,8 @@ static ItsCmdResult process_movall(GICv3ITSState *s, const uint64_t *cmdpkt)
|
||||
rd1 = FIELD_EX64(cmdpkt[2], MOVALL_2, RDBASE1);
|
||||
rd2 = FIELD_EX64(cmdpkt[3], MOVALL_3, RDBASE2);
|
||||
|
||||
trace_gicv3_its_cmd_movall(rd1, rd2);
|
||||
|
||||
if (rd1 >= s->gicv3->num_cpu) {
|
||||
qemu_log_mask(LOG_GUEST_ERROR,
|
||||
"%s: RDBASE1 %" PRId64
|
||||
@ -601,6 +620,8 @@ static ItsCmdResult process_movi(GICv3ITSState *s, const uint64_t *cmdpkt)
|
||||
eventid = FIELD_EX64(cmdpkt[1], MOVI_1, EVENTID);
|
||||
new_icid = FIELD_EX64(cmdpkt[2], MOVI_2, ICID);
|
||||
|
||||
trace_gicv3_its_cmd_movi(devid, eventid, new_icid);
|
||||
|
||||
if (devid >= s->dt.num_entries) {
|
||||
qemu_log_mask(LOG_GUEST_ERROR,
|
||||
"%s: invalid command attributes: devid %d>=%d",
|
||||
@ -779,6 +800,7 @@ static void process_cmdq(GICv3ITSState *s)
|
||||
* is already consistent by the time SYNC command is executed.
|
||||
* Hence no further processing is required for SYNC command.
|
||||
*/
|
||||
trace_gicv3_its_cmd_sync();
|
||||
break;
|
||||
case GITS_CMD_MAPD:
|
||||
result = process_mapd(s, cmdpkt);
|
||||
@ -803,6 +825,7 @@ static void process_cmdq(GICv3ITSState *s)
|
||||
* need to trigger lpi priority re-calculation to be in
|
||||
* sync with LPI config table or pending table changes.
|
||||
*/
|
||||
trace_gicv3_its_cmd_inv();
|
||||
for (i = 0; i < s->gicv3->num_cpu; i++) {
|
||||
gicv3_redist_update_lpi(&s->gicv3->cpu[i]);
|
||||
}
|
||||
@ -814,6 +837,7 @@ static void process_cmdq(GICv3ITSState *s)
|
||||
result = process_movall(s, cmdpkt);
|
||||
break;
|
||||
default:
|
||||
trace_gicv3_its_cmd_unknown(cmd);
|
||||
break;
|
||||
}
|
||||
if (result == CMD_CONTINUE) {
|
||||
|
@ -176,6 +176,18 @@ gicv3_its_write(uint64_t offset, uint64_t data, unsigned size) "GICv3 ITS write:
|
||||
gicv3_its_badwrite(uint64_t offset, uint64_t data, unsigned size) "GICv3 ITS write: offset 0x%" PRIx64 " data 0x%" PRIx64 " size %u: error"
|
||||
gicv3_its_translation_write(uint64_t offset, uint64_t data, unsigned size, uint32_t requester_id) "GICv3 ITS TRANSLATER write: offset 0x%" PRIx64 " data 0x%" PRIx64 " size %u requester_id 0x%x"
|
||||
gicv3_its_process_command(uint32_t rd_offset, uint8_t cmd) "GICv3 ITS: processing command at offset 0x%x: 0x%x"
|
||||
gicv3_its_cmd_int(uint32_t devid, uint32_t eventid) "GICv3 ITS: command INT DeviceID 0x%x EventID 0x%x"
|
||||
gicv3_its_cmd_clear(uint32_t devid, uint32_t eventid) "GICv3 ITS: command CLEAR DeviceID 0x%x EventID 0x%x"
|
||||
gicv3_its_cmd_discard(uint32_t devid, uint32_t eventid) "GICv3 ITS: command DISCARD DeviceID 0x%x EventID 0x%x"
|
||||
gicv3_its_cmd_sync(void) "GICv3 ITS: command SYNC"
|
||||
gicv3_its_cmd_mapd(uint32_t devid, uint32_t size, uint64_t ittaddr, int valid) "GICv3 ITS: command MAPD DeviceID 0x%x Size 0x%x ITT_addr 0x%" PRIx64 " V %d"
|
||||
gicv3_its_cmd_mapc(uint32_t icid, uint64_t rdbase, int valid) "GICv3 ITS: command MAPC ICID 0x%x RDbase 0x%" PRIx64 " V %d"
|
||||
gicv3_its_cmd_mapi(uint32_t devid, uint32_t eventid, uint32_t icid) "GICv3 ITS: command MAPI DeviceID 0x%x EventID 0x%x ICID 0x%x"
|
||||
gicv3_its_cmd_mapti(uint32_t devid, uint32_t eventid, uint32_t icid, uint32_t intid) "GICv3 ITS: command MAPTI DeviceID 0x%x EventID 0x%x ICID 0x%x pINTID 0x%x"
|
||||
gicv3_its_cmd_inv(void) "GICv3 ITS: command INV or INVALL"
|
||||
gicv3_its_cmd_movall(uint64_t rd1, uint64_t rd2) "GICv3 ITS: command MOVALL RDbase1 0x%" PRIx64 " RDbase2 0x%" PRIx64
|
||||
gicv3_its_cmd_movi(uint32_t devid, uint32_t eventid, uint32_t icid) "GICv3 ITS: command MOVI DeviceID 0x%x EventID 0x%x ICID 0x%x"
|
||||
gicv3_its_cmd_unknown(unsigned cmd) "GICv3 ITS: unknown command 0x%x"
|
||||
|
||||
# armv7m_nvic.c
|
||||
nvic_recompute_state(int vectpending, int vectpending_prio, int exception_prio) "NVIC state recomputed: vectpending %d vectpending_prio %d exception_prio %d"
|
||||
|
Loading…
Reference in New Issue
Block a user