1 1.18 andvar /* $NetBSD: db_disasm.c,v 1.18 2022/04/17 21:24:53 andvar Exp $ */ 2 1.1 fredette 3 1.1 fredette /* $OpenBSD: db_disasm.c,v 1.9 2000/04/18 20:02:45 mickey Exp $ */ 4 1.1 fredette 5 1.1 fredette /* 6 1.12 snj * Copyright (c) 1999,2005 Michael Shalayeff 7 1.1 fredette * All rights reserved. 8 1.1 fredette * 9 1.12 snj * Permission to use, copy, modify, and distribute this software for any 10 1.12 snj * purpose with or without fee is hereby granted, provided that the above 11 1.12 snj * copyright notice and this permission notice appear in all copies. 12 1.12 snj * 13 1.12 snj * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 14 1.12 snj * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 15 1.12 snj * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 16 1.12 snj * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 17 1.12 snj * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER IN 18 1.12 snj * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT 19 1.12 snj * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 20 1.1 fredette */ 21 1.1 fredette /* 22 1.1 fredette * (c) Copyright 1992 HEWLETT-PACKARD COMPANY 23 1.1 fredette * 24 1.1 fredette * To anyone who acknowledges that this file is provided "AS IS" 25 1.1 fredette * without any express or implied warranty: 26 1.1 fredette * permission to use, copy, modify, and distribute this file 27 1.1 fredette * for any purpose is hereby granted without fee, provided that 28 1.1 fredette * the above copyright notice and this notice appears in all 29 1.1 fredette * copies, and that the name of Hewlett-Packard Company not be 30 1.1 fredette * used in advertising or publicity pertaining to distribution 31 1.1 fredette * of the software without specific, written prior permission. 32 1.1 fredette * Hewlett-Packard Company makes no representations about the 33 1.1 fredette * suitability of this software for any purpose. 34 1.1 fredette */ 35 1.1 fredette 36 1.1 fredette /* 37 1.1 fredette * unasm.c -- HP_PA Instruction Printer 38 1.1 fredette */ 39 1.2 lukem 40 1.2 lukem #include <sys/cdefs.h> 41 1.18 andvar __KERNEL_RCSID(0, "$NetBSD: db_disasm.c,v 1.18 2022/04/17 21:24:53 andvar Exp $"); 42 1.1 fredette 43 1.1 fredette #include <sys/param.h> 44 1.1 fredette #include <sys/systm.h> 45 1.1 fredette 46 1.1 fredette #include <machine/db_machdep.h> 47 1.16 skrll 48 1.1 fredette #include <ddb/db_access.h> 49 1.1 fredette #include <ddb/db_sym.h> 50 1.1 fredette #include <ddb/db_output.h> 51 1.1 fredette #include <ddb/db_interface.h> 52 1.1 fredette 53 1.16 skrll #ifndef _KERNEL 54 1.16 skrll #include <string.h> 55 1.16 skrll #endif 56 1.1 fredette 57 1.1 fredette /* IMPORTANT NOTE: 58 1.1 fredette * All modules using this header may assume that the datatype "int" is a 59 1.1 fredette * 32-bit (or > 32-bit) signed quantity. 60 1.1 fredette */ 61 1.1 fredette 62 1.1 fredette 63 1.1 fredette /* Spectrum Architecturally Defined Datatypes */ 64 1.1 fredette struct doubleword { 65 1.1 fredette int wd0; 66 1.1 fredette int wd1; 67 1.1 fredette }; 68 1.1 fredette 69 1.1 fredette struct quadword { 70 1.1 fredette struct doubleword d0; 71 1.1 fredette struct doubleword d1; 72 1.1 fredette }; 73 1.1 fredette 74 1.1 fredette /* datatypes for halfword and byte fields of a word are defined 75 1.1 fredette * in ssBits.h */ 76 1.1 fredette 77 1.1 fredette /* Memory addressing datatypes */ 78 1.1 fredette typedef unsigned int SID, /* range [0..MAXSID] */ 79 1.1 fredette PGID, /* range [0..MAXPGID] */ 80 1.1 fredette OFS, /* range [0..MAXINT] */ 81 1.1 fredette REALADR; /* range [0..MAXINT] */ 82 1.1 fredette 83 1.1 fredette 84 1.1 fredette /* data sizes */ 85 1.1 fredette enum datasize { Byte, Halfword, Word, Doubleword, Quadword, Variable }; 86 1.1 fredette 87 1.1 fredette /* Miscellaneous datatypes */ 88 1.1 fredette typedef unsigned int FLAGS; 89 1.1 fredette 90 1.1 fredette /* struct for entry in unwind table */ 91 1.1 fredette struct ute { 92 1.1 fredette int word1; 93 1.1 fredette int word2; 94 1.1 fredette int word3; 95 1.1 fredette int word4; 96 1.1 fredette }; 97 1.1 fredette /* 98 1.1 fredette * Header: /n/schirf/u/baford/CVS/mach4-parisc/kernel_unused/parisc/kdb/unasm.c,v 1.5 1994/07/21 22:32:05 mike Exp 99 1.1 fredette * 100 1.1 fredette * Spectrum Instruction Set Condition Completer Bit Assignments 101 1.1 fredette * Dan Magenheimer - 6/14/82 102 1.1 fredette * Terrence Miller - 6/21/82 103 1.1 fredette * Computer Research Center, Hewlett-Packard Labs 104 1.1 fredette * 105 1.1 fredette * (c) copyright 1982 106 1.1 fredette * (p) protected 1982 107 1.1 fredette * The Hewlett-Packard Company 108 1.1 fredette * Hewlett-Packard Laboratories 109 1.1 fredette * Computer Research Center 110 1.1 fredette * Palo Alto, California 111 1.1 fredette * 112 1.1 fredette * *** HP Company Confidential *** 113 1.1 fredette * 114 1.1 fredette * Log: unasm.c,v 115 1.1 fredette * Revision 1.5 1994/07/21 22:32:05 mike 116 1.1 fredette * official HP copyright notice 117 1.1 fredette * 118 1.1 fredette * Revision 1.4 1992/07/08 12:19:52 dalton 119 1.1 fredette * Checkin before split to 1.0.4 release (by LBS). 120 1.1 fredette * 121 1.1 fredette * Revision 1.3 92/06/06 16:16:45 dalton 122 1.1 fredette * *** empty log message *** 123 1.1 fredette * 124 1.1 fredette * Revision 1.2 92/06/06 15:42:28 dalton 125 1.1 fredette * Changed include to be a path relative to hp800. 126 1.1 fredette * 127 1.1 fredette * Revision 1.1 92/06/06 14:05:33 dalton 128 1.1 fredette * Initial revision 129 1.1 fredette * 130 1.1 fredette * Revision 1.2 91/04/14 20:29:49 osfrcs 131 1.1 fredette * Initial version. 132 1.1 fredette * [91/03/30 09:20:34 brezak] 133 1.1 fredette * 134 1.1 fredette * Revision 1.1.2.2 91/04/02 10:42:50 brezak 135 1.1 fredette * Initial version. 136 1.1 fredette * [91/03/30 09:20:34 brezak] 137 1.1 fredette * 138 1.1 fredette * Revision 1.1.1.2 91/03/30 09:20:34 brezak 139 1.1 fredette * Initial version. 140 1.1 fredette * 141 1.1 fredette * Revision 1.1 88/07/11 14:05:15 14:05:15 ren (Bob Naas) 142 1.1 fredette * Initial revision 143 1.1 fredette * 144 1.1 fredette * Revision 5.2 87/07/02 14:45:57 14:45:57 kent (Kent McMullen) 145 1.1 fredette * added constants to support addDasm and addDCond added to ssDID.c 146 1.1 fredette * 147 1.1 fredette * Revision 5.1 87/02/27 11:12:08 11:12:08 kent (Kent McMullen) 148 1.1 fredette * update all src to 5.1 149 1.1 fredette * 150 1.1 fredette * Revision 5.0 87/02/18 16:31:15 16:31:15 kent (Kent McMullen) 151 1.1 fredette * update all revision numbers to 5.0 for release 152 1.1 fredette * 153 1.1 fredette * Revision 1.1 86/07/15 08:34:55 08:34:55 kent (Kent McMullen) 154 1.1 fredette * Initial revision 155 1.1 fredette * 156 1.1 fredette * Revision 4.1 83/10/25 17:01:22 17:01:22 djm (Daniel J Magenheimer) 157 1.1 fredette * First release for ACD v4 158 1.1 fredette * 159 1.1 fredette * Revision 3.0 83/06/13 10:22:59 djm (Daniel Magenheimer) 160 1.1 fredette * First release for distribution 161 1.1 fredette * 162 1.1 fredette * 163 1.1 fredette */ 164 1.1 fredette 165 1.1 fredette 166 1.1 fredette /* Arithmetic/Logical Conditions */ 167 1.1 fredette #define NEV 0x0 168 1.1 fredette #define EQZ 0x2 169 1.1 fredette #define LT 0x4 170 1.1 fredette #define LE 0x6 171 1.1 fredette #define LLT 0x8 172 1.1 fredette #define NUV 0x8 173 1.1 fredette #define LLE 0xA 174 1.1 fredette #define ZNV 0xA 175 1.1 fredette #define SV 0xC 176 1.1 fredette #define OD 0xE 177 1.1 fredette #define TR 0x1 178 1.1 fredette #define NEQZ 0x3 179 1.1 fredette #define GE 0x5 180 1.1 fredette #define GT 0x7 181 1.1 fredette #define LGE 0x9 182 1.1 fredette #define UV 0x9 183 1.1 fredette #define LGT 0xB 184 1.1 fredette #define VNZ 0xB 185 1.1 fredette #define NSV 0xD 186 1.1 fredette #define EV 0xF 187 1.1 fredette 188 1.1 fredette /* unit conditions */ 189 1.1 fredette #define SBZ 0x4 190 1.1 fredette #define SHZ 0x6 191 1.1 fredette #define SDC 0x8 192 1.1 fredette #define SBC 0xC 193 1.1 fredette #define SHC 0xE 194 1.1 fredette #define NBZ 0x5 195 1.1 fredette #define NHZ 0x7 196 1.1 fredette #define NDC 0x9 197 1.1 fredette #define NBC 0xD 198 1.1 fredette #define NHC 0xF 199 1.1 fredette 200 1.1 fredette /*field conditions */ 201 1.1 fredette #define XEQ 0x1 202 1.1 fredette #define XLT 0x2 203 1.1 fredette #define XOD 0x3 204 1.1 fredette #define XTR 0x4 205 1.1 fredette #define XNE 0x5 206 1.1 fredette #define XGE 0x6 207 1.1 fredette #define XEV 0x7 208 1.1 fredette 209 1.1 fredette 210 1.1 fredette 211 1.1 fredette /* 212 1.1 fredette * These macros are designed to be portable to all machines that have 213 1.1 fredette * a wordsize greater than or equal to 32 bits that support the portable 214 1.1 fredette * C compiler and the standard C preprocessor. Wordsize (default 32) 215 1.1 fredette * and bitfield assignment (default left-to-right, unlike VAX, PDP-11) 216 1.1 fredette * should be predefined using the constants HOSTWDSZ and BITFRL and 217 1.1 fredette * the C compiler "-D" flag (e.g., -DHOSTWDSZ=36 -DBITFLR for the DEC-20). 218 1.1 fredette * Note that the macro arguments assume that the integer being referenced 219 1.1 fredette * is a 32-bit integer (right-justified on the 20) and that bit 0 is the 220 1.1 fredette * most significant bit. 221 1.1 fredette */ 222 1.1 fredette 223 1.1 fredette #ifndef HOSTWDSZ 224 1.1 fredette #define HOSTWDSZ 32 225 1.1 fredette #endif 226 1.1 fredette 227 1.1 fredette #ifdef vax 228 1.1 fredette #ifndef BITFLR 229 1.1 fredette #define BITFRL 230 1.1 fredette #endif 231 1.1 fredette #else 232 1.1 fredette #define BITFLR 233 1.1 fredette #endif 234 1.1 fredette 235 1.1 fredette /*########################### Macros ######################################*/ 236 1.1 fredette 237 1.1 fredette /*--------------------------------------------------------------------------- 238 1.1 fredette * DeclareBitfield$Reference - Declare a structure to be used to reference 239 1.1 fredette * a specified bitfield within an integer (using BitfR, see below). 240 1.1 fredette * The argument "n" must be an identifier name not used elsewhere in the 241 1.1 fredette * program , "s" and "l" must (alas!) be constants. (Suggestion: if 242 1.1 fredette * "s" == 2 and "l" == 8, use _b28 for "n".) The name "BITFLR" should 243 1.1 fredette * be pre-defined if the compiler assigns bitfields from left-to-right. 244 1.9 wiz * The resultant macro expansion defines a structure in which the bit field 245 1.1 fredette * starting at position "s" with length "l" may be referenced by accessing 246 1.1 fredette * member "n". [Note: The leftmost bits in a 36-bit word may be accessed 247 1.1 fredette * by specifying -4 <= s < 0 on the DEC-20.] 248 1.1 fredette *---------------------------------------------------------------------------*/ 249 1.1 fredette 250 1.1 fredette #ifdef BITFRL 251 1.4 matt #define DeclBitfR(s,l,n) struct n { int:(HOSTWDSZ-(s)-(l)); unsigned n:l;} n; 252 1.1 fredette #else 253 1.4 matt #define DeclBitfR(s,l,n) struct n { int:((s)+(HOSTWDSZ-32)); unsigned n:l;} n; 254 1.1 fredette #endif 255 1.1 fredette 256 1.1 fredette /*--------------------------------------------------------------------------- 257 1.1 fredette * Bitfield$Reference - Reference a specified bitfield within an integer. 258 1.1 fredette * The argument "i" must be an addressable variable (i.e., not a register 259 1.1 fredette * variable or an expression... but see BitfX below), "n" must be an 260 1.1 fredette * identifier name declared in a DeclBitfR invocation. The resultant 261 1.1 fredette * macro expansion references the bit field in "i" described by the 262 1.1 fredette * DeclBitfR invocation with the same name ("n"). BitfR may be used as 263 1.1 fredette * an lvalue or an rvalue. (i.e., either side of an assignment statement) 264 1.1 fredette * The "s" and "l" arguments are historical and are now unused. (They 265 1.1 fredette * correspond to the "s" and "l" arguments in DeclBitfR) 266 1.1 fredette * Translates to a single instruction on both the VAX and the DEC-20. 267 1.1 fredette *---------------------------------------------------------------------------*/ 268 1.4 matt #define BitfR(i,s,l,n) (i.n.n) 269 1.1 fredette 270 1.1 fredette /*--------------------------------------------------------------------------- 271 1.1 fredette * Bitfield$eXtract - Extract the specified field from an integer. Arguments 272 1.1 fredette * are the same as for BitfR (except no "n"), however both "s" and "l" need 273 1.1 fredette * no longer be constants. May only be used as an rvalue. Translates to 274 1.1 fredette * two instructions on the VAX, three on the DEC-20. 275 1.1 fredette *---------------------------------------------------------------------------*/ 276 1.1 fredette 277 1.4 matt #define BitfX(i,s,l) (((i.w) >> (32-(s)-(l))) & ((1 << (l)) - 1)) 278 1.1 fredette 279 1.1 fredette 280 1.1 fredette /*--------------------------------------------------------------------------- 281 1.1 fredette * Mask$32bits - Mask the low order 32 bits of passed word. No-op on 32 282 1.1 fredette * bit machines. 283 1.1 fredette *---------------------------------------------------------------------------*/ 284 1.1 fredette 285 1.1 fredette #if HOSTWDSZ > 32 286 1.1 fredette #define Mask32(x) ((x) & 0xffffffff) 287 1.1 fredette #else 288 1.1 fredette #define Mask32(x) (x) 289 1.1 fredette #endif 290 1.1 fredette 291 1.1 fredette 292 1.1 fredette /*--------------------------------------------------------------------------- 293 1.1 fredette * SignExtend$32bits - Force the high-order bits in machines with wordsize 294 1.1 fredette * longer than 32 to match bit 0. 295 1.1 fredette *---------------------------------------------------------------------------*/ 296 1.1 fredette 297 1.1 fredette #if HOSTWDSZ > 32 298 1.1 fredette #define SignEx32(x) (((x) & 0x80000000) ? ((x) | ((unsigned)-1 << 32)) \ 299 1.1 fredette : Mask32(x)) 300 1.1 fredette #else 301 1.1 fredette #define SignEx32(x) (x) 302 1.1 fredette #endif 303 1.1 fredette 304 1.1 fredette /**************************/ 305 1.1 fredette /* bit field declarations */ 306 1.1 fredette /**************************/ 307 1.1 fredette 308 1.1 fredette /* since the compiler complains if a structure name is declared twice, even 309 1.1 fredette * if the declarations are identical, all DeclBitfR invocations are 310 1.1 fredette * given here in one file. */ 311 1.1 fredette 312 1.4 matt union insn { 313 1.4 matt int w; 314 1.1 fredette DeclBitfR(0,1,_b01) 315 1.1 fredette DeclBitfR(0,15,_b015) 316 1.1 fredette DeclBitfR(0,16,_b016) 317 1.1 fredette DeclBitfR(0,4,_b04) 318 1.1 fredette DeclBitfR(0,6,_b06) 319 1.1 fredette DeclBitfR(0,8,_b08) 320 1.1 fredette DeclBitfR(4,1,_b41) 321 1.1 fredette DeclBitfR(4,4,_b44) 322 1.1 fredette DeclBitfR(6,1,_b61) 323 1.1 fredette DeclBitfR(6,13,_b613) 324 1.1 fredette DeclBitfR(6,15,_b615) 325 1.1 fredette DeclBitfR(6,17,_b617) 326 1.1 fredette DeclBitfR(6,26,_b626) 327 1.1 fredette DeclBitfR(6,5,_b65) 328 1.1 fredette DeclBitfR(7,1,_b71) 329 1.1 fredette DeclBitfR(8,1,_b81) 330 1.1 fredette DeclBitfR(8,4,_b84) 331 1.1 fredette DeclBitfR(8,8,_b88) 332 1.1 fredette DeclBitfR(9,1,_b91) 333 1.1 fredette DeclBitfR(10,1,_b101) 334 1.1 fredette DeclBitfR(11,1,_b111) 335 1.1 fredette DeclBitfR(11,10,_b1110) 336 1.1 fredette DeclBitfR(11,4,_b114) 337 1.1 fredette DeclBitfR(11,5,_b115) 338 1.1 fredette DeclBitfR(12,1,_b121) 339 1.1 fredette DeclBitfR(12,4,_b124) 340 1.1 fredette DeclBitfR(13,1,_b131) 341 1.1 fredette DeclBitfR(14,1,_b141) 342 1.1 fredette DeclBitfR(15,1,_b151) 343 1.1 fredette DeclBitfR(16,1,_b161) 344 1.1 fredette DeclBitfR(16,15,_b1615) 345 1.1 fredette DeclBitfR(16,16,_b1616) 346 1.1 fredette DeclBitfR(16,2,_b162) 347 1.1 fredette DeclBitfR(16,3,_b163) 348 1.1 fredette DeclBitfR(16,4,_b164) 349 1.1 fredette DeclBitfR(16,5,_b165) 350 1.1 fredette DeclBitfR(16,8,_b168) 351 1.1 fredette DeclBitfR(17,1,_b171) 352 1.1 fredette DeclBitfR(18,1,_b181) 353 1.1 fredette DeclBitfR(18,13,_b1813) 354 1.1 fredette DeclBitfR(18,2,_b182) 355 1.1 fredette DeclBitfR(18,7,_b187) 356 1.1 fredette DeclBitfR(19,1,_b191) 357 1.1 fredette DeclBitfR(19,8,_b198) 358 1.1 fredette DeclBitfR(19,10,_b1910) 359 1.1 fredette DeclBitfR(20,11,_b2011) 360 1.1 fredette DeclBitfR(20,2,_b202) 361 1.1 fredette DeclBitfR(20,4,_b204) 362 1.1 fredette DeclBitfR(21,10,_b2110) 363 1.1 fredette DeclBitfR(21,2,_b212) 364 1.1 fredette DeclBitfR(21,5,_b215) 365 1.1 fredette DeclBitfR(22,5,_b225) 366 1.1 fredette DeclBitfR(23,3,_b233) 367 1.1 fredette DeclBitfR(24,1,_b241) 368 1.1 fredette DeclBitfR(24,4,_b244) 369 1.1 fredette DeclBitfR(24,8,_b248) 370 1.1 fredette DeclBitfR(25,1,_b251) 371 1.1 fredette DeclBitfR(26,1,_b261) 372 1.1 fredette DeclBitfR(27,1,_b271) 373 1.1 fredette DeclBitfR(27,4,_b274) 374 1.1 fredette DeclBitfR(27,5,_b275) 375 1.1 fredette DeclBitfR(28,1,_b281) 376 1.1 fredette DeclBitfR(28,4,_b284) 377 1.1 fredette DeclBitfR(29,1,_b291) 378 1.1 fredette DeclBitfR(30,1,_b301) 379 1.1 fredette DeclBitfR(30,2,_b302) 380 1.1 fredette DeclBitfR(31,1,_b311) 381 1.4 matt }; 382 1.1 fredette 383 1.1 fredette /******************/ 384 1.1 fredette /* Word subfields */ 385 1.1 fredette /******************/ 386 1.1 fredette 387 1.1 fredette #define Sign(i) BitfR(i,0,1,_b01) 388 1.1 fredette /* halfwords */ 389 1.1 fredette #define Hwd0(i) BitfR(i,0,16,_b016) 390 1.1 fredette #define Hwd1sign(i) BitfR(i,16,1,_b161) 391 1.1 fredette #define Hwd1(i) BitfR(i,16,16,_b1616) 392 1.1 fredette /* bytes */ 393 1.1 fredette #define Byte0(i) BitfR(i,0,8,_b08) 394 1.1 fredette #define Byte1sign(i) BitfR(i,8,1,_b81) 395 1.1 fredette #define Byte1(i) BitfR(i,8,8,_b88) 396 1.1 fredette #define Byte2(i) BitfR(i,16,8,_b168) 397 1.1 fredette #define Byte3sign(i) BitfR(i,24,1,_b241) 398 1.1 fredette #define Byte3(i) BitfR(i,24,8,_b248) 399 1.1 fredette /* digits */ 400 1.1 fredette #define Digit0(i) BitfR(i,0,4,_b04) 401 1.1 fredette #define Digit1(i) BitfR(i,4,4,_b44) 402 1.1 fredette #define Digit2(i) BitfR(i,8,4,_b84) 403 1.1 fredette #define Digit3(i) BitfR(i,12,4,_b124) 404 1.1 fredette #define Digit4(i) BitfR(i,16,4,_b164) 405 1.1 fredette #define Digit5(i) BitfR(i,20,4,_b204) 406 1.1 fredette #define Digit6(i) BitfR(i,24,4,_b244) 407 1.1 fredette #define Digit7(i) BitfR(i,28,4,_b284) 408 1.1 fredette 409 1.1 fredette /* Wordsize definitions */ 410 1.1 fredette 411 1.1 fredette #define BIT_P_DW 64 /* bits/doubleword */ 412 1.1 fredette #define BIT_P_WD 32 /* bits/word */ 413 1.1 fredette #define BIT_P_HW 16 /* bits/halfword */ 414 1.1 fredette #define BIT_P_BYT 8 /* bits/byte */ 415 1.1 fredette #define BYT_P_DW 8 /* bytes/doubleword */ 416 1.1 fredette #define BYT_P_WD 4 /* bytes/word */ 417 1.1 fredette #define BYT_P_HW 2 /* bytes/halfword */ 418 1.1 fredette 419 1.1 fredette /* Masks */ 420 1.1 fredette 421 1.1 fredette #define WDMASK 0xffffffff /* 32-bit mask */ 422 1.1 fredette #define OFSMASK 0xffffffff /* 32-bit mask */ 423 1.1 fredette #define SIDMASK 0xffffffff /* 32-bit mask */ 424 1.1 fredette #define SIGNMASK 0x80000000 /* 32 bit word sign bit */ 425 1.1 fredette 426 1.1 fredette /* Alignments */ 427 1.1 fredette 428 1.1 fredette #define wdalign(ofs) (ofs &= ~3) 429 1.1 fredette /* 430 1.1 fredette * Header: /n/schirf/u/baford/CVS/mach4-parisc/kernel_unused/parisc/kdb/unasm.c,v 1.5 1994/07/21 22:32:05 mike Exp 431 1.1 fredette * 432 1.1 fredette * Spectrum Simulator Instruction Opcode Definitions 433 1.1 fredette * Dan Magenheimer 434 1.1 fredette * Computer Research Center, Hewlett-Packard Labs 435 1.1 fredette * 436 1.1 fredette * (c) copyright 1982 437 1.1 fredette * (p) protected 1982 438 1.1 fredette * The Hewlett-Packard Company 439 1.1 fredette * Hewlett-Packard Laboratories 440 1.1 fredette * Computer Research Center 441 1.1 fredette * Palo Alto, California 442 1.1 fredette * 443 1.1 fredette * *** HP Company Confidential *** 444 1.1 fredette * 445 1.1 fredette * Log: unasm.c,v 446 1.1 fredette * Revision 1.5 1994/07/21 22:32:05 mike 447 1.1 fredette * official HP copyright notice 448 1.1 fredette * 449 1.1 fredette * Revision 1.4 1992/07/08 12:19:52 dalton 450 1.1 fredette * Checkin before split to 1.0.4 release (by LBS). 451 1.1 fredette * 452 1.1 fredette * Revision 1.3 92/06/06 16:16:45 dalton 453 1.1 fredette * *** empty log message *** 454 1.1 fredette * 455 1.1 fredette * Revision 1.2 92/06/06 15:42:28 dalton 456 1.1 fredette * Changed include to be a path relative to hp800. 457 1.1 fredette * 458 1.1 fredette * Revision 1.1 92/06/06 14:05:33 dalton 459 1.1 fredette * Initial revision 460 1.1 fredette * 461 1.1 fredette * Revision 1.2 91/04/14 20:29:49 osfrcs 462 1.1 fredette * Initial version. 463 1.1 fredette * [91/03/30 09:20:34 brezak] 464 1.1 fredette * 465 1.1 fredette * Revision 1.1.2.2 91/04/02 10:42:50 brezak 466 1.1 fredette * Initial version. 467 1.1 fredette * [91/03/30 09:20:34 brezak] 468 1.1 fredette * 469 1.1 fredette * Revision 1.1.1.2 91/03/30 09:20:34 brezak 470 1.1 fredette * Initial version. 471 1.1 fredette * 472 1.1 fredette * Revision 6.1 89/09/06 10:39:58 burroughs 473 1.1 fredette * Added shadow registers for gr0-gr7. 474 1.1 fredette * gr0-7 are copied into sh0-7 whenever a trap occurs 475 1.1 fredette * the instruction RFIR restores gr0-7 from sh0-7 and returns from 476 1.1 fredette * interrupt. 477 1.1 fredette * the "sh" command displays the shadow registers 478 1.1 fredette * = sh7 0x789 works, too. 479 1.1 fredette * 480 1.1 fredette * Revision 6.0 89/09/01 15:46:37 15:46:37 burroughs (Greg Burroughs) 481 1.1 fredette * baseline for pcx simple offsite 482 1.1 fredette * 483 1.1 fredette * Revision 5.2 87/09/02 14:30:23 14:30:23 kent 484 1.1 fredette * separated stat gathering for indexed vs short. 485 1.1 fredette * this will NOT work if cache hints ever get used 486 1.1 fredette * since this field was assumed always zero 487 1.1 fredette * 488 1.1 fredette * Revision 5.1 87/02/27 11:12:16 11:12:16 kent (Kent McMullen) 489 1.1 fredette * update all src to 5.1 490 1.1 fredette * 491 1.1 fredette * Revision 5.0 87/02/18 16:31:35 16:31:35 kent (Kent McMullen) 492 1.1 fredette * update all revision numbers to 5.0 for release 493 1.1 fredette * 494 1.1 fredette * Revision 1.1 86/07/15 08:34:57 08:34:57 kent (Kent McMullen) 495 1.1 fredette * Initial revision 496 1.1 fredette * 497 1.1 fredette * Revision 4.1 83/10/25 17:02:34 17:02:34 djm (Daniel J Magenheimer) 498 1.1 fredette * First release for ACD v4 499 1.1 fredette * 500 1.1 fredette * Revision 3.0 83/06/13 10:24:45 djm (Daniel Magenheimer) 501 1.1 fredette * First release for distribution 502 1.1 fredette * 503 1.1 fredette * 504 1.1 fredette */ 505 1.1 fredette 506 1.1 fredette /* 507 1.1 fredette * Changes: 508 1.1 fredette * 01/30/90 ejf Simplify SPOPn support, now only gives assist emulation trap. 509 1.1 fredette * 01/19/90 ejf Replace linpak instructions with just FSTQ[SX]. 510 1.1 fredette * 12/19/89 ejf Add PA89 new floating point opcode 0E. 511 1.1 fredette * 12/18/89 ejf Change 5 ops to PA89 format. 512 1.1 fredette * 12/01/89 ejf Move additional instructions fmas, fmaa, fld2, fst2 to ssILst 513 1.1 fredette * 09/22/89 ejf Fix unbalanced comments. 514 1.1 fredette */ 515 1.1 fredette 516 1.1 fredette 517 1.1 fredette /* ..and modified by hand to remove the load/store short references */ 518 1.1 fredette /* ..and modified by hand to make memory management ops conform to the 519 1.1 fredette * requirement that all subops of a major opcode begin in the same 520 1.1 fredette * place and have the same length */ 521 1.1 fredette 522 1.1 fredette #define LDW 0x12, 0x00, 0, 0 /* LOAD WORD */ 523 1.1 fredette #define LDWM 0x13, 0x00, 0, 0 /* LOAD WORD and MODIFY */ 524 1.1 fredette #define LDH 0x11, 0x00, 0, 0 /* LOAD HALFWORD */ 525 1.1 fredette #define LDB 0x10, 0x00, 0, 0 /* LOAD BYTE */ 526 1.1 fredette #define LDO 0x0d, 0x00, 0, 0 /* LOAD OFFSET */ 527 1.1 fredette #define STW 0x1a, 0x00, 0, 0 /* STORE WORD */ 528 1.1 fredette #define STWM 0x1b, 0x00, 0, 0 /* STORE WORD and MODIFY */ 529 1.1 fredette #define STH 0x19, 0x00, 0, 0 /* STORE HALFWORD */ 530 1.1 fredette #define STB 0x18, 0x00, 0, 0 /* STORE BYTE */ 531 1.1 fredette #define LDWX 0x03, 0x02, 19, 7 /* LOAD WORD INDEXED */ 532 1.1 fredette #define LDHX 0x03, 0x01, 19, 7 /* LOAD HALFWORD INDEXED */ 533 1.1 fredette #define LDBX 0x03, 0x00, 19, 7 /* LOAD BYTE INDEXED */ 534 1.1 fredette #define LDWAX 0x03, 0x06, 19, 7 /* LOAD WORD ABSOLUTE INDEXED */ 535 1.1 fredette #define LDCWX 0x03, 0x07, 19, 7 /* LOAD and CLEAR WORD INDEXED */ 536 1.1 fredette #define LDWS 0x03, 0x42, 19, 7 /* LOAD WORD SHORT DISP */ 537 1.1 fredette #define LDHS 0x03, 0x41, 19, 7 /* LOAD HALFWORD SHORT DISP */ 538 1.1 fredette #define LDBS 0x03, 0x40, 19, 7 /* LOAD BYTE SHORT DISP */ 539 1.1 fredette #define LDWAS 0x03, 0x46, 19, 7 /* LOAD WORD ABSOLUTE SHORT DISP */ 540 1.1 fredette #define LDCWS 0x03, 0x47, 19, 7 /* LOAD and CLEAR WORD SHORT DISP */ 541 1.1 fredette #define STWS 0x03, 0x4a, 19, 7 /* STORE WORD SHORT DISP */ 542 1.1 fredette #define STHS 0x03, 0x49, 19, 7 /* STORE HALFWORD SHORT DISP */ 543 1.1 fredette #define STBS 0x03, 0x48, 19, 7 /* STORE BYTE SHORT DISP */ 544 1.1 fredette #define STWAS 0x03, 0x4e, 19, 7 /* STORE WORD ABSOLUTE SHORT DISP */ 545 1.1 fredette #define STBYS 0x03, 0x4c, 19, 7 /* STORE BYTES SHORT DISP */ 546 1.1 fredette #define LDIL 0x08, 0x00, 0, 0 /* LOAD IMMED LEFT */ 547 1.1 fredette #define ADDIL 0x0a, 0x00, 0, 0 /* ADD IMMED LEFT */ 548 1.1 fredette #define BL 0x3a, 0x00, 16, 3 /* BRANCH [and LINK] */ 549 1.1 fredette #define GATE 0x3a, 0x01, 16, 3 /* GATEWAY */ 550 1.1 fredette #define BLR 0x3a, 0x02, 16, 3 /* BRANCH and LINK REGISTER */ 551 1.1 fredette #define BV 0x3a, 0x06, 16, 3 /* BRANCH VECTORED */ 552 1.1 fredette #define BE 0x38, 0x00, 0, 0 /* BRANCH EXTERNAL */ 553 1.1 fredette #define BLE 0x39, 0x00, 0, 0 /* BRANCH and LINK EXTERNAL */ 554 1.1 fredette #define MOVB 0x32, 0x00, 0, 0 /* MOVE and BRANCH */ 555 1.1 fredette #define MOVIB 0x33, 0x00, 0, 0 /* MOVE IMMED and BRANCH */ 556 1.1 fredette #define COMBT 0x20, 0x00, 0, 0 /* COMPARE and BRANCH if TRUE */ 557 1.1 fredette #define COMBF 0x22, 0x00, 0, 0 /* COMPARE and BRANCH if FALSE */ 558 1.1 fredette #define COMIBT 0x21, 0x00, 0, 0 /* COMPARE IMMED and BRANCH if TRUE */ 559 1.1 fredette #define COMIBF 0x23, 0x00, 0, 0 /* COMPARE IMMED and BRANCH if FALSE */ 560 1.1 fredette #define ADDBT 0x28, 0x00, 0, 0 /* ADD and BRANCH if TRUE */ 561 1.1 fredette #define ADDBF 0x2a, 0x00, 0, 0 /* ADD and BRANCH if FALSE */ 562 1.1 fredette #define ADDIBT 0x29, 0x00, 0, 0 /* ADD IMMED and BRANCH if TRUE */ 563 1.1 fredette #define ADDIBF 0x2b, 0x00, 0, 0 /* ADD IMMED and BRANCH if FALSE */ 564 1.1 fredette #define BVB 0x30, 0x00, 0, 0 /* BRANCH on VARIABLE BIT */ 565 1.1 fredette #define BB 0x31, 0x00, 0, 0 /* BRANCH on BIT */ 566 1.1 fredette #define ADD 0x02, 0x30, 20, 7 /* ADD */ 567 1.1 fredette #define ADDL 0x02, 0x50, 20, 7 /* ADD LOGICAL */ 568 1.1 fredette #define ADDO 0x02, 0x70, 20, 7 /* ADD and TRAP on OVFLO */ 569 1.1 fredette #define SH1ADD 0x02, 0x32, 20, 7 /* SHIFT 1, ADD */ 570 1.1 fredette #define SH1ADDL 0x02, 0x52, 20, 7 /* SHIFT 1, ADD LOGICAL */ 571 1.1 fredette #define SH1ADDO 0x02, 0x72, 20, 7 /* SHIFT 1, ADD and TRAP on OVFLO */ 572 1.1 fredette #define SH2ADD 0x02, 0x34, 20, 7 /* SHIFT 2, ADD */ 573 1.1 fredette #define SH2ADDL 0x02, 0x54, 20, 7 /* SHIFT 2, ADD LOGICAL */ 574 1.1 fredette #define SH2ADDO 0x02, 0x74, 20, 7 /* SHIFT 2, ADD and TRAP on OVFLO */ 575 1.1 fredette #define SH3ADD 0x02, 0x36, 20, 7 /* SHIFT 3, ADD */ 576 1.1 fredette #define SH3ADDL 0x02, 0x56, 20, 7 /* SHIFT 3, ADD LOGICAL */ 577 1.1 fredette #define SH3ADDO 0x02, 0x76, 20, 7 /* SHIFT 3, ADD and TRAP on OVFLO */ 578 1.1 fredette #define ADDC 0x02, 0x38, 20, 7 /* ADD with CARRY */ 579 1.1 fredette #define ADDCO 0x02, 0x78, 20, 7 /* ADD with CARRY and TRAP on OVFLO */ 580 1.1 fredette #define SUB 0x02, 0x20, 20, 7 /* SUBTRACT */ 581 1.1 fredette #define SUBO 0x02, 0x60, 20, 7 /* SUBTRACT and TRAP on OVFLO */ 582 1.1 fredette #define SUBB 0x02, 0x28, 20, 7 /* SUBTRACT with BORROW */ 583 1.1 fredette #define SUBBO 0x02, 0x68, 20, 7 /* SUBTRACT with BORROW and TRAP on OVFLO */ 584 1.1 fredette #define SUBT 0x02, 0x26, 20, 7 /* SUBTRACT and TRAP on COND */ 585 1.1 fredette #define SUBTO 0x02, 0x66, 20, 7 /* SUBTRACT and TRAP on COND or OVFLO */ 586 1.1 fredette #define DS 0x02, 0x22, 20, 7 /* DIVIDE STEP */ 587 1.1 fredette #define COMCLR 0x02, 0x44, 20, 7 /* COMPARE and CLEAR */ 588 1.1 fredette #define OR 0x02, 0x12, 20, 7 /* INCLUSIVE OR */ 589 1.1 fredette #define XOR 0x02, 0x14, 20, 7 /* EXCLUSIVE OR */ 590 1.1 fredette #define AND 0x02, 0x10, 20, 7 /* AND */ 591 1.1 fredette #define ANDCM 0x02, 0x00, 20, 7 /* AND COMPLEMENT */ 592 1.1 fredette #define UXOR 0x02, 0x1c, 20, 7 /* UNIT XOR */ 593 1.1 fredette #define UADDCM 0x02, 0x4c, 20, 7 /* UNIT ADD COMPLEMENT */ 594 1.1 fredette #define UADDCMT 0x02, 0x4e, 20, 7 /* UNIT ADD COMPLEMENT and TRAP on COND */ 595 1.1 fredette #define DCOR 0x02, 0x5c, 20, 7 /* DECIMAL CORRECT */ 596 1.1 fredette #define IDCOR 0x02, 0x5e, 20, 7 /* INTERMEDIATE DECIMAL CORRECT */ 597 1.1 fredette #define ADDI 0x2d, 0x00, 20, 1 /* ADD to IMMED */ 598 1.1 fredette #define ADDIO 0x2d, 0x01, 20, 1 /* ADD to IMMED and TRAP on OVFLO */ 599 1.1 fredette #define ADDIT 0x2c, 0x00, 20, 1 /* ADD to IMMED and TRAP on COND */ 600 1.1 fredette #define ADDITO 0x2c, 0x01, 20, 1 /* ADD to IMMED and TRAP on COND or OVFLO */ 601 1.1 fredette #define SUBI 0x25, 0x00, 20, 1 /* SUBTRACT from IMMED */ 602 1.1 fredette #define SUBIO 0x25, 0x01, 20, 1 /* SUBTRACT from IMMED and TRAP on OVFLO */ 603 1.1 fredette #define COMICLR 0x24, 0x00, 0, 0 /* COMPARE IMMED and CLEAR */ 604 1.1 fredette #define VSHD 0x34, 0x00, 19, 3 /* VARIABLE SHIFT DOUBLE */ 605 1.1 fredette #define SHD 0x34, 0x02, 19, 3 /* SHIFT DOUBLE */ 606 1.1 fredette #define VEXTRU 0x34, 0x04, 19, 3 /* VARIABLE EXTRACT RIGHT UNSIGNED */ 607 1.1 fredette #define VEXTRS 0x34, 0x05, 19, 3 /* VARIABLE EXTRACT RIGHT SIGNED */ 608 1.1 fredette #define EXTRU 0x34, 0x06, 19, 3 /* EXTRACT RIGHT UNSIGNED */ 609 1.1 fredette #define EXTRS 0x34, 0x07, 19, 3 /* EXTRACT RIGHT SIGNED */ 610 1.1 fredette #define VDEP 0x35, 0x01, 19, 3 /* VARIABLE DEPOSIT */ 611 1.1 fredette #define DEP 0x35, 0x03, 19, 3 /* DEPOSIT */ 612 1.1 fredette #define VDEPI 0x35, 0x05, 19, 3 /* VARIABLE DEPOSIT IMMED */ 613 1.1 fredette #define DEPI 0x35, 0x07, 19, 3 /* DEPOSIT IMMED */ 614 1.1 fredette #define ZVDEP 0x35, 0x00, 19, 3 /* ZERO and VARIABLE DEPOSIT */ 615 1.1 fredette #define ZDEP 0x35, 0x02, 19, 3 /* ZERO and DEPOSIT */ 616 1.1 fredette #define ZVDEPI 0x35, 0x04, 19, 3 /* ZERO and VARIABLE DEPOSIT IMMED */ 617 1.1 fredette #define ZDEPI 0x35, 0x06, 19, 3 /* ZERO and DEPOSIT IMMED */ 618 1.1 fredette #define BREAK 0x00, 0x00, 19, 8 /* BREAK */ 619 1.1 fredette #define RFI 0x00, 0x60, 19, 8 /* RETURN FROM INTERRUPTION */ 620 1.1 fredette #define RFIR 0x00, 0x65, 19, 8 /* RFI & RESTORE SHADOW REGISTERS */ 621 1.1 fredette #define SSM 0x00, 0x6b, 19, 8 /* SET SYSTEM MASK */ 622 1.1 fredette #define RSM 0x00, 0x73, 19, 8 /* RESET SYSTEM MASK */ 623 1.1 fredette #define MTSM 0x00, 0xc3, 19, 8 /* MOVE TO SYSTEM MASK */ 624 1.1 fredette #define LDSID 0x00, 0x85, 19, 8 /* LOAD SPACE IDENTIFIER */ 625 1.1 fredette #define MTSP 0x00, 0xc1, 19, 8 /* MOVE TO SPACE REGISTER */ 626 1.1 fredette #define MTCTL 0x00, 0xc2, 19, 8 /* MOVE TO SYSTEM CONTROL REGISTER */ 627 1.1 fredette #define MFSP 0x00, 0x25, 19, 8 /* MOVE FROM SPACE REGISTER */ 628 1.1 fredette #define MFCTL 0x00, 0x45, 19, 8 /* MOVE FROM SYSTEM CONTROL REGISTER */ 629 1.1 fredette #define SYNC 0x00, 0x20, 19, 8 /* SYNCHRONIZE DATA CACHE */ 630 1.1 fredette #define DIAG 0x05, 0x00, 0, 0 /* DIAGNOSE */ 631 1.1 fredette #define SPOP 0x04, 0x00, 0, 0 /* SPECIAL FUNCTION UNIT */ 632 1.1 fredette #define COPR 0x0c, 0x00, 0, 0 /* COPROCESSOR */ 633 1.1 fredette #define CLDWX 0x09, 0x00, 19, 4 /* COPROCESSOR LOAD WORD INDEXED */ 634 1.1 fredette #define CLDDX 0x0b, 0x00, 19, 4 /* COPROCESSOR LOAD WORD INDEXED */ 635 1.1 fredette #define CSTWX 0x09, 0x01, 19, 4 /* COPROCESSOR STORE WORD INDEXED */ 636 1.1 fredette #define CSTDX 0x0b, 0x01, 19, 4 /* COPROCESSOR STORE WORD INDEXED */ 637 1.1 fredette #define CLDWS 0x09, 0x08, 19, 4 /* COPROCESSOR LOAD WORD SHORT */ 638 1.1 fredette #define CLDDS 0x0b, 0x08, 19, 4 /* COPROCESSOR LOAD WORD SHORT */ 639 1.1 fredette #define CSTWS 0x09, 0x09, 19, 4 /* COPROCESSOR STORE WORD SHORT */ 640 1.1 fredette #define CSTDS 0x0b, 0x09, 19, 4 /* COPROCESSOR STORE WORD SHORT */ 641 1.1 fredette #define FLOAT0 0x0e, 0x00, 21, 2 /* FLOATING POINT CLASS 0 */ 642 1.1 fredette #define FLOAT1 0x0e, 0x01, 21, 2 /* FLOATING POINT CLASS 1 */ 643 1.1 fredette #define FLOAT2 0x0e, 0x02, 21, 2 /* FLOATING POINT CLASS 2 */ 644 1.1 fredette #define FLOAT3 0x0e, 0x03, 21, 2 /* FLOATING POINT CLASS 3 */ 645 1.1 fredette #define FMPYSUB 0x26, 0x00, 0, 0 /* FP MULTIPLY AND SUBTRACT */ 646 1.1 fredette #define FMPYADD 0x06, 0x00, 0, 0 /* FP MULTIPLY AND ADD/TRUNCATE */ 647 1.1 fredette #define FSTQX 0x0f, 0x01, 19, 4 /* FLOATING POINT STORE QUAD INDEXED */ 648 1.1 fredette #define FSTQS 0x0f, 0x09, 19, 4 /* FLOATING POINT STORE QUAD SHORT */ 649 1.1 fredette /* all of the following have been pushed around to conform */ 650 1.1 fredette #define PROBER 0x01, 0x46, 19, 7 /* PROBE READ ACCESS */ 651 1.1 fredette #ifdef notdef 652 1.1 fredette #define PROBERI 0x01, 0xc6, 19, 7 /* PROBE READ ACCESS IMMEDIATE */ 653 1.1 fredette #endif 654 1.1 fredette #define PROBEW 0x01, 0x47, 19, 7 /* PROBE WRITE ACCESS */ 655 1.1 fredette #ifdef notdef 656 1.1 fredette #define PROBEWI 0x01, 0xc7, 19, 7 /* PROBE WRITE ACCESS IMMEDIATE */ 657 1.1 fredette #endif 658 1.1 fredette #define LPA 0x01, 0x4d, 19, 7 /* LOAD PHYSICAL ADDRESS */ 659 1.1 fredette #define LHA 0x01, 0x4c, 19, 7 /* LOAD HASH ADDRESS */ 660 1.1 fredette #define PDTLB 0x01, 0x48, 19, 7 /* PURGE DATA TRANS LOOKASIDE BUFFER */ 661 1.1 fredette #define PITLB 0x01, 0x08, 19, 7 /* PURGE INST TRANS LOOKASIDE BUFFER */ 662 1.1 fredette #define PDTLBE 0x01, 0x49, 19, 7 /* PURGE DATA TLB ENTRY */ 663 1.1 fredette #define PITLBE 0x01, 0x09, 19, 7 /* PURGE INST TLB ENTRY */ 664 1.1 fredette #define IDTLBA 0x01, 0x41, 19, 7 /* INSERT DATA TLB ADDRESS */ 665 1.1 fredette #define IITLBA 0x01, 0x01, 19, 7 /* INSERT INSTRUCTION TLB ADDRESS */ 666 1.1 fredette #define IDTLBP 0x01, 0x40, 19, 7 /* INSERT DATA TLB PROTECTION */ 667 1.1 fredette #define IITLBP 0x01, 0x00, 19, 7 /* INSERT INSTRUCTION TLB PROTECTION */ 668 1.1 fredette #define PDC 0x01, 0x4e, 19, 7 /* PURGE DATA CACHE */ 669 1.1 fredette #define FDC 0x01, 0x4a, 19, 7 /* FLUSH DATA CACHE */ 670 1.1 fredette #define FIC 0x01, 0x0a, 19, 7 /* FLUSH INSTRUCTION CACHE */ 671 1.1 fredette #define FDCE 0x01, 0x4b, 19, 7 /* FLUSH DATA CACHE ENTRY */ 672 1.1 fredette #define FICE 0x01, 0x0b, 19, 7 /* FLUSH DATA CACHE ENTRY */ 673 1.1 fredette 674 1.1 fredette /* 675 1.1 fredette * Header: /n/schirf/u/baford/CVS/mach4-parisc/kernel_unused/parisc/kdb/unasm.c,v 1.5 1994/07/21 22:32:05 mike Exp 676 1.1 fredette * 677 1.1 fredette * Spectrum Simulator Instruction Set Constants and Datatypes 678 1.1 fredette * Dan Magenheimer - 4/28/82 679 1.1 fredette * Computer Research Center, Hewlett-Packard Labs 680 1.1 fredette * 681 1.1 fredette * (c) copyright 1982 682 1.1 fredette * (p) protected 1982 683 1.1 fredette * The Hewlett-Packard Company 684 1.1 fredette * Hewlett-Packard Laboratories 685 1.1 fredette * Computer Research Center 686 1.1 fredette * Palo Alto, California 687 1.1 fredette * 688 1.1 fredette * *** HP Company Confidential *** 689 1.1 fredette * 690 1.1 fredette * Log: unasm.c,v 691 1.1 fredette * Revision 1.5 1994/07/21 22:32:05 mike 692 1.1 fredette * official HP copyright notice 693 1.1 fredette * 694 1.1 fredette * Revision 1.4 1992/07/08 12:19:52 dalton 695 1.1 fredette * Checkin before split to 1.0.4 release (by LBS). 696 1.1 fredette * 697 1.1 fredette * Revision 1.3 92/06/06 16:16:45 dalton 698 1.1 fredette * *** empty log message *** 699 1.1 fredette * 700 1.1 fredette * Revision 1.2 92/06/06 15:42:28 dalton 701 1.1 fredette * Changed include to be a path relative to hp800. 702 1.1 fredette * 703 1.1 fredette * Revision 1.1 92/06/06 14:05:33 dalton 704 1.1 fredette * Initial revision 705 1.1 fredette * 706 1.1 fredette * Revision 1.2 91/04/14 20:29:49 osfrcs 707 1.1 fredette * Initial version. 708 1.1 fredette * [91/03/30 09:20:34 brezak] 709 1.1 fredette * 710 1.1 fredette * Revision 1.1.2.2 91/04/02 10:42:50 brezak 711 1.1 fredette * Initial version. 712 1.1 fredette * [91/03/30 09:20:34 brezak] 713 1.1 fredette * 714 1.1 fredette * Revision 1.1.1.2 91/03/30 09:20:34 brezak 715 1.1 fredette * Initial version. 716 1.1 fredette * 717 1.1 fredette ;Revision 1.1 88/07/11 14:05:21 14:05:21 ren (Bob Naas) 718 1.1 fredette ;Initial revision 719 1.1 fredette ; 720 1.1 fredette * Revision 5.1 87/02/27 11:12:23 11:12:23 kent (Kent McMullen) 721 1.1 fredette * update all src to 5.1 722 1.1 fredette * 723 1.1 fredette * Revision 5.0 87/02/18 16:31:52 16:31:52 kent (Kent McMullen) 724 1.1 fredette * update all revision numbers to 5.0 for release 725 1.1 fredette * 726 1.1 fredette * Revision 1.1 86/07/15 08:35:00 08:35:00 kent (Kent McMullen) 727 1.1 fredette * Initial revision 728 1.1 fredette * 729 1.1 fredette * Revision 4.3 85/11/12 09:28:44 09:28:44 viggy (Viggy Mokkarala) 730 1.1 fredette * first mpsim version, partially stable 731 1.1 fredette * 732 1.1 fredette * Revision 4.2 84/07/16 17:20:57 17:20:57 djm () 733 1.1 fredette * Define field macros for COPR and SFU insts 734 1.1 fredette * 735 1.1 fredette * Revision 4.1 83/10/25 17:10:14 djm (Daniel Magenheimer) 736 1.1 fredette * First release for ACD v4 737 1.1 fredette * 738 1.1 fredette * Revision 3.1 83/08/03 14:09:59 djm (Daniel Magenheimer) 739 1.1 fredette * Sys calls, args, -S, bug fixes, etc. 740 1.1 fredette * 741 1.1 fredette * Revision 3.0 83/06/13 10:25:13 djm (Daniel Magenheimer) 742 1.1 fredette * First release for distribution 743 1.1 fredette * 744 1.1 fredette * 745 1.1 fredette */ 746 1.1 fredette /* 747 1.1 fredette * Changes: 748 1.1 fredette * 12/01/89 ejf Add Rsd(), Rse(), Rtd(), Rte() for 5 ops. 749 1.6 wiz * 11/30/89 ejf Make instruction use counters shared, not per CPU. 750 1.1 fredette * 11/28/89 ejf Change majoropcode for quicker extension extract. 751 1.1 fredette */ 752 1.1 fredette 753 1.1 fredette 754 1.1 fredette 755 1.1 fredette /* 756 1.1 fredette * Dependencies: std.h, ssDefs.h, bits.h 757 1.1 fredette */ 758 1.1 fredette 759 1.1 fredette 760 1.1 fredette /* Lookup/Execute structure for instructions */ 761 1.1 fredette struct inst { 762 1.1 fredette u_char majopc; /* major opcode of instruction, 0..MAXOPC */ 763 1.1 fredette u_char opcext; /* opcode extension, 0 if not applic. */ 764 1.1 fredette u_char extbs; /* starting bit pos of extension field */ 765 1.1 fredette u_char extbl; /* bit length of extension field */ 766 1.1 fredette u_int count; /* frequency counter for analysis */ 767 1.1 fredette char mnem[8]; /* ascii mnemonic */ 768 1.1 fredette /* disassembly function */ 769 1.4 matt int (*dasmfcn)(const struct inst *, OFS, union insn); 770 1.1 fredette }; 771 1.1 fredette 772 1.1 fredette 773 1.1 fredette #define NMAJOPCS 64 774 1.1 fredette 775 1.1 fredette struct majoropcode { 776 1.1 fredette const struct inst **subops; /* pointer to table of subops indexed by 777 1.1 fredette * opcode extension */ 778 1.1 fredette u_int maxsubop; /* largest opcode extension value or 0 */ 779 1.1 fredette u_int extshft; /* right shift amount for extension field */ 780 1.1 fredette u_int extmask; /* post shift mask for extension field */ 781 1.1 fredette }; 782 1.1 fredette 783 1.1 fredette #define OpExt(i,m) ((i >> m->extshft) & m->extmask) /* extract opcode extension */ 784 1.1 fredette 785 1.1 fredette 786 1.1 fredette /*****************************/ 787 1.1 fredette /* Miscellaneous definitions */ 788 1.1 fredette /*****************************/ 789 1.1 fredette 790 1.1 fredette /* Load/Store Indexed Opcode Extension Cache Control */ 791 1.1 fredette #define NOACTION 0 792 1.1 fredette #define STACKREF 1 793 1.1 fredette #define SEQPASS 2 794 1.1 fredette #define PREFETCH 3 795 1.1 fredette 796 1.1 fredette /******************************/ 797 1.1 fredette /* Fields within instructions */ 798 1.1 fredette /******************************/ 799 1.1 fredette 800 1.1 fredette /* opcode */ 801 1.1 fredette #define Opcode(i) BitfR(i,0,6,_b06) 802 1.1 fredette /* opcode true/false bit */ 803 1.1 fredette #define OpcTF(i) BitfR(i,4,1,_b41) 804 1.1 fredette /* register sources */ 805 1.1 fredette #define Rsa(i) BitfR(i,11,5,_b115) 806 1.1 fredette #define Rsb(i) BitfR(i,6,5,_b65) 807 1.1 fredette #define Rsc(i) BitfR(i,27,5,_b275) 808 1.1 fredette #define Rsd(i) BitfR(i,21,5,_b215) 809 1.1 fredette #define Rse(i) BitfR(i,16,5,_b165) 810 1.1 fredette /* register targets */ 811 1.1 fredette #define Rta(i) BitfR(i,11,5,_b115) 812 1.1 fredette #define Rtb(i) BitfR(i,6,5,_b65) 813 1.1 fredette #define Rtc(i) BitfR(i,27,5,_b275) 814 1.1 fredette #define Rtd(i) BitfR(i,21,5,_b215) 815 1.1 fredette #define Rte(i) BitfR(i,16,5,_b165) 816 1.1 fredette /* 5-bit immediates (Magnitude, Sign) */ 817 1.1 fredette #define Imb5(i) BitfR(i,6,5,_b65) 818 1.1 fredette #define Ima5M(i) BitfR(i,11,4,_b114) 819 1.1 fredette #define Ima5S(i) BitfR(i,15,1,_b151) 820 1.1 fredette #define Ima5A(i) BitfR(i,11,5,_b115) 821 1.1 fredette #define Imd5(i) BitfR(i,22,5,_b225) 822 1.1 fredette #define Imc5M(i) BitfR(i,27,4,_b274) 823 1.1 fredette #define Imc5S(i) BitfR(i,31,1,_b311) 824 1.1 fredette #define Imc5A(i) BitfR(i,27,5,_b275) 825 1.1 fredette /* Other immediates */ 826 1.1 fredette #define Im21L(i) BitfR(i,18,2,_b182) 827 1.1 fredette #define Im21H(i) BitfR(i,20,11,_b2011) 828 1.1 fredette #define Im21M1(i) BitfR(i,16,2,_b162) 829 1.1 fredette #define Im21M2(i) BitfR(i,11,5,_b115) 830 1.1 fredette #define Im21S(i) BitfR(i,31,1,_b311) 831 1.1 fredette #define Im11M(i) BitfR(i,21,10,_b2110) 832 1.1 fredette #define Im11S(i) BitfR(i,31,1,_b311) 833 1.1 fredette /* displacements/offsets */ 834 1.1 fredette #define DispM(i) BitfR(i,18,13,_b1813) 835 1.1 fredette #define DispS(i) BitfR(i,31,1,_b311) 836 1.1 fredette #define Off5(i) BitfR(i,11,5,_b115) 837 1.1 fredette #define Off11H(i) BitfR(i,19,10,_b1910) 838 1.1 fredette #define Off11L(i) BitfR(i,29,1,_b291) 839 1.1 fredette #define OffS(i) BitfR(i,31,1,_b311) 840 1.1 fredette /* miscellaneous */ 841 1.1 fredette #define Dss(i) BitfR(i,16,2,_b162) 842 1.1 fredette #define Cond(i) BitfR(i,16,3,_b163) 843 1.1 fredette #define Cneg(i) BitfR(i,19,1,_b191) 844 1.1 fredette #define Cond4(i) BitfR(i,16,4,_b164) /* Cond AND Cneg */ 845 1.1 fredette #define Nu(i) BitfR(i,30,1,_b301) 846 1.1 fredette #define SrL(i) BitfR(i,16,2,_b162) 847 1.1 fredette #define SrH(i) BitfR(i,18,1,_b181) 848 1.1 fredette #define ShortDisp(i) BitfR(i,19,1,_b191) 849 1.1 fredette #define IndxShft(i) BitfR(i,18,1,_b181) 850 1.1 fredette #define ModBefore(i) BitfR(i,18,1,_b181) 851 1.1 fredette #define CacheCtrl(i) BitfR(i,20,2,_b202) 852 1.1 fredette #define Modify(i) BitfR(i,26,1,_b261) 853 1.1 fredette #define ProbeI(i) BitfR(i,18,1,_b181) 854 1.1 fredette #define Uid(i) BitfR(i,23,3,_b233) 855 1.1 fredette #define Sfu(i) BitfR(i,23,3,_b233) 856 1.1 fredette #define CopExt17(i) BitfR(i,6,17,_b617) 857 1.1 fredette #define CopExt5(i) BitfR(i,27,5,_b275) 858 1.1 fredette #define SpopType(i) BitfR(i,21,2,_b212) 859 1.1 fredette #define SpopExt15(i) BitfR(i,6,15,_b615) 860 1.1 fredette #define SpopExt10(i) BitfR(i,11,10,_b1110) 861 1.1 fredette #define SpopExt5L(i) BitfR(i,16,5,_b165) 862 1.1 fredette #define SpopExt5(i) BitfR(i,27,5,_b275) 863 1.1 fredette #define NoMajOpc(i) BitfR(i,6,26,_b626) 864 1.1 fredette #define Bi1(i) BitfR(i,27,5,_b275) /* fields in BREAK */ 865 1.1 fredette #define Bi2(i) BitfR(i,6,13,_b613) 866 1.1 fredette 867 1.1 fredette /* fragmented field collating macros */ 868 1.17 skrll #define Ima5(i) (Ima5S(i) ? Ima5M(i) | (int)(~__BITS(3,0)) : Ima5M(i)) 869 1.1 fredette 870 1.17 skrll #define Imc5(i) (Imc5S(i) ? Imc5M(i) | (int)(~__BITS(3,0)) : Imc5M(i)) 871 1.1 fredette 872 1.17 skrll #define Disp(i) (DispS(i) ? DispM(i) | (int)(~__BITS(12,0)) : DispM(i)) 873 1.1 fredette 874 1.1 fredette #define Im21(i) (Im21S(i) << 31 | Im21H(i) << 20 | Im21M1(i) << 18 | \ 875 1.1 fredette Im21M2(i) << 13 | Im21L(i) << 11) 876 1.1 fredette 877 1.17 skrll #define Im11(i) (Im11S(i) ? Im11M(i) | (int)(~__BITS(9,0)) : Im11M(i)) 878 1.1 fredette 879 1.1 fredette #define Bdisp(i) ((OffS(i) ? (Off5(i)<<11 | Off11L(i)<<10|Off11H(i)) \ 880 1.17 skrll /* branch displacement (bytes) */ | (int)(~__BITS(15,0)) \ 881 1.1 fredette : (Off5(i)<<11|Off11L(i)<<10|Off11H(i))) << 2) 882 1.1 fredette 883 1.1 fredette #define Cbdisp(i) ((OffS(i) ? (Off11L(i) << 10 | Off11H(i)) \ 884 1.17 skrll /* compare/branch disp (bytes) */ | (int)(~__BITS(10,0)) \ 885 1.1 fredette : Off11L(i) << 10 | Off11H(i)) << 2) 886 1.1 fredette 887 1.1 fredette #define Sr(i) (SrH(i)<<2 | SrL(i)) 888 1.1 fredette 889 1.1 fredette /* sfu/copr */ 890 1.1 fredette #define CoprExt1(i) (CopExt17(i)) 891 1.1 fredette #define CoprExt2(i) (CopExt5(i)) 892 1.1 fredette #define CoprExt(i) ((CopExt17(i)<<5) | CopExt5(i)) 893 1.1 fredette #define Spop0Ext(i) ((SpopExt15(i)<<5) | SpopExt5(i)) 894 1.1 fredette #define Spop1Ext(i) (SpopExt15(i)) 895 1.1 fredette #define Spop2Ext(i) ((SpopExt10(i)<<5) | SpopExt5(i)) 896 1.1 fredette #define Spop3Ext(i) ((SpopExt5L(i)<<5) | SpopExt5(i)) 897 1.1 fredette 898 1.1 fredette 899 1.1 fredette /*##################### Globals - Imports ##################################*/ 900 1.1 fredette 901 1.1 fredette /* Disassembly functions */ 902 1.5 chs int fcoprDasm(union insn, u_int, u_int); 903 1.7 chs const char *edDCond(u_int); 904 1.7 chs const char *unitDCond(u_int); 905 1.7 chs const char *addDCond(u_int); 906 1.7 chs const char *subDCond(u_int); 907 1.5 chs int blDasm(const struct inst *, OFS, union insn); 908 1.5 chs int ldDasm(const struct inst *, OFS, union insn); 909 1.5 chs int stDasm(const struct inst *, OFS, union insn); 910 1.5 chs int addDasm(const struct inst *, OFS, union insn); 911 1.5 chs int unitDasm(const struct inst *, OFS, union insn); 912 1.5 chs int iaDasm(const struct inst *, OFS, union insn); 913 1.5 chs int shdDasm(const struct inst *, OFS, union insn); 914 1.5 chs int extrDasm(const struct inst *, OFS, union insn); 915 1.5 chs int vextrDasm(const struct inst *, OFS, union insn); 916 1.5 chs int depDasm(const struct inst *, OFS, union insn); 917 1.5 chs int vdepDasm(const struct inst *, OFS, union insn); 918 1.5 chs int depiDasm(const struct inst *, OFS, union insn); 919 1.5 chs int vdepiDasm(const struct inst *, OFS, union insn); 920 1.5 chs int limmDasm(const struct inst *, OFS, union insn); 921 1.5 chs int brkDasm(const struct inst *, OFS, union insn); 922 1.5 chs int lpkDasm(const struct inst *, OFS, union insn); 923 1.5 chs int fmpyaddDasm(const struct inst *, OFS, union insn); 924 1.5 chs int fmpysubDasm(const struct inst *, OFS, union insn); 925 1.5 chs int floatDasm(const struct inst *, OFS, union insn); 926 1.5 chs int coprDasm(const struct inst *, OFS, union insn); 927 1.5 chs int diagDasm(const struct inst *, OFS, union insn); 928 1.5 chs int scDasm(const struct inst *, OFS, union insn); 929 1.5 chs int mmgtDasm(const struct inst *, OFS, union insn); 930 1.5 chs int ldxDasm(const struct inst *, OFS, union insn); 931 1.5 chs int stsDasm(const struct inst *, OFS, union insn); 932 1.5 chs int stbysDasm(const struct inst *, OFS, union insn); 933 1.5 chs int brDasm(const struct inst *, OFS, union insn); 934 1.5 chs int bvDasm(const struct inst *, OFS, union insn); 935 1.5 chs int beDasm(const struct inst *, OFS, union insn); 936 1.5 chs int cbDasm(const struct inst *, OFS, union insn); 937 1.5 chs int cbiDasm(const struct inst *, OFS, union insn); 938 1.5 chs int bbDasm(const struct inst *, OFS, union insn); 939 1.5 chs int ariDasm(const struct inst *, OFS, union insn); 940 1.1 fredette 941 1.1 fredette /*##################### Globals - Exports ##################################*/ 942 1.1 fredette /*##################### Local Variables ####################################*/ 943 1.1 fredette 944 1.1 fredette static const char fcoprUndef[] = "copr\t(rsvd or undef.)"; 945 1.1 fredette static const char fmtStrTbl[][5] = { "sgl", "dbl", "sgl", "quad" }; 946 1.1 fredette static const char condStrTbl[][7] = { 947 1.1 fredette "false?", "false", "?", "!<=>", "=", "=t", "?=", "!<>", 948 1.1 fredette "!?>=", "<", "?<", "!>=", "!?>", "<=", "?<=", "!>", 949 1.1 fredette "!?<=", ">", "?>", "!<=", "!?<", ">=", "?>=", "!<", 950 1.1 fredette "!?=", "<>", "!=", "!=t", "!?", "<=>", "true?", "true" 951 1.1 fredette }; 952 1.1 fredette static const char fsreg[][5] = { 953 1.1 fredette "r0L", "r0R", "r1L", "r1R", "r2L", "r2R", "r3L", "r3R", 954 1.1 fredette "r4L", "r4R", "r5L", "r5R", "r6L", "r6R", "r7L", "r7R", 955 1.1 fredette "r8L", "r8R", "r9L", "r9R", "r10L", "r10R", "r11L", "r11R", 956 1.1 fredette "r12L", "r12R", "r13L", "r13R", "r14L", "r14R", "r15L", "r15R", 957 1.1 fredette "r16L", "r16R", "r17L", "r17R", "r18L", "r18R", "r19L", "r19R", 958 1.1 fredette "r20L", "r20R", "r21L", "r21R", "r22L", "r22R", "r23L", "r23R", 959 1.1 fredette "r24L", "r24R", "r25L", "r25R", "r26L", "r26R", "r27L", "r27R", 960 1.1 fredette "r28L", "r28R", "r29L", "r29R", "r30L", "r30R", "r31L", "r31R" 961 1.1 fredette }; 962 1.1 fredette static const char fdreg[][4] = { 963 1.1 fredette "r0", "r0", "r1", "r1", "r2", "r2", "r3", "r3", 964 1.1 fredette "r4", "r4", "r5", "r5", "r6", "r6", "r7", "r7", 965 1.1 fredette "r8", "r8", "r9", "r9", "r10", "r10", "r11", "r11", 966 1.1 fredette "r12", "r12", "r13", "r13", "r14", "r14", "r15", "r15", 967 1.1 fredette "r16", "r16", "r17", "r17", "r18", "r18", "r19", "r19", 968 1.1 fredette "r20", "r20", "r21", "r21", "r22", "r22", "r23", "r23", 969 1.1 fredette "r24", "r24", "r25", "r25", "r26", "r26", "r27", "r27", 970 1.1 fredette "r28", "r28", "r29", "r29", "r30", "r30", "r31", "r31" 971 1.1 fredette }; 972 1.1 fredette 973 1.1 fredette /*##################### Macros #############################################*/ 974 1.1 fredette 975 1.1 fredette #define Match(s) (strncmp(s,i->mnem,sizeof(s)-1) == 0) 976 1.1 fredette 977 1.1 fredette /* bits for assist ops */ 978 1.1 fredette #define AstNu(w) Modify(w) 979 1.1 fredette #define Fpi(w) (Uid(w)>3) 980 1.1 fredette 981 1.1 fredette /* bits for 5 ops */ 982 1.1 fredette #define SinglePrec(i) Modify(i) 983 1.1 fredette #define Ms1(i) ((Rsb(i)<<1)+(SinglePrec(i)?((Rsb(i)>15)?1:32):0)) 984 1.1 fredette #define Ms2(i) ((Rsa(i)<<1)+(SinglePrec(i)?((Rsa(i)>15)?1:32):0)) 985 1.1 fredette #define Mt(i) ((Rtc(i)<<1)+(SinglePrec(i)?((Rtc(i)>15)?1:32):0)) 986 1.1 fredette #define As(i) ((Rsd(i)<<1)+(SinglePrec(i)?((Rsd(i)>15)?1:32):0)) 987 1.1 fredette #define Ad(i) ((Rte(i)<<1)+(SinglePrec(i)?((Rte(i)>15)?1:32):0)) 988 1.1 fredette 989 1.1 fredette /*##################### Globals - Exports ##################################*/ 990 1.1 fredette 991 1.1 fredette /* To replace instr function, do the following: */ 992 1.1 fredette /* a) locate the desired entry in instrs[] below */ 993 1.18 andvar /* b) change the 3rd field if an alternate mnemonic is */ 994 1.1 fredette /* desired for window disassembly */ 995 1.1 fredette /* c) change the 4th field to the name of the function being */ 996 1.1 fredette /* used for replacement (i.e. ldwRepl instead of ldw) */ 997 1.1 fredette /* d) change the 5th field if an alternate disassembly routine */ 998 1.1 fredette /* is desired (i.e. ldDasmRepl) */ 999 1.1 fredette 1000 1.1 fredette static const struct inst instrs[] = { 1001 1.1 fredette { LDW, 0, "ldw", ldDasm }, 1002 1.1 fredette { LDH, 0, "ldh", ldDasm }, 1003 1.1 fredette { LDB, 0, "ldb", ldDasm }, 1004 1.1 fredette { LDWM, 0, "ldwm", ldDasm }, 1005 1.1 fredette { LDO, 0, "ldo", ldDasm }, 1006 1.1 fredette { STW, 0, "stw", stDasm }, 1007 1.1 fredette { STH, 0, "sth", stDasm }, 1008 1.1 fredette { STB, 0, "stb", stDasm }, 1009 1.1 fredette { STWM, 0, "stwm", stDasm }, 1010 1.1 fredette { LDWX, 0, "ldw", ldxDasm }, 1011 1.1 fredette { LDHX, 0, "ldh", ldxDasm }, 1012 1.1 fredette { LDBX, 0, "ldb", ldxDasm }, 1013 1.1 fredette { LDCWX, 0, "ldcw", ldxDasm }, 1014 1.1 fredette { LDWAX, 0, "ldwa", ldxDasm }, 1015 1.1 fredette { LDWS, 0, "ldw", ldxDasm }, 1016 1.1 fredette { LDHS, 0, "ldh", ldxDasm }, 1017 1.1 fredette { LDBS, 0, "ldb", ldxDasm }, 1018 1.1 fredette { LDCWS, 0, "ldcw", ldxDasm }, 1019 1.1 fredette { LDWAS, 0, "ldwa", ldxDasm }, 1020 1.1 fredette { STWS, 0, "stws", stsDasm }, 1021 1.1 fredette { STHS, 0, "sths", stsDasm }, 1022 1.1 fredette { STBS, 0, "stbs", stsDasm }, 1023 1.1 fredette { STWAS, 0, "stwas", stsDasm }, 1024 1.1 fredette { STBYS, 0, "stbys", stbysDasm }, 1025 1.1 fredette { LDIL, 0, "ldil", limmDasm }, 1026 1.1 fredette { ADDIL, 0, "addil", limmDasm }, 1027 1.1 fredette { GATE, 0, "gate", blDasm }, 1028 1.1 fredette { BL, 0, "b", blDasm }, 1029 1.1 fredette { BLR, 0, "blr", brDasm }, 1030 1.1 fredette { BV, 0, "bv", bvDasm }, 1031 1.1 fredette { BE, 0, "be", beDasm }, 1032 1.1 fredette { BLE, 0, "ble", beDasm }, 1033 1.1 fredette { COMBT, 0, "combt", cbDasm }, 1034 1.1 fredette { COMBF, 0, "combf", cbDasm }, 1035 1.1 fredette { COMIBT, 0, "comibt", cbiDasm }, 1036 1.1 fredette { COMIBF, 0, "comibf", cbiDasm }, 1037 1.1 fredette { ADDBT, 0, "addbt", cbDasm }, 1038 1.1 fredette { ADDBF, 0, "addbf", cbDasm }, 1039 1.1 fredette { ADDIBT, 0, "addibt", cbiDasm }, 1040 1.1 fredette { ADDIBF, 0, "addibf", cbiDasm }, 1041 1.1 fredette { MOVB, 0, "movb", cbDasm }, 1042 1.1 fredette { MOVIB, 0, "movib", cbiDasm }, 1043 1.1 fredette { BB, 0, "bb", bbDasm }, 1044 1.1 fredette { BVB, 0, "bvb", bbDasm }, 1045 1.1 fredette { SUBO, 0, "subo", ariDasm }, 1046 1.1 fredette { ADD, 0, "add", addDasm }, 1047 1.1 fredette { ADDL, 0, "addl", addDasm }, 1048 1.1 fredette { ADDO, 0, "addo", ariDasm }, 1049 1.1 fredette { SH1ADD, 0, "sh1add", ariDasm }, 1050 1.1 fredette { SH1ADDL,0, "sh1addl", ariDasm }, 1051 1.1 fredette { SH1ADDO,0, "sh1addo", ariDasm }, 1052 1.1 fredette { SH2ADD, 0, "sh2add", ariDasm }, 1053 1.1 fredette { SH2ADDL,0, "sh2addl", ariDasm }, 1054 1.1 fredette { SH2ADDO,0, "sh2addo", ariDasm }, 1055 1.1 fredette { SH3ADD, 0, "sh3add", ariDasm }, 1056 1.1 fredette { SH3ADDL,0, "sh3addl", ariDasm }, 1057 1.1 fredette { SH3ADDO,0, "sh3addo", ariDasm }, 1058 1.1 fredette { SUB, 0, "sub", ariDasm }, 1059 1.1 fredette { ADDCO, 0, "addco", ariDasm }, 1060 1.1 fredette { SUBBO, 0, "subbo", ariDasm }, 1061 1.1 fredette { ADDC, 0, "addc", ariDasm }, 1062 1.1 fredette { SUBB, 0, "subb", ariDasm }, 1063 1.1 fredette { COMCLR, 0, "comclr", ariDasm }, 1064 1.1 fredette { OR, 0, "or", ariDasm }, 1065 1.1 fredette { AND, 0, "and", ariDasm }, 1066 1.1 fredette { XOR, 0, "xor", ariDasm }, 1067 1.1 fredette { ANDCM, 0, "andcm", ariDasm }, 1068 1.1 fredette { DS, 0, "ds", ariDasm }, 1069 1.1 fredette { UXOR, 0, "uxor", unitDasm }, 1070 1.1 fredette { UADDCM, 0, "uaddcm", unitDasm }, 1071 1.1 fredette { UADDCMT,0, "uaddcmt", unitDasm }, 1072 1.1 fredette { SUBTO, 0, "subto", ariDasm }, 1073 1.1 fredette { SUBT, 0, "subt", ariDasm }, 1074 1.1 fredette { DCOR, 0, "dcor", unitDasm }, 1075 1.1 fredette { IDCOR, 0, "idcor", unitDasm }, 1076 1.1 fredette { ADDIO, 0, "addio", iaDasm }, 1077 1.1 fredette { SUBIO, 0, "subio", iaDasm }, 1078 1.1 fredette { ADDI, 0, "addi", iaDasm }, 1079 1.1 fredette { SUBI, 0, "subi", iaDasm }, 1080 1.1 fredette { COMICLR,0, "comiclr", iaDasm }, 1081 1.1 fredette { ADDITO, 0, "addito", iaDasm }, 1082 1.1 fredette { ADDIT, 0, "addit", iaDasm }, 1083 1.1 fredette { SHD, 0, "shd", shdDasm }, 1084 1.1 fredette { VSHD, 0, "vshd", shdDasm }, 1085 1.1 fredette { EXTRU, 0, "extru", extrDasm }, 1086 1.1 fredette { EXTRS, 0, "extrs", extrDasm }, 1087 1.1 fredette { VEXTRU, 0, "vextru", vextrDasm }, 1088 1.1 fredette { VEXTRS, 0, "vextrs", vextrDasm }, 1089 1.1 fredette { DEP, 0, "dep", depDasm }, 1090 1.1 fredette { VDEP, 0, "vdep", vdepDasm }, 1091 1.1 fredette { DEPI, 0, "depi", depiDasm }, 1092 1.1 fredette { VDEPI, 0, "vdepi", vdepiDasm }, 1093 1.1 fredette { ZDEP, 0, "zdep", depDasm }, 1094 1.1 fredette { ZVDEP, 0, "zvdep", vdepDasm }, 1095 1.1 fredette { ZDEPI, 0, "zdepi", depiDasm }, 1096 1.1 fredette { ZVDEPI, 0, "zvdepi", vdepiDasm }, 1097 1.1 fredette { BREAK, 0, "break", brkDasm }, 1098 1.1 fredette { RFI, 0, "rfi", 0 }, 1099 1.1 fredette { RFIR, 0, "rfir", 0 }, 1100 1.1 fredette { SSM, 0, "ssm", scDasm }, 1101 1.1 fredette { RSM, 0, "rsm", scDasm }, 1102 1.1 fredette { MTSM, 0, "mtsm", scDasm }, 1103 1.1 fredette { PROBER, 0, "prober", mmgtDasm }, 1104 1.1 fredette { PROBEW, 0, "probew", mmgtDasm }, 1105 1.1 fredette { LPA, 0, "lpa", mmgtDasm }, 1106 1.1 fredette { LHA, 0, "lha", mmgtDasm }, 1107 1.1 fredette { LDSID, 0, "ldsid", scDasm }, 1108 1.1 fredette { PDTLB, 0, "pdtlb", mmgtDasm }, 1109 1.1 fredette { PDTLBE, 0, "pdtlbe", mmgtDasm }, 1110 1.1 fredette { PITLB, 0, "pitlb", mmgtDasm }, 1111 1.1 fredette { PITLBE, 0, "pitlbe", mmgtDasm }, 1112 1.1 fredette { IDTLBA, 0, "idtlba", mmgtDasm }, 1113 1.1 fredette { IITLBA, 0, "iitlba", mmgtDasm }, 1114 1.1 fredette { IDTLBP, 0, "idtlbp", mmgtDasm }, 1115 1.1 fredette { IITLBP, 0, "iitlbp", mmgtDasm }, 1116 1.1 fredette { FIC, 0, "fic", mmgtDasm }, 1117 1.1 fredette { FICE, 0, "fice", mmgtDasm }, 1118 1.1 fredette { PDC, 0, "pdc", mmgtDasm }, 1119 1.1 fredette { FDC, 0, "fdc", mmgtDasm }, 1120 1.1 fredette { FDCE, 0, "fdce", mmgtDasm }, 1121 1.1 fredette { SYNC, 0, "sync", 0 }, 1122 1.1 fredette { MTSP, 0, "mtsp", scDasm }, 1123 1.1 fredette { MTCTL, 0, "mtctl", scDasm }, 1124 1.1 fredette { MFSP, 0, "mfsp", scDasm }, 1125 1.1 fredette { MFCTL, 0, "mfctl", scDasm }, 1126 1.1 fredette { DIAG, 0, "diag", diagDasm }, 1127 1.1 fredette { SPOP, 0, "???", 0 }, 1128 1.1 fredette { COPR, 0, "copr", coprDasm }, 1129 1.1 fredette { CLDWX, 0, "cldw", coprDasm }, 1130 1.1 fredette { CLDDX, 0, "cldd", coprDasm }, 1131 1.1 fredette { CSTWX, 0, "cstw", coprDasm }, 1132 1.1 fredette { CSTDX, 0, "cstd", coprDasm }, 1133 1.1 fredette { CLDWS, 0, "cldw", coprDasm }, 1134 1.1 fredette { CLDDS, 0, "cldd", coprDasm }, 1135 1.1 fredette { CSTWS, 0, "cstw", coprDasm }, 1136 1.1 fredette { CSTDS, 0, "cstd", coprDasm }, 1137 1.1 fredette { FLOAT0, 0, "f", floatDasm }, 1138 1.1 fredette { FLOAT1, 0, "fcnv", floatDasm }, 1139 1.1 fredette { FLOAT2, 0, "f", floatDasm }, 1140 1.1 fredette { FLOAT3, 0, "f", floatDasm }, 1141 1.1 fredette { FMPYSUB,0, "fmpy", fmpysubDasm }, 1142 1.1 fredette { FMPYADD,0, "fmpy", fmpyaddDasm }, 1143 1.1 fredette { FSTQX, 0, "fstqx", lpkDasm }, 1144 1.1 fredette { FSTQS, 0, "fstqs", lpkDasm }, 1145 1.16 skrll { 0, 0, 0, 0, 0, "", NULL} 1146 1.1 fredette }; 1147 1.1 fredette 1148 1.1 fredette 1149 1.1 fredette static const struct inst *so_sysop[0xd0]; 1150 1.1 fredette static const struct inst *so_mmuop[0x50]; 1151 1.1 fredette static const struct inst *so_arith[0x80]; 1152 1.1 fredette static const struct inst *so_loads[0x50]; 1153 1.1 fredette static const struct inst *so_cldw [0x0A]; 1154 1.1 fredette static const struct inst *so_cldd [0x0A]; 1155 1.1 fredette static const struct inst *so_float[0x04]; 1156 1.1 fredette static const struct inst *so_fstq [0x0A]; 1157 1.1 fredette static const struct inst *so_ebran[0x08]; 1158 1.1 fredette static const struct inst *so_addit[0x02]; 1159 1.1 fredette static const struct inst *so_addi [0x02]; 1160 1.1 fredette static const struct inst *so_subi [0x02]; 1161 1.1 fredette static const struct inst *so_shext[0x08]; 1162 1.1 fredette static const struct inst *so_deps [0x08]; 1163 1.1 fredette 1164 1.7 chs #define ILLEG NULL 1165 1.1 fredette #define NENTS(a) (sizeof(a)/sizeof(a[0])-1) 1166 1.1 fredette static struct majoropcode majopcs[NMAJOPCS] = { 1167 1.16 skrll { so_sysop, NENTS(so_sysop), 0, 0 }, /* 00 */ 1168 1.16 skrll { so_mmuop, NENTS(so_mmuop), 0, 0 }, /* 01 */ 1169 1.16 skrll { so_arith, NENTS(so_arith), 0, 0 }, /* 02 */ 1170 1.16 skrll { so_loads, NENTS(so_loads), 0, 0 }, /* 03 */ 1171 1.16 skrll { ILLEG, 1, 0, 0 }, /* 04 */ 1172 1.16 skrll { ILLEG, 1, 0, 0 }, /* 05 */ 1173 1.16 skrll { ILLEG, 1, 0, 0 }, /* 06 */ 1174 1.16 skrll { ILLEG, 1, 0, 0 }, /* 07 */ 1175 1.16 skrll { ILLEG, 1, 0, 0 }, /* 08 */ 1176 1.16 skrll { so_cldw , NENTS(so_cldw ), 0, 0 }, /* 09 */ 1177 1.16 skrll { ILLEG, 1, 0, 0 }, /* 0A */ 1178 1.16 skrll { so_cldd , NENTS(so_cldd ), 0, 0 }, /* 0B */ 1179 1.16 skrll { ILLEG, 1, 0, 0 }, /* 0C */ 1180 1.16 skrll { ILLEG, 1, 0, 0 }, /* 0D */ 1181 1.16 skrll { so_float, NENTS(so_float), 0, 0 }, /* 0E */ 1182 1.16 skrll { so_fstq , NENTS(so_fstq ), 0, 0 }, /* 0F */ 1183 1.16 skrll { ILLEG, 1, 0, 0 }, /* 10 */ 1184 1.16 skrll { ILLEG, 1, 0, 0 }, /* 11 */ 1185 1.16 skrll { ILLEG, 1, 0, 0 }, /* 12 */ 1186 1.16 skrll { ILLEG, 1, 0, 0 }, /* 13 */ 1187 1.16 skrll { ILLEG, 1, 0, 0 }, /* 14 */ 1188 1.16 skrll { ILLEG, 1, 0, 0 }, /* 15 */ 1189 1.16 skrll { ILLEG, 1, 0, 0 }, /* 16 */ 1190 1.16 skrll { ILLEG, 1, 0, 0 }, /* 17 */ 1191 1.16 skrll { ILLEG, 1, 0, 0 }, /* 18 */ 1192 1.16 skrll { ILLEG, 1, 0, 0 }, /* 19 */ 1193 1.16 skrll { ILLEG, 1, 0, 0 }, /* 1A */ 1194 1.16 skrll { ILLEG, 1, 0, 0 }, /* 1B */ 1195 1.16 skrll { ILLEG, 1, 0, 0 }, /* 1C */ 1196 1.16 skrll { ILLEG, 1, 0, 0 }, /* 1D */ 1197 1.16 skrll { ILLEG, 1, 0, 0 }, /* 1E */ 1198 1.16 skrll { ILLEG, 1, 0, 0 }, /* 1F */ 1199 1.16 skrll { ILLEG, 1, 0, 0 }, /* 20 */ 1200 1.16 skrll { ILLEG, 1, 0, 0 }, /* 21 */ 1201 1.16 skrll { ILLEG, 1, 0, 0 }, /* 22 */ 1202 1.16 skrll { ILLEG, 1, 0, 0 }, /* 23 */ 1203 1.16 skrll { ILLEG, 1, 0, 0 }, /* 24 */ 1204 1.16 skrll { so_subi , NENTS(so_subi ), 0, 0 }, /* 25 */ 1205 1.16 skrll { ILLEG, 1, 0, 0 }, /* 26 */ 1206 1.16 skrll { ILLEG, 1, 0, 0 }, /* 27 */ 1207 1.16 skrll { ILLEG, 1, 0, 0 }, /* 28 */ 1208 1.16 skrll { ILLEG, 1, 0, 0 }, /* 29 */ 1209 1.16 skrll { ILLEG, 1, 0, 0 }, /* 2A */ 1210 1.16 skrll { ILLEG, 1, 0, 0 }, /* 2B */ 1211 1.16 skrll { so_addit, NENTS(so_addit), 0, 0 }, /* 2C */ 1212 1.16 skrll { so_addi , NENTS(so_addi ), 0, 0 }, /* 2D */ 1213 1.16 skrll { ILLEG, 1, 0, 0 }, /* 2E */ 1214 1.16 skrll { ILLEG, 1, 0, 0 }, /* 2F */ 1215 1.16 skrll { ILLEG, 1, 0, 0 }, /* 30 */ 1216 1.16 skrll { ILLEG, 1, 0, 0 }, /* 31 */ 1217 1.16 skrll { ILLEG, 1, 0, 0 }, /* 32 */ 1218 1.16 skrll { ILLEG, 1, 0, 0 }, /* 33 */ 1219 1.16 skrll { so_shext, NENTS(so_shext), 0, 0 }, /* 34 */ 1220 1.16 skrll { so_deps , NENTS(so_deps ), 0, 0 }, /* 35 */ 1221 1.16 skrll { ILLEG, 1, 0, 0 }, /* 36 */ 1222 1.16 skrll { ILLEG, 1, 0, 0 }, /* 37 */ 1223 1.16 skrll { ILLEG, 1, 0, 0 }, /* 38 */ 1224 1.16 skrll { ILLEG, 1, 0, 0 }, /* 39 */ 1225 1.16 skrll { so_ebran, NENTS(so_ebran), 0, 0 }, /* 3A */ 1226 1.16 skrll { ILLEG, 1, 0, 0 }, /* 3B */ 1227 1.16 skrll { ILLEG, 1, 0, 0 }, /* 3C */ 1228 1.16 skrll { ILLEG, 1, 0, 0 }, /* 3D */ 1229 1.16 skrll { ILLEG, 1, 0, 0 }, /* 3E */ 1230 1.16 skrll { ILLEG, 1, 0, 0 }, /* 3F */ 1231 1.1 fredette }; 1232 1.1 fredette #undef NENTS 1233 1.1 fredette #undef ILLEG 1234 1.1 fredette 1235 1.1 fredette /*-------------------------------------------------------------------------- 1236 1.1 fredette * instruction$ExecutionInitialize - Initialize the instruction execution 1237 1.1 fredette * data structures. 1238 1.1 fredette *---------------------------------------------------------------------------*/ 1239 1.5 chs static int iExInit(void); 1240 1.1 fredette static int 1241 1.1 fredette iExInit(void) 1242 1.1 fredette { 1243 1.1 fredette static int unasm_initted = 0; 1244 1.3 chs const struct inst *i; 1245 1.3 chs struct majoropcode *m; 1246 1.1 fredette u_int shft, mask; 1247 1.1 fredette 1248 1.1 fredette if (unasm_initted) 1249 1.1 fredette return 0; 1250 1.1 fredette 1251 1.1 fredette /* 1252 1.1 fredette * Determine maxsubop for each major opcode. 1253 1.1 fredette * Also, check all instructions of a given major opcode 1254 1.1 fredette * for consistent opcode extension field definition, and 1255 1.1 fredette * save a converted form of this definition in the majopcs 1256 1.1 fredette * entry for this major opcode. 1257 1.1 fredette */ 1258 1.1 fredette for (i = &instrs[0]; *i->mnem; i++) { 1259 1.1 fredette m = &majopcs[i->majopc]; 1260 1.16 skrll if (m->maxsubop < i->opcext) { 1261 1.16 skrll db_printf("iExInit not enough space for opcode %d", 1262 1.1 fredette i->majopc); 1263 1.16 skrll return 0; 1264 1.16 skrll } 1265 1.1 fredette shft = 32 - i->extbs - i->extbl; 1266 1.1 fredette mask = (1 << i->extbl) - 1; 1267 1.1 fredette if (m->extshft || m->extmask) { 1268 1.1 fredette if (m->extshft != shft || m->extmask != mask) { 1269 1.1 fredette db_printf("%s - Bad instruction initialization!\n", i->mnem); 1270 1.1 fredette return (0); 1271 1.1 fredette } 1272 1.1 fredette } else { 1273 1.1 fredette m->extshft = shft; 1274 1.1 fredette m->extmask = mask; 1275 1.1 fredette } 1276 1.1 fredette } 1277 1.1 fredette 1278 1.1 fredette /* 1279 1.1 fredette * Lastly, fill in all legal subops with the appropriate info. 1280 1.1 fredette */ 1281 1.1 fredette for (i = &instrs[0]; *i->mnem; i++) { 1282 1.1 fredette m = &majopcs[i->majopc]; 1283 1.1 fredette if (m->maxsubop == 1) 1284 1.7 chs m->subops = __UNCONST(i); 1285 1.1 fredette else 1286 1.1 fredette m->subops[i->opcext] = i; 1287 1.1 fredette } 1288 1.1 fredette 1289 1.1 fredette unasm_initted++; 1290 1.1 fredette return (1); 1291 1.1 fredette } 1292 1.1 fredette 1293 1.1 fredette 1294 1.1 fredette 1295 1.1 fredette /*##################### Functions and Subroutines ##########################*/ 1296 1.1 fredette 1297 1.1 fredette /**************************************/ 1298 1.1 fredette /* Miscellaneous Disassembly Routines */ 1299 1.1 fredette /**************************************/ 1300 1.1 fredette 1301 1.1 fredette /* Add instructions */ 1302 1.1 fredette int 1303 1.5 chs addDasm(const struct inst *i, OFS ofs, union insn w) 1304 1.1 fredette { 1305 1.14 skrll db_printf("%s\t%%r%d, %%r%d, %%r%d",addDCond(Cond4(w)), 1306 1.1 fredette Rsa(w),Rsb(w),Rtc(w)); 1307 1.1 fredette return (1); 1308 1.1 fredette } 1309 1.1 fredette 1310 1.1 fredette /* Unit instructions */ 1311 1.1 fredette int 1312 1.5 chs unitDasm(const struct inst *i, OFS ofs, union insn w) 1313 1.1 fredette { 1314 1.16 skrll db_printf("%s", unitDCond(Cond4(w))); 1315 1.1 fredette if (Match("dcor") || Match("idcor")) 1316 1.14 skrll db_printf("\t%%r%d, %%r%d",Rsb(w),Rtc(w)); 1317 1.1 fredette else 1318 1.14 skrll db_printf("\t%%r%d, %%r%d, %%r%d",Rsa(w),Rsb(w),Rtc(w)); 1319 1.1 fredette return (1); 1320 1.1 fredette } 1321 1.1 fredette 1322 1.1 fredette /* Immediate Arithmetic instructions */ 1323 1.1 fredette int 1324 1.5 chs iaDasm(const struct inst *i, OFS ofs, union insn w) 1325 1.1 fredette { 1326 1.1 fredette if (Match("addi")) 1327 1.14 skrll db_printf("%s\t%d, %%r%d, %%r%d", 1328 1.1 fredette addDCond(Cond4(w)),Im11(w),Rsb(w),Rta(w)); 1329 1.1 fredette else 1330 1.14 skrll db_printf("%s\t%d, %%r%d, %%r%d", 1331 1.1 fredette subDCond(Cond4(w)),Im11(w),Rsb(w),Rta(w)); 1332 1.1 fredette return (1); 1333 1.1 fredette } 1334 1.1 fredette 1335 1.1 fredette /* Shift double instructions */ 1336 1.1 fredette int 1337 1.5 chs shdDasm(const struct inst *i, OFS ofs, union insn w) 1338 1.1 fredette { 1339 1.1 fredette if (Match("vshd")) 1340 1.14 skrll db_printf("%s\t%%r%d, %%r%d, %%r%d", 1341 1.1 fredette edDCond(Cond(w)), Rsa(w),Rsb(w),Rtc(w)); 1342 1.1 fredette else 1343 1.14 skrll db_printf("%s\t%%r%d, %%r%d, %d, %%r%d", 1344 1.1 fredette edDCond(Cond(w)),Rsa(w),Rsb(w),31-Imd5(w),Rtc(w)); 1345 1.1 fredette return (1); 1346 1.1 fredette } 1347 1.1 fredette 1348 1.1 fredette /* Extract instructions */ 1349 1.1 fredette int 1350 1.5 chs extrDasm(const struct inst *i, OFS ofs, union insn w) 1351 1.1 fredette { 1352 1.14 skrll db_printf("%s\t%%r%d, %d, %d, %%r%d", 1353 1.1 fredette edDCond(Cond(w)),Rsb(w),Imd5(w),32 - Rsc(w),Rta(w)); 1354 1.1 fredette return (1); 1355 1.1 fredette } 1356 1.1 fredette 1357 1.1 fredette 1358 1.1 fredette /* Variable extract instructions */ 1359 1.1 fredette int 1360 1.5 chs vextrDasm(const struct inst *i, OFS ofs, union insn w) 1361 1.1 fredette { 1362 1.14 skrll db_printf("%s\t%%r%d, %d, %%r%d", 1363 1.1 fredette edDCond(Cond(w)),Rsb(w),32 - Rsc(w),Rta(w)); 1364 1.1 fredette return (1); 1365 1.1 fredette } 1366 1.1 fredette 1367 1.1 fredette 1368 1.1 fredette /* Deposit instructions */ 1369 1.1 fredette int 1370 1.5 chs depDasm(const struct inst *i, OFS ofs, union insn w) 1371 1.1 fredette { 1372 1.14 skrll db_printf("%s\t%%r%d, %d, %d, %%r%d", 1373 1.1 fredette edDCond(Cond(w)),Rsa(w),31 - Imd5(w),32 - Rsc(w),Rtb(w)); 1374 1.1 fredette return (1); 1375 1.1 fredette } 1376 1.1 fredette 1377 1.1 fredette 1378 1.1 fredette /* Variable deposit instructions */ 1379 1.1 fredette int 1380 1.5 chs vdepDasm(const struct inst *i, OFS ofs, union insn w) 1381 1.1 fredette { 1382 1.14 skrll db_printf("%s\t%%r%d, %d, %%r%d", 1383 1.1 fredette edDCond(Cond(w)),Rsa(w),32 - Rsc(w),Rtb(w)); 1384 1.1 fredette return (1); 1385 1.1 fredette } 1386 1.1 fredette 1387 1.1 fredette 1388 1.1 fredette /* Deposit Immediate instructions */ 1389 1.1 fredette int 1390 1.5 chs depiDasm(const struct inst *i, OFS ofs, union insn w) 1391 1.1 fredette { 1392 1.14 skrll db_printf("%s\t%d, %d, %d, %%r%d", 1393 1.1 fredette edDCond(Cond(w)),Ima5(w),31 - Imd5(w),32 - Imc5A(w),Rtb(w)); 1394 1.1 fredette return (1); 1395 1.1 fredette } 1396 1.1 fredette 1397 1.1 fredette /* Variable Deposit Immediate instructions */ 1398 1.1 fredette int 1399 1.5 chs vdepiDasm(const struct inst *i, OFS ofs, union insn w) 1400 1.1 fredette { 1401 1.14 skrll db_printf("%s\t%d, %d, %%r%d",edDCond(Cond(w)),Ima5(w),32-Imc5A(w),Rtb(w)); 1402 1.1 fredette return (1); 1403 1.1 fredette } 1404 1.1 fredette 1405 1.1 fredette /*--------------------------------------------------------------------------- 1406 1.1 fredette * conditionType$DisassembleCondition - Return a string which contains the 1407 1.1 fredette * ascii description of the passed numeric condition. 1408 1.1 fredette *---------------------------------------------------------------------------*/ 1409 1.1 fredette 1410 1.7 chs const char * 1411 1.5 chs subDCond(u_int cond) 1412 1.1 fredette { 1413 1.1 fredette switch(cond) { 1414 1.1 fredette case EQZ: return(",="); 1415 1.1 fredette case LT: return(",<"); 1416 1.1 fredette case LE: return(",<="); 1417 1.1 fredette case LLT: return(",<<"); 1418 1.1 fredette case LLE: return(",<<="); 1419 1.1 fredette case SV: return(",sv"); 1420 1.1 fredette case OD: return(",od"); 1421 1.1 fredette case NEQZ: return(",<>"); 1422 1.1 fredette case GE: return(",>="); 1423 1.1 fredette case GT: return(",>"); 1424 1.1 fredette case LGE: return(",>>="); 1425 1.1 fredette case LGT: return(",>>"); 1426 1.1 fredette case NSV: return(",nsv"); 1427 1.1 fredette case EV: return(",ev"); 1428 1.1 fredette case TR: return(",tr"); 1429 1.1 fredette case NEV: return(""); 1430 1.1 fredette default: 1431 1.16 skrll return("subDCond: unknown condition"); 1432 1.1 fredette } 1433 1.1 fredette } 1434 1.1 fredette 1435 1.1 fredette 1436 1.1 fredette /*--------------------------------------------------------------------------- 1437 1.1 fredette * conditionType$DisassembleCondition - Return a string which contains the 1438 1.1 fredette * ascii description of the passed numeric condition. 1439 1.1 fredette *---------------------------------------------------------------------------*/ 1440 1.1 fredette 1441 1.7 chs const char * 1442 1.5 chs addDCond(u_int cond) 1443 1.1 fredette { 1444 1.1 fredette switch(cond) { 1445 1.1 fredette case EQZ: return(",="); 1446 1.1 fredette case LT: return(",<"); 1447 1.1 fredette case LE: return(",<="); 1448 1.1 fredette case NUV: return(",nuv"); 1449 1.1 fredette case ZNV: return(",znv"); 1450 1.1 fredette case SV: return(",sv"); 1451 1.1 fredette case OD: return(",od"); 1452 1.1 fredette case NEQZ: return(",<>"); 1453 1.1 fredette case GE: return(",>="); 1454 1.1 fredette case GT: return(",>"); 1455 1.1 fredette case UV: return(",uv"); 1456 1.1 fredette case VNZ: return(",vnz"); 1457 1.1 fredette case NSV: return(",nsv"); 1458 1.1 fredette case EV: return(",ev"); 1459 1.1 fredette case TR: return(",tr"); 1460 1.1 fredette case NEV: return(""); 1461 1.1 fredette default: 1462 1.16 skrll return ("addDCond: unknown condition"); 1463 1.1 fredette } 1464 1.1 fredette } 1465 1.1 fredette 1466 1.7 chs const char * 1467 1.5 chs unitDCond(u_int cond) 1468 1.1 fredette { 1469 1.1 fredette switch(cond) { 1470 1.1 fredette case SHC: return(",shc"); 1471 1.1 fredette case SHZ: return(",shz"); 1472 1.1 fredette case SBC: return(",sbc"); 1473 1.1 fredette case SBZ: return(",sbz"); 1474 1.1 fredette case SDC: return(",sdc"); 1475 1.1 fredette case NHC: return(",nhc"); 1476 1.1 fredette case NHZ: return(",nhz"); 1477 1.1 fredette case NBC: return(",nbc"); 1478 1.1 fredette case NBZ: return(",nbz"); 1479 1.1 fredette case NDC: return(",ndc"); 1480 1.1 fredette case TR: return(",tr"); 1481 1.1 fredette case NEV: return(""); 1482 1.1 fredette default: 1483 1.16 skrll return("unitDCond: unknown condition"); 1484 1.1 fredette } 1485 1.1 fredette } 1486 1.1 fredette 1487 1.7 chs const char * 1488 1.5 chs edDCond(u_int cond) 1489 1.1 fredette { 1490 1.1 fredette switch(cond) { 1491 1.1 fredette case XOD: return(",od"); 1492 1.1 fredette case XTR: return(",tr"); 1493 1.1 fredette case XNE: return(",<>"); 1494 1.1 fredette case XLT: return(",<"); 1495 1.1 fredette case XEQ: return(",="); 1496 1.1 fredette case XGE: return(",>="); 1497 1.1 fredette case XEV: return(",ev"); 1498 1.1 fredette case NEV: return(""); 1499 1.1 fredette default: 1500 1.16 skrll return("edDCond: unknown condition"); 1501 1.1 fredette } 1502 1.1 fredette } 1503 1.1 fredette 1504 1.1 fredette 1505 1.1 fredette 1506 1.1 fredette /****************************************/ 1507 1.1 fredette /* Format Specific Disassembly Routines */ 1508 1.1 fredette /****************************************/ 1509 1.1 fredette 1510 1.1 fredette 1511 1.1 fredette /* Load [modify] instructions */ 1512 1.1 fredette int 1513 1.5 chs ldDasm(const struct inst *i, OFS ofs, union insn w) 1514 1.1 fredette { 1515 1.3 chs int d = Disp(w); 1516 1.1 fredette char s[2]; 1517 1.1 fredette 1518 1.1 fredette s[1] = '\0'; 1519 1.1 fredette if (d < 0) { 1520 1.1 fredette d = -d; 1521 1.1 fredette s[0] = '-'; 1522 1.1 fredette } else 1523 1.1 fredette s[0] = '\0'; 1524 1.1 fredette 1525 1.1 fredette if (Rsb(w) == 0 && Match("ldo")) { 1526 1.14 skrll db_printf("ldi\t%s%X, %%r%d",s,d,Rta(w)); 1527 1.1 fredette return (1); 1528 1.1 fredette } 1529 1.1 fredette db_printf("%s\t%s%s%X",i->mnem,(d < 2048? "R'":""), s, d); 1530 1.1 fredette if (Dss(w)) 1531 1.14 skrll db_printf("(%%sr%d, %%r%d), %%r%d",Dss(w),Rsb(w),Rta(w)); 1532 1.1 fredette else 1533 1.14 skrll db_printf("(%%r%d), %%r%d",Rsb(w),Rta(w)); 1534 1.1 fredette return (1); 1535 1.1 fredette } 1536 1.1 fredette 1537 1.1 fredette /* Store [modify] instructions */ 1538 1.1 fredette int 1539 1.5 chs stDasm(const struct inst *i, OFS ofs, union insn w) 1540 1.1 fredette { 1541 1.3 chs int d = Disp(w); 1542 1.1 fredette char s[2]; 1543 1.1 fredette 1544 1.14 skrll db_printf("\t%%r%d, ",Rta(w)); 1545 1.1 fredette 1546 1.1 fredette s[1] = '\0'; 1547 1.1 fredette if (d < 0) { 1548 1.1 fredette d = -d; 1549 1.1 fredette s[0] = '-'; 1550 1.1 fredette } else 1551 1.1 fredette s[0] = '\0'; 1552 1.1 fredette 1553 1.1 fredette db_printf("%s%s%X", (d < 2048? "R'":""), s, d); 1554 1.1 fredette 1555 1.1 fredette if (Dss(w)) 1556 1.14 skrll db_printf("(%%sr%d, %%r%d)",Dss(w),Rsb(w)); 1557 1.1 fredette else 1558 1.1 fredette db_printf("(%%r%d)",Rsb(w)); 1559 1.1 fredette return (1); 1560 1.1 fredette } 1561 1.1 fredette 1562 1.1 fredette /* Load indexed instructions */ 1563 1.1 fredette int 1564 1.5 chs ldxDasm(const struct inst *i, OFS ofs, union insn w) 1565 1.1 fredette { 1566 1.3 chs const char *p; 1567 1.1 fredette 1568 1.1 fredette if (ShortDisp(w)) { 1569 1.1 fredette db_printf("s"); 1570 1.1 fredette if (Modify(w)) 1571 1.1 fredette db_printf(",m%s", ModBefore(w)? "b": "a"); 1572 1.1 fredette } else { 1573 1.1 fredette db_printf("x"); 1574 1.1 fredette if (Modify(w)) 1575 1.1 fredette db_printf(",%sm", IndxShft(w)? "s":""); 1576 1.1 fredette } 1577 1.1 fredette switch (CacheCtrl(w)) { 1578 1.4 matt default: 1579 1.1 fredette case NOACTION: p = ""; break; 1580 1.1 fredette case STACKREF: p = ",c"; break; 1581 1.1 fredette case SEQPASS: p = ",q"; break; 1582 1.1 fredette case PREFETCH: p = ",p"; break; 1583 1.1 fredette } 1584 1.1 fredette if (ShortDisp(w)) 1585 1.1 fredette db_printf("%s\t%d", p, Ima5(w)); 1586 1.1 fredette else 1587 1.1 fredette db_printf("%s\t%%r%d", p, Rsa(w)); 1588 1.1 fredette 1589 1.1 fredette if (Dss(w)) 1590 1.14 skrll db_printf("(%%sr%d, %%r%d), %%r%d",Dss(w),Rsb(w),Rtc(w)); 1591 1.1 fredette else 1592 1.14 skrll db_printf("(%%r%d), %%r%d",Rsb(w),Rtc(w)); 1593 1.1 fredette return (1); 1594 1.1 fredette } 1595 1.1 fredette 1596 1.1 fredette /* Store short displacement instructions */ 1597 1.1 fredette int 1598 1.5 chs stsDasm(const struct inst *i, OFS ofs, union insn w) 1599 1.1 fredette { 1600 1.3 chs const char *p; 1601 1.5 chs 1602 1.1 fredette if (Modify(w)) 1603 1.1 fredette db_printf(",m%s", ModBefore(w)? "b":"a"); 1604 1.1 fredette 1605 1.1 fredette switch (CacheCtrl(w)) { 1606 1.4 matt default: 1607 1.1 fredette case NOACTION: p = ""; break; 1608 1.1 fredette case STACKREF: p = ",c"; break; 1609 1.1 fredette case SEQPASS: p = ",q"; break; 1610 1.1 fredette case PREFETCH: p = ",p"; break; 1611 1.1 fredette } 1612 1.14 skrll db_printf("%s\t%%r%d, ", p, Rta(w)); 1613 1.1 fredette if (Dss(w)) 1614 1.14 skrll db_printf("%d(%%sr%d, %%r%d)",Imc5(w),Dss(w),Rsb(w)); 1615 1.1 fredette else 1616 1.1 fredette db_printf("%d(%%r%d)",Imc5(w),Rsb(w)); 1617 1.1 fredette return (1); 1618 1.1 fredette } 1619 1.1 fredette 1620 1.1 fredette /* Store Bytes Instruction */ 1621 1.1 fredette int 1622 1.5 chs stbysDasm(const struct inst *i, OFS ofs, union insn w) 1623 1.1 fredette { 1624 1.3 chs const char *p; 1625 1.5 chs 1626 1.16 skrll db_printf("%s", ModBefore(w)? ",e":",b"); 1627 1.1 fredette if (Modify(w)) 1628 1.1 fredette db_printf(",m"); 1629 1.1 fredette switch (CacheCtrl(w)) { 1630 1.4 matt default: 1631 1.1 fredette case NOACTION: p = ""; break; 1632 1.1 fredette case STACKREF: p = ",f"; break; 1633 1.1 fredette case SEQPASS: p = ",r"; break; 1634 1.1 fredette case PREFETCH: p = ",z"; break; 1635 1.1 fredette } 1636 1.14 skrll db_printf("%s\t%%r%d, ", p, Rta(w)); 1637 1.1 fredette if (Dss(w)) 1638 1.14 skrll db_printf("%d(%%sr%d, %%r%d)",Imc5(w),Dss(w),Rsb(w)); 1639 1.1 fredette else 1640 1.1 fredette db_printf("%d(%%r%d)",Imc5(w),Rsb(w)); 1641 1.1 fredette return (1); 1642 1.1 fredette } 1643 1.1 fredette 1644 1.1 fredette /* Long Immediate instructions */ 1645 1.1 fredette int 1646 1.5 chs limmDasm(const struct inst *i, OFS ofs, union insn w) 1647 1.1 fredette { 1648 1.14 skrll db_printf("\tL'%X, %%r%d", Im21(w), Rtb(w)); 1649 1.1 fredette return (1); 1650 1.1 fredette } 1651 1.1 fredette 1652 1.1 fredette 1653 1.1 fredette /* Branch and Link instruction(s) (Branch, too!!) */ 1654 1.1 fredette int 1655 1.5 chs blDasm(const struct inst *i, OFS ofs, union insn w) 1656 1.1 fredette { 1657 1.3 chs OFS tgtofs = ofs + 8 + Bdisp(w); 1658 1.3 chs u_int link = Rtb(w); 1659 1.1 fredette 1660 1.1 fredette if (link && !Match("gate")) 1661 1.1 fredette db_printf("l"); 1662 1.1 fredette if (Nu(w)) 1663 1.1 fredette db_printf(",n"); 1664 1.1 fredette db_printf("\t"); 1665 1.1 fredette 1666 1.1 fredette db_printsym((db_addr_t)tgtofs, DB_STGY_ANY, db_printf); 1667 1.1 fredette 1668 1.1 fredette if (link || Match("gate")) 1669 1.14 skrll db_printf(", %%r%d",link); 1670 1.1 fredette 1671 1.1 fredette return (1); 1672 1.1 fredette } 1673 1.1 fredette 1674 1.1 fredette /* Branch Register instruction */ 1675 1.1 fredette int 1676 1.5 chs brDasm(const struct inst *i, OFS ofs, union insn w) 1677 1.1 fredette { 1678 1.14 skrll db_printf("%s\t%%r%d, %%r%d", Nu(w)?",n":"", Rsa(w), Rtb(w)); 1679 1.1 fredette return (1); 1680 1.1 fredette } 1681 1.1 fredette 1682 1.1 fredette /* Dispatch instructions */ 1683 1.1 fredette int 1684 1.5 chs bvDasm(const struct inst *i, OFS ofs, union insn w) 1685 1.1 fredette { 1686 1.1 fredette db_printf("%s\t%%r%d(%%r%d)", Nu(w)?",n":"", Rsa(w), Rsb(w)); 1687 1.1 fredette return (1); 1688 1.1 fredette } 1689 1.1 fredette 1690 1.1 fredette /* Branch External instructions */ 1691 1.1 fredette int 1692 1.5 chs beDasm(const struct inst *i, OFS ofs, union insn w) 1693 1.1 fredette { 1694 1.3 chs int d = Bdisp(w); 1695 1.3 chs const char *p; 1696 1.1 fredette char s[2]; 1697 1.1 fredette 1698 1.1 fredette s[1] = '\0'; 1699 1.1 fredette if (d < 0) { 1700 1.1 fredette d = -d; 1701 1.1 fredette s[0] = '-'; 1702 1.1 fredette } else 1703 1.1 fredette s[0] = '\0'; 1704 1.1 fredette 1705 1.1 fredette p = Nu(w)? ",n":""; 1706 1.14 skrll db_printf("%s\tR'%s%X(%%sr%d, %%r%d)", p, 1707 1.1 fredette s, d, Sr(w), Rsb(w)); 1708 1.1 fredette return (1); 1709 1.1 fredette } 1710 1.1 fredette 1711 1.1 fredette 1712 1.1 fredette /* Compare/Add and Branch instructions */ 1713 1.1 fredette int 1714 1.5 chs cbDasm(const struct inst *i, OFS ofs, union insn w) 1715 1.1 fredette { 1716 1.3 chs OFS tgtofs = ofs + 8 + Cbdisp(w); 1717 1.1 fredette 1718 1.1 fredette if (Match("movb")) 1719 1.16 skrll db_printf("%s", edDCond(Cond(w))); 1720 1.1 fredette else if (Match("addb")) 1721 1.16 skrll db_printf("%s", addDCond(Cond(w) << 1)); 1722 1.1 fredette else 1723 1.16 skrll db_printf("%s", subDCond(Cond(w) << 1)); 1724 1.16 skrll db_printf("%s\t%%r%d, %%r%d, ", Nu(w)?",n":"", Rsa(w), Rsb(w)); 1725 1.1 fredette db_printsym((db_addr_t)tgtofs, DB_STGY_ANY, db_printf); 1726 1.1 fredette return (1); 1727 1.1 fredette } 1728 1.1 fredette 1729 1.1 fredette /* Compare/Add and Branch Immediate instructions */ 1730 1.1 fredette int 1731 1.5 chs cbiDasm(const struct inst *i, OFS ofs, union insn w) 1732 1.1 fredette { 1733 1.3 chs OFS tgtofs = ofs + 8 + Cbdisp(w); 1734 1.1 fredette 1735 1.1 fredette if (Match("movib")) 1736 1.16 skrll db_printf("%s", edDCond(Cond(w))); 1737 1.1 fredette else if (Match("addib")) 1738 1.16 skrll db_printf("%s", addDCond(Cond(w) << 1)); 1739 1.1 fredette else 1740 1.16 skrll db_printf("%s", subDCond(Cond(w) << 1)); 1741 1.14 skrll db_printf("%s\t%d, %%r%d, ", Nu(w)? ",n":"", Ima5(w), Rsb(w)); 1742 1.1 fredette db_printsym((db_addr_t)tgtofs, DB_STGY_ANY, db_printf); 1743 1.1 fredette return (1); 1744 1.1 fredette } 1745 1.1 fredette 1746 1.1 fredette /* Branch on Bit instructions */ 1747 1.1 fredette int 1748 1.5 chs bbDasm(const struct inst *i, OFS ofs, union insn w) 1749 1.1 fredette { 1750 1.3 chs OFS tgtofs = ofs + 8 + Cbdisp(w); 1751 1.3 chs const char *p; 1752 1.1 fredette 1753 1.16 skrll db_printf("%s", edDCond(Cond(w))); 1754 1.1 fredette p = Nu(w)? ",n":""; 1755 1.1 fredette if (Match("bvb")) 1756 1.14 skrll db_printf("%s\t%%r%d, ", p, Rta(w)); 1757 1.1 fredette else 1758 1.14 skrll db_printf("%s\t%%r%d, %d, ", p, Rsa(w), Imb5(w)); 1759 1.1 fredette db_printsym((db_addr_t)tgtofs, DB_STGY_ANY, db_printf); 1760 1.1 fredette return (1); 1761 1.1 fredette } 1762 1.1 fredette 1763 1.1 fredette /* Arithmetic instructions */ 1764 1.1 fredette int 1765 1.5 chs ariDasm(const struct inst *i, OFS ofs, union insn w) 1766 1.1 fredette { 1767 1.1 fredette if (Match("or") && Rsb(w) == 0 && Cond4(w) == NEV) { 1768 1.1 fredette if (Rsa(w) == 0 && Rtc(w) == 0) 1769 1.1 fredette db_printf("nop"); 1770 1.1 fredette else 1771 1.14 skrll db_printf("copy\t%%r%d, %%r%d",Rsa(w),Rtc(w)); 1772 1.1 fredette } else 1773 1.14 skrll db_printf("%s%s\t%%r%d, %%r%d, %%r%d", i->mnem, 1774 1.1 fredette subDCond(Cond4(w)), Rsa(w),Rsb(w),Rtc(w)); 1775 1.1 fredette return(1); 1776 1.1 fredette } 1777 1.1 fredette 1778 1.1 fredette /* System control operations */ 1779 1.1 fredette int 1780 1.5 chs scDasm(const struct inst *i, OFS ofs, union insn w) 1781 1.1 fredette { 1782 1.1 fredette if (Match("mtctl")) { 1783 1.1 fredette if (Rtb(w) == 11) 1784 1.1 fredette db_printf("mtsar\t%%r%d",Rsa(w)); 1785 1.1 fredette else 1786 1.14 skrll db_printf("mtctl\t%%r%d, %%cr%d",Rsa(w),Rtb(w)); 1787 1.1 fredette return (1); 1788 1.1 fredette } 1789 1.16 skrll db_printf("%s", i->mnem); 1790 1.1 fredette if (Match("ssm") || Match("rsm")) 1791 1.14 skrll db_printf("\t%d, %%r%d",Ima5A(w),Rtc(w)); 1792 1.1 fredette else if (Match("mtsm")) db_printf("\t%%r%d",Rsa(w)); 1793 1.1 fredette else if (Match("ldprid")) db_printf("\t%%r%d",Rtc(w)); 1794 1.14 skrll else if (Match("mtsp")) db_printf("\t%%r%d, %%sr%d",Rsa(w),Sr(w)); 1795 1.14 skrll else if (Match("mfsp")) db_printf("\t%%sr%d, %%r%d",Sr(w),Rtc(w)); 1796 1.14 skrll else if (Match("mfctl")) db_printf("\t%%cr%d, %%r%d",Rsb(w),Rtc(w)); 1797 1.1 fredette else if (Match("ldsid")) { 1798 1.1 fredette if (Dss(w)) 1799 1.14 skrll db_printf("\t(%%sr%d, %%r%d), %%r%d",Dss(w),Rsb(w),Rtc(w)); 1800 1.1 fredette else 1801 1.14 skrll db_printf("\t(%%r%d), %%r%d",Rsb(w),Rtc(w)); 1802 1.1 fredette } else { 1803 1.1 fredette db_printf("?????"); 1804 1.1 fredette return (0); 1805 1.1 fredette } 1806 1.1 fredette return (1); 1807 1.1 fredette } 1808 1.1 fredette 1809 1.1 fredette /* Instruction cache/tlb control instructions */ 1810 1.1 fredette int 1811 1.5 chs mmgtDasm(const struct inst *i, OFS ofs, union insn w) 1812 1.1 fredette { 1813 1.1 fredette if (Match("probe")) { 1814 1.1 fredette if (ProbeI(w)) { 1815 1.1 fredette if (Dss(w)) 1816 1.14 skrll db_printf("i\t(%%sr%d, %%r%d), %d, %%r%d", 1817 1.1 fredette Dss(w),Rsb(w),Rsa(w),Rtc(w)); 1818 1.1 fredette else 1819 1.14 skrll db_printf("i\t(%%r%d), %d, %%r%d", 1820 1.1 fredette Rsb(w),Rsa(w),Rtc(w)); 1821 1.1 fredette } else { 1822 1.1 fredette if (Dss(w)) 1823 1.14 skrll db_printf("\t(%%sr%d, %%r%d), %%r%d, %%r%d", 1824 1.1 fredette Dss(w),Rsb(w),Rsa(w),Rtc(w)); 1825 1.1 fredette else 1826 1.14 skrll db_printf("\t(%%r%d), %%r%d, %%r%d", 1827 1.1 fredette Rsb(w),Rsa(w),Rtc(w)); 1828 1.1 fredette } 1829 1.1 fredette } 1830 1.1 fredette else if (Match("lha") || Match("lpa")) { 1831 1.1 fredette if (Modify(w)) 1832 1.1 fredette db_printf(",m"); 1833 1.1 fredette if (Dss(w)) 1834 1.14 skrll db_printf("\t%%r%d(%%sr%d, %%r%d), %%r%d", 1835 1.1 fredette Rsa(w),Dss(w),Rsb(w),Rtc(w)); 1836 1.1 fredette else 1837 1.14 skrll db_printf("\t%%r%d(%%r%d), %%r%d",Rsa(w),Rsb(w),Rtc(w)); 1838 1.1 fredette } 1839 1.1 fredette else if (Match("pdtlb") || Match("pdc") || Match("fdc")) { 1840 1.1 fredette if (Modify(w)) db_printf(",m"); 1841 1.1 fredette if (Dss(w)) 1842 1.14 skrll db_printf("\t%%r%d(%%sr%d, %%r%d)",Rsa(w),Dss(w),Rsb(w)); 1843 1.1 fredette else 1844 1.1 fredette db_printf("\t%%r%d(%%r%d)",Rsa(w),Rsb(w)); 1845 1.1 fredette } 1846 1.1 fredette else if (Match("pitlb") || Match("fic")) { 1847 1.1 fredette if (Modify(w)) 1848 1.1 fredette db_printf(",m"); 1849 1.14 skrll db_printf("\t%%r%d(%%sr%d, %%r%d)",Rsa(w),Sr(w),Rsb(w)); 1850 1.1 fredette } 1851 1.1 fredette else if (Match("idtlb")) { 1852 1.1 fredette if (Dss(w)) 1853 1.14 skrll db_printf("\t%%r%d, (%%sr%d, %%r%d)",Rsa(w),Dss(w),Rsb(w)); 1854 1.1 fredette else 1855 1.14 skrll db_printf("\t%%r%d, (%%r%d)",Rsa(w),Rsb(w)); 1856 1.1 fredette } 1857 1.1 fredette else if (Match("iitlb")) 1858 1.14 skrll db_printf("\t%%r%d, (%%sr%d, %%r%d)",Rsa(w),Sr(w),Rsb(w)); 1859 1.1 fredette else { 1860 1.1 fredette db_printf("?????"); 1861 1.1 fredette return (0); 1862 1.1 fredette } 1863 1.1 fredette return(1); 1864 1.1 fredette } 1865 1.1 fredette 1866 1.1 fredette /* break instruction */ 1867 1.1 fredette int 1868 1.5 chs brkDasm(const struct inst *i, OFS ofs, union insn w) 1869 1.1 fredette { 1870 1.14 skrll db_printf("\t%d, %d",Bi1(w),Bi2(w)); 1871 1.1 fredette return (1); 1872 1.1 fredette } 1873 1.1 fredette 1874 1.1 fredette int 1875 1.5 chs floatDasm(const struct inst *i, OFS ofs, union insn w) 1876 1.1 fredette { 1877 1.3 chs u_int op1, r1, fmt, t; 1878 1.1 fredette u_int op2, r2, dfmt; 1879 1.7 chs const char *p; 1880 1.1 fredette 1881 1.1 fredette op1 = CoprExt1(w); 1882 1.1 fredette op2 = CoprExt2(w); 1883 1.1 fredette fmt = (op1 >> 2) & 3; /* get precision of source */ 1884 1.1 fredette 1885 1.1 fredette #define ST(r) ((fmt & 1)? fdreg[(r)]:fsreg[(r)]) 1886 1.1 fredette /* 1887 1.1 fredette * get first (or only) source register 1888 1.1 fredette * (independent of class) 1889 1.1 fredette */ 1890 1.1 fredette r1 = (op1 >> 11) & 0x3e; 1891 1.1 fredette if ((fmt & 1) == 0 && (Uid(w) & 2)) 1892 1.1 fredette r1++; 1893 1.1 fredette 1894 1.1 fredette if (op1 & 2) { /* class 2 or 3 */ 1895 1.1 fredette /* 1896 1.1 fredette * get second source register 1897 1.1 fredette */ 1898 1.1 fredette r2 = (op1 >> 6) & 0x3e; 1899 1.1 fredette if (fmt == 2) 1900 1.1 fredette r2++; 1901 1.1 fredette 1902 1.1 fredette if ((op1 & 1) == 0) { /* class 2 */ 1903 1.1 fredette /* Opclass 2: 2 sources, no destination */ 1904 1.1 fredette switch((op1 >> 4) & 7) { 1905 1.1 fredette case 0: 1906 1.1 fredette p = "cmp"; 1907 1.1 fredette break; 1908 1.1 fredette default: 1909 1.16 skrll db_printf("%s", fcoprUndef); 1910 1.1 fredette return(0); 1911 1.1 fredette } 1912 1.1 fredette db_printf("%s,%s",p,fmtStrTbl[fmt]); 1913 1.14 skrll db_printf(",%s\t%%f%s, %%f%s", 1914 1.1 fredette condStrTbl[op2], ST(r1), ST(r2)); 1915 1.1 fredette return (1); 1916 1.1 fredette } 1917 1.1 fredette /* 1918 1.1 fredette * get target register (class 3) 1919 1.1 fredette */ 1920 1.1 fredette t = (op2 << 1); 1921 1.1 fredette if ((fmt & 1) == 0 && (Uid(w) & 1)) 1922 1.1 fredette t++; 1923 1.1 fredette /* Opclass 3: 2 sources, 1 destination */ 1924 1.1 fredette switch((op1 >> 4) & 7) { 1925 1.1 fredette case 0: p = "add"; break; 1926 1.1 fredette case 1: p = "sub"; break; 1927 1.1 fredette case 2: p = (Fpi(w)) ? "mpyi" : "mpy"; break; 1928 1.1 fredette case 3: p = "div"; break; 1929 1.1 fredette case 4: p = "rem"; break; 1930 1.16 skrll default: db_printf("%s", fcoprUndef); return (0); 1931 1.1 fredette } 1932 1.1 fredette db_printf("%s,%s", p, fmtStrTbl[fmt]); 1933 1.14 skrll db_printf("\t%%f%s, %%f%s, %%f%s",ST(r1),ST(r2),ST(t)); 1934 1.1 fredette } else if (op1 & 1) { /* class 1 */ 1935 1.1 fredette dfmt = (op1 >> 4) & 3; 1936 1.1 fredette #define DT(r) ((dfmt & 1)? fdreg[(r)]:fsreg[(r)]) 1937 1.1 fredette 1938 1.1 fredette /* 1939 1.1 fredette * get target register 1940 1.1 fredette */ 1941 1.1 fredette t = (op2 << 1); 1942 1.1 fredette if ((dfmt & 1) == 0 && (Uid(w) & 1)) 1943 1.1 fredette t++; 1944 1.1 fredette /* Opclass 1: 1 source, 1 destination conversions */ 1945 1.4 matt p = &"ff\0\0xf\0\0fx\0\0fxt\0"[((op1) >> 4) & 0x0c]; 1946 1.4 matt #if 0 1947 1.1 fredette switch((op1 >> 6) & 3) { 1948 1.4 matt default: 1949 1.1 fredette case 0: p = "ff"; break; 1950 1.1 fredette case 1: p = "xf"; break; 1951 1.1 fredette case 2: p = "fx"; break; 1952 1.1 fredette case 3: p = "fxt"; break; 1953 1.1 fredette } 1954 1.4 matt #endif 1955 1.1 fredette db_printf("%s,%s", p, fmtStrTbl[fmt]); 1956 1.14 skrll db_printf(",%s\t%%f%s, %%f%s",fmtStrTbl[dfmt],ST(r1),DT(t)); 1957 1.1 fredette } else { /* class 0 */ 1958 1.1 fredette /* 1959 1.1 fredette * get target register 1960 1.1 fredette */ 1961 1.1 fredette t = (op2 << 1); 1962 1.1 fredette if ((fmt & 1) == 0 && (Uid(w) & 1)) 1963 1.1 fredette t++; 1964 1.1 fredette /* Opclass 0: 1 source, 1 destination */ 1965 1.1 fredette switch((op1 >> 4) & 7) { 1966 1.1 fredette case 1: p = "rsqrt"; break; 1967 1.1 fredette case 2: p = "cpy"; break; 1968 1.1 fredette case 3: p = "abs"; break; 1969 1.1 fredette case 4: p = "sqrt"; break; 1970 1.1 fredette case 5: p = "rnd"; break; 1971 1.16 skrll default: db_printf("%s", fcoprUndef); return (0); 1972 1.1 fredette } 1973 1.1 fredette db_printf("%s,%s",p,fmtStrTbl[fmt]); 1974 1.14 skrll db_printf("\t%%f%s, %%f%s",ST(r1),ST(t)); 1975 1.1 fredette } 1976 1.1 fredette return (1); 1977 1.1 fredette } 1978 1.1 fredette 1979 1.1 fredette int 1980 1.5 chs fcoprDasm(union insn w, u_int op1, u_int op2) 1981 1.1 fredette { 1982 1.3 chs u_int r1, r2, t, fmt, dfmt; 1983 1.7 chs const char *p; 1984 1.1 fredette 1985 1.1 fredette if (AstNu(w) && op1 == ((1<<4) | 2)) { 1986 1.1 fredette if (op2 == 0 || op2 == 1 || op2 == 2) { 1987 1.1 fredette db_printf("ftest"); 1988 1.1 fredette if (op2 == 1) 1989 1.1 fredette db_printf(",acc"); 1990 1.1 fredette else if (op2 == 2) 1991 1.1 fredette db_printf(",rej"); 1992 1.1 fredette return (1); 1993 1.1 fredette } 1994 1.1 fredette return (0); 1995 1.1 fredette } else if (0 == op1 && 0 == op2) { 1996 1.1 fredette db_printf("fcopr identify"); 1997 1.1 fredette return (1); 1998 1.1 fredette } 1999 1.1 fredette switch(op1 & 3) { 2000 1.1 fredette case 0: 2001 1.1 fredette /* Opclass 0: 1 source, 1 destination */ 2002 1.1 fredette r1 = (op1 >> 12) & 0x1f; t = op2; fmt = (op1 >> 2) & 3; 2003 1.1 fredette switch((op1 >> 4) & 7) { 2004 1.1 fredette case 1: p = "rsqrt"; break; 2005 1.1 fredette case 2: p = "cpy"; break; 2006 1.1 fredette case 3: p = "abs"; break; 2007 1.1 fredette case 4: p = "sqrt"; break; 2008 1.1 fredette case 5: p = "rnd"; break; 2009 1.16 skrll default: db_printf("%s", fcoprUndef); return(0); 2010 1.1 fredette } 2011 1.14 skrll db_printf("f%s,%s\t%%fr%d, %%fr%d", p, fmtStrTbl[fmt], r1, t); 2012 1.1 fredette break; 2013 1.1 fredette case 1: 2014 1.1 fredette /* Opclass 1: 1 source, 1 destination conversions */ 2015 1.1 fredette r1 = (op1 >> 12) & 0x1f; t = op2; 2016 1.1 fredette fmt = (op1 >> 2) & 3; dfmt = (op1 >> 4) & 3; 2017 1.4 matt p = &"ff\0\0xf\0\0fx\0\0fxt\0"[((op1) >> 4) & 0x0c]; 2018 1.4 matt #if 0 2019 1.1 fredette switch((op1 >> 6) & 3) { 2020 1.1 fredette case 0: p = "ff"; break; 2021 1.1 fredette case 1: p = "xf"; break; 2022 1.1 fredette case 2: p = "fx"; break; 2023 1.1 fredette case 3: p = "fxt"; break; 2024 1.1 fredette } 2025 1.4 matt #endif 2026 1.14 skrll db_printf("fcnv%s,%s,%s\t%%fr%d, %%fr%d", 2027 1.1 fredette p, fmtStrTbl[fmt], fmtStrTbl[dfmt], r1, t); 2028 1.1 fredette break; 2029 1.1 fredette case 2: 2030 1.1 fredette /* Opclass 2: 2 sources, no destination */ 2031 1.1 fredette r1 = (op1 >> 12) & 0x1f; r2 = (op1 >> 7) & 0x1f; 2032 1.1 fredette fmt = (op1 >> 2) & 3; 2033 1.1 fredette switch((op1 >> 4) & 7) { 2034 1.1 fredette case 0: p = "fcmp"; break; 2035 1.16 skrll default: db_printf("%s", fcoprUndef); return (0); 2036 1.1 fredette } 2037 1.14 skrll db_printf("%s,%s,%s\t%%fr%d, %%fr%d", 2038 1.1 fredette p,fmtStrTbl[fmt],condStrTbl[op2],r1,r2); 2039 1.1 fredette break; 2040 1.1 fredette case 3: 2041 1.1 fredette /* Opclass 3: 2 sources, 1 destination */ 2042 1.1 fredette r1 = (op1 >> 12) & 0x1f; r2 = (op1 >> 7) & 0x1f; t = op2; 2043 1.1 fredette fmt = (op1 >> 2) & 3; 2044 1.1 fredette switch((op1 >> 4) & 7) { 2045 1.1 fredette case 0: p = "add"; break; 2046 1.1 fredette case 1: p = "sub"; break; 2047 1.1 fredette case 2: p = "mpy"; break; 2048 1.1 fredette case 3: p = "div"; break; 2049 1.1 fredette case 4: p = "rem"; break; 2050 1.16 skrll default: db_printf("%s", fcoprUndef); return (0); 2051 1.1 fredette } 2052 1.14 skrll db_printf("f%s,%s\t%%fr%d, %%fr%d, %%fr%d", 2053 1.1 fredette p, fmtStrTbl[fmt], r1, r2, t); 2054 1.1 fredette break; 2055 1.1 fredette default: 2056 1.16 skrll db_printf("%s", fcoprUndef); 2057 1.1 fredette return(0); 2058 1.1 fredette } 2059 1.1 fredette return (1); 2060 1.1 fredette } 2061 1.1 fredette 2062 1.1 fredette int 2063 1.5 chs coprDasm(const struct inst *i, OFS ofs, union insn w) 2064 1.1 fredette { 2065 1.3 chs u_int uid = Uid(w); 2066 1.3 chs int load = 0; 2067 1.7 chs const char *pfx = uid > 1 ? "c" : "f"; 2068 1.4 matt int dreg = 0; 2069 1.1 fredette 2070 1.1 fredette if (Match("copr")) { 2071 1.1 fredette if (uid) { 2072 1.1 fredette db_printf("copr,%d,0x%x",uid,CoprExt(w)); 2073 1.1 fredette if (AstNu(w)) 2074 1.1 fredette db_printf(",n"); 2075 1.1 fredette return (1); 2076 1.1 fredette } 2077 1.1 fredette return fcoprDasm(w, CoprExt1(w),CoprExt2(w)); 2078 1.1 fredette } 2079 1.1 fredette if (Match("cldd")) { 2080 1.1 fredette dreg = 1; 2081 1.1 fredette load = 1; 2082 1.1 fredette db_printf("%sldd",pfx); 2083 1.1 fredette } else if (Match("cldw")) { 2084 1.1 fredette load = 1; 2085 1.1 fredette db_printf("%sldw",pfx); 2086 1.1 fredette } else if (Match("cstd")) { 2087 1.1 fredette dreg = 1; 2088 1.1 fredette db_printf("%sstd",pfx); 2089 1.1 fredette } else if (Match("cstw")) 2090 1.1 fredette db_printf("%sstw",pfx); 2091 1.1 fredette else { 2092 1.1 fredette db_printf("copr???"); 2093 1.1 fredette return (0); 2094 1.1 fredette } 2095 1.1 fredette if (ShortDisp(w)) { 2096 1.1 fredette db_printf("s"); 2097 1.1 fredette if (AstNu(w)) 2098 1.1 fredette db_printf(",m%s", ModBefore(w)?"b":"a"); 2099 1.1 fredette } 2100 1.1 fredette else { 2101 1.1 fredette db_printf("x"); 2102 1.1 fredette if (AstNu(w)) 2103 1.1 fredette db_printf(",%sm", IndxShft(w)?"s":""); 2104 1.1 fredette else if (IndxShft(w)) 2105 1.1 fredette db_printf(",s"); 2106 1.1 fredette } 2107 1.1 fredette switch (CacheCtrl(w)) { 2108 1.1 fredette case NOACTION: break; 2109 1.1 fredette case STACKREF: db_printf(",c"); break; 2110 1.1 fredette case SEQPASS: db_printf(",q"); break; 2111 1.1 fredette case PREFETCH: db_printf(",p"); break; 2112 1.1 fredette } 2113 1.1 fredette if (load) { 2114 1.3 chs const char *p; 2115 1.1 fredette 2116 1.1 fredette if (dreg) 2117 1.1 fredette p = fdreg[(Rtc(w)<<1)+(uid&1)]; 2118 1.1 fredette else 2119 1.1 fredette p = fsreg[(Rtc(w)<<1)+(uid&1)]; 2120 1.1 fredette 2121 1.1 fredette if (ShortDisp(w)) 2122 1.1 fredette db_printf("\t%d",Ima5(w)); 2123 1.1 fredette else 2124 1.1 fredette db_printf("\t%%r%d",Rsa(w)); 2125 1.1 fredette if (Dss(w)) 2126 1.14 skrll db_printf("(%%sr%d, %%r%d), %%f%s", Dss(w),Rsb(w), p); 2127 1.1 fredette else 2128 1.14 skrll db_printf("(%%r%d), %%f%s",Rsb(w), p); 2129 1.1 fredette } else { 2130 1.3 chs const char *p; 2131 1.1 fredette 2132 1.1 fredette if (dreg) 2133 1.1 fredette p = fdreg[(Rsc(w)<<1)+(uid&1)]; 2134 1.1 fredette else 2135 1.1 fredette p = fsreg[(Rsc(w)<<1)+(uid&1)]; 2136 1.1 fredette 2137 1.1 fredette if (ShortDisp(w)) 2138 1.14 skrll db_printf("\t%%f%s, %d", p, Ima5(w)); 2139 1.1 fredette else 2140 1.14 skrll db_printf("\t%%f%s, %%r%d", p, Rta(w)); 2141 1.1 fredette if (Dss(w)) 2142 1.14 skrll db_printf("(%%sr%d, %%r%d)",Dss(w),Rsb(w)); 2143 1.1 fredette else 2144 1.1 fredette db_printf("(%%r%d)",Rsb(w)); 2145 1.1 fredette } 2146 1.1 fredette return (1); 2147 1.1 fredette } 2148 1.1 fredette 2149 1.1 fredette int 2150 1.5 chs lpkDasm(const struct inst *i, OFS ofs, union insn w) 2151 1.1 fredette { 2152 1.1 fredette /* 2153 1.1 fredette * Floating point STore Quad 2154 1.1 fredette * Short or Indexed 2155 1.1 fredette */ 2156 1.1 fredette if (ShortDisp(w)) { 2157 1.1 fredette if (Modify(w)) 2158 1.1 fredette db_printf(",m%s", ModBefore(w)?"b":"a"); 2159 1.1 fredette } else { 2160 1.1 fredette if (Modify(w)) 2161 1.1 fredette db_printf(",%sm", IndxShft(w)? "s":""); 2162 1.1 fredette else if (IndxShft(w)) 2163 1.1 fredette db_printf(",s"); 2164 1.1 fredette } 2165 1.1 fredette switch (CacheCtrl(w)) { 2166 1.1 fredette case NOACTION: break; 2167 1.1 fredette case STACKREF: db_printf(",c"); break; 2168 1.1 fredette case SEQPASS: db_printf(",q"); break; 2169 1.1 fredette case PREFETCH: db_printf(",p"); break; 2170 1.1 fredette } 2171 1.1 fredette if (ShortDisp(w)) 2172 1.14 skrll db_printf("\t%%fr%d, %d",Rsc(w),Ima5(w)); 2173 1.1 fredette else 2174 1.14 skrll db_printf("\t%%fr%d, %%r%d",Rsc(w),Rta(w)); 2175 1.1 fredette if (Dss(w)) 2176 1.14 skrll db_printf("(%%sr%d, %%r%d)",Dss(w),Rsb(w)); 2177 1.1 fredette else 2178 1.1 fredette db_printf("(%%r%d)",Rsb(w)); 2179 1.1 fredette return (1); 2180 1.1 fredette } 2181 1.1 fredette 2182 1.1 fredette int 2183 1.5 chs diagDasm(const struct inst *i, OFS ofs, union insn w) 2184 1.1 fredette { 2185 1.1 fredette if (0x0b0 == BitfR(w,19,8,_b198)) /* mtcpu */ 2186 1.14 skrll db_printf("mtcpu\t%%r%d, %%dr%d", Rsa(w), Rtb(w)); 2187 1.1 fredette else if (0x0d0 == BitfR(w,19,8,_b198)) /* mfcpu */ 2188 1.14 skrll db_printf("mfcpu\t%%dr%d, %%r%d", Rsb(w), Rta(w)); 2189 1.1 fredette else { 2190 1.16 skrll db_printf("%s", i->mnem); 2191 1.1 fredette if (Match("diag")) 2192 1.4 matt db_printf("\t0x%X",w.w & 0x03ffffff); 2193 1.1 fredette else { 2194 1.1 fredette db_printf("?????"); 2195 1.1 fredette return (0); 2196 1.1 fredette } 2197 1.1 fredette } 2198 1.1 fredette return (1); 2199 1.1 fredette } 2200 1.1 fredette 2201 1.1 fredette int 2202 1.5 chs fmpysubDasm(const struct inst *i, OFS ofs, union insn w) 2203 1.1 fredette { 2204 1.1 fredette if (SinglePrec(w)) 2205 1.14 skrll db_printf("sub,sgl\t%%f%s, %%f%s, %%f%s, %%f%s, %%f%s", 2206 1.1 fredette fsreg[Ms1(w)], fsreg[Ms2(w)], fsreg[Mt(w)], 2207 1.1 fredette fsreg[As(w)], fsreg[Ad(w)]); 2208 1.1 fredette else 2209 1.14 skrll db_printf("sub,dbl\t%%f%s, %%f%s, %%f%s, %%f%s, %%f%s", 2210 1.1 fredette fdreg[Ms1(w)], fdreg[Ms2(w)], fdreg[Mt(w)], 2211 1.1 fredette fdreg[As(w)], fdreg[Ad(w)]); 2212 1.1 fredette return (1); 2213 1.1 fredette } 2214 1.1 fredette 2215 1.1 fredette int 2216 1.5 chs fmpyaddDasm(const struct inst *i, OFS ofs, union insn w) 2217 1.1 fredette { 2218 1.3 chs const char 2219 1.1 fredette *ms1 = SinglePrec(w) ? fsreg[Ms1(w)] : fdreg[Ms1(w)], 2220 1.1 fredette *ms2 = SinglePrec(w) ? fsreg[Ms2(w)] : fdreg[Ms2(w)], 2221 1.1 fredette *mt = SinglePrec(w) ? fsreg[Mt(w)] : fdreg[Mt(w)], 2222 1.1 fredette *as = SinglePrec(w) ? fsreg[As(w)] : fdreg[As(w)], 2223 1.1 fredette *ad = SinglePrec(w) ? fsreg[Ad(w)] : fdreg[Ad(w)]; 2224 1.1 fredette 2225 1.1 fredette if (Rsd(w) == 0) 2226 1.14 skrll db_printf("\t%%fcfxt, %s, %%f%s, %%f%s, %%f%s", 2227 1.1 fredette ((SinglePrec(w)) ? "sgl" : "dbl"), ms1, ms2, mt); 2228 1.1 fredette else 2229 1.14 skrll db_printf("add%s\t%%f%s, %%f%s, %%f%s, %%f%s, %%f%s", 2230 1.1 fredette ((SinglePrec(w)) ? "sgl" : "dbl"), ms1, ms2, mt, as, ad); 2231 1.1 fredette 2232 1.1 fredette return (1); 2233 1.1 fredette } 2234 1.1 fredette 2235 1.1 fredette vaddr_t 2236 1.10 thorpej db_disasm(vaddr_t loc, bool flag) 2237 1.1 fredette { 2238 1.3 chs const struct inst *i; 2239 1.3 chs const struct majoropcode *m; 2240 1.3 chs u_int ext; 2241 1.4 matt union insn instruct; 2242 1.15 skrll OFS ofs = loc; 2243 1.1 fredette 2244 1.1 fredette iExInit(); 2245 1.1 fredette 2246 1.16 skrll #ifdef _KERNEL 2247 1.1 fredette if (USERMODE(loc)) { 2248 1.11 christos if (copyin((void *)(loc &~ HPPA_PC_PRIV_MASK), 2249 1.1 fredette &instruct, sizeof(instruct))) 2250 1.4 matt instruct.w = 0; 2251 1.1 fredette } else 2252 1.16 skrll #endif 2253 1.4 matt instruct.w = *(int *)loc; 2254 1.1 fredette 2255 1.1 fredette m = &majopcs[Opcode(instruct)]; 2256 1.4 matt ext = OpExt(instruct.w, m); 2257 1.1 fredette if (ext <= m->maxsubop) { 2258 1.1 fredette /* special hack for majopcs table layout */ 2259 1.1 fredette if (m->maxsubop == 1) 2260 1.1 fredette i = (const struct inst *)m->subops; 2261 1.1 fredette else 2262 1.1 fredette i = m->subops[ext]; 2263 1.1 fredette 2264 1.13 skrll if (i) { 2265 1.13 skrll if (i->dasmfcn != coprDasm && i->dasmfcn != diagDasm && 2266 1.13 skrll i->dasmfcn != ariDasm && i->dasmfcn != scDasm && 2267 1.13 skrll i->dasmfcn != ldDasm) 2268 1.13 skrll db_printf("%s", i->mnem); 2269 1.13 skrll if (i->dasmfcn) 2270 1.13 skrll (*i->dasmfcn)(i, ofs, instruct); 2271 1.13 skrll } else { 2272 1.13 skrll db_printf("undefined subop"); 2273 1.13 skrll } 2274 1.1 fredette } else 2275 1.13 skrll db_printf("undefined"); 2276 1.1 fredette 2277 1.1 fredette db_printf("\n"); 2278 1.1 fredette return (loc + sizeof(instruct)); 2279 1.1 fredette } 2280