/*
 * Copyright (C) 2017-2019 Alibaba Group Holding Limited
 */


/******************************************************************************
 * @file     trap_c.c
 * @brief    source file for the trap process
 * @version  V1.0
 * @date     12. December 2017
 ******************************************************************************/

#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <csi_config.h>
#include <csi_core.h>
/*
 *   异常向量分配：
 *       0：重启异常
 *       1：未对齐访问异常
 *       2：访问错误异常
 *       3：除零异常
 *       4：非法指令异常
 *       5：特权违反异常
 *       6：跟踪异常
 *       7: 断点异常
 *       8：不可恢复错误异常
 *       9：idly异常
 *       10: 向量中断
 */
void (*trap_c_callback)(void);
uint32_t vec;
void trap_c(uint32_t *regs)
{
    int i;
    vec = (__get_PSR() & PSR_VEC_Msk) >> PSR_VEC_Pos;

    printf("CPU Exception : NO.%u", vec);
    printf("\n");

    for (i = 0; i < 32; i++) {
        printf("r%d: %08x\t", i, regs[i]);

        if ((i % 4) == 3) {
            printf("\n");
        }
    }

    for (i = 0; i < 16; i++) {
        printf("vr%d: %08x\t", i, regs[i + 32]);

        if ((i % 4) == 3) {
            printf("\n");
        }
    }

    printf("\n");
    printf("epsr: %8x\n", regs[48]);
    printf("epc : %8x\n", regs[49]);

    if (trap_c_callback) {
        trap_c_callback();
    }

    while (1);
}

