2021-12-12 23:53:04 +08:00
|
|
|
#include "tb_cxxrtl_io.h"
|
|
|
|
#include "hazard3_csr.h"
|
2022-08-08 03:51:12 +08:00
|
|
|
#include "hazard3_irq.h"
|
2021-12-12 23:53:04 +08:00
|
|
|
|
|
|
|
// Pend all IRQs, enable them one-by-one and log their firing.
|
|
|
|
|
|
|
|
#define mie_meie 0x800u
|
|
|
|
|
|
|
|
int main() {
|
|
|
|
asm volatile ("csrsi mstatus, 0x8");
|
|
|
|
write_csr(mie, mie_meie);
|
|
|
|
|
|
|
|
tb_set_irq_masked(-1u);
|
|
|
|
|
|
|
|
for (int i = 31; i >= 0; --i) {
|
|
|
|
tb_printf("Enabling IRQ %d\n", i);
|
2022-08-08 03:51:12 +08:00
|
|
|
h3irq_enable(i, true);
|
2021-12-12 23:53:04 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void __attribute__((interrupt)) isr_external_irq() {
|
|
|
|
tb_puts("-> external irq handler\n");
|
|
|
|
tb_assert(read_csr(mcause) == 0x8000000bu, "mcause should indicate external IRQ\n");
|
2022-08-08 03:51:12 +08:00
|
|
|
// The external IRQ pending bit should immediately clear due to the
|
|
|
|
// premption priority being boosted above the IRQ we took.
|
|
|
|
tb_assert(read_csr(mip) == 0x080u, "mip should indicate timer IRQ only\n");
|
2021-12-12 23:53:04 +08:00
|
|
|
|
2022-08-08 03:51:12 +08:00
|
|
|
// meinext updates dynamically, should be read exactly once at the start of an
|
2021-12-12 23:53:04 +08:00
|
|
|
// IRQ handler.
|
2022-08-08 03:51:12 +08:00
|
|
|
uint32_t meinext = read_csr(hazard3_csr_meinext);
|
|
|
|
tb_printf("meinext = %u\n", meinext);
|
|
|
|
tb_printf(
|
|
|
|
"meipa = %08x\n",
|
|
|
|
h3irq_array_read(hazard3_csr_meipa, 0) |
|
|
|
|
((uint32_t)h3irq_array_read(hazard3_csr_meipa, 1) << 16)
|
|
|
|
);
|
2021-12-12 23:53:04 +08:00
|
|
|
|
2022-08-08 03:51:12 +08:00
|
|
|
// meinext is scaled by 4 to make it cheaper to index a software vector table.
|
|
|
|
tb_assert(h3irq_pending(meinext >> 2), "IRQ indicated by meinext is not pending\n");
|
|
|
|
tb_clr_irq_masked(1u << (meinext >> 2));
|
2021-12-12 23:53:04 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
/*EXPECTED-OUTPUT***************************************************************
|
|
|
|
|
|
|
|
Enabling IRQ 31
|
|
|
|
-> external irq handler
|
2022-08-08 03:51:12 +08:00
|
|
|
meinext = 124
|
|
|
|
meipa = ffffffff
|
2021-12-12 23:53:04 +08:00
|
|
|
Enabling IRQ 30
|
|
|
|
-> external irq handler
|
2022-08-08 03:51:12 +08:00
|
|
|
meinext = 120
|
|
|
|
meipa = 7fffffff
|
2021-12-12 23:53:04 +08:00
|
|
|
Enabling IRQ 29
|
|
|
|
-> external irq handler
|
2022-08-08 03:51:12 +08:00
|
|
|
meinext = 116
|
|
|
|
meipa = 3fffffff
|
2021-12-12 23:53:04 +08:00
|
|
|
Enabling IRQ 28
|
|
|
|
-> external irq handler
|
2022-08-08 03:51:12 +08:00
|
|
|
meinext = 112
|
|
|
|
meipa = 1fffffff
|
2021-12-12 23:53:04 +08:00
|
|
|
Enabling IRQ 27
|
|
|
|
-> external irq handler
|
2022-08-08 03:51:12 +08:00
|
|
|
meinext = 108
|
|
|
|
meipa = 0fffffff
|
2021-12-12 23:53:04 +08:00
|
|
|
Enabling IRQ 26
|
|
|
|
-> external irq handler
|
2022-08-08 03:51:12 +08:00
|
|
|
meinext = 104
|
|
|
|
meipa = 07ffffff
|
2021-12-12 23:53:04 +08:00
|
|
|
Enabling IRQ 25
|
|
|
|
-> external irq handler
|
2022-08-08 03:51:12 +08:00
|
|
|
meinext = 100
|
|
|
|
meipa = 03ffffff
|
2021-12-12 23:53:04 +08:00
|
|
|
Enabling IRQ 24
|
|
|
|
-> external irq handler
|
2022-08-08 03:51:12 +08:00
|
|
|
meinext = 96
|
|
|
|
meipa = 01ffffff
|
2021-12-12 23:53:04 +08:00
|
|
|
Enabling IRQ 23
|
|
|
|
-> external irq handler
|
2022-08-08 03:51:12 +08:00
|
|
|
meinext = 92
|
|
|
|
meipa = 00ffffff
|
2021-12-12 23:53:04 +08:00
|
|
|
Enabling IRQ 22
|
|
|
|
-> external irq handler
|
2022-08-08 03:51:12 +08:00
|
|
|
meinext = 88
|
|
|
|
meipa = 007fffff
|
2021-12-12 23:53:04 +08:00
|
|
|
Enabling IRQ 21
|
|
|
|
-> external irq handler
|
2022-08-08 03:51:12 +08:00
|
|
|
meinext = 84
|
|
|
|
meipa = 003fffff
|
2021-12-12 23:53:04 +08:00
|
|
|
Enabling IRQ 20
|
|
|
|
-> external irq handler
|
2022-08-08 03:51:12 +08:00
|
|
|
meinext = 80
|
|
|
|
meipa = 001fffff
|
2021-12-12 23:53:04 +08:00
|
|
|
Enabling IRQ 19
|
|
|
|
-> external irq handler
|
2022-08-08 03:51:12 +08:00
|
|
|
meinext = 76
|
|
|
|
meipa = 000fffff
|
2021-12-12 23:53:04 +08:00
|
|
|
Enabling IRQ 18
|
|
|
|
-> external irq handler
|
2022-08-08 03:51:12 +08:00
|
|
|
meinext = 72
|
|
|
|
meipa = 0007ffff
|
2021-12-12 23:53:04 +08:00
|
|
|
Enabling IRQ 17
|
|
|
|
-> external irq handler
|
2022-08-08 03:51:12 +08:00
|
|
|
meinext = 68
|
|
|
|
meipa = 0003ffff
|
2021-12-12 23:53:04 +08:00
|
|
|
Enabling IRQ 16
|
|
|
|
-> external irq handler
|
2022-08-08 03:51:12 +08:00
|
|
|
meinext = 64
|
|
|
|
meipa = 0001ffff
|
2021-12-12 23:53:04 +08:00
|
|
|
Enabling IRQ 15
|
|
|
|
-> external irq handler
|
2022-08-08 03:51:12 +08:00
|
|
|
meinext = 60
|
|
|
|
meipa = 0000ffff
|
2021-12-12 23:53:04 +08:00
|
|
|
Enabling IRQ 14
|
|
|
|
-> external irq handler
|
2022-08-08 03:51:12 +08:00
|
|
|
meinext = 56
|
|
|
|
meipa = 00007fff
|
2021-12-12 23:53:04 +08:00
|
|
|
Enabling IRQ 13
|
|
|
|
-> external irq handler
|
2022-08-08 03:51:12 +08:00
|
|
|
meinext = 52
|
|
|
|
meipa = 00003fff
|
2021-12-12 23:53:04 +08:00
|
|
|
Enabling IRQ 12
|
|
|
|
-> external irq handler
|
2022-08-08 03:51:12 +08:00
|
|
|
meinext = 48
|
|
|
|
meipa = 00001fff
|
2021-12-12 23:53:04 +08:00
|
|
|
Enabling IRQ 11
|
|
|
|
-> external irq handler
|
2022-08-08 03:51:12 +08:00
|
|
|
meinext = 44
|
|
|
|
meipa = 00000fff
|
2021-12-12 23:53:04 +08:00
|
|
|
Enabling IRQ 10
|
|
|
|
-> external irq handler
|
2022-08-08 03:51:12 +08:00
|
|
|
meinext = 40
|
|
|
|
meipa = 000007ff
|
2021-12-12 23:53:04 +08:00
|
|
|
Enabling IRQ 9
|
|
|
|
-> external irq handler
|
2022-08-08 03:51:12 +08:00
|
|
|
meinext = 36
|
|
|
|
meipa = 000003ff
|
2021-12-12 23:53:04 +08:00
|
|
|
Enabling IRQ 8
|
|
|
|
-> external irq handler
|
2022-08-08 03:51:12 +08:00
|
|
|
meinext = 32
|
|
|
|
meipa = 000001ff
|
2021-12-12 23:53:04 +08:00
|
|
|
Enabling IRQ 7
|
|
|
|
-> external irq handler
|
2022-08-08 03:51:12 +08:00
|
|
|
meinext = 28
|
|
|
|
meipa = 000000ff
|
2021-12-12 23:53:04 +08:00
|
|
|
Enabling IRQ 6
|
|
|
|
-> external irq handler
|
2022-08-08 03:51:12 +08:00
|
|
|
meinext = 24
|
|
|
|
meipa = 0000007f
|
2021-12-12 23:53:04 +08:00
|
|
|
Enabling IRQ 5
|
|
|
|
-> external irq handler
|
2022-08-08 03:51:12 +08:00
|
|
|
meinext = 20
|
|
|
|
meipa = 0000003f
|
2021-12-12 23:53:04 +08:00
|
|
|
Enabling IRQ 4
|
|
|
|
-> external irq handler
|
2022-08-08 03:51:12 +08:00
|
|
|
meinext = 16
|
|
|
|
meipa = 0000001f
|
2021-12-12 23:53:04 +08:00
|
|
|
Enabling IRQ 3
|
|
|
|
-> external irq handler
|
2022-08-08 03:51:12 +08:00
|
|
|
meinext = 12
|
|
|
|
meipa = 0000000f
|
2021-12-12 23:53:04 +08:00
|
|
|
Enabling IRQ 2
|
|
|
|
-> external irq handler
|
2022-08-08 03:51:12 +08:00
|
|
|
meinext = 8
|
|
|
|
meipa = 00000007
|
2021-12-12 23:53:04 +08:00
|
|
|
Enabling IRQ 1
|
|
|
|
-> external irq handler
|
2022-08-08 03:51:12 +08:00
|
|
|
meinext = 4
|
|
|
|
meipa = 00000003
|
2021-12-12 23:53:04 +08:00
|
|
|
Enabling IRQ 0
|
|
|
|
-> external irq handler
|
2022-08-08 03:51:12 +08:00
|
|
|
meinext = 0
|
|
|
|
meipa = 00000001
|
2021-12-12 23:53:04 +08:00
|
|
|
|
|
|
|
*******************************************************************************/
|