Home | History | Annotate | Line # | Download | only in unwind
decode.h revision 1.1.20.2
      1  1.1.20.2  rpaulo /*	$NetBSD: decode.h,v 1.1.20.2 2006/09/09 02:40:43 rpaulo Exp $	*/
      2  1.1.20.2  rpaulo 
      3  1.1.20.2  rpaulo /* Contributed to the NetBSD Foundation by Cherry G. Mathew <cherry (at) mahiti.org>
      4  1.1.20.2  rpaulo  * This file contains prototypes to decode unwind descriptors.
      5  1.1.20.2  rpaulo  */
      6  1.1.20.2  rpaulo 
      7  1.1.20.2  rpaulo #define MAXSTATERECS 20	/* The maximum number of descriptor records per region */
      8  1.1.20.2  rpaulo 
      9  1.1.20.2  rpaulo #define IS_R1(byte) (( (byte) & 0xc0) == 0)
     10  1.1.20.2  rpaulo #define IS_R2(byte) (((byte) & 0xf8) == 0x40)
     11  1.1.20.2  rpaulo #define IS_R3(byte) (((byte) & 0xfc) == 0x60)
     12  1.1.20.2  rpaulo #define IS_P1(byte) (((byte) & 0xe0) == 0x80)
     13  1.1.20.2  rpaulo #define IS_P2(byte) (((byte) & 0xf0) == 0xa0)
     14  1.1.20.2  rpaulo #define IS_P3(byte) (((byte) & 0xf8) == 0xb0)
     15  1.1.20.2  rpaulo #define IS_P4(byte) ((byte) == (char) 0xb8)
     16  1.1.20.2  rpaulo #define IS_P5(byte) ((byte) == (char) 0xb9)
     17  1.1.20.2  rpaulo #define IS_P6(byte) (((byte) & 0xe0) == 0xc0)
     18  1.1.20.2  rpaulo #define IS_P7(byte) (((byte) & 0xf0) == 0xe0)
     19  1.1.20.2  rpaulo #define IS_P8(byte) ((byte) == (char) 0xf0)
     20  1.1.20.2  rpaulo #define IS_P9(byte) ((byte) == (char) 0xf1)
     21  1.1.20.2  rpaulo #define IS_P10(byte) ((byte) ==(char) 0xff)
     22  1.1.20.2  rpaulo #define IS_B1(byte) (((byte) & 0xc0) == 0x80)
     23  1.1.20.2  rpaulo #define IS_B2(byte) (((byte) & 0xe0) == 0xc0)
     24  1.1.20.2  rpaulo #define IS_B3(byte) ((byte) == (char) 0xe0)
     25  1.1.20.2  rpaulo #define IS_B4(byte) (((byte) & 0xf7) == 0xf0)
     26  1.1.20.2  rpaulo #define IS_X1(byte) ((byte) == (char) 0xf9)
     27  1.1.20.2  rpaulo #define IS_X2(byte) ((byte) == (char) 0xfa)
     28  1.1.20.2  rpaulo #define IS_X3(byte) ((byte) == (char) 0xfb)
     29  1.1.20.2  rpaulo #define IS_X4(byte) ((byte) == (char) 0xfc)
     30  1.1.20.2  rpaulo 
     31  1.1.20.2  rpaulo struct unwind_desc_R1 {
     32  1.1.20.2  rpaulo 	boolean_t r;
     33  1.1.20.2  rpaulo 	vsize_t rlen;
     34  1.1.20.2  rpaulo };
     35  1.1.20.2  rpaulo 
     36  1.1.20.2  rpaulo struct unwind_desc_R2 {
     37  1.1.20.2  rpaulo 	u_int mask;
     38  1.1.20.2  rpaulo #define R2MASKRP	0x8
     39  1.1.20.2  rpaulo #define R2MASKPFS	0x4
     40  1.1.20.2  rpaulo #define R2MASKPSP	0x2
     41  1.1.20.2  rpaulo 
     42  1.1.20.2  rpaulo 	u_int grsave;
     43  1.1.20.2  rpaulo 	vsize_t rlen;
     44  1.1.20.2  rpaulo };
     45  1.1.20.2  rpaulo 
     46  1.1.20.2  rpaulo struct unwind_desc_R3 {
     47  1.1.20.2  rpaulo 	boolean_t r;
     48  1.1.20.2  rpaulo 	vsize_t rlen;
     49  1.1.20.2  rpaulo };
     50  1.1.20.2  rpaulo 
     51  1.1.20.2  rpaulo struct unwind_desc_P1 {
     52  1.1.20.2  rpaulo 	u_int brmask;
     53  1.1.20.2  rpaulo };
     54  1.1.20.2  rpaulo 
     55  1.1.20.2  rpaulo struct unwind_desc_P2 {
     56  1.1.20.2  rpaulo 	u_int brmask;
     57  1.1.20.2  rpaulo 	u_int gr;
     58  1.1.20.2  rpaulo };
     59  1.1.20.2  rpaulo 
     60  1.1.20.2  rpaulo struct unwind_desc_P3 {
     61  1.1.20.2  rpaulo 	u_int r;
     62  1.1.20.2  rpaulo 	u_int grbr;
     63  1.1.20.2  rpaulo };
     64  1.1.20.2  rpaulo 
     65  1.1.20.2  rpaulo struct unwind_desc_P4 {
     66  1.1.20.2  rpaulo 	vsize_t imask;
     67  1.1.20.2  rpaulo };
     68  1.1.20.2  rpaulo 
     69  1.1.20.2  rpaulo struct unwind_desc_P5 {
     70  1.1.20.2  rpaulo 	u_int grmask;
     71  1.1.20.2  rpaulo 	u_int frmask;
     72  1.1.20.2  rpaulo };
     73  1.1.20.2  rpaulo 
     74  1.1.20.2  rpaulo struct unwind_desc_P6 {
     75  1.1.20.2  rpaulo 	boolean_t r;
     76  1.1.20.2  rpaulo 	u_int rmask;
     77  1.1.20.2  rpaulo };
     78  1.1.20.2  rpaulo 
     79  1.1.20.2  rpaulo struct unwind_desc_P7 {
     80  1.1.20.2  rpaulo 	u_int r;
     81  1.1.20.2  rpaulo 	vsize_t t;
     82  1.1.20.2  rpaulo 	vsize_t size;
     83  1.1.20.2  rpaulo };
     84  1.1.20.2  rpaulo 
     85  1.1.20.2  rpaulo struct unwind_desc_P8 {
     86  1.1.20.2  rpaulo 	u_int r;
     87  1.1.20.2  rpaulo 	vsize_t t;
     88  1.1.20.2  rpaulo };
     89  1.1.20.2  rpaulo 
     90  1.1.20.2  rpaulo struct unwind_desc_P9 {
     91  1.1.20.2  rpaulo 	u_int grmask;
     92  1.1.20.2  rpaulo 	u_int gr;
     93  1.1.20.2  rpaulo };
     94  1.1.20.2  rpaulo 
     95  1.1.20.2  rpaulo struct unwind_desc_P10 {
     96  1.1.20.2  rpaulo 	u_int abi;
     97  1.1.20.2  rpaulo 	u_int context;
     98  1.1.20.2  rpaulo };
     99  1.1.20.2  rpaulo 
    100  1.1.20.2  rpaulo struct unwind_desc_B1 {
    101  1.1.20.2  rpaulo 	boolean_t r;
    102  1.1.20.2  rpaulo 	u_int label;
    103  1.1.20.2  rpaulo };
    104  1.1.20.2  rpaulo 
    105  1.1.20.2  rpaulo struct unwind_desc_B2 {
    106  1.1.20.2  rpaulo 	u_int ecount;
    107  1.1.20.2  rpaulo 	vsize_t t;
    108  1.1.20.2  rpaulo };
    109  1.1.20.2  rpaulo 
    110  1.1.20.2  rpaulo struct unwind_desc_B3 {
    111  1.1.20.2  rpaulo 	vsize_t t;
    112  1.1.20.2  rpaulo 	vsize_t ecount;
    113  1.1.20.2  rpaulo };
    114  1.1.20.2  rpaulo 
    115  1.1.20.2  rpaulo struct unwind_desc_B4 {
    116  1.1.20.2  rpaulo 	boolean_t r;
    117  1.1.20.2  rpaulo 	vsize_t label;
    118  1.1.20.2  rpaulo };
    119  1.1.20.2  rpaulo 
    120  1.1.20.2  rpaulo struct unwind_desc_X1 {
    121  1.1.20.2  rpaulo 	boolean_t r;
    122  1.1.20.2  rpaulo 	boolean_t a;
    123  1.1.20.2  rpaulo 	boolean_t b;
    124  1.1.20.2  rpaulo 	u_int reg;
    125  1.1.20.2  rpaulo 	vsize_t t;
    126  1.1.20.2  rpaulo 	vsize_t offset;
    127  1.1.20.2  rpaulo };
    128  1.1.20.2  rpaulo 
    129  1.1.20.2  rpaulo struct unwind_desc_X2 {
    130  1.1.20.2  rpaulo 	boolean_t x;
    131  1.1.20.2  rpaulo 	boolean_t a;
    132  1.1.20.2  rpaulo 	boolean_t b;
    133  1.1.20.2  rpaulo 	u_int reg;
    134  1.1.20.2  rpaulo 	boolean_t y;
    135  1.1.20.2  rpaulo 	u_int treg;
    136  1.1.20.2  rpaulo 	vsize_t t;
    137  1.1.20.2  rpaulo };
    138  1.1.20.2  rpaulo 
    139  1.1.20.2  rpaulo 
    140  1.1.20.2  rpaulo 
    141  1.1.20.2  rpaulo struct unwind_desc_X3 {
    142  1.1.20.2  rpaulo 	boolean_t r;
    143  1.1.20.2  rpaulo 	u_int qp;
    144  1.1.20.2  rpaulo 	boolean_t a;
    145  1.1.20.2  rpaulo 	boolean_t b;
    146  1.1.20.2  rpaulo 	u_int reg;
    147  1.1.20.2  rpaulo 	vsize_t t;
    148  1.1.20.2  rpaulo 	vsize_t offset;
    149  1.1.20.2  rpaulo };
    150  1.1.20.2  rpaulo 
    151  1.1.20.2  rpaulo struct unwind_desc_X4 {
    152  1.1.20.2  rpaulo 	u_int qp;
    153  1.1.20.2  rpaulo 	boolean_t x;
    154  1.1.20.2  rpaulo 	boolean_t a;
    155  1.1.20.2  rpaulo 	boolean_t b;
    156  1.1.20.2  rpaulo 	u_int reg;
    157  1.1.20.2  rpaulo 	boolean_t y;
    158  1.1.20.2  rpaulo 	u_int treg;
    159  1.1.20.2  rpaulo 	vsize_t t;
    160  1.1.20.2  rpaulo };
    161  1.1.20.2  rpaulo 
    162  1.1.20.2  rpaulo union unwind_desc {
    163  1.1.20.2  rpaulo 	struct unwind_desc_R1 R1;
    164  1.1.20.2  rpaulo 	struct unwind_desc_R2 R2;
    165  1.1.20.2  rpaulo 	struct unwind_desc_R3 R3;
    166  1.1.20.2  rpaulo 
    167  1.1.20.2  rpaulo 	struct unwind_desc_P1 P1;
    168  1.1.20.2  rpaulo 	struct unwind_desc_P2 P2;
    169  1.1.20.2  rpaulo 	struct unwind_desc_P3 P3;
    170  1.1.20.2  rpaulo 	struct unwind_desc_P4 P4;
    171  1.1.20.2  rpaulo 	struct unwind_desc_P5 P5;
    172  1.1.20.2  rpaulo 	struct unwind_desc_P6 P6;
    173  1.1.20.2  rpaulo 	struct unwind_desc_P7 P7;
    174  1.1.20.2  rpaulo 	struct unwind_desc_P8 P8;
    175  1.1.20.2  rpaulo 	struct unwind_desc_P9 P9;
    176  1.1.20.2  rpaulo 	struct unwind_desc_P10 P10;
    177  1.1.20.2  rpaulo 
    178  1.1.20.2  rpaulo 	struct unwind_desc_B1 B1;
    179  1.1.20.2  rpaulo 	struct unwind_desc_B2 B2;
    180  1.1.20.2  rpaulo 	struct unwind_desc_B3 B3;
    181  1.1.20.2  rpaulo 	struct unwind_desc_B4 B4;
    182  1.1.20.2  rpaulo 
    183  1.1.20.2  rpaulo 	struct unwind_desc_X1 X1;
    184  1.1.20.2  rpaulo 	struct unwind_desc_X2 X2;
    185  1.1.20.2  rpaulo 	struct unwind_desc_X3 X3;
    186  1.1.20.2  rpaulo 	struct unwind_desc_X4 X4;
    187  1.1.20.2  rpaulo };
    188  1.1.20.2  rpaulo 
    189  1.1.20.2  rpaulo enum record_type {
    190  1.1.20.2  rpaulo 	R1, R2, R3,
    191  1.1.20.2  rpaulo 	P1, P2, P3, P4, P5, P6, P7, P8, P9, P10,
    192  1.1.20.2  rpaulo 	B1, B2, B3, B4,
    193  1.1.20.2  rpaulo 	X1, X2, X3, X4
    194  1.1.20.2  rpaulo };
    195  1.1.20.2  rpaulo 
    196  1.1.20.2  rpaulo 
    197  1.1.20.2  rpaulo /* A record chain is a decoded unwind descriptor.
    198  1.1.20.2  rpaulo  * It is usefull for post processing unwind descriptors.
    199  1.1.20.2  rpaulo  */
    200  1.1.20.2  rpaulo 
    201  1.1.20.2  rpaulo struct recordchain {
    202  1.1.20.2  rpaulo 	enum record_type type;
    203  1.1.20.2  rpaulo 	union unwind_desc udesc;
    204  1.1.20.2  rpaulo };
    205  1.1.20.2  rpaulo 
    206  1.1.20.2  rpaulo 
    207  1.1.20.2  rpaulo 
    208  1.1.20.2  rpaulo /* Decode Function prototypes. */
    209  1.1.20.2  rpaulo 
    210  1.1.20.2  rpaulo char *
    211  1.1.20.2  rpaulo unwind_decode_ule128(char *buf, unsigned long *);
    212  1.1.20.2  rpaulo char *
    213  1.1.20.2  rpaulo unwind_decode_R1(char *buf, union unwind_desc *uwd);
    214  1.1.20.2  rpaulo char *
    215  1.1.20.2  rpaulo unwind_decode_R2(char *buf, union unwind_desc *uwd);
    216  1.1.20.2  rpaulo char *
    217  1.1.20.2  rpaulo unwind_decode_R3(char *buf, union unwind_desc *uwd);
    218  1.1.20.2  rpaulo char *
    219  1.1.20.2  rpaulo unwind_decode_P1(char *buf, union unwind_desc *uwd);
    220  1.1.20.2  rpaulo char *
    221  1.1.20.2  rpaulo unwind_decode_P2(char *buf, union unwind_desc *uwd);
    222  1.1.20.2  rpaulo char *
    223  1.1.20.2  rpaulo unwind_decode_P3(char *buf, union unwind_desc *uwd);
    224  1.1.20.2  rpaulo char *
    225  1.1.20.2  rpaulo unwind_decode_P4(char *buf, union unwind_desc *uwd, vsize_t len);
    226  1.1.20.2  rpaulo char *
    227  1.1.20.2  rpaulo unwind_decode_P5(char *buf, union unwind_desc *uwd);
    228  1.1.20.2  rpaulo char *
    229  1.1.20.2  rpaulo unwind_decode_P6(char *buf, union unwind_desc *uwd);
    230  1.1.20.2  rpaulo char *
    231  1.1.20.2  rpaulo unwind_decode_P7(char *buf, union unwind_desc *uwd);
    232  1.1.20.2  rpaulo char *
    233  1.1.20.2  rpaulo unwind_decode_P8(char *buf, union unwind_desc *uwd);
    234  1.1.20.2  rpaulo char *
    235  1.1.20.2  rpaulo unwind_decode_P9(char *buf, union unwind_desc *uwd);
    236  1.1.20.2  rpaulo char *
    237  1.1.20.2  rpaulo unwind_decode_P10(char *buf, union unwind_desc *uwd);
    238  1.1.20.2  rpaulo char *
    239  1.1.20.2  rpaulo unwind_decode_B1(char *buf, union unwind_desc *uwd);
    240  1.1.20.2  rpaulo char *
    241  1.1.20.2  rpaulo unwind_decode_B2(char *buf, union unwind_desc *uwd);
    242  1.1.20.2  rpaulo char *
    243  1.1.20.2  rpaulo unwind_decode_B3(char *buf, union unwind_desc *uwd);
    244  1.1.20.2  rpaulo char *
    245  1.1.20.2  rpaulo unwind_decode_B4(char *buf, union unwind_desc *uwd);
    246  1.1.20.2  rpaulo char *
    247  1.1.20.2  rpaulo unwind_decode_X1(char *buf, union unwind_desc *uwd);
    248  1.1.20.2  rpaulo char *
    249  1.1.20.2  rpaulo unwind_decode_X2(char *buf, union unwind_desc *uwd);
    250  1.1.20.2  rpaulo char *
    251  1.1.20.2  rpaulo unwind_decode_X3(char *buf, union unwind_desc *uwd);
    252  1.1.20.2  rpaulo char *
    253  1.1.20.2  rpaulo unwind_decode_X4(char *buf, union unwind_desc *uwd);
    254  1.1.20.2  rpaulo 
    255  1.1.20.2  rpaulo 
    256  1.1.20.2  rpaulo 
    257  1.1.20.2  rpaulo 
    258  1.1.20.2  rpaulo 
    259  1.1.20.2  rpaulo 
    260