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 */