42 lines
1.2 KiB
C
42 lines
1.2 KiB
C
#include "c10_common.h"
|
|
|
|
volatile uint32_t g_task01_count;
|
|
volatile uint32_t g_task01_mcause;
|
|
volatile uint32_t g_task01_mepc;
|
|
volatile uint32_t g_task01_resume_pc;
|
|
volatile uint32_t g_task01_resumed;
|
|
volatile uint32_t g_task01_pass;
|
|
|
|
void __attribute__((interrupt("machine"))) handle_exception(void)
|
|
{
|
|
const uint32_t cause = read_csr(mcause);
|
|
const uint32_t pc = read_csr(mepc);
|
|
|
|
g_task01_count++;
|
|
g_task01_mcause = cause;
|
|
g_task01_mepc = pc;
|
|
g_task01_resume_pc = pc + 4u;
|
|
write_csr(mepc, g_task01_resume_pc);
|
|
}
|
|
|
|
int main(void)
|
|
{
|
|
c10_disable_interrupts();
|
|
__asm__ volatile("ecall");
|
|
g_task01_resumed = 1u;
|
|
|
|
g_task01_pass = g_task01_count == 1u &&
|
|
g_task01_mcause == MACHINE_ECALL_CAUSE &&
|
|
g_task01_resume_pc - g_task01_mepc == 4u &&
|
|
g_task01_resumed == 1u;
|
|
|
|
c10_report("T01 count=", g_task01_count);
|
|
c10_report("T01 mcause=", g_task01_mcause);
|
|
c10_report("T01 mepc=", g_task01_mepc);
|
|
c10_report("T01 resume_pc=", g_task01_resume_pc);
|
|
c10_report("T01 delta=", g_task01_resume_pc - g_task01_mepc);
|
|
c10_report("T01 resumed=", g_task01_resumed);
|
|
c10_report("T01 pass=", g_task01_pass);
|
|
return g_task01_pass ? 0 : 1;
|
|
}
|