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
|
|
|
|
|
|
|
// Set IRQ mask (meie0) wide-open, then pend the IRQs one by one and log their
|
|
|
|
// firing.
|
|
|
|
|
|
|
|
#define mie_meie 0x800u
|
|
|
|
|
|
|
|
int main() {
|
|
|
|
asm volatile ("csrsi mstatus, 0x8");
|
2022-08-08 03:51:12 +08:00
|
|
|
|
|
|
|
h3irq_array_write(hazard3_csr_meiea, 0, 0xffffu);
|
|
|
|
h3irq_array_write(hazard3_csr_meiea, 1, 0xffffu);
|
2021-12-12 23:53:04 +08:00
|
|
|
write_csr(mie, mie_meie);
|
|
|
|
|
|
|
|
for (int i = 0; i < 32; ++i) {
|
|
|
|
tb_printf("Setting IRQ %d\n", i);
|
|
|
|
tb_set_irq_masked(1u << i);
|
|
|
|
}
|
|
|
|
|
|
|
|
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
|
|
|
// External IRQ does not appear pending because, after taking the
|
|
|
|
// interrupt, it no longer has sufficient priority to preempt.
|
|
|
|
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***************************************************************
|
|
|
|
|
|
|
|
Setting 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
|
|
|
Setting IRQ 1
|
|
|
|
-> external irq handler
|
2022-08-08 03:51:12 +08:00
|
|
|
meinext = 4
|
|
|
|
meipa = 00000002
|
2021-12-12 23:53:04 +08:00
|
|
|
Setting IRQ 2
|
|
|
|
-> external irq handler
|
2022-08-08 03:51:12 +08:00
|
|
|
meinext = 8
|
|
|
|
meipa = 00000004
|
2021-12-12 23:53:04 +08:00
|
|
|
Setting IRQ 3
|
|
|
|
-> external irq handler
|
2022-08-08 03:51:12 +08:00
|
|
|
meinext = 12
|
|
|
|
meipa = 00000008
|
2021-12-12 23:53:04 +08:00
|
|
|
Setting IRQ 4
|
|
|
|
-> external irq handler
|
2022-08-08 03:51:12 +08:00
|
|
|
meinext = 16
|
|
|
|
meipa = 00000010
|
2021-12-12 23:53:04 +08:00
|
|
|
Setting IRQ 5
|
|
|
|
-> external irq handler
|
2022-08-08 03:51:12 +08:00
|
|
|
meinext = 20
|
|
|
|
meipa = 00000020
|
2021-12-12 23:53:04 +08:00
|
|
|
Setting IRQ 6
|
|
|
|
-> external irq handler
|
2022-08-08 03:51:12 +08:00
|
|
|
meinext = 24
|
|
|
|
meipa = 00000040
|
2021-12-12 23:53:04 +08:00
|
|
|
Setting IRQ 7
|
|
|
|
-> external irq handler
|
2022-08-08 03:51:12 +08:00
|
|
|
meinext = 28
|
|
|
|
meipa = 00000080
|
2021-12-12 23:53:04 +08:00
|
|
|
Setting IRQ 8
|
|
|
|
-> external irq handler
|
2022-08-08 03:51:12 +08:00
|
|
|
meinext = 32
|
|
|
|
meipa = 00000100
|
2021-12-12 23:53:04 +08:00
|
|
|
Setting IRQ 9
|
|
|
|
-> external irq handler
|
2022-08-08 03:51:12 +08:00
|
|
|
meinext = 36
|
|
|
|
meipa = 00000200
|
2021-12-12 23:53:04 +08:00
|
|
|
Setting IRQ 10
|
|
|
|
-> external irq handler
|
2022-08-08 03:51:12 +08:00
|
|
|
meinext = 40
|
|
|
|
meipa = 00000400
|
2021-12-12 23:53:04 +08:00
|
|
|
Setting IRQ 11
|
|
|
|
-> external irq handler
|
2022-08-08 03:51:12 +08:00
|
|
|
meinext = 44
|
|
|
|
meipa = 00000800
|
2021-12-12 23:53:04 +08:00
|
|
|
Setting IRQ 12
|
|
|
|
-> external irq handler
|
2022-08-08 03:51:12 +08:00
|
|
|
meinext = 48
|
|
|
|
meipa = 00001000
|
2021-12-12 23:53:04 +08:00
|
|
|
Setting IRQ 13
|
|
|
|
-> external irq handler
|
2022-08-08 03:51:12 +08:00
|
|
|
meinext = 52
|
|
|
|
meipa = 00002000
|
2021-12-12 23:53:04 +08:00
|
|
|
Setting IRQ 14
|
|
|
|
-> external irq handler
|
2022-08-08 03:51:12 +08:00
|
|
|
meinext = 56
|
|
|
|
meipa = 00004000
|
2021-12-12 23:53:04 +08:00
|
|
|
Setting IRQ 15
|
|
|
|
-> external irq handler
|
2022-08-08 03:51:12 +08:00
|
|
|
meinext = 60
|
|
|
|
meipa = 00008000
|
2021-12-12 23:53:04 +08:00
|
|
|
Setting IRQ 16
|
|
|
|
-> external irq handler
|
2022-08-08 03:51:12 +08:00
|
|
|
meinext = 64
|
|
|
|
meipa = 00010000
|
2021-12-12 23:53:04 +08:00
|
|
|
Setting IRQ 17
|
|
|
|
-> external irq handler
|
2022-08-08 03:51:12 +08:00
|
|
|
meinext = 68
|
|
|
|
meipa = 00020000
|
2021-12-12 23:53:04 +08:00
|
|
|
Setting IRQ 18
|
|
|
|
-> external irq handler
|
2022-08-08 03:51:12 +08:00
|
|
|
meinext = 72
|
|
|
|
meipa = 00040000
|
2021-12-12 23:53:04 +08:00
|
|
|
Setting IRQ 19
|
|
|
|
-> external irq handler
|
2022-08-08 03:51:12 +08:00
|
|
|
meinext = 76
|
|
|
|
meipa = 00080000
|
2021-12-12 23:53:04 +08:00
|
|
|
Setting IRQ 20
|
|
|
|
-> external irq handler
|
2022-08-08 03:51:12 +08:00
|
|
|
meinext = 80
|
|
|
|
meipa = 00100000
|
2021-12-12 23:53:04 +08:00
|
|
|
Setting IRQ 21
|
|
|
|
-> external irq handler
|
2022-08-08 03:51:12 +08:00
|
|
|
meinext = 84
|
|
|
|
meipa = 00200000
|
2021-12-12 23:53:04 +08:00
|
|
|
Setting IRQ 22
|
|
|
|
-> external irq handler
|
2022-08-08 03:51:12 +08:00
|
|
|
meinext = 88
|
|
|
|
meipa = 00400000
|
2021-12-12 23:53:04 +08:00
|
|
|
Setting IRQ 23
|
|
|
|
-> external irq handler
|
2022-08-08 03:51:12 +08:00
|
|
|
meinext = 92
|
|
|
|
meipa = 00800000
|
2021-12-12 23:53:04 +08:00
|
|
|
Setting IRQ 24
|
|
|
|
-> external irq handler
|
2022-08-08 03:51:12 +08:00
|
|
|
meinext = 96
|
|
|
|
meipa = 01000000
|
2021-12-12 23:53:04 +08:00
|
|
|
Setting IRQ 25
|
|
|
|
-> external irq handler
|
2022-08-08 03:51:12 +08:00
|
|
|
meinext = 100
|
|
|
|
meipa = 02000000
|
2021-12-12 23:53:04 +08:00
|
|
|
Setting IRQ 26
|
|
|
|
-> external irq handler
|
2022-08-08 03:51:12 +08:00
|
|
|
meinext = 104
|
|
|
|
meipa = 04000000
|
2021-12-12 23:53:04 +08:00
|
|
|
Setting IRQ 27
|
|
|
|
-> external irq handler
|
2022-08-08 03:51:12 +08:00
|
|
|
meinext = 108
|
|
|
|
meipa = 08000000
|
2021-12-12 23:53:04 +08:00
|
|
|
Setting IRQ 28
|
|
|
|
-> external irq handler
|
2022-08-08 03:51:12 +08:00
|
|
|
meinext = 112
|
|
|
|
meipa = 10000000
|
2021-12-12 23:53:04 +08:00
|
|
|
Setting IRQ 29
|
|
|
|
-> external irq handler
|
2022-08-08 03:51:12 +08:00
|
|
|
meinext = 116
|
|
|
|
meipa = 20000000
|
2021-12-12 23:53:04 +08:00
|
|
|
Setting IRQ 30
|
|
|
|
-> external irq handler
|
2022-08-08 03:51:12 +08:00
|
|
|
meinext = 120
|
|
|
|
meipa = 40000000
|
2021-12-12 23:53:04 +08:00
|
|
|
Setting IRQ 31
|
|
|
|
-> external irq handler
|
2022-08-08 03:51:12 +08:00
|
|
|
meinext = 124
|
|
|
|
meipa = 80000000
|
2021-12-12 23:53:04 +08:00
|
|
|
|
|
|
|
*******************************************************************************/
|