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