Add zcmp_irq_kill test
This commit is contained in:
parent
e98d7b41ea
commit
95faab6f2c
|
@ -0,0 +1,128 @@
|
||||||
|
#include "tb_cxxrtl_io.h"
|
||||||
|
|
||||||
|
// Test intent: check that killing and restarting of push/pop instructions
|
||||||
|
// due to IRQs does not cause stack corruption
|
||||||
|
|
||||||
|
volatile uint32_t results[13];
|
||||||
|
|
||||||
|
void foreground_task() {
|
||||||
|
asm volatile (
|
||||||
|
// First push is an actual save of the registers
|
||||||
|
".hword 0xb8f6\n" // cm.push {ra,s0-s11},-80
|
||||||
|
"sw a0, 0(sp)\n"
|
||||||
|
"sw a1, 4(sp)\n"
|
||||||
|
"li a1, 13 * 100\n"
|
||||||
|
"li x1, 0xa5000000 + 1\n"
|
||||||
|
"li x8, 0xa5000000 + 8\n"
|
||||||
|
"li x9, 0xa5000000 + 9\n"
|
||||||
|
"li x18, 0xa5000000 + 18\n"
|
||||||
|
"li x19, 0xa5000000 + 19\n"
|
||||||
|
"li x20, 0xa5000000 + 20\n"
|
||||||
|
"li x21, 0xa5000000 + 21\n"
|
||||||
|
"li x22, 0xa5000000 + 22\n"
|
||||||
|
"li x23, 0xa5000000 + 23\n"
|
||||||
|
"li x24, 0xa5000000 + 24\n"
|
||||||
|
"li x25, 0xa5000000 + 25\n"
|
||||||
|
"li x26, 0xa5000000 + 26\n"
|
||||||
|
"li x27, 0xa5000000 + 27\n"
|
||||||
|
"1:\n"
|
||||||
|
".hword 0xb8f2\n" // cm.push {ra,s0-s11},-64
|
||||||
|
// Rotate the contents of the stack frame
|
||||||
|
"lw s0, 12(sp)\n"
|
||||||
|
"lw s1, 16(sp)\n"
|
||||||
|
"lw s2, 20(sp)\n"
|
||||||
|
"lw s3, 24(sp)\n"
|
||||||
|
"lw s4, 28(sp)\n"
|
||||||
|
"lw s5, 32(sp)\n"
|
||||||
|
"lw s6, 36(sp)\n"
|
||||||
|
"lw s7, 40(sp)\n"
|
||||||
|
"lw s8, 44(sp)\n"
|
||||||
|
"lw s9, 48(sp)\n"
|
||||||
|
"lw s10, 52(sp)\n"
|
||||||
|
"lw s11, 56(sp)\n"
|
||||||
|
"lw a0, 60(sp)\n"
|
||||||
|
|
||||||
|
"lw a0, 12(sp)\n"
|
||||||
|
"lw s0, 16(sp)\n"
|
||||||
|
"lw s1, 20(sp)\n"
|
||||||
|
"lw s2, 24(sp)\n"
|
||||||
|
"lw s3, 28(sp)\n"
|
||||||
|
"lw s4, 32(sp)\n"
|
||||||
|
"lw s5, 36(sp)\n"
|
||||||
|
"lw s6, 40(sp)\n"
|
||||||
|
"lw s7, 44(sp)\n"
|
||||||
|
"lw s8, 48(sp)\n"
|
||||||
|
"lw s9, 52(sp)\n"
|
||||||
|
"lw s10, 56(sp)\n"
|
||||||
|
"lw s11, 60(sp)\n"
|
||||||
|
// Re-pop. Doing this a multiple of 13 times will restore the original contents.
|
||||||
|
".hword 0xbaf2\n" // cm.pop {ra, s0-s11},64
|
||||||
|
"addi a1, a1, -1\n"
|
||||||
|
"bnez a1, 1b\n"
|
||||||
|
// Write out results
|
||||||
|
"la a1, results\n"
|
||||||
|
"sw x1, 4*0(a1)\n"
|
||||||
|
"sw x8, 4*1(a1)\n"
|
||||||
|
"sw x9, 4*2(a1)\n"
|
||||||
|
"sw x18, 4*3(a1)\n"
|
||||||
|
"sw x19, 4*4(a1)\n"
|
||||||
|
"sw x20, 4*5(a1)\n"
|
||||||
|
"sw x21, 4*6(a1)\n"
|
||||||
|
"sw x22, 4*7(a1)\n"
|
||||||
|
"sw x23, 4*8(a1)\n"
|
||||||
|
"sw x24, 4*9(a1)\n"
|
||||||
|
"sw x25, 4*10(a1)\n"
|
||||||
|
"sw x26, 4*11(a1)\n"
|
||||||
|
"sw x27, 4*12(a1)\n"
|
||||||
|
// Restore original register values
|
||||||
|
"lw a0, 0(sp)\n"
|
||||||
|
"lw a1, 4(sp)\n"
|
||||||
|
".hword 0xbaf6\n" // cm.pop {ra,s0-s11},80
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Note not using attribute interrupt due to stack corruption bug in current
|
||||||
|
// CORE-V toolchain
|
||||||
|
void __attribute__((naked)) isr_machine_timer() {
|
||||||
|
asm volatile (
|
||||||
|
".hword 0xb852\n" // cm.push {ra,s0},-16
|
||||||
|
"li ra, %0\n"
|
||||||
|
"lw s0, (ra)\n"
|
||||||
|
"addi s0, s0, 421\n" // Prime number
|
||||||
|
"sw s0, (ra)\n"
|
||||||
|
".hword 0xba52\n" // cm.pop {ra,s0},16
|
||||||
|
"mret\n"
|
||||||
|
: : "i" ((uintptr_t)&mm_timer->mtimecmp)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
asm volatile ("csrw mie, %0" : : "r" (0x80));
|
||||||
|
mm_timer->mtime = 0;
|
||||||
|
// Will take first timer interrupt immediately:
|
||||||
|
asm volatile ("csrsi mstatus, 0x8");
|
||||||
|
|
||||||
|
foreground_task();
|
||||||
|
for (int i = 0; i < 13; ++i) {
|
||||||
|
tb_put_u32(results[i]);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*EXPECTED-OUTPUT***************************************************************
|
||||||
|
|
||||||
|
a5000001
|
||||||
|
a5000008
|
||||||
|
a5000009
|
||||||
|
a5000012
|
||||||
|
a5000013
|
||||||
|
a5000014
|
||||||
|
a5000015
|
||||||
|
a5000016
|
||||||
|
a5000017
|
||||||
|
a5000018
|
||||||
|
a5000019
|
||||||
|
a500001a
|
||||||
|
a500001b
|
||||||
|
|
||||||
|
*******************************************************************************/
|
Loading…
Reference in New Issue