Add some basic trace events to the arm_timer device. Signed-off-by: Peter Maydell <peter.mayd...@linaro.org> --- hw/timer/arm_timer.c | 27 +++++++++++++++++++++------ hw/timer/trace-events | 7 +++++++ 2 files changed, 28 insertions(+), 6 deletions(-)
diff --git a/hw/timer/arm_timer.c b/hw/timer/arm_timer.c index c2e6211188b..283ae1e74a9 100644 --- a/hw/timer/arm_timer.c +++ b/hw/timer/arm_timer.c @@ -17,6 +17,7 @@ #include "qemu/main-loop.h" #include "qemu/module.h" #include "qemu/log.h" +#include "trace.h" /* Common timer implementation. */ @@ -43,7 +44,10 @@ typedef struct { static void arm_timer_update(arm_timer_state *s) { /* Update interrupts. */ - if (s->int_level && (s->control & TIMER_CTRL_IE)) { + int level = s->int_level && (s->control & TIMER_CTRL_IE); + + trace_sp804_arm_timer_update(level); + if (level) { qemu_irq_raise(s->irq); } else { qemu_irq_lower(s->irq); @@ -216,17 +220,21 @@ static uint64_t sp804_read(void *opaque, hwaddr offset, unsigned size) { SP804State *s = (SP804State *)opaque; + uint64_t res; if (offset < 0x20) { - return arm_timer_read(s->timer[0], offset); + res = arm_timer_read(s->timer[0], offset); + goto out; } if (offset < 0x40) { - return arm_timer_read(s->timer[1], offset - 0x20); + res = arm_timer_read(s->timer[1], offset - 0x20); + goto out; } /* TimerPeriphID */ if (offset >= 0xfe0 && offset <= 0xffc) { - return sp804_ids[(offset - 0xfe0) >> 2]; + res = sp804_ids[(offset - 0xfe0) >> 2]; + goto out; } switch (offset) { @@ -236,12 +244,17 @@ static uint64_t sp804_read(void *opaque, hwaddr offset, qemu_log_mask(LOG_UNIMP, "%s: integration test registers unimplemented\n", __func__); - return 0; + res = 0; + goto out; } qemu_log_mask(LOG_GUEST_ERROR, "%s: Bad offset %x\n", __func__, (int)offset); - return 0; + res = 0; + +out: + trace_sp804_read(offset, res); + return res; } static void sp804_write(void *opaque, hwaddr offset, @@ -249,6 +262,8 @@ static void sp804_write(void *opaque, hwaddr offset, { SP804State *s = (SP804State *)opaque; + trace_sp804_write(offset, value); + if (offset < 0x20) { arm_timer_write(s->timer[0], offset, value); return; diff --git a/hw/timer/trace-events b/hw/timer/trace-events index db02a9142cd..600b002c7bf 100644 --- a/hw/timer/trace-events +++ b/hw/timer/trace-events @@ -87,3 +87,10 @@ pl031_read(uint32_t addr, uint32_t value) "addr 0x%08x value 0x%08x" pl031_write(uint32_t addr, uint32_t value) "addr 0x%08x value 0x%08x" pl031_alarm_raised(void) "alarm raised" pl031_set_alarm(uint32_t ticks) "alarm set for %u ticks" + +# arm_timer.c +sp804_read(uint32_t addr, uint32_t value) "addr 0x%08x value 0x%08x" +sp804_write(uint32_t addr, uint32_t value) "addr 0x%08x value 0x%08x" +# Note that this trace event can't distinguish which of the two timers +# in the sp804 is being updated +sp804_arm_timer_update(int level) "level %d" -- 2.20.1