sl@0: /* unwinder.h sl@0: * sl@0: * Copyright 2002-2005 ARM Limited. All rights reserved. sl@0: * sl@0: * Your rights to use this code are set out in the accompanying licence sl@0: * text file LICENCE.txt (ARM contract number LEC-ELA-00080 v2.0). sl@0: */ sl@0: /* sl@0: * RCS $Revision: 91721 $ sl@0: * Checkin $Date: 2005-08-08 19:30:07 +0100 (Mon, 08 Aug 2005) $ sl@0: * Revising $Author: drodgman $ sl@0: */ sl@0: sl@0: /* Language-independent unwinder header public defines */ sl@0: sl@0: #ifndef UNWINDER_H sl@0: #define UNWINDER_H sl@0: sl@0: #ifdef __cplusplus sl@0: extern "C" { sl@0: #endif sl@0: sl@0: typedef enum { sl@0: _URC_OK = 0, /* operation completed successfully */ sl@0: _URC_FOREIGN_EXCEPTION_CAUGHT = 1, sl@0: _URC_HANDLER_FOUND = 6, sl@0: _URC_INSTALL_CONTEXT = 7, sl@0: _URC_CONTINUE_UNWIND = 8, sl@0: _URC_FAILURE = 9 /* unspecified failure of some kind */ sl@0: } _Unwind_Reason_Code; sl@0: sl@0: typedef enum { sl@0: _US_VIRTUAL_UNWIND_FRAME = 0, sl@0: _US_UNWIND_FRAME_STARTING = 1, sl@0: _US_UNWIND_FRAME_RESUME = 2 sl@0: } _Unwind_State; sl@0: sl@0: typedef struct _Unwind_Control_Block _Unwind_Control_Block; sl@0: typedef struct _Unwind_Context _Unwind_Context; sl@0: typedef uint32_t _Unwind_EHT_Header; sl@0: sl@0: sl@0: /* UCB: */ sl@0: sl@0: struct _Unwind_Control_Block { sl@0: char exception_class[8]; sl@0: void (*exception_cleanup)(_Unwind_Reason_Code, _Unwind_Control_Block *); sl@0: /* Unwinder cache, private fields for the unwinder's use */ sl@0: struct { sl@0: uint32_t reserved1; /* init reserved1 to 0, then don't touch */ sl@0: uint32_t reserved2; sl@0: uint32_t reserved3; sl@0: uint32_t reserved4; sl@0: uint32_t reserved5; sl@0: } unwinder_cache; sl@0: /* Propagation barrier cache (valid after phase 1): */ sl@0: struct { sl@0: uint32_t sp; sl@0: uint32_t bitpattern[5]; sl@0: } barrier_cache; sl@0: /* Cleanup cache (preserved over cleanup): */ sl@0: struct { sl@0: uint32_t bitpattern[4]; sl@0: } cleanup_cache; sl@0: /* Pr cache (for pr's benefit): */ sl@0: struct { sl@0: uint32_t fnstart; /* function start address */ sl@0: _Unwind_EHT_Header *ehtp; /* pointer to EHT entry header word */ sl@0: uint32_t additional; /* additional data */ sl@0: uint32_t reserved1; sl@0: } pr_cache; sl@0: long long int :0; /* Force alignment of next item to 8-byte boundary */ sl@0: }; sl@0: sl@0: /* Interface functions: */ sl@0: sl@0: _Unwind_Reason_Code _Unwind_RaiseException(_Unwind_Control_Block *ucbp); sl@0: NORETURNDECL void _Unwind_Resume(_Unwind_Control_Block *ucbp); sl@0: void _Unwind_Complete(_Unwind_Control_Block *ucbp); sl@0: void _Unwind_DeleteException(_Unwind_Control_Block *ucbp); sl@0: sl@0: /* Virtual Register Set*/ sl@0: sl@0: typedef enum { sl@0: _UVRSC_CORE = 0, /* integer register */ sl@0: _UVRSC_VFP = 1, /* vfp */ sl@0: /* 2: was fpa (obsolete) */ sl@0: _UVRSC_WMMXD = 3, /* Intel WMMX data register */ sl@0: _UVRSC_WMMXC = 4 /* Intel WMMX control register */ sl@0: } _Unwind_VRS_RegClass; sl@0: sl@0: typedef enum { sl@0: _UVRSD_UINT32 = 0, sl@0: _UVRSD_VFPX = 1, sl@0: /* 2: was fpa (obsolete) */ sl@0: _UVRSD_UINT64 = 3, sl@0: _UVRSD_FLOAT = 4, sl@0: _UVRSD_DOUBLE = 5 sl@0: } _Unwind_VRS_DataRepresentation; sl@0: sl@0: typedef enum { sl@0: _UVRSR_OK = 0, sl@0: _UVRSR_NOT_IMPLEMENTED = 1, sl@0: _UVRSR_FAILED = 2 sl@0: } _Unwind_VRS_Result; sl@0: sl@0: IMPORT_C _Unwind_VRS_Result _Unwind_VRS_Set(_Unwind_Context *context, sl@0: _Unwind_VRS_RegClass regclass, sl@0: uint32_t regno, sl@0: _Unwind_VRS_DataRepresentation representation, sl@0: void *valuep); sl@0: sl@0: IMPORT_C _Unwind_VRS_Result _Unwind_VRS_Get(_Unwind_Context *context, sl@0: _Unwind_VRS_RegClass regclass, sl@0: uint32_t regno, sl@0: _Unwind_VRS_DataRepresentation representation, sl@0: void *valuep); sl@0: sl@0: IMPORT_C _Unwind_VRS_Result _Unwind_VRS_Pop(_Unwind_Context *context, sl@0: _Unwind_VRS_RegClass regclass, sl@0: uint32_t descriminator, sl@0: _Unwind_VRS_DataRepresentation representation); sl@0: sl@0: #ifdef __cplusplus sl@0: } /* extern "C" */ sl@0: #endif sl@0: sl@0: #endif /* defined UNWINDER_H */