1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 22 /* 23 * Copyright 2007 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27 /* 28 * Copyright 2007 Jason King. All rights reserved. 29 * Use is subject to license terms. 30 */ 31 32 #ifndef _DIS_SPARC_FMT_H 33 #define _DIS_SPARC_FMT_H 34 35 #ifdef __cplusplus 36 extern "C" { 37 #endif 38 39 #include <sys/types.h> 40 #include "libdisasm.h" 41 #include "dis_sparc.h" 42 43 /* which set of registers are used with an instruction */ 44 #define REG_INT 0x00 /* regular integer registers */ 45 #define REG_FP 0x01 /* single-precision fp registers */ 46 #define REG_FPD 0x02 /* double-precision fp registers */ 47 #define REG_FPQ 0x03 /* quad-precision fp registers */ 48 #define REG_CP 0x04 /* coprocessor registers (v8) */ 49 #define REG_ICC 0x05 /* %icc / % xcc */ 50 #define REG_FCC 0x06 /* %fccn */ 51 #define REG_FSR 0x07 /* %fsr */ 52 #define REG_CSR 0x08 /* %csr */ 53 #define REG_CQ 0x09 /* %cq */ 54 #define REG_NONE 0x0a /* no registers */ 55 56 /* the size fo the displacement for branches */ 57 #define DISP22 0x00 58 #define DISP19 0x01 59 #define DISP16 0x02 60 #define CONST22 0x03 61 62 /* get/set the register set name for the rd field of an instruction */ 63 #define FLG_RD(x) (x) 64 #define FLG_RD_VAL(x) (x & 0xfL) 65 66 #define FLG_STORE (0x1L << 24) /* the instruction is not a load */ 67 #define FLG_ASI (0x2L << 24) /* the load/store includes an asi value */ 68 69 70 /* flags for ALU instructions */ 71 72 /* set/get register set name for 1st argument position */ 73 #define FLG_P1(x) (x << 8) 74 #define FLG_P1_VAL(x) ((x >> 8) & 0xfL) 75 76 /* get/set reg set for 2nd argument position */ 77 #define FLG_P2(x) (x << 4) 78 #define FLG_P2_VAL(x) ((x >> 4) & 0xfL) 79 80 /* get/set for 3rd argument position */ 81 #define FLG_P3(x) (x) 82 #define FLG_P3_VAL(x) (x & 0xfL) 83 84 /* set if the arguments do not contain immediate values */ 85 #define FLG_NOIMM (0x01L << 24) 86 87 88 89 /* flags for branch instructions */ 90 91 /* has branch prediction */ 92 #define FLG_PRED (0x01L << 24) 93 94 /* get/set condition code register set -- usually REG_NONE */ 95 #define FLG_RS1(x) (x) 96 #define FLG_RS1_VAL(x) (x & 0xfL) 97 98 /* get/set displacement size */ 99 #define FLG_DISP(x) (x << 4L) 100 #define FLG_DISP_VAL(x) ((x >> 4L) & 0x0fL) 101 102 103 int fmt_call(dis_handle_t *, uint32_t, const inst_t *, int); 104 int fmt_ls(dis_handle_t *, uint32_t, const inst_t *, int); 105 int fmt_alu(dis_handle_t *, uint32_t, const inst_t *, int); 106 int fmt_branch(dis_handle_t *, uint32_t, const inst_t *, int); 107 int fmt_sethi(dis_handle_t *, uint32_t, const inst_t *, int); 108 int fmt_fpop1(dis_handle_t *, uint32_t, const inst_t *, int); 109 int fmt_fpop2(dis_handle_t *, uint32_t, const inst_t *, int); 110 int fmt_vis(dis_handle_t *, uint32_t, const inst_t *, int); 111 int fmt_trap(dis_handle_t *, uint32_t, const inst_t *, int); 112 int fmt_regwin(dis_handle_t *, uint32_t, const inst_t *, int); 113 int fmt_trap_ret(dis_handle_t *, uint32_t, const inst_t *, int); 114 int fmt_movcc(dis_handle_t *, uint32_t, const inst_t *, int); 115 int fmt_movr(dis_handle_t *, uint32_t, const inst_t *, int); 116 int fmt_fused(dis_handle_t *, uint32_t, const inst_t *, int); 117 118 #ifdef __cplusplus 119 } 120 #endif 121 122 #endif /* _DIS_SPARC_FMT_H */