#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; }