|
|
d29346 |
#include <stdint.h>
|
|
|
d29346 |
#include <signal.h>
|
|
|
d29346 |
#include <sys/unwind.h>
|
|
|
d29346 |
#include "psxseh.h"
|
|
|
d29346 |
|
|
|
d29346 |
extern const struct __seh_vtbl * __seh_vtbl;
|
|
|
d29346 |
|
|
|
d29346 |
|
|
|
d29346 |
int __unwind_exception_filter(
|
|
|
d29346 |
struct _nt_exception_record * erec,
|
|
|
d29346 |
void * fctx,
|
|
|
d29346 |
mcontext_t * tctx,
|
|
|
d29346 |
struct _nt_dispatcher_context * dctx,
|
|
|
d29346 |
__unwind_personality_routine uw_routine)
|
|
|
d29346 |
{
|
|
|
d29346 |
return __seh_vtbl->seh_exception_filter(
|
|
|
d29346 |
erec,fctx,tctx,dctx,uw_routine);
|
|
|
d29346 |
}
|
|
|
d29346 |
|
|
|
d29346 |
|
|
|
d29346 |
int __unwind_exception_handler(
|
|
|
d29346 |
struct _nt_exception_record * erec,
|
|
|
d29346 |
uintptr_t fbase,
|
|
|
d29346 |
mcontext_t * tctx,
|
|
|
d29346 |
struct _nt_dispatcher_context * dctx)
|
|
|
d29346 |
{
|
|
|
d29346 |
return __seh_vtbl->seh_exception_handler(
|
|
|
d29346 |
erec,fbase,tctx,dctx);
|
|
|
d29346 |
}
|
|
|
d29346 |
|
|
|
d29346 |
|
|
|
d29346 |
int __unwind_raise_exception(struct __unwind_exception * e)
|
|
|
d29346 |
{
|
|
|
d29346 |
return __seh_vtbl->seh_unwind_raise_exception(e);
|
|
|
d29346 |
}
|
|
|
d29346 |
|
|
|
d29346 |
|
|
|
d29346 |
void __unwind_delete_exception(struct __unwind_exception * e)
|
|
|
d29346 |
{
|
|
|
d29346 |
return __seh_vtbl->seh_unwind_delete_exception(e);
|
|
|
d29346 |
}
|
|
|
d29346 |
|
|
|
d29346 |
|
|
|
d29346 |
void __unwind_resume(struct __unwind_exception * e)
|
|
|
d29346 |
{
|
|
|
d29346 |
return __seh_vtbl->seh_unwind_resume(e);
|
|
|
d29346 |
}
|
|
|
d29346 |
|
|
|
d29346 |
|
|
|
d29346 |
int __unwind_resume_or_rethrow(struct __unwind_exception * e)
|
|
|
d29346 |
{
|
|
|
d29346 |
return __seh_vtbl->seh_unwind_resume_or_rethrow(e);
|
|
|
d29346 |
}
|
|
|
d29346 |
|
|
|
d29346 |
|
|
|
d29346 |
int __unwind_force(
|
|
|
d29346 |
struct __unwind_exception * e,
|
|
|
d29346 |
int (*stop_fn)(
|
|
|
d29346 |
int, int, uintptr_t,
|
|
|
d29346 |
struct __unwind_exception *,
|
|
|
d29346 |
struct __unwind_context *,
|
|
|
d29346 |
void *),
|
|
|
d29346 |
void * ctx)
|
|
|
d29346 |
{
|
|
|
d29346 |
return __seh_vtbl->seh_unwind_force(e,stop_fn,ctx);
|
|
|
d29346 |
}
|
|
|
d29346 |
|
|
|
d29346 |
|
|
|
d29346 |
void * __unwind_get_language_specific_data(struct __unwind_context * uwctx)
|
|
|
d29346 |
{
|
|
|
d29346 |
return __seh_vtbl->seh_unwind_get_language_specific_data(uwctx);
|
|
|
d29346 |
}
|
|
|
d29346 |
|
|
|
d29346 |
|
|
|
d29346 |
int __unwind_backtrace(
|
|
|
d29346 |
enum __unwind_reason_code (*trace_fn)(
|
|
|
d29346 |
struct __unwind_context *,
|
|
|
d29346 |
void *),
|
|
|
d29346 |
void * ctx)
|
|
|
d29346 |
{
|
|
|
d29346 |
return __seh_vtbl->seh_unwind_backtrace(trace_fn,ctx);
|
|
|
d29346 |
}
|
|
|
d29346 |
|
|
|
d29346 |
|
|
|
d29346 |
int __unwind_calltrace()
|
|
|
d29346 |
{
|
|
|
d29346 |
return __seh_vtbl->seh_unwind_calltrace();
|
|
|
d29346 |
}
|
|
|
d29346 |
|
|
|
d29346 |
|
|
|
d29346 |
uintptr_t __unwind_get_ip(const struct __unwind_context * uwctx)
|
|
|
d29346 |
{
|
|
|
d29346 |
return __seh_vtbl->seh_unwind_get_ip(uwctx);
|
|
|
d29346 |
}
|
|
|
d29346 |
|
|
|
d29346 |
|
|
|
d29346 |
void __unwind_set_ip(struct __unwind_context * uwctx, uintptr_t ip)
|
|
|
d29346 |
{
|
|
|
d29346 |
return __seh_vtbl->seh_unwind_set_ip(uwctx,ip);
|
|
|
d29346 |
}
|
|
|
d29346 |
|
|
|
d29346 |
|
|
|
d29346 |
uintptr_t __unwind_get_gr(const struct __unwind_context * uwctx, int idx)
|
|
|
d29346 |
{
|
|
|
d29346 |
return __seh_vtbl->seh_unwind_get_gr(uwctx,idx);
|
|
|
d29346 |
}
|
|
|
d29346 |
|
|
|
d29346 |
|
|
|
d29346 |
void __unwind_set_gr(struct __unwind_context * uwctx, int idx, uintptr_t rval)
|
|
|
d29346 |
{
|
|
|
d29346 |
return __seh_vtbl->seh_unwind_set_gr(uwctx,idx,rval);
|
|
|
d29346 |
}
|
|
|
d29346 |
|
|
|
d29346 |
|
|
|
d29346 |
uintptr_t __unwind_get_data_rel_base(const struct __unwind_context * uwctx)
|
|
|
d29346 |
{
|
|
|
d29346 |
return __seh_vtbl->seh_unwind_get_data_rel_base(uwctx);
|
|
|
d29346 |
}
|
|
|
d29346 |
|
|
|
d29346 |
|
|
|
d29346 |
uintptr_t __unwind_get_text_rel_base(const struct __unwind_context * uwctx)
|
|
|
d29346 |
{
|
|
|
d29346 |
return __seh_vtbl->seh_unwind_get_text_rel_base(uwctx);
|
|
|
d29346 |
}
|
|
|
d29346 |
|
|
|
d29346 |
|
|
|
d29346 |
uintptr_t __unwind_get_cfa(const struct __unwind_context * uwctx)
|
|
|
d29346 |
{
|
|
|
d29346 |
return __seh_vtbl->seh_unwind_get_cfa(uwctx);
|
|
|
d29346 |
}
|
|
|
d29346 |
|
|
|
d29346 |
|
|
|
d29346 |
uintptr_t __unwind_get_ip_info(const struct __unwind_context * uwctx, int * pinfo)
|
|
|
d29346 |
{
|
|
|
d29346 |
return __seh_vtbl->seh_unwind_get_ip_info(uwctx,pinfo);
|
|
|
d29346 |
}
|
|
|
d29346 |
|
|
|
d29346 |
|
|
|
d29346 |
uintptr_t __unwind_get_region_start(const struct __unwind_context * uwctx)
|
|
|
d29346 |
{
|
|
|
d29346 |
return __seh_vtbl->seh_unwind_get_region_start(uwctx);
|
|
|
d29346 |
}
|
|
|
d29346 |
|
|
|
d29346 |
|
|
|
d29346 |
void * __unwind_find_enclosing_function(const void * addr)
|
|
|
d29346 |
{
|
|
|
d29346 |
return __seh_vtbl->seh_unwind_find_enclosing_function(addr);
|
|
|
d29346 |
}
|