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