139 lines
3.0 KiB
C
139 lines
3.0 KiB
C
#include "tb_cxxrtl_io.h"
|
|
#include "hazard3_csr.h"
|
|
|
|
// Fire all IRQs simultaneously, and log the resulting handler calls
|
|
|
|
#define mie_meie 0x800u
|
|
|
|
int main() {
|
|
asm volatile ("csrsi mstatus, 0x8");
|
|
write_csr(mie, mie_meie);
|
|
write_csr(hazard3_csr_meie0, -1u);
|
|
|
|
tb_puts("Firing all IRQs\n");
|
|
tb_set_irq_masked(-1u);
|
|
tb_puts("Returned OK\n");
|
|
|
|
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");
|
|
tb_assert(read_csr(mip) == 0x880u, "mip should indicate external + timer IRQ\n");
|
|
|
|
// mlei updates dynamically, should be read exactly once at the start of an
|
|
// IRQ handler.
|
|
uint32_t mlei = read_csr(hazard3_csr_mlei);
|
|
tb_printf("mlei = %u\n", mlei);
|
|
tb_printf("meip0 = %08x\n", read_csr(hazard3_csr_meip0));
|
|
|
|
// mlei is scaled by 4 to make it cheaper to index a software vector table.
|
|
tb_assert(read_csr(hazard3_csr_meip0) & (1u << (mlei >> 2)), "IRQ indicated by mlei is not pending\n");
|
|
tb_clr_irq_masked(1u << (mlei >> 2));
|
|
}
|
|
|
|
/*EXPECTED-OUTPUT***************************************************************
|
|
|
|
Firing all IRQs
|
|
-> external irq handler
|
|
mlei = 0
|
|
meip0 = ffffffff
|
|
-> external irq handler
|
|
mlei = 4
|
|
meip0 = fffffffe
|
|
-> external irq handler
|
|
mlei = 8
|
|
meip0 = fffffffc
|
|
-> external irq handler
|
|
mlei = 12
|
|
meip0 = fffffff8
|
|
-> external irq handler
|
|
mlei = 16
|
|
meip0 = fffffff0
|
|
-> external irq handler
|
|
mlei = 20
|
|
meip0 = ffffffe0
|
|
-> external irq handler
|
|
mlei = 24
|
|
meip0 = ffffffc0
|
|
-> external irq handler
|
|
mlei = 28
|
|
meip0 = ffffff80
|
|
-> external irq handler
|
|
mlei = 32
|
|
meip0 = ffffff00
|
|
-> external irq handler
|
|
mlei = 36
|
|
meip0 = fffffe00
|
|
-> external irq handler
|
|
mlei = 40
|
|
meip0 = fffffc00
|
|
-> external irq handler
|
|
mlei = 44
|
|
meip0 = fffff800
|
|
-> external irq handler
|
|
mlei = 48
|
|
meip0 = fffff000
|
|
-> external irq handler
|
|
mlei = 52
|
|
meip0 = ffffe000
|
|
-> external irq handler
|
|
mlei = 56
|
|
meip0 = ffffc000
|
|
-> external irq handler
|
|
mlei = 60
|
|
meip0 = ffff8000
|
|
-> external irq handler
|
|
mlei = 64
|
|
meip0 = ffff0000
|
|
-> external irq handler
|
|
mlei = 68
|
|
meip0 = fffe0000
|
|
-> external irq handler
|
|
mlei = 72
|
|
meip0 = fffc0000
|
|
-> external irq handler
|
|
mlei = 76
|
|
meip0 = fff80000
|
|
-> external irq handler
|
|
mlei = 80
|
|
meip0 = fff00000
|
|
-> external irq handler
|
|
mlei = 84
|
|
meip0 = ffe00000
|
|
-> external irq handler
|
|
mlei = 88
|
|
meip0 = ffc00000
|
|
-> external irq handler
|
|
mlei = 92
|
|
meip0 = ff800000
|
|
-> external irq handler
|
|
mlei = 96
|
|
meip0 = ff000000
|
|
-> external irq handler
|
|
mlei = 100
|
|
meip0 = fe000000
|
|
-> external irq handler
|
|
mlei = 104
|
|
meip0 = fc000000
|
|
-> external irq handler
|
|
mlei = 108
|
|
meip0 = f8000000
|
|
-> external irq handler
|
|
mlei = 112
|
|
meip0 = f0000000
|
|
-> external irq handler
|
|
mlei = 116
|
|
meip0 = e0000000
|
|
-> external irq handler
|
|
mlei = 120
|
|
meip0 = c0000000
|
|
-> external irq handler
|
|
mlei = 124
|
|
meip0 = 80000000
|
|
Returned OK
|
|
|
|
|
|
*******************************************************************************/
|