artiq/soc/runtime/exceptions.c

76 lines
1.4 KiB
C
Raw Normal View History

#include <generated/csr.h>
#include "exceptions.h"
#ifdef ARTIQ_AMP
#include "mailbox.h"
#include "messages.h"
#else
2014-10-19 23:51:49 +08:00
#include "comm.h"
#endif
2014-09-22 13:18:48 +08:00
#define MAX_EXCEPTION_CONTEXTS 64
struct exception_context {
void *jb[13];
2014-09-22 13:18:48 +08:00
};
static struct exception_context exception_contexts[MAX_EXCEPTION_CONTEXTS];
static int ec_top;
static int stored_id;
static long long int stored_params[3];
2014-09-22 13:18:48 +08:00
void *exception_push(void)
{
2014-09-22 13:18:48 +08:00
if(ec_top >= MAX_EXCEPTION_CONTEXTS)
exception_raise(EID_INTERNAL_ERROR);
2014-09-22 13:18:48 +08:00
return exception_contexts[ec_top++].jb;
}
void exception_pop(int levels)
{
ec_top -= levels;
}
int exception_getid(long long int *eparams)
{
int i;
if(eparams)
for(i=0;i<3;i++)
eparams[i] = stored_params[i];
2014-09-22 13:18:48 +08:00
return stored_id;
}
2014-09-22 13:18:48 +08:00
void exception_raise(int id)
{
exception_raise_params(id, 0, 0, 0);
}
void exception_raise_params(int id,
long long int p0, long long int p1,
long long int p2)
2014-09-22 13:18:48 +08:00
{
if(ec_top > 0) {
stored_id = id;
stored_params[0] = p0;
stored_params[1] = p1;
stored_params[2] = p2;
exception_longjmp(exception_contexts[--ec_top].jb);
2014-10-15 16:11:28 +08:00
} else {
2015-04-05 17:55:05 +08:00
#ifdef ARTIQ_AMP
struct msg_exception msg;
int i;
msg.type = MESSAGE_TYPE_EXCEPTION;
msg.eid = EID_INTERNAL_ERROR;
for(i=0;i<3;i++)
msg.eparams[i] = 0;
mailbox_send_and_wait(&msg);
#else
2014-10-19 23:51:49 +08:00
comm_log("ERROR: uncaught exception, ID=%d\n", id);
#endif
2014-10-15 16:11:28 +08:00
while(1);
}
}