hw/intc: riscv_aplic: add trace events of APLIC read/write function
Add the trace events for APLIC read/write functions. Signed-off-by: Jim Shu <jim.shu@sifive.com> Reviewed-by: Daniel Henrique Barboza <daniel.barboza@oss.qualcomm.com> Message-ID: <20260428160103.3551125-5-jim.shu@sifive.com> [ Changes by AF: - Init val to zero to avoid uninitialised build errors ] Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
Jim Shu committed
Apr 29, 2026 at 00:01 UTC
4e5d88de54dc957e6c4eacc6a72972a5797cc053
2 files changed
+42
-25
hw/intc/riscv_aplic.c
+38
-25
@@ -35,6 +35,7 @@
35
#include "system/tcg.h"
36
#include "kvm/kvm_riscv.h"
37
#include "migration/vmstate.h"
38
+#include "trace.h"
39
40
#define APLIC_MAX_IDC (1UL << 14)
41
#define APLIC_MAX_SOURCE 1024
@@ -626,6 +627,7 @@ static void riscv_aplic_request(void *opaque, int irq, int level)
627
static uint64_t riscv_aplic_read(void *opaque, hwaddr addr, unsigned size)
628
{
629
uint32_t irq, word, idc;
630
+ uint64_t val = 0;
631
RISCVAPLICState *aplic = opaque;
632
633
/* Reads must be 4 byte words */
@@ -634,18 +636,18 @@ static uint64_t riscv_aplic_read(void *opaque, hwaddr addr, unsigned size)
636
}
637
638
if (addr == APLIC_DOMAINCFG) {
637
- return APLIC_DOMAINCFG_RDONLY | aplic->domaincfg |
638
- (aplic->msimode ? APLIC_DOMAINCFG_DM : 0);
639
+ val = APLIC_DOMAINCFG_RDONLY | aplic->domaincfg |
640
+ (aplic->msimode ? APLIC_DOMAINCFG_DM : 0);
641
} else if ((APLIC_SOURCECFG_BASE <= addr) &&
642
(addr < (APLIC_SOURCECFG_BASE + (aplic->num_irqs - 1) * 4))) {
643
irq = ((addr - APLIC_SOURCECFG_BASE) >> 2) + 1;
642
- return aplic->sourcecfg[irq];
644
+ val = aplic->sourcecfg[irq];
645
} else if (aplic->mmode && aplic->msimode &&
646
(addr == APLIC_MMSICFGADDR)) {
645
- return aplic->mmsicfgaddr;
647
+ val = aplic->mmsicfgaddr;
648
} else if (aplic->mmode && aplic->msimode &&
649
(addr == APLIC_MMSICFGADDRH)) {
648
- return aplic->mmsicfgaddrH;
650
+ val = aplic->mmsicfgaddrH;
651
} else if (aplic->mmode && aplic->msimode &&
652
(addr == APLIC_SMSICFGADDR)) {
653
/*
@@ -657,65 +659,74 @@ static uint64_t riscv_aplic_read(void *opaque, hwaddr addr, unsigned size)
659
* only zero in at least one of the supervisor-level child
660
* domains).
661
*/
660
- return (aplic->num_children) ? aplic->smsicfgaddr : 0;
662
+ val = (aplic->num_children) ? aplic->smsicfgaddr : 0;
663
} else if (aplic->mmode && aplic->msimode &&
664
(addr == APLIC_SMSICFGADDRH)) {
663
- return (aplic->num_children) ? aplic->smsicfgaddrH : 0;
665
+ val = (aplic->num_children) ? aplic->smsicfgaddrH : 0;
666
} else if ((APLIC_SETIP_BASE <= addr) &&
667
(addr < (APLIC_SETIP_BASE + aplic->bitfield_words * 4))) {
668
word = (addr - APLIC_SETIP_BASE) >> 2;
667
- return riscv_aplic_read_pending_word(aplic, word);
669
+ val = riscv_aplic_read_pending_word(aplic, word);
670
} else if (addr == APLIC_SETIPNUM) {
669
- return 0;
671
+ val = 0;
672
} else if ((APLIC_CLRIP_BASE <= addr) &&
673
(addr < (APLIC_CLRIP_BASE + aplic->bitfield_words * 4))) {
674
word = (addr - APLIC_CLRIP_BASE) >> 2;
673
- return riscv_aplic_read_input_word(aplic, word);
675
+ val = riscv_aplic_read_input_word(aplic, word);
676
} else if (addr == APLIC_CLRIPNUM) {
675
- return 0;
677
+ val = 0;
678
} else if ((APLIC_SETIE_BASE <= addr) &&
679
(addr < (APLIC_SETIE_BASE + aplic->bitfield_words * 4))) {
680
word = (addr - APLIC_SETIE_BASE) >> 2;
679
- return riscv_aplic_read_enabled_word(aplic, word);
681
+ val = riscv_aplic_read_enabled_word(aplic, word);
682
} else if (addr == APLIC_SETIENUM) {
681
- return 0;
683
+ val = 0;
684
} else if ((APLIC_CLRIE_BASE <= addr) &&
685
(addr < (APLIC_CLRIE_BASE + aplic->bitfield_words * 4))) {
684
- return 0;
686
+ val = 0;
687
} else if (addr == APLIC_CLRIENUM) {
686
- return 0;
688
+ val = 0;
689
} else if (addr == APLIC_SETIPNUM_LE) {
688
- return 0;
690
+ val = 0;
691
} else if (addr == APLIC_SETIPNUM_BE) {
690
- return 0;
692
+ val = 0;
693
} else if (addr == APLIC_GENMSI) {
692
- return (aplic->msimode) ? aplic->genmsi : 0;
694
+ val = (aplic->msimode) ? aplic->genmsi : 0;
695
} else if ((APLIC_TARGET_BASE <= addr) &&
696
(addr < (APLIC_TARGET_BASE + (aplic->num_irqs - 1) * 4))) {
697
irq = ((addr - APLIC_TARGET_BASE) >> 2) + 1;
698
if (!riscv_aplic_source_active(aplic, irq)) {
697
- return 0;
699
+ val = 0;
700
+ } else {
701
+ val = aplic->target[irq];
702
}
699
- return aplic->target[irq];
703
} else if (!aplic->msimode && (APLIC_IDC_BASE <= addr) &&
704
(addr < (APLIC_IDC_BASE + aplic->num_harts * APLIC_IDC_SIZE))) {
705
idc = (addr - APLIC_IDC_BASE) / APLIC_IDC_SIZE;
706
switch (addr - (APLIC_IDC_BASE + idc * APLIC_IDC_SIZE)) {
707
case APLIC_IDC_IDELIVERY:
705
- return aplic->idelivery[idc];
708
+ val = aplic->idelivery[idc];
709
+ break;
710
case APLIC_IDC_IFORCE:
707
- return aplic->iforce[idc];
711
+ val = aplic->iforce[idc];
712
+ break;
713
case APLIC_IDC_ITHRESHOLD:
709
- return aplic->ithreshold[idc];
714
+ val = aplic->ithreshold[idc];
715
+ break;
716
case APLIC_IDC_TOPI:
711
- return riscv_aplic_idc_topi(aplic, idc);
717
+ val = riscv_aplic_idc_topi(aplic, idc);
718
+ break;
719
case APLIC_IDC_CLAIMI:
713
- return riscv_aplic_idc_claimi(aplic, idc);
720
+ val = riscv_aplic_idc_claimi(aplic, idc);
721
+ break;
722
default:
723
goto err;
724
};
725
}
726
727
+ trace_riscv_aplic_read(addr, size, val);
728
+ return val;
729
+
730
err:
731
qemu_log_mask(LOG_GUEST_ERROR,
732
"%s: Invalid register read 0x%" HWADDR_PRIx "\n",
@@ -734,6 +745,8 @@ static void riscv_aplic_write(void *opaque, hwaddr addr, uint64_t value,
745
goto err;
746
}
747
748
+ trace_riscv_aplic_write(addr, size, value);
749
+
750
if (addr == APLIC_DOMAINCFG) {
751
/* Only IE bit writable at the moment */
752
value &= APLIC_DOMAINCFG_IE;
hw/intc/trace-events
+4
@@ -353,3 +353,7 @@ loongarch_msi_set_irq(int irq_num) "set msi irq %d"
353
loongarch_extioi_setirq(int irq, int level) "set extirq irq %d level %d"
354
loongarch_extioi_readw(uint64_t addr, uint64_t val) "addr: 0x%"PRIx64 "val: 0x%" PRIx64
355
loongarch_extioi_writew(uint64_t addr, uint64_t val) "addr: 0x%"PRIx64 "val: 0x%" PRIx64
356
+
357
+# riscv_aplic.c
358
+riscv_aplic_read(uint64_t offset, unsigned size, uint64_t value) "offset: 0x%" PRIx64 ", size: %u, value: 0x%" PRIx64
359
+riscv_aplic_write(uint64_t offset, unsigned size, uint64_t value) "offset: 0x%" PRIx64 ", size: %u, value: 0x%" PRIx64