/* $NetBSD: decode.h,v 1.2 2007/02/21 22:59:45 thorpej Exp $ */ /* Contributed to the NetBSD Foundation by Cherry G. Mathew * This file contains prototypes to decode unwind descriptors. */ #define MAXSTATERECS 20 /* The maximum number of descriptor records per region */ #define IS_R1(byte) (( (byte) & 0xc0) == 0) #define IS_R2(byte) (((byte) & 0xf8) == 0x40) #define IS_R3(byte) (((byte) & 0xfc) == 0x60) #define IS_P1(byte) (((byte) & 0xe0) == 0x80) #define IS_P2(byte) (((byte) & 0xf0) == 0xa0) #define IS_P3(byte) (((byte) & 0xf8) == 0xb0) #define IS_P4(byte) ((byte) == (char) 0xb8) #define IS_P5(byte) ((byte) == (char) 0xb9) #define IS_P6(byte) (((byte) & 0xe0) == 0xc0) #define IS_P7(byte) (((byte) & 0xf0) == 0xe0) #define IS_P8(byte) ((byte) == (char) 0xf0) #define IS_P9(byte) ((byte) == (char) 0xf1) #define IS_P10(byte) ((byte) ==(char) 0xff) #define IS_B1(byte) (((byte) & 0xc0) == 0x80) #define IS_B2(byte) (((byte) & 0xe0) == 0xc0) #define IS_B3(byte) ((byte) == (char) 0xe0) #define IS_B4(byte) (((byte) & 0xf7) == 0xf0) #define IS_X1(byte) ((byte) == (char) 0xf9) #define IS_X2(byte) ((byte) == (char) 0xfa) #define IS_X3(byte) ((byte) == (char) 0xfb) #define IS_X4(byte) ((byte) == (char) 0xfc) struct unwind_desc_R1 { bool r; vsize_t rlen; }; struct unwind_desc_R2 { u_int mask; #define R2MASKRP 0x8 #define R2MASKPFS 0x4 #define R2MASKPSP 0x2 u_int grsave; vsize_t rlen; }; struct unwind_desc_R3 { bool r; vsize_t rlen; }; struct unwind_desc_P1 { u_int brmask; }; struct unwind_desc_P2 { u_int brmask; u_int gr; }; struct unwind_desc_P3 { u_int r; u_int grbr; }; struct unwind_desc_P4 { vsize_t imask; }; struct unwind_desc_P5 { u_int grmask; u_int frmask; }; struct unwind_desc_P6 { bool r; u_int rmask; }; struct unwind_desc_P7 { u_int r; vsize_t t; vsize_t size; }; struct unwind_desc_P8 { u_int r; vsize_t t; }; struct unwind_desc_P9 { u_int grmask; u_int gr; }; struct unwind_desc_P10 { u_int abi; u_int context; }; struct unwind_desc_B1 { bool r; u_int label; }; struct unwind_desc_B2 { u_int ecount; vsize_t t; }; struct unwind_desc_B3 { vsize_t t; vsize_t ecount; }; struct unwind_desc_B4 { bool r; vsize_t label; }; struct unwind_desc_X1 { bool r; bool a; bool b; u_int reg; vsize_t t; vsize_t offset; }; struct unwind_desc_X2 { bool x; bool a; bool b; u_int reg; bool y; u_int treg; vsize_t t; }; struct unwind_desc_X3 { bool r; u_int qp; bool a; bool b; u_int reg; vsize_t t; vsize_t offset; }; struct unwind_desc_X4 { u_int qp; bool x; bool a; bool b; u_int reg; bool y; u_int treg; vsize_t t; }; union unwind_desc { struct unwind_desc_R1 R1; struct unwind_desc_R2 R2; struct unwind_desc_R3 R3; struct unwind_desc_P1 P1; struct unwind_desc_P2 P2; struct unwind_desc_P3 P3; struct unwind_desc_P4 P4; struct unwind_desc_P5 P5; struct unwind_desc_P6 P6; struct unwind_desc_P7 P7; struct unwind_desc_P8 P8; struct unwind_desc_P9 P9; struct unwind_desc_P10 P10; struct unwind_desc_B1 B1; struct unwind_desc_B2 B2; struct unwind_desc_B3 B3; struct unwind_desc_B4 B4; struct unwind_desc_X1 X1; struct unwind_desc_X2 X2; struct unwind_desc_X3 X3; struct unwind_desc_X4 X4; }; enum record_type { R1, R2, R3, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, B1, B2, B3, B4, X1, X2, X3, X4 }; /* A record chain is a decoded unwind descriptor. * It is usefull for post processing unwind descriptors. */ struct recordchain { enum record_type type; union unwind_desc udesc; }; /* Decode Function prototypes. */ char * unwind_decode_ule128(char *buf, unsigned long *); char * unwind_decode_R1(char *buf, union unwind_desc *uwd); char * unwind_decode_R2(char *buf, union unwind_desc *uwd); char * unwind_decode_R3(char *buf, union unwind_desc *uwd); char * unwind_decode_P1(char *buf, union unwind_desc *uwd); char * unwind_decode_P2(char *buf, union unwind_desc *uwd); char * unwind_decode_P3(char *buf, union unwind_desc *uwd); char * unwind_decode_P4(char *buf, union unwind_desc *uwd, vsize_t len); char * unwind_decode_P5(char *buf, union unwind_desc *uwd); char * unwind_decode_P6(char *buf, union unwind_desc *uwd); char * unwind_decode_P7(char *buf, union unwind_desc *uwd); char * unwind_decode_P8(char *buf, union unwind_desc *uwd); char * unwind_decode_P9(char *buf, union unwind_desc *uwd); char * unwind_decode_P10(char *buf, union unwind_desc *uwd); char * unwind_decode_B1(char *buf, union unwind_desc *uwd); char * unwind_decode_B2(char *buf, union unwind_desc *uwd); char * unwind_decode_B3(char *buf, union unwind_desc *uwd); char * unwind_decode_B4(char *buf, union unwind_desc *uwd); char * unwind_decode_X1(char *buf, union unwind_desc *uwd); char * unwind_decode_X2(char *buf, union unwind_desc *uwd); char * unwind_decode_X3(char *buf, union unwind_desc *uwd); char * unwind_decode_X4(char *buf, union unwind_desc *uwd);