mirror of
https://github.com/zeldaret/oot-vc.git
synced 2026-09-26 13:33:20 -04:00
2da23233ab
* progress * Work on operator new() * Remove throw() from malloc/free declarations --------- Co-authored-by: Yanis002 <35189056+Yanis002@users.noreply.github.com>
231 lines
5.9 KiB
C
231 lines
5.9 KiB
C
#ifndef _RUNTIME_GECKO_EXCEPTION_PPC_H
|
|
#define _RUNTIME_GECKO_EXCEPTION_PPC_H
|
|
|
|
typedef unsigned char exaction_type;
|
|
|
|
#define EXACTION_ENDBIT 0x80
|
|
#define EXACTION_MASK 0x7F
|
|
|
|
// EXAction structs
|
|
|
|
#define EXACTION_ENDOFLIST 0
|
|
#define EXACTION_BRANCH 1
|
|
|
|
typedef struct ex_branch {
|
|
exaction_type action;
|
|
unsigned char unused;
|
|
unsigned short target;
|
|
} ex_branch;
|
|
|
|
#define EXACTION_DESTROYLOCAL 2
|
|
|
|
typedef struct ex_destroylocal {
|
|
exaction_type action;
|
|
unsigned char unused;
|
|
short local;
|
|
void* dtor;
|
|
} ex_destroylocal;
|
|
|
|
#define EXACTION_DESTROYLOCALCOND 3
|
|
|
|
typedef struct ex_destroylocalcond {
|
|
exaction_type action;
|
|
unsigned char dlc_field;
|
|
short cond;
|
|
short local;
|
|
void* dtor;
|
|
} ex_destroylocalcond;
|
|
|
|
#define ex_destroylocalcond_MakeField(regcond) (((regcond) << 7))
|
|
#define ex_destroylocalcond_GetRegCond(field) ((field) >> 7)
|
|
|
|
#define EXACTION_DESTROYLOCALPOINTER 4
|
|
|
|
typedef struct ex_destroylocalpointer {
|
|
exaction_type action;
|
|
unsigned char dlp_field;
|
|
short pointer;
|
|
void* dtor;
|
|
} ex_destroylocalpointer;
|
|
|
|
#define ex_destroylocalpointer_MakeField(regpointer) (((regpointer) << 7))
|
|
#define ex_destroylocalpointer_GetRegPointer(field) ((field) >> 7)
|
|
|
|
#define EXACTION_DESTROYLOCALARRAY 5
|
|
|
|
typedef struct ex_destroylocalarray {
|
|
exaction_type action;
|
|
unsigned char unused;
|
|
short localarray;
|
|
unsigned short elements;
|
|
unsigned short element_size;
|
|
void* dtor;
|
|
} ex_destroylocalarray;
|
|
|
|
#define EXACTION_DESTROYBASE 6
|
|
#define EXACTION_DESTROYMEMBER 7
|
|
|
|
typedef struct ex_destroymember {
|
|
exaction_type action;
|
|
unsigned char dm_field;
|
|
short objectptr;
|
|
long offset;
|
|
void* dtor;
|
|
} ex_destroymember;
|
|
|
|
#define ex_destroymember_MakeField(regpointer) (((regpointer) << 7))
|
|
#define ex_destroymember_GetRegPointer(field) ((field) >> 7)
|
|
|
|
#define EXACTION_DESTROYMEMBERCOND 8
|
|
|
|
typedef struct ex_destroymembercond {
|
|
exaction_type action;
|
|
unsigned char dmc_field;
|
|
short cond;
|
|
short objectptr;
|
|
long offset;
|
|
void* dtor;
|
|
} ex_destroymembercond;
|
|
|
|
#define ex_destroymembercond_MakeField(regcond, regpointer) (((regcond) << 7) | (((regpointer) & 0x1) << 6))
|
|
#define ex_destroymembercond_GetRegCond(field) ((field) >> 7)
|
|
#define ex_destroymembercond_GetRegPointer(field) (((field) >> 6) & 0x1)
|
|
|
|
#define EXACTION_DESTROYMEMBERARRAY 9
|
|
|
|
typedef struct ex_destroymemberarray {
|
|
exaction_type action;
|
|
unsigned char dma_field;
|
|
short objectptr;
|
|
long offset;
|
|
long elements;
|
|
long element_size;
|
|
void* dtor;
|
|
} ex_destroymemberarray;
|
|
|
|
#define ex_destroymemberarray_MakeField(regpointer) (((regpointer) << 7))
|
|
#define ex_destroymemberarray_GetRegPointer(field) ((field) >> 7)
|
|
|
|
#define EXACTION_DELETEPOINTER 10
|
|
|
|
typedef struct ex_deletepointer {
|
|
exaction_type action;
|
|
unsigned char dp_field;
|
|
short objectptr;
|
|
void* deletefunc;
|
|
} ex_deletepointer;
|
|
|
|
#define ex_deletepointer_MakeField(regpointer) (((regpointer) << 7))
|
|
#define ex_deletepointer_GetRegPointer(field) ((field) >> 7)
|
|
|
|
#define EXACTION_DELETEPOINTERCOND 11
|
|
|
|
typedef struct ex_deletepointercond {
|
|
exaction_type action;
|
|
unsigned char dpc_field;
|
|
short cond;
|
|
short objectptr;
|
|
void* deletefunc;
|
|
} ex_deletepointercond;
|
|
|
|
#define ex_deletepointercond_MakeField(regcond, regpointer) (((regcond) << 7) | (((regpointer) & 0x1) << 6))
|
|
#define ex_deletepointercond_GetRegCond(field) ((field) >> 7)
|
|
#define ex_deletepointercond_GetRegPointer(field) (((field) >> 6) & 0x1)
|
|
|
|
#define EXACTION_CATCHBLOCK 12
|
|
|
|
typedef struct ex_catchblock {
|
|
exaction_type action;
|
|
unsigned char unused;
|
|
char* catch_type;
|
|
unsigned short catch_pcoffset;
|
|
short cinfo_ref;
|
|
} ex_catchblock;
|
|
|
|
#define EXACTION_ACTIVECATCHBLOCK 13
|
|
|
|
typedef struct ex_activecatchblock {
|
|
exaction_type action;
|
|
unsigned char unused;
|
|
short cinfo_ref;
|
|
} ex_activecatchblock;
|
|
|
|
#define EXACTION_TERMINATE 14
|
|
|
|
typedef struct ex_terminate {
|
|
exaction_type action;
|
|
unsigned char unused;
|
|
} ex_terminate;
|
|
|
|
#define EXACTION_SPECIFICATION 15
|
|
|
|
typedef struct ex_specification {
|
|
exaction_type action;
|
|
unsigned char unused;
|
|
unsigned short specs;
|
|
long pcoffset;
|
|
long cinfo_ref;
|
|
char* spec[];
|
|
} ex_specification;
|
|
|
|
#define EXACTION_CATCHBLOCK_32 16
|
|
|
|
typedef struct ex_catchblock_32 {
|
|
exaction_type action;
|
|
unsigned char unused;
|
|
char* catch_type;
|
|
long catch_pcoffset;
|
|
long cinfo_ref;
|
|
} ex_catchblock_32;
|
|
|
|
// Other structs
|
|
|
|
typedef struct ExceptionRangeSmall {
|
|
unsigned short start;
|
|
unsigned short end;
|
|
unsigned short action;
|
|
} ExceptionRangeSmall;
|
|
|
|
typedef struct ExceptionTableSmall {
|
|
unsigned short et_field;
|
|
ExceptionRangeSmall ranges[0];
|
|
} ExceptionTableSmall;
|
|
|
|
typedef struct ExceptionRangeLarge {
|
|
unsigned long start;
|
|
unsigned short size;
|
|
unsigned short action;
|
|
} ExceptionRangeLarge;
|
|
|
|
typedef struct ExceptionTableLarge {
|
|
unsigned short et_field;
|
|
unsigned short et_field2;
|
|
ExceptionRangeLarge ranges[];
|
|
} ExceptionTableLarge;
|
|
|
|
#define ET_MakeField(savedGPRs, savedFPRs, savedCR, hasframeptr, isLarge) \
|
|
(((savedGPRs) << 11) | ((savedFPRs & 0x1f) << 6) | ((savedCR & 0x1) << 5) | ((hasframeptr & 0x1) << 4) | \
|
|
((isLarge & 1) << 3))
|
|
|
|
#define ET_GetSavedGPRs(field) ((field) >> 11)
|
|
#define ET_GetSavedFPRs(field) (((field) >> 6) & 0x1f)
|
|
#define ET_GetSavedCR(field) (((field) >> 5) & 0x1)
|
|
#define ET_GetHasFramePtr(field) (((field) >> 4) & 0x1)
|
|
#define ET_IsLargeTable(field) (((field) >> 3) & 0x1)
|
|
#define ET_ClearLargeBit(field) ((field) & ~(1 << 3))
|
|
#define ET_SetLargeBit(field) ((field) | (1 << 3))
|
|
|
|
#define ET_HasElfVector(field) (((field) >> 1) & 0x1)
|
|
|
|
typedef struct ExceptionTableIndex {
|
|
unsigned long functionoffset;
|
|
unsigned long eti_field;
|
|
unsigned long exceptionoffset;
|
|
} ExceptionTableIndex;
|
|
|
|
#define ETI_MakeField(direct, fsize) ((((long)(direct)) << 31) | ((fsize) & 0x7fffffff))
|
|
#define ETI_GetDirectStore(field) ((field) >> 31)
|
|
#define ETI_GetFunctionSize(field) ((field) & 0x7fffffff)
|
|
|
|
#endif
|