mirror of https://github.com/xemu-project/xemu.git
hw/intc/arm_gicv3_its: Add tracepoints
The ITS currently has no tracepoints; add a minimal set that allows basic monitoring of guest register accesses and reading of commands from the command queue. Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20220122182444.724087-3-peter.maydell@linaro.org
This commit is contained in:
parent
fc6177af11
commit
195209d368
|
@ -13,6 +13,7 @@
|
|||
|
||||
#include "qemu/osdep.h"
|
||||
#include "qemu/log.h"
|
||||
#include "trace.h"
|
||||
#include "hw/qdev-properties.h"
|
||||
#include "hw/intc/arm_gicv3_its_common.h"
|
||||
#include "gicv3_internal.h"
|
||||
|
@ -634,6 +635,8 @@ static void process_cmdq(GICv3ITSState *s)
|
|||
|
||||
cmd = (data & CMD_MASK);
|
||||
|
||||
trace_gicv3_its_process_command(rd_offset, cmd);
|
||||
|
||||
switch (cmd) {
|
||||
case GITS_CMD_INT:
|
||||
result = process_its_cmd(s, data, cq_offset, INTERRUPT);
|
||||
|
@ -818,6 +821,8 @@ static MemTxResult gicv3_its_translation_write(void *opaque, hwaddr offset,
|
|||
bool result = true;
|
||||
uint32_t devid = 0;
|
||||
|
||||
trace_gicv3_its_translation_write(offset, data, size, attrs.requester_id);
|
||||
|
||||
switch (offset) {
|
||||
case GITS_TRANSLATER:
|
||||
if (s->ctlr & R_GITS_CTLR_ENABLED_MASK) {
|
||||
|
@ -1107,6 +1112,7 @@ static MemTxResult gicv3_its_read(void *opaque, hwaddr offset, uint64_t *data,
|
|||
qemu_log_mask(LOG_GUEST_ERROR,
|
||||
"%s: invalid guest read at offset " TARGET_FMT_plx
|
||||
"size %u\n", __func__, offset, size);
|
||||
trace_gicv3_its_badread(offset, size);
|
||||
/*
|
||||
* The spec requires that reserved registers are RAZ/WI;
|
||||
* so use false returns from leaf functions as a way to
|
||||
|
@ -1114,6 +1120,8 @@ static MemTxResult gicv3_its_read(void *opaque, hwaddr offset, uint64_t *data,
|
|||
* the caller, or we'll cause a spurious guest data abort.
|
||||
*/
|
||||
*data = 0;
|
||||
} else {
|
||||
trace_gicv3_its_read(offset, *data, size);
|
||||
}
|
||||
return MEMTX_OK;
|
||||
}
|
||||
|
@ -1140,12 +1148,15 @@ static MemTxResult gicv3_its_write(void *opaque, hwaddr offset, uint64_t data,
|
|||
qemu_log_mask(LOG_GUEST_ERROR,
|
||||
"%s: invalid guest write at offset " TARGET_FMT_plx
|
||||
"size %u\n", __func__, offset, size);
|
||||
trace_gicv3_its_badwrite(offset, data, size);
|
||||
/*
|
||||
* The spec requires that reserved registers are RAZ/WI;
|
||||
* so use false returns from leaf functions as a way to
|
||||
* trigger the guest-error logging but don't return it to
|
||||
* the caller, or we'll cause a spurious guest data abort.
|
||||
*/
|
||||
} else {
|
||||
trace_gicv3_its_write(offset, data, size);
|
||||
}
|
||||
return MEMTX_OK;
|
||||
}
|
||||
|
|
|
@ -169,6 +169,14 @@ gicv3_redist_badwrite(uint32_t cpu, uint64_t offset, uint64_t data, unsigned siz
|
|||
gicv3_redist_set_irq(uint32_t cpu, int irq, int level) "GICv3 redistributor 0x%x interrupt %d level changed to %d"
|
||||
gicv3_redist_send_sgi(uint32_t cpu, int irq) "GICv3 redistributor 0x%x pending SGI %d"
|
||||
|
||||
# arm_gicv3_its.c
|
||||
gicv3_its_read(uint64_t offset, uint64_t data, unsigned size) "GICv3 ITS read: offset 0x%" PRIx64 " data 0x%" PRIx64 " size %u"
|
||||
gicv3_its_badread(uint64_t offset, unsigned size) "GICv3 ITS read: offset 0x%" PRIx64 " size %u: error"
|
||||
gicv3_its_write(uint64_t offset, uint64_t data, unsigned size) "GICv3 ITS write: offset 0x%" PRIx64 " data 0x%" PRIx64 " size %u"
|
||||
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"
|
||||
|
||||
# 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"
|
||||
nvic_recompute_state_secure(int vectpending, bool vectpending_is_s_banked, int vectpending_prio, int exception_prio) "NVIC state recomputed: vectpending %d is_s_banked %d vectpending_prio %d exception_prio %d"
|
||||
|
|
Loading…
Reference in New Issue