@samitouri / QOSamiQemu / commits / 4e5d88de54

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