#include "brexcept.h"
#include "CORE/FW/diag.h"
#include "CORE/FW/resource.h"
#include "harness/trace.h"
#include <string.h>
void* exceptionValue;
br_exception_handler* _BrExceptionHandler;
// IDA: br_exception_handler* __cdecl _BrExceptionBegin()
br_exception_handler* _BrExceptionBegin(void) {
br_exception_handler* h;
LOG_TRACE("()");
h = BrResAllocate(NULL, sizeof(br_exception_handler), BR_MEMORY_EXCEPTION_HANDLER);
h->prev = _BrExceptionHandler;
_BrExceptionHandler = h;
return h;
}
// IDA: void __cdecl _BrExceptionEnd()
void _BrExceptionEnd(void) {
br_exception_handler* old;
LOG_TRACE("()");
if (_BrExceptionHandler == NULL) {
BrFailure("Unhandled exception: %d");
}
old = _BrExceptionHandler;
_BrExceptionHandler = _BrExceptionHandler->prev;
BrResFree(old);
}
// IDA: void __cdecl _BrExceptionThrow(br_int_32 type, void *value)
void _BrExceptionThrow(br_int_32 type, void* value) {
br_exception_handler h;
br_exception_handler* old;
LOG_TRACE("(%d, %p)", type, value);
if (_BrExceptionHandler == NULL) {
BrFailure("Unhandled exception: %d");
}
memcpy(&h
, _BrExceptionHandler
, sizeof(br_exception_handler
));
old = _BrExceptionHandler;
_BrExceptionHandler = _BrExceptionHandler->prev;
BrResFree(old);
exceptionValue = value;
}
// IDA: br_exception __cdecl _BrExceptionValueFetch(br_exception type, void **evp)
br_exception _BrExceptionValueFetch(br_exception type, void** evp) {
LOG_TRACE("(%d, %p)", type, evp);
if (type != 0 && evp != NULL) {
*evp = exceptionValue;
}
return type;
}
// IDA: void* __cdecl _BrExceptionResource()
void* _BrExceptionResource(void) {
LOG_TRACE("()");
return _BrExceptionHandler;
}