1*4882a593Smuzhiyun /* $Id$ */ 2*4882a593Smuzhiyun 3*4882a593Smuzhiyun #ifndef _PPC_H 4*4882a593Smuzhiyun #define _PPC_H 5*4882a593Smuzhiyun 6*4882a593Smuzhiyun /*====================================================================== 7*4882a593Smuzhiyun * 8*4882a593Smuzhiyun * OPERANDS 9*4882a593Smuzhiyun * 10*4882a593Smuzhiyun *======================================================================*/ 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun enum OP_FIELD { 13*4882a593Smuzhiyun O_AA = 1, O_BD, O_BI, O_BO, O_crbD, O_crbA, O_crbB, O_CRM, O_d, O_frC, O_frD, 14*4882a593Smuzhiyun O_frS, O_IMM, O_LI, O_LK, O_MB, O_ME, O_NB, O_OE, O_rA, O_rB, O_Rc, O_rD, 15*4882a593Smuzhiyun O_rS, O_SH, O_SIMM, O_SR, O_TO, O_UIMM, O_crfD, O_crfS, O_L, O_spr, O_tbr, 16*4882a593Smuzhiyun O_cr2 }; 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun struct operand { 19*4882a593Smuzhiyun enum OP_FIELD field; /* The operand identifier from the 20*4882a593Smuzhiyun enum above */ 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun char * name; /* Symbolic name of this operand */ 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun unsigned int bits; /* The number of bits used by this 25*4882a593Smuzhiyun operand */ 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun unsigned int shift; /* How far to the right the operand 28*4882a593Smuzhiyun should be shifted so that it is 29*4882a593Smuzhiyun aligned at the beginning of the 30*4882a593Smuzhiyun word */ 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun unsigned int hint; /* A bitwise-inclusive-OR of the 33*4882a593Smuzhiyun values shown below. These are used 34*4882a593Smuzhiyun tell the disassembler how to print 35*4882a593Smuzhiyun this operand */ 36*4882a593Smuzhiyun }; 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun /* Values for operand hint */ 39*4882a593Smuzhiyun #define OH_SILENT 0x01 /* dont print this operand */ 40*4882a593Smuzhiyun #define OH_ADDR 0x02 /* this operand is an address */ 41*4882a593Smuzhiyun #define OH_REG 0x04 /* this operand is a register */ 42*4882a593Smuzhiyun #define OH_SPR 0x08 /* this operand is an SPR */ 43*4882a593Smuzhiyun #define OH_TBR 0x10 /* this operand is a TBR */ 44*4882a593Smuzhiyun #define OH_OFFSET 0x20 /* this operand is an offset */ 45*4882a593Smuzhiyun #define OH_LITERAL 0x40 /* a literal string */ 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun /*====================================================================== 49*4882a593Smuzhiyun * 50*4882a593Smuzhiyun * OPCODES 51*4882a593Smuzhiyun * 52*4882a593Smuzhiyun *======================================================================*/ 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun /* From the MPCxxx instruction set documentation, all instructions are 55*4882a593Smuzhiyun * 32 bits long and word aligned. Bits 0-5 always specify the primary 56*4882a593Smuzhiyun * opcode. Many instructions also have an extended opcode. 57*4882a593Smuzhiyun */ 58*4882a593Smuzhiyun 59*4882a593Smuzhiyun #define GET_OPCD(i) (((unsigned long)(i) >> 26) & 0x3f) 60*4882a593Smuzhiyun #define MAKE_OPCODE(i) ((((unsigned long)(i)) & 0x3f) << 26) 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun /* The MPC860 User's Manual, Appendix D.4 contains the definitions of the 63*4882a593Smuzhiyun * instruction forms 64*4882a593Smuzhiyun */ 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun /*------------------------------------------------- 68*4882a593Smuzhiyun * I-Form Instructions: 69*4882a593Smuzhiyun * bX 70*4882a593Smuzhiyun *------------------------------------------------- 71*4882a593Smuzhiyun * OPCD | LI |AA|LK 72*4882a593Smuzhiyun *-------------------------------------------------*/ 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun #define I_OPCODE(i,aa,lk) (MAKE_OPCODE(i) | (((aa) & 0x1) << 1) | ((lk) & 0x1)) 75*4882a593Smuzhiyun #define I_MASK I_OPCODE(0x3f,0x1,0x1) 76*4882a593Smuzhiyun 77*4882a593Smuzhiyun 78*4882a593Smuzhiyun /*------------------------------------------------- 79*4882a593Smuzhiyun * B-Form Instructions: 80*4882a593Smuzhiyun * bcX 81*4882a593Smuzhiyun *------------------------------------------------- 82*4882a593Smuzhiyun * OPCD | BO | BI | BD |AA|LK 83*4882a593Smuzhiyun *-------------------------------------------------*/ 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun #define B_OPCODE(i,aa,lk) (MAKE_OPCODE(i) | (((aa) & 0x1) << 1) | ((lk) & 0x1)) 86*4882a593Smuzhiyun #define B_MASK B_OPCODE(0x3f,0x1,0x1) 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun /*------------------------------------------------- 90*4882a593Smuzhiyun * SC-Form Instructions: 91*4882a593Smuzhiyun * sc 92*4882a593Smuzhiyun *------------------------------------------------- 93*4882a593Smuzhiyun * OPCD | 00000 | 00000 | 00000000000000 |1|0 94*4882a593Smuzhiyun *-------------------------------------------------*/ 95*4882a593Smuzhiyun 96*4882a593Smuzhiyun #define SC_OPCODE(i) (MAKE_OPCODE(i) | 0x2) 97*4882a593Smuzhiyun #define SC_MASK SC_OPCODE(0x3f) 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun 100*4882a593Smuzhiyun /*------------------------------------------------- 101*4882a593Smuzhiyun * D-Form Instructions: 102*4882a593Smuzhiyun * addi addic addic. addis andi. andis. cmpi cmpli 103*4882a593Smuzhiyun * lbz lbzu lha lhau lhz lhzu lmw lwz lwzu mulli 104*4882a593Smuzhiyun * ori oris stb stbu sth sthu stmw stw stwu subfic 105*4882a593Smuzhiyun * twi xori xoris 106*4882a593Smuzhiyun *------------------------------------------------- 107*4882a593Smuzhiyun * OPCD | D | A | d 108*4882a593Smuzhiyun * OPCD | D | A | SIMM 109*4882a593Smuzhiyun * OPCD | S | A | d 110*4882a593Smuzhiyun * OPCD | S | A | UIMM 111*4882a593Smuzhiyun * OPCD |crfD|0|L| A | SIMM 112*4882a593Smuzhiyun * OPCD |crfD|0|L| A | UIMM 113*4882a593Smuzhiyun * OPCD | TO | A | SIMM 114*4882a593Smuzhiyun *-------------------------------------------------*/ 115*4882a593Smuzhiyun 116*4882a593Smuzhiyun #define D_OPCODE(i) MAKE_OPCODE(i) 117*4882a593Smuzhiyun #define D_MASK MAKE_OPCODE(0x3f) 118*4882a593Smuzhiyun 119*4882a593Smuzhiyun 120*4882a593Smuzhiyun /*------------------------------------------------- 121*4882a593Smuzhiyun * DS-Form Instructions: 122*4882a593Smuzhiyun * (none supported by MPC860) 123*4882a593Smuzhiyun *------------------------------------------------- 124*4882a593Smuzhiyun * OPCD | D | A | ds |XO 125*4882a593Smuzhiyun * OPCD | S | A | ds |XO 126*4882a593Smuzhiyun *-------------------------------------------------*/ 127*4882a593Smuzhiyun 128*4882a593Smuzhiyun #define DS_OPCODE(i,xo) (MAKE_OPCODE(i) | ((xo) & 0x3)) 129*4882a593Smuzhiyun #define DS_MASK DS_OPCODE(0x3f,0x1) 130*4882a593Smuzhiyun 131*4882a593Smuzhiyun 132*4882a593Smuzhiyun /*--------------------------------------------------- 133*4882a593Smuzhiyun * X-Form Instructions: 134*4882a593Smuzhiyun * andX andcX cmp cmpl cntlzwX dcbf dcbi dcbst dcbt 135*4882a593Smuzhiyun * dcbtst dcbz eciwx ecowx eieio eqvX extsbX extshX 136*4882a593Smuzhiyun * icbi lbzux lbxz lhaux lhax lhbrx lhzux lhxz lswi 137*4882a593Smuzhiyun * lswx lwarx lwbrx lwzux lwxz mcrfs mcrxr mfcr 138*4882a593Smuzhiyun * mfmsr mfsr mfsrin mtmsr mtsr mtsrin nandX norX 139*4882a593Smuzhiyun * orX orcX slwX srawX srawiX srwX stbux stbx 140*4882a593Smuzhiyun * sthbrx sthuxsthx stswi stswx stwbrx stwcx. stwux 141*4882a593Smuzhiyun * stwx sync tlbie tlbld tlbli tlbsync tw xorX 142*4882a593Smuzhiyun *--------------------------------------------------- 143*4882a593Smuzhiyun * OPCD | D | A | B | XO |0 144*4882a593Smuzhiyun * OPCD | D | A | NB | XO |0 145*4882a593Smuzhiyun * OPCD | D | 00000 | B | XO |0 146*4882a593Smuzhiyun * OPCD | D | 00000 | 00000 | XO |0 147*4882a593Smuzhiyun * OPCD | D |0| SR | 00000 | XO |0 148*4882a593Smuzhiyun * OPCD | S | A | B | XO |Rc 149*4882a593Smuzhiyun * OPCD | S | A | B | XO |1 150*4882a593Smuzhiyun * OPCD | S | A | B | XO |0 151*4882a593Smuzhiyun * OPCD | S | A | NB | XO |0 152*4882a593Smuzhiyun * OPCD | S | A | 00000 | XO |Rc 153*4882a593Smuzhiyun * OPCD | S | 00000 | B | XO |0 154*4882a593Smuzhiyun * OPCD | S | 00000 | 00000 | XO |0 155*4882a593Smuzhiyun * OPCD | S |0| SR | 00000 | XO |0 156*4882a593Smuzhiyun * OPCD | S | A | SH | XO |Rc 157*4882a593Smuzhiyun * OPCD |crfD|0|L| A | SH | XO |0 158*4882a593Smuzhiyun * OPCD |crfD |00| A | B | XO |0 159*4882a593Smuzhiyun * OPCD |crfD |00|crfS |00| 00000 | XO |0 160*4882a593Smuzhiyun * OPCD |crfD |00| 00000 | 00000 | XO |0 161*4882a593Smuzhiyun * OPCD |crfD |00| 00000 | IMM |0| XO |Rc 162*4882a593Smuzhiyun * OPCD | TO | A | B | XO |0 163*4882a593Smuzhiyun * OPCD | D | 00000 | B | XO |Rc 164*4882a593Smuzhiyun * OPCD | D | 00000 | 00000 | XO |Rc 165*4882a593Smuzhiyun * OPCD | crbD | 00000 | 00000 | XO |Rc 166*4882a593Smuzhiyun * OPCD | 00000 | A | B | XO |0 167*4882a593Smuzhiyun * OPCD | 00000 | 00000 | B | XO |0 168*4882a593Smuzhiyun * OPCD | 00000 | 00000 | 00000 | XO |0 169*4882a593Smuzhiyun *---------------------------------------------------*/ 170*4882a593Smuzhiyun 171*4882a593Smuzhiyun #define X_OPCODE(i,xo,rc) (MAKE_OPCODE(i) | (((xo) & 0x3ff) << 1) | \ 172*4882a593Smuzhiyun ((rc) & 0x1)) 173*4882a593Smuzhiyun #define X_MASK X_OPCODE(0x3f,0x3ff,0x1) 174*4882a593Smuzhiyun 175*4882a593Smuzhiyun 176*4882a593Smuzhiyun /*--------------------------------------------------- 177*4882a593Smuzhiyun * XL-Form Instructions: 178*4882a593Smuzhiyun * bcctrX bclrX crand crandc creqv crnand crnor cror 179*4882a593Smuzhiyun * croc crxorisync mcrf rfi 180*4882a593Smuzhiyun *--------------------------------------------------- 181*4882a593Smuzhiyun * OPCD | BO | BI | 00000 | XO |LK 182*4882a593Smuzhiyun * OPCD | crbD | crbA | crbB | XO |0 183*4882a593Smuzhiyun * OPCD |crfD |00|crfS |00| 00000 | XO |0 184*4882a593Smuzhiyun * OPCD | 00000 | 00000 | 00000 | XO |0 185*4882a593Smuzhiyun *---------------------------------------------------*/ 186*4882a593Smuzhiyun 187*4882a593Smuzhiyun #define XL_OPCODE(i,xo,lk) (MAKE_OPCODE(i) | (((xo) & 0x3ff) << 1) | \ 188*4882a593Smuzhiyun ((lk) & 0x1)) 189*4882a593Smuzhiyun #define XL_MASK XL_OPCODE(0x3f,0x3ff,0x1) 190*4882a593Smuzhiyun 191*4882a593Smuzhiyun 192*4882a593Smuzhiyun /*--------------------------------------------------- 193*4882a593Smuzhiyun * XFX-Form Instructions: 194*4882a593Smuzhiyun * mfspr mftb mtcrf mtspr 195*4882a593Smuzhiyun *--------------------------------------------------- 196*4882a593Smuzhiyun * OPCD | D | spr | XO |0 197*4882a593Smuzhiyun * OPCD | D |0| CRM |0| XO |0 198*4882a593Smuzhiyun * OPCD | S | spr | XO |0 199*4882a593Smuzhiyun * OPCD | D | tbr | XO |0 200*4882a593Smuzhiyun *---------------------------------------------------*/ 201*4882a593Smuzhiyun 202*4882a593Smuzhiyun #define XFX_OPCODE(i,xo,rc) (MAKE_OPCODE(i) | (((xo) & 0x3ff) << 1) | \ 203*4882a593Smuzhiyun ((rc) & 0x1)) 204*4882a593Smuzhiyun #define XFX_MASK XFX_OPCODE(0x3f,0x3ff,0x1) 205*4882a593Smuzhiyun 206*4882a593Smuzhiyun 207*4882a593Smuzhiyun /*--------------------------------------------------- 208*4882a593Smuzhiyun * XFL-Form Instructions: 209*4882a593Smuzhiyun * (none supported by MPC860) 210*4882a593Smuzhiyun *--------------------------------------------------- 211*4882a593Smuzhiyun * OPCD |0| FM |0| B | XO |0 212*4882a593Smuzhiyun *---------------------------------------------------*/ 213*4882a593Smuzhiyun 214*4882a593Smuzhiyun #define XFL_OPCODE(i,xo,rc) (MAKE_OPCODE(i) | (((xo) & 0x3ff) << 1) | \ 215*4882a593Smuzhiyun ((rc) & 0x1)) 216*4882a593Smuzhiyun #define XFL_MASK XFL_OPCODE(0x3f,0x3ff,0x1) 217*4882a593Smuzhiyun 218*4882a593Smuzhiyun 219*4882a593Smuzhiyun /*--------------------------------------------------- 220*4882a593Smuzhiyun * XS-Form Instructions: 221*4882a593Smuzhiyun * (none supported by MPC860) 222*4882a593Smuzhiyun *--------------------------------------------------- 223*4882a593Smuzhiyun * OPCD | S | A | sh | XO |sh|LK 224*4882a593Smuzhiyun *---------------------------------------------------*/ 225*4882a593Smuzhiyun 226*4882a593Smuzhiyun #define XS_OPCODE(i,xo,rc) (MAKE_OPCODE(i) | (((xo) & 0x1ff) << 2) | \ 227*4882a593Smuzhiyun ((rc) & 0x1)) 228*4882a593Smuzhiyun #define XS_MASK XS_OPCODE(0x3f,0x1ff,0x1) 229*4882a593Smuzhiyun 230*4882a593Smuzhiyun 231*4882a593Smuzhiyun /*--------------------------------------------------- 232*4882a593Smuzhiyun * XO-Form Instructions: 233*4882a593Smuzhiyun * addX addcXaddeX addmeX addzeX divwX divwuX mulhwX 234*4882a593Smuzhiyun * mulhwuX mullwX negX subfX subfcX subfeX subfmeX 235*4882a593Smuzhiyun * subfzeX 236*4882a593Smuzhiyun *--------------------------------------------------- 237*4882a593Smuzhiyun * OPCD | D | A | B |OE| XO |Rc 238*4882a593Smuzhiyun * OPCD | D | A | B |0 | XO |Rc 239*4882a593Smuzhiyun * OPCD | D | A | 00000 |OE| XO |Rc 240*4882a593Smuzhiyun *---------------------------------------------------*/ 241*4882a593Smuzhiyun 242*4882a593Smuzhiyun #define XO_OPCODE(i,xo,oe,rc) (MAKE_OPCODE(i) | (((oe) & 0x1) << 10) | \ 243*4882a593Smuzhiyun (((xo) & 0x1ff) << 1) | ((rc) & 0x1)) 244*4882a593Smuzhiyun #define XO_MASK XO_OPCODE(0x3f,0x1ff,0x1,0x1) 245*4882a593Smuzhiyun 246*4882a593Smuzhiyun 247*4882a593Smuzhiyun /*--------------------------------------------------- 248*4882a593Smuzhiyun * A-Form Instructions: 249*4882a593Smuzhiyun * (none supported by MPC860) 250*4882a593Smuzhiyun *--------------------------------------------------- 251*4882a593Smuzhiyun * OPCD | D | A | B |00000| XO |Rc 252*4882a593Smuzhiyun * OPCD | D | A | B | C | XO |Rc 253*4882a593Smuzhiyun * OPCD | D | A | 00000 | C | XO |Rc 254*4882a593Smuzhiyun * OPCD | D | 00000 | B |00000| XO |Rc 255*4882a593Smuzhiyun *---------------------------------------------------*/ 256*4882a593Smuzhiyun 257*4882a593Smuzhiyun #define A_OPCODE(i,xo,rc) (MAKE_OPCODE(i) | (((xo) & 0x1f) << 1) | \ 258*4882a593Smuzhiyun ((rc) & 0x1)) 259*4882a593Smuzhiyun #define A_MASK A_OPCODE(0x3f,0x1f,0x1) 260*4882a593Smuzhiyun 261*4882a593Smuzhiyun 262*4882a593Smuzhiyun /*--------------------------------------------------- 263*4882a593Smuzhiyun * M-Form Instructions: 264*4882a593Smuzhiyun * rlwimiX rlwinmX rlwnmX 265*4882a593Smuzhiyun *--------------------------------------------------- 266*4882a593Smuzhiyun * OPCD | S | A | SH | MB | ME |Rc 267*4882a593Smuzhiyun * OPCD | S | A | B | MB | ME |Rc 268*4882a593Smuzhiyun *---------------------------------------------------*/ 269*4882a593Smuzhiyun 270*4882a593Smuzhiyun #define M_OPCODE(i,rc) (MAKE_OPCODE(i) | ((rc) & 0x1)) 271*4882a593Smuzhiyun #define M_MASK M_OPCODE(0x3f,0x1) 272*4882a593Smuzhiyun 273*4882a593Smuzhiyun 274*4882a593Smuzhiyun /*--------------------------------------------------- 275*4882a593Smuzhiyun * MD-Form Instructions: 276*4882a593Smuzhiyun * (none supported by MPC860) 277*4882a593Smuzhiyun *--------------------------------------------------- 278*4882a593Smuzhiyun * OPCD | S | A | sh | mb | XO |sh|Rc 279*4882a593Smuzhiyun * OPCD | S | A | sh | me | XO |sh|Rc 280*4882a593Smuzhiyun *---------------------------------------------------*/ 281*4882a593Smuzhiyun 282*4882a593Smuzhiyun #define MD_OPCODE(i,xo,rc) (MAKE_OPCODE(i) | (((xo) & 0x7) << 2) | \ 283*4882a593Smuzhiyun ((rc) & 0x1)) 284*4882a593Smuzhiyun #define MD_MASK MD_OPCODE(0x3f,0x7,0x1) 285*4882a593Smuzhiyun 286*4882a593Smuzhiyun 287*4882a593Smuzhiyun /*--------------------------------------------------- 288*4882a593Smuzhiyun * MDS-Form Instructions: 289*4882a593Smuzhiyun * (none supported by MPC860) 290*4882a593Smuzhiyun *--------------------------------------------------- 291*4882a593Smuzhiyun * OPCD | S | A | B | mb | XO |Rc 292*4882a593Smuzhiyun * OPCD | S | A | B | me | XO |Rc 293*4882a593Smuzhiyun *---------------------------------------------------*/ 294*4882a593Smuzhiyun 295*4882a593Smuzhiyun #define MDS_OPCODE(i,xo,rc) (MAKE_OPCODE(i) | (((xo) & 0xf) << 1) | \ 296*4882a593Smuzhiyun ((rc) & 0x1)) 297*4882a593Smuzhiyun #define MDS_MASK MDS_OPCODE(0x3f,0xf,0x1) 298*4882a593Smuzhiyun 299*4882a593Smuzhiyun #define INSTRUCTION( memaddr ) ntohl(*(unsigned long *)(memaddr)) 300*4882a593Smuzhiyun 301*4882a593Smuzhiyun #define MAX_OPERANDS 8 302*4882a593Smuzhiyun 303*4882a593Smuzhiyun struct ppc_ctx; 304*4882a593Smuzhiyun 305*4882a593Smuzhiyun struct opcode { 306*4882a593Smuzhiyun unsigned long opcode; /* The complete opcode as produced by 307*4882a593Smuzhiyun one of the XXX_OPCODE macros above */ 308*4882a593Smuzhiyun 309*4882a593Smuzhiyun unsigned long mask; /* The mask to use on an instruction 310*4882a593Smuzhiyun before comparing with the opcode 311*4882a593Smuzhiyun field to see if it matches */ 312*4882a593Smuzhiyun 313*4882a593Smuzhiyun enum OP_FIELD fields[MAX_OPERANDS]; 314*4882a593Smuzhiyun /* An array defining the operands for 315*4882a593Smuzhiyun this opcode. The values of the 316*4882a593Smuzhiyun array are the operand identifiers */ 317*4882a593Smuzhiyun 318*4882a593Smuzhiyun int (*hfunc)(struct ppc_ctx *); 319*4882a593Smuzhiyun /* Address of a function to handle the given 320*4882a593Smuzhiyun mnemonic */ 321*4882a593Smuzhiyun 322*4882a593Smuzhiyun char * name; /* The symbolic name of this opcode */ 323*4882a593Smuzhiyun 324*4882a593Smuzhiyun unsigned int hint; /* A bitwise-inclusive-OR of the 325*4882a593Smuzhiyun values shown below. These are used 326*4882a593Smuzhiyun tell the disassembler how to print 327*4882a593Smuzhiyun some operands for this opcode */ 328*4882a593Smuzhiyun }; 329*4882a593Smuzhiyun 330*4882a593Smuzhiyun /* values for opcode hints */ 331*4882a593Smuzhiyun #define H_RELATIVE 0x1 /* The address operand is relative */ 332*4882a593Smuzhiyun #define H_IMM_HIGH 0x2 /* [U|S]IMM field shifted high */ 333*4882a593Smuzhiyun #define H_RA0_IS_0 0x4 /* If rA = 0 then treat as literal 0 */ 334*4882a593Smuzhiyun 335*4882a593Smuzhiyun struct ppc_ctx { 336*4882a593Smuzhiyun struct opcode * op; 337*4882a593Smuzhiyun unsigned long instr; 338*4882a593Smuzhiyun unsigned int flags; 339*4882a593Smuzhiyun int datalen; 340*4882a593Smuzhiyun char data[ 256 ]; 341*4882a593Smuzhiyun char radix_fmt[ 8 ]; 342*4882a593Smuzhiyun unsigned char * virtual; 343*4882a593Smuzhiyun }; 344*4882a593Smuzhiyun 345*4882a593Smuzhiyun 346*4882a593Smuzhiyun /*====================================================================== 347*4882a593Smuzhiyun * 348*4882a593Smuzhiyun * FUNCTIONS 349*4882a593Smuzhiyun * 350*4882a593Smuzhiyun *======================================================================*/ 351*4882a593Smuzhiyun 352*4882a593Smuzhiyun /* Values for flags as passed to various ppc routines */ 353*4882a593Smuzhiyun #define F_RADOCTAL 0x1 /* output radix = unsigned octal */ 354*4882a593Smuzhiyun #define F_RADUDECIMAL 0x2 /* output radix = unsigned decimal */ 355*4882a593Smuzhiyun #define F_RADSDECIMAL 0x4 /* output radix = signed decimal */ 356*4882a593Smuzhiyun #define F_RADHEX 0x8 /* output radix = unsigned hex */ 357*4882a593Smuzhiyun #define F_SIMPLE 0x10 /* use simplified mnemonics */ 358*4882a593Smuzhiyun #define F_SYMBOL 0x20 /* use symbol lookups for addresses */ 359*4882a593Smuzhiyun #define F_INSTR 0x40 /* output the raw instruction */ 360*4882a593Smuzhiyun #define F_LOCALMEM 0x80 /* retrieve opcodes from local memory 361*4882a593Smuzhiyun rather than from the HMI */ 362*4882a593Smuzhiyun #define F_LINENO 0x100 /* show line number info if available */ 363*4882a593Smuzhiyun #define F_VALIDONLY 0x200 /* cache: valid entries only */ 364*4882a593Smuzhiyun 365*4882a593Smuzhiyun /* Values for assembler error codes */ 366*4882a593Smuzhiyun #define E_ASM_BAD_OPCODE 1 367*4882a593Smuzhiyun #define E_ASM_NUM_OPERANDS 2 368*4882a593Smuzhiyun #define E_ASM_BAD_REGISTER 3 369*4882a593Smuzhiyun #define E_ASM_BAD_SPR 4 370*4882a593Smuzhiyun #define E_ASM_BAD_TBR 5 371*4882a593Smuzhiyun 372*4882a593Smuzhiyun extern int disppc __P((unsigned char *,unsigned char *,int, 373*4882a593Smuzhiyun int (*)(const char *), unsigned long)); 374*4882a593Smuzhiyun extern int print_source_line __P((char *,char *,int, 375*4882a593Smuzhiyun int (*pfunc)(const char *))); 376*4882a593Smuzhiyun extern int find_next_address __P((unsigned char *,int,struct pt_regs *)); 377*4882a593Smuzhiyun extern int handle_bc __P((struct ppc_ctx *)); 378*4882a593Smuzhiyun extern unsigned long asmppc __P((unsigned long,char*,int*)); 379*4882a593Smuzhiyun extern char *asm_error_str __P((int)); 380*4882a593Smuzhiyun 381*4882a593Smuzhiyun /*====================================================================== 382*4882a593Smuzhiyun * 383*4882a593Smuzhiyun * GLOBAL VARIABLES 384*4882a593Smuzhiyun * 385*4882a593Smuzhiyun *======================================================================*/ 386*4882a593Smuzhiyun 387*4882a593Smuzhiyun extern struct operand operands[]; 388*4882a593Smuzhiyun extern const unsigned int n_operands; 389*4882a593Smuzhiyun extern struct opcode opcodes[]; 390*4882a593Smuzhiyun extern const unsigned int n_opcodes; 391*4882a593Smuzhiyun 392*4882a593Smuzhiyun #endif /* _PPC_H */ 393*4882a593Smuzhiyun 394*4882a593Smuzhiyun 395*4882a593Smuzhiyun /* 396*4882a593Smuzhiyun * Copyright (c) 2000 William L. Pitts and W. Gerald Hicks 397*4882a593Smuzhiyun * All rights reserved. 398*4882a593Smuzhiyun * 399*4882a593Smuzhiyun * Redistribution and use in source and binary forms are freely 400*4882a593Smuzhiyun * permitted provided that the above copyright notice and this 401*4882a593Smuzhiyun * paragraph and the following disclaimer are duplicated in all 402*4882a593Smuzhiyun * such forms. 403*4882a593Smuzhiyun * 404*4882a593Smuzhiyun * This software is provided "AS IS" and without any express or 405*4882a593Smuzhiyun * implied warranties, including, without limitation, the implied 406*4882a593Smuzhiyun * warranties of merchantability and fitness for a particular 407*4882a593Smuzhiyun * purpose. 408*4882a593Smuzhiyun */ 409