sl@0: /* unwinder.h sl@0: * sl@0: * Copyright 2002-2003 ARM Limited. sl@0: */ sl@0: /* sl@0: Licence sl@0: sl@0: 1. Subject to the provisions of clause 2, ARM hereby grants to LICENSEE a sl@0: perpetual, non-exclusive, nontransferable, royalty free, worldwide licence sl@0: to use this Example Implementation of Exception Handling solely for the sl@0: purpose of developing, having developed, manufacturing, having sl@0: manufactured, offering to sell, selling, supplying or otherwise sl@0: distributing products which comply with the Exception Handling ABI for the sl@0: ARM Architecture specification. All other rights are reserved to ARM or its sl@0: licensors. sl@0: sl@0: 2. THIS EXAMPLE IMPLEMENTATION OF EXCEPTION HANDLING IS PROVIDED "AS IS" sl@0: WITH NO WARRANTIES EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT LIMITED sl@0: TO ANY WARRANTY OF SATISFACTORY QUALITY, MERCHANTABILITY, NONINFRINGEMENT sl@0: OR FITNESS FOR A PARTICULAR PURPOSE. sl@0: */ sl@0: /* sl@0: * RCS $Revision: 1.7 $ sl@0: * Checkin $Date: 2003/09/01 12:45:25 $ sl@0: * Revising $Author: achapman $ 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: 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: _UVRSC_FPA = 2, /* fpa */ 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: _UVRSD_FPAX = 2, 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: _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: _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: _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 */