mips_disassem.c revision 2bc2b792782b304b15d8c48b54916a9b3fa3a7ac
12bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind/*  $NetBSD: db_disasm.c,v 1.19 2007/02/28 04:21:53 thorpej Exp $   */
22bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
32bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind/*-
42bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind * Copyright (c) 1991, 1993
52bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind *  The Regents of the University of California.  All rights reserved.
62bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind *
72bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind * This code is derived from software contributed to Berkeley by
82bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind * Ralph Campbell.
92bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind *
102bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind * Redistribution and use in source and binary forms, with or without
112bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind * modification, are permitted provided that the following conditions
122bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind * are met:
132bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind * 1. Redistributions of source code must retain the above copyright
142bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind *    notice, this list of conditions and the following disclaimer.
152bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind * 2. Redistributions in binary form must reproduce the above copyright
162bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind *    notice, this list of conditions and the following disclaimer in the
172bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind *    documentation and/or other materials provided with the distribution.
182bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind * 3. Neither the name of the University nor the names of its contributors
192bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind *    may be used to endorse or promote products derived from this software
202bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind *    without specific prior written permission.
212bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind *
222bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
232bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
242bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
252bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
262bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
272bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
282bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
292bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
302bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
312bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
322bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind * SUCH DAMAGE.
332bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind *
342bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind *  from: @(#)kadb.c    8.1 (Berkeley) 6/10/93
352bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind */
362bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
372bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind#include <stdio.h>
382bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind#include <stdint.h>
392bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind#include <stdarg.h>
402bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind#include <stdbool.h>
412bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind#include <sys/cdefs.h>
422bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
432bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind#include <sys/types.h>
442bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind#include "mips_opcode.h"
452bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
462bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
472bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind// #include <sys/systm.h>
482bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind// #include <sys/param.h>
492bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
502bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind// #include <machine/reg.h>
512bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind// #include <machine/cpu.h>
522bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind/*#include <machine/param.h>*/
532bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind// #include <machine/db_machdep.h>
542bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
552bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind// #include <ddb/db_interface.h>
562bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind// #include <ddb/db_output.h>
572bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind// #include <ddb/db_extern.h>
582bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind// #include <ddb/db_sym.h>
592bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
602bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
612bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lindstatic char *sprintf_buffer;
622bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lindstatic int sprintf_buf_len;
632bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
642bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
652bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lindtypedef uint32_t db_addr_t;
662bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lindstatic void db_printf(const char* fmt, ...);
672bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
682bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lindstatic const char * const op_name[64] = {
692bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind/* 0 */ "spec", "bcond","j  ",    "jal",  "beq",  "bne",  "blez", "bgtz",
702bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind/* 8 */ "addi", "addiu","slti", "sltiu","andi", "ori",  "xori", "lui",
712bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind/*16 */ "cop0", "cop1", "cop2", "cop3", "beql", "bnel", "blezl","bgtzl",
722bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind/*24 */ "daddi","daddiu","ldl", "ldr",  "op34", "op35", "op36", "op37",
732bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind/*32 */ "lb ",   "lh ",   "lwl",  "lw ",   "lbu",  "lhu",  "lwr",  "lwu",
742bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind/*40 */ "sb ",   "sh ",   "swl",  "sw ",   "sdl",  "sdr",  "swr",  "cache",
752bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind/*48 */ "ll ",   "lwc1", "lwc2", "lwc3", "lld",  "ldc1", "ldc2", "ld ",
762bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind/*56 */ "sc ",   "swc1", "swc2", "swc3", "scd",  "sdc1", "sdc2", "sd "
772bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind};
782bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
792bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lindstatic const char * const spec_name[64] = {
802bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind/* 0 */ "sll",  "spec01","srl", "sra",  "sllv", "spec05","srlv","srav",
812bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind/* 8 */ "jr",   "jalr", "movz","movn","syscall","break","spec16","sync",
822bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind/*16 */ "mfhi", "mthi", "mflo", "mtlo", "dsllv","spec25","dsrlv","dsrav",
832bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind/*24 */ "mult", "multu","div",  "divu", "dmult","dmultu","ddiv","ddivu",
842bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind/*32 */ "add",  "addu", "sub",  "subu", "and",  "or ",   "xor",  "nor",
852bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind/*40 */ "spec50","spec51","slt","sltu", "dadd","daddu","dsub","dsubu",
862bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind/*48 */ "tge","tgeu","tlt","tltu","teq","spec65","tne","spec67",
872bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind/*56 */ "dsll","spec71","dsrl","dsra","dsll32","spec75","dsrl32","dsra32"
882bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind};
892bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
902bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lindstatic const char * const spec2_name[64] = {     /* QED RM4650, R5000, etc. */
912bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind/* 0x00 */ "madd", "maddu", "mul", "spec3", "msub", "msubu", "rsrv6", "rsrv7",
922bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind/* 0x08 */ "rsrv", "rsrv", "rsrv", "rsrv", "rsrv", "rsrv", "rsrv", "rsrv",
932bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind/* 0x10 */ "rsrv", "rsrv", "rsrv", "rsrv", "rsrv", "rsrv", "rsrv", "rsrv",
942bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind/* 0x18 */ "rsrv", "rsrv", "rsrv", "rsrv", "rsrv", "rsrv", "rsrv", "rsrv",
952bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind/* 0x20 */ "clz",  "clo",  "rsrv", "rsrv", "dclz", "dclo", "rsrv", "rsrv",
962bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind/* 0x28 */ "rsrv", "rsrv", "rsrv", "rsrv", "rsrv", "rsrv", "rsrv", "rsrv",
972bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind/* 0x30 */ "rsrv", "rsrv", "rsrv", "rsrv", "rsrv", "rsrv", "rsrv", "rsrv",
982bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind/* 0x38 */ "rsrv", "rsrv", "rsrv", "resv", "rsrv", "rsrv", "rsrv", "sdbbp"
992bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind};
1002bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
1012bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lindstatic const char * const bcond_name[32] = {
1022bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind/* 0 */ "bltz", "bgez", "bltzl", "bgezl", "?", "?", "?", "?",
1032bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind/* 8 */ "tgei", "tgeiu", "tlti", "tltiu", "teqi", "?", "tnei", "?",
1042bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind/*16 */ "bltzal", "bgezal", "bltzall", "bgezall", "?", "?", "?", "?",
1052bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind/*24 */ "?", "?", "?", "?", "?", "?", "?", "?",
1062bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind};
1072bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
1082bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lindstatic const char * const cop1_name[64] = {
1092bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind/* 0 */ "fadd",  "fsub", "fmpy", "fdiv", "fsqrt","fabs", "fmov", "fneg",
1102bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind/* 8 */ "fop08","fop09","fop0a","fop0b","fop0c","fop0d","fop0e","fop0f",
1112bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind/*16 */ "fop10","fop11","fop12","fop13","fop14","fop15","fop16","fop17",
1122bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind/*24 */ "fop18","fop19","fop1a","fop1b","fop1c","fop1d","fop1e","fop1f",
1132bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind/*32 */ "fcvts","fcvtd","fcvte","fop23","fcvtw","fop25","fop26","fop27",
1142bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind/*40 */ "fop28","fop29","fop2a","fop2b","fop2c","fop2d","fop2e","fop2f",
1152bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind/*48 */ "fcmp.f","fcmp.un","fcmp.eq","fcmp.ueq","fcmp.olt","fcmp.ult",
1162bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    "fcmp.ole","fcmp.ule",
1172bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind/*56 */ "fcmp.sf","fcmp.ngle","fcmp.seq","fcmp.ngl","fcmp.lt","fcmp.nge",
1182bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    "fcmp.le","fcmp.ngt"
1192bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind};
1202bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
1212bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lindstatic const char * const fmt_name[16] = {
1222bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    "s",    "d",    "e",    "fmt3",
1232bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    "w",    "fmt5", "fmt6", "fmt7",
1242bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    "fmt8", "fmt9", "fmta", "fmtb",
1252bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    "fmtc", "fmtd", "fmte", "fmtf"
1262bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind};
1272bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
1282bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind#if defined(__mips_n32) || defined(__mips_n64)
1292bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lindstatic char * const reg_name[32] = {
1302bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    "zero", "at",   "v0",   "v1",   "a0",   "a1",   "a2",   "a3",
1312bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    "a4",   "a5",   "a6",   "a7",   "t0",   "t1",   "t2",   "t3",
1322bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    "s0",   "s1",   "s2",   "s3",   "s4",   "s5",   "s6",   "s7",
1332bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    "t8",   "t9",   "k0",   "k1",   "gp",   "sp",   "s8",   "ra"
1342bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind};
1352bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind#else
1362bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
1372bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lindstatic char * alt_arm_reg_name[32] = {  // hacked names for comparison with ARM code
1382bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    "zero", "at",   "r0",   "r1",   "r2",   "r3",   "r4",   "r5",
1392bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    "r6",   "r7",   "r8",   "r9",   "r10",  "r11",  "r12",  "r13",
1402bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    "r14",  "r15",  "at2",  "cmp",  "s4",   "s5",   "s6",   "s7",
1412bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    "t8",   "t9",   "k0",   "k1",   "gp",   "sp",   "s8",   "ra"
1422bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind};
1432bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
1442bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lindstatic char * mips_reg_name[32] = {
1452bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    "zero", "at",   "v0",   "v1",   "a0",   "a1",   "a2",   "a3",
1462bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    "t0",   "t1",   "t2",   "t3",   "t4",   "t5",   "t6",   "t7",
1472bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    "s0",   "s1",   "s2",   "s3",   "s4",   "s5",   "s6",   "s7",
1482bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    "t8",   "t9",   "k0",   "k1",   "gp",   "sp",   "s8",   "ra"
1492bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind};
1502bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
1512bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lindstatic char ** reg_name =  &mips_reg_name[0];
1522bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
1532bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind#endif /* __mips_n32 || __mips_n64 */
1542bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
1552bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lindstatic const char * const c0_opname[64] = {
1562bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    "c0op00","tlbr",  "tlbwi", "c0op03","c0op04","c0op05","tlbwr", "c0op07",
1572bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    "tlbp",  "c0op11","c0op12","c0op13","c0op14","c0op15","c0op16","c0op17",
1582bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    "rfe",   "c0op21","c0op22","c0op23","c0op24","c0op25","c0op26","c0op27",
1592bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    "eret",  "c0op31","c0op32","c0op33","c0op34","c0op35","c0op36","c0op37",
1602bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    "c0op40","c0op41","c0op42","c0op43","c0op44","c0op45","c0op46","c0op47",
1612bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    "c0op50","c0op51","c0op52","c0op53","c0op54","c0op55","c0op56","c0op57",
1622bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    "c0op60","c0op61","c0op62","c0op63","c0op64","c0op65","c0op66","c0op67",
1632bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    "c0op70","c0op71","c0op72","c0op73","c0op74","c0op75","c0op77","c0op77",
1642bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind};
1652bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
1662bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lindstatic const char * const c0_reg[32] = {
1672bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    "index",    "random",   "tlblo0",  "tlblo1",
1682bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    "context",  "pagemask", "wired",   "cp0r7",
1692bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    "badvaddr", "count",    "tlbhi",   "compare",
1702bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    "status",   "cause",    "epc",     "prid",
1712bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    "config",   "lladdr",   "watchlo", "watchhi",
1722bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    "xcontext", "cp0r21",   "cp0r22",  "debug",
1732bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    "depc",     "perfcnt",  "ecc",     "cacheerr",
1742bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    "taglo",    "taghi",    "errepc",  "desave"
1752bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind};
1762bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
1772bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lindstatic void print_addr(db_addr_t);
1782bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Linddb_addr_t mips_disassem(db_addr_t loc, char *di_buffer, int alt_dis_format);
1792bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
1802bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
1812bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind/*
1822bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind * Disassemble instruction 'insn' nominally at 'loc'.
1832bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind * 'loc' may in fact contain a breakpoint instruction.
1842bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind */
1852bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lindstatic db_addr_t
1862bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Linddb_disasm_insn(int insn, db_addr_t loc, bool altfmt)
1872bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind{
1882bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    bool bdslot = false;
1892bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    InstFmt i;
1902bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
1912bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    i.word = insn;
1922bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
1932bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    switch (i.JType.op) {
1942bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    case OP_SPECIAL:
1952bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        if (i.word == 0) {
1962bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            db_printf("nop");
1972bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            break;
1982bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        }
1992bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        if (i.word == 0x0080) {
2002bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            db_printf("NIY");
2012bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            break;
2022bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        }
2032bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        if (i.word == 0x00c0) {
2042bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            db_printf("NOT IMPL");
2052bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            break;
2062bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        }
2072bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        /* Special cases --------------------------------------------------
2082bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind         * "addu" is a "move" only in 32-bit mode.  What's the correct
2092bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind         * answer - never decode addu/daddu as "move"?
2102bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind         */
2112bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        if ( (i.RType.func == OP_ADDU && i.RType.rt == 0)  ||
2122bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind             (i.RType.func == OP_OR   && i.RType.rt == 0) ) {
2132bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            db_printf("move\t%s,%s",
2142bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind                reg_name[i.RType.rd],
2152bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind                reg_name[i.RType.rs]);
2162bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            break;
2172bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        }
2182bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        // mips32r2, rotr & rotrv
2192bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        if (i.RType.func == OP_SRL && (i.RType.rs & 1) == 1) {
2202bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            db_printf("rotr\t%s,%s,%d", reg_name[i.RType.rd],
2212bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind                reg_name[i.RType.rt], i.RType.shamt);
2222bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            break;
2232bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        }
2242bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        if (i.RType.func == OP_SRLV && (i.RType.shamt & 1) == 1) {
2252bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            db_printf("rotrv\t%s,%s,%s", reg_name[i.RType.rd],
2262bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind                reg_name[i.RType.rt], reg_name[i.RType.rs]);
2272bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            break;
2282bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        }
2292bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
2302bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
2312bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        db_printf("%s", spec_name[i.RType.func]);
2322bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        switch (i.RType.func) {
2332bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        case OP_SLL:
2342bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        case OP_SRL:
2352bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        case OP_SRA:
2362bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        case OP_DSLL:
2372bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
2382bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        case OP_DSRL:
2392bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        case OP_DSRA:
2402bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        case OP_DSLL32:
2412bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        case OP_DSRL32:
2422bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        case OP_DSRA32:
2432bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            db_printf("\t%s,%s,%d",
2442bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind                reg_name[i.RType.rd],
2452bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind                reg_name[i.RType.rt],
2462bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind                i.RType.shamt);
2472bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            break;
2482bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
2492bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        case OP_SLLV:
2502bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        case OP_SRLV:
2512bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        case OP_SRAV:
2522bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        case OP_DSLLV:
2532bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        case OP_DSRLV:
2542bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        case OP_DSRAV:
2552bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            db_printf("\t%s,%s,%s",
2562bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind                reg_name[i.RType.rd],
2572bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind                reg_name[i.RType.rt],
2582bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind                reg_name[i.RType.rs]);
2592bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            break;
2602bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
2612bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        case OP_MFHI:
2622bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        case OP_MFLO:
2632bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            db_printf("\t%s", reg_name[i.RType.rd]);
2642bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            break;
2652bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
2662bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        case OP_JR:
2672bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        case OP_JALR:
2682bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            db_printf("\t%s", reg_name[i.RType.rs]);
2692bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            bdslot = true;
2702bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            break;
2712bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        case OP_MTLO:
2722bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        case OP_MTHI:
2732bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            db_printf("\t%s", reg_name[i.RType.rs]);
2742bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            break;
2752bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
2762bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        case OP_MULT:
2772bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        case OP_MULTU:
2782bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        case OP_DMULT:
2792bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        case OP_DMULTU:
2802bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        case OP_DIV:
2812bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        case OP_DIVU:
2822bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        case OP_DDIV:
2832bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        case OP_DDIVU:
2842bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            db_printf("\t%s,%s",
2852bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind                reg_name[i.RType.rs],
2862bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind                reg_name[i.RType.rt]);
2872bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            break;
2882bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
2892bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
2902bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        case OP_SYSCALL:
2912bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        case OP_SYNC:
2922bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            break;
2932bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
2942bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        case OP_BREAK:
2952bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            db_printf("\t%d", (i.RType.rs << 5) | i.RType.rt);
2962bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            break;
2972bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
2982bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        default:
2992bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            db_printf("\t%s,%s,%s",
3002bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind                reg_name[i.RType.rd],
3012bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind                reg_name[i.RType.rs],
3022bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind                reg_name[i.RType.rt]);
3032bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        }
3042bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        break;
3052bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
3062bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    case OP_SPECIAL2:
3072bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        if (i.RType.func == OP_MUL)
3082bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            db_printf("%s\t%s,%s,%s",
3092bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind                spec2_name[i.RType.func & 0x3f],
3102bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind                    reg_name[i.RType.rd],
3112bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind                    reg_name[i.RType.rs],
3122bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind                    reg_name[i.RType.rt]);
3132bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        else
3142bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            db_printf("%s\t%s,%s",
3152bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind                spec2_name[i.RType.func & 0x3f],
3162bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind                    reg_name[i.RType.rs],
3172bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind                    reg_name[i.RType.rt]);
3182bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
3192bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        break;
3202bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
3212bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    case OP_SPECIAL3:
3222bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        if (i.RType.func == OP_EXT)
3232bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            db_printf("ext\t%s,%s,%d,%d",
3242bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind                    reg_name[i.RType.rt],
3252bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind                    reg_name[i.RType.rs],
3262bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind                    i.RType.rd+1,
3272bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind                    i.RType.shamt);
3282bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        else if (i.RType.func == OP_INS)
3292bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            db_printf("ins\t%s,%s,%d,%d",
3302bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind                    reg_name[i.RType.rt],
3312bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind                    reg_name[i.RType.rs],
3322bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind                    i.RType.rd+1,
3332bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind                    i.RType.shamt);
3342bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        else if (i.RType.func == OP_BSHFL && i.RType.shamt == OP_WSBH)
3352bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            db_printf("wsbh\t%s,%s",
3362bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind                reg_name[i.RType.rd],
3372bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind                reg_name[i.RType.rt]);
3382bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        else if (i.RType.func == OP_BSHFL && i.RType.shamt == OP_SEB)
3392bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            db_printf("seb\t%s,%s",
3402bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind                reg_name[i.RType.rd],
3412bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind                reg_name[i.RType.rt]);
3422bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        else if (i.RType.func == OP_BSHFL && i.RType.shamt == OP_SEH)
3432bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            db_printf("seh\t%s,%s",
3442bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind                reg_name[i.RType.rd],
3452bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind                reg_name[i.RType.rt]);
3462bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        else
3472bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            db_printf("Unknown");
3482bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        break;
3492bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
3502bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    case OP_BCOND:
3512bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        db_printf("%s\t%s,", bcond_name[i.IType.rt],
3522bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            reg_name[i.IType.rs]);
3532bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        goto pr_displ;
3542bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
3552bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    case OP_BLEZ:
3562bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    case OP_BLEZL:
3572bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    case OP_BGTZ:
3582bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    case OP_BGTZL:
3592bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        db_printf("%s\t%s,", op_name[i.IType.op],
3602bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            reg_name[i.IType.rs]);
3612bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        goto pr_displ;
3622bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
3632bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    case OP_BEQ:
3642bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    case OP_BEQL:
3652bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        if (i.IType.rs == 0 && i.IType.rt == 0) {
3662bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            db_printf("b  \t");
3672bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            goto pr_displ;
3682bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        }
3692bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        /* FALLTHROUGH */
3702bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    case OP_BNE:
3712bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    case OP_BNEL:
3722bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        db_printf("%s\t%s,%s,", op_name[i.IType.op],
3732bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            reg_name[i.IType.rs],
3742bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            reg_name[i.IType.rt]);
3752bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    pr_displ:
3762bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        print_addr(loc + 4 + ((short)i.IType.imm << 2));
3772bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        bdslot = true;
3782bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        break;
3792bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
3802bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    case OP_COP0:
3812bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        switch (i.RType.rs) {
3822bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        case OP_BCx:
3832bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        case OP_BCy:
3842bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
3852bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            db_printf("bc0%c\t",
3862bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind                "ft"[i.RType.rt & COPz_BC_TF_MASK]);
3872bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            goto pr_displ;
3882bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
3892bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        case OP_MT:
3902bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            db_printf("mtc0\t%s,%s",
3912bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind                reg_name[i.RType.rt],
3922bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind                c0_reg[i.RType.rd]);
3932bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            break;
3942bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
3952bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        case OP_DMT:
3962bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            db_printf("dmtc0\t%s,%s",
3972bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind                reg_name[i.RType.rt],
3982bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind                c0_reg[i.RType.rd]);
3992bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            break;
4002bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
4012bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        case OP_MF:
4022bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            db_printf("mfc0\t%s,%s",
4032bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind                reg_name[i.RType.rt],
4042bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind                c0_reg[i.RType.rd]);
4052bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            break;
4062bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
4072bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        case OP_DMF:
4082bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            db_printf("dmfc0\t%s,%s",
4092bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind                reg_name[i.RType.rt],
4102bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind                c0_reg[i.RType.rd]);
4112bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            break;
4122bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
4132bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        default:
4142bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            db_printf("%s", c0_opname[i.FRType.func]);
4152bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        }
4162bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        break;
4172bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
4182bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    case OP_COP1:
4192bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        switch (i.RType.rs) {
4202bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        case OP_BCx:
4212bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        case OP_BCy:
4222bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            db_printf("bc1%c\t",
4232bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind                "ft"[i.RType.rt & COPz_BC_TF_MASK]);
4242bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            goto pr_displ;
4252bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
4262bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        case OP_MT:
4272bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            db_printf("mtc1\t%s,f%d",
4282bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind                reg_name[i.RType.rt],
4292bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind                i.RType.rd);
4302bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            break;
4312bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
4322bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        case OP_MF:
4332bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            db_printf("mfc1\t%s,f%d",
4342bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind                reg_name[i.RType.rt],
4352bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind                i.RType.rd);
4362bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            break;
4372bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
4382bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        case OP_CT:
4392bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            db_printf("ctc1\t%s,f%d",
4402bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind                reg_name[i.RType.rt],
4412bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind                i.RType.rd);
4422bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            break;
4432bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
4442bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        case OP_CF:
4452bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            db_printf("cfc1\t%s,f%d",
4462bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind                reg_name[i.RType.rt],
4472bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind                i.RType.rd);
4482bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            break;
4492bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
4502bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        default:
4512bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            db_printf("%s.%s\tf%d,f%d,f%d",
4522bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind                cop1_name[i.FRType.func],
4532bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind                fmt_name[i.FRType.fmt],
4542bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind                i.FRType.fd, i.FRType.fs, i.FRType.ft);
4552bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        }
4562bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        break;
4572bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
4582bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    case OP_J:
4592bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    case OP_JAL:
4602bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        db_printf("%s\t", op_name[i.JType.op]);
4612bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        print_addr((loc & 0xF0000000) | (i.JType.target << 2));
4622bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        bdslot = true;
4632bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        break;
4642bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
4652bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    case OP_LWC1:
4662bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    case OP_SWC1:
4672bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        db_printf("%s\tf%d,", op_name[i.IType.op],
4682bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            i.IType.rt);
4692bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        goto loadstore;
4702bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
4712bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    case OP_LB:
4722bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    case OP_LH:
4732bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    case OP_LW:
4742bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    case OP_LD:
4752bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    case OP_LBU:
4762bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    case OP_LHU:
4772bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    case OP_LWU:
4782bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    case OP_SB:
4792bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    case OP_SH:
4802bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    case OP_SW:
4812bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    case OP_SD:
4822bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        db_printf("%s\t%s,", op_name[i.IType.op],
4832bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            reg_name[i.IType.rt]);
4842bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    loadstore:
4852bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        db_printf("%d(%s)", (short)i.IType.imm,
4862bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            reg_name[i.IType.rs]);
4872bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        break;
4882bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
4892bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    case OP_ORI:
4902bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    case OP_XORI:
4912bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        if (i.IType.rs == 0) {
4922bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            db_printf("li\t%s,0x%x",
4932bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind                reg_name[i.IType.rt],
4942bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind                i.IType.imm);
4952bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            break;
4962bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        }
4972bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        /* FALLTHROUGH */
4982bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    case OP_ANDI:
4992bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        db_printf("%s\t%s,%s,0x%x", op_name[i.IType.op],
5002bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            reg_name[i.IType.rt],
5012bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            reg_name[i.IType.rs],
5022bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            i.IType.imm);
5032bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        break;
5042bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
5052bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    case OP_LUI:
5062bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        db_printf("%s\t%s,0x%x", op_name[i.IType.op],
5072bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            reg_name[i.IType.rt],
5082bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            i.IType.imm);
5092bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        break;
5102bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
5112bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    case OP_CACHE:
5122bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        db_printf("%s\t0x%x,0x%x(%s)",
5132bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            op_name[i.IType.op],
5142bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            i.IType.rt,
5152bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            i.IType.imm,
5162bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            reg_name[i.IType.rs]);
5172bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        break;
5182bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
5192bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    case OP_ADDI:
5202bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    case OP_DADDI:
5212bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    case OP_ADDIU:
5222bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    case OP_DADDIU:
5232bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        if (i.IType.rs == 0) {
5242bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            db_printf("li\t%s,%d",
5252bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind                reg_name[i.IType.rt],
5262bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind                (short)i.IType.imm);
5272bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            break;
5282bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        }
5292bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        /* FALLTHROUGH */
5302bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    default:
5312bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        db_printf("%s\t%s,%s,%d", op_name[i.IType.op],
5322bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            reg_name[i.IType.rt],
5332bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            reg_name[i.IType.rs],
5342bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            (short)i.IType.imm);
5352bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    }
5362bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    // db_printf("\n");
5372bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    // if (bdslot) {
5382bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    //     db_printf("   bd: ");
5392bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    //     mips_disassem(loc+4);
5402bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    //     return (loc + 8);
5412bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    // }
5422bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    return (loc + 4);
5432bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind}
5442bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
5452bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lindstatic void
5462bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lindprint_addr(db_addr_t loc)
5472bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind{
5482bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    db_printf("0x%08x", loc);
5492bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind}
5502bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
5512bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
5522bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
5532bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lindstatic void db_printf(const char* fmt, ...)
5542bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind{
5552bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    int cnt;
5562bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    va_list argp;
5572bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    va_start(argp, fmt);
5582bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    if (sprintf_buffer) {
5592bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        cnt = vsnprintf(sprintf_buffer, sprintf_buf_len, fmt, argp);
5602bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        sprintf_buffer += cnt;
5612bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        sprintf_buf_len -= cnt;
5622bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    } else {
5632bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        vprintf(fmt, argp);
5642bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    }
5652bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind}
5662bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
5672bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
5682bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind/*
5692bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind * Disassemble instruction at 'loc'.
5702bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind * Return address of start of next instruction.
5712bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind * Since this function is used by 'examine' and by 'step'
5722bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind * "next instruction" does NOT mean the next instruction to
5732bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind * be executed but the 'linear' next instruction.
5742bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind */
5752bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Linddb_addr_t
5762bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lindmips_disassem(db_addr_t loc, char *di_buffer, int alt_dis_format)
5772bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind{
5782bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    u_int32_t instr;
5792bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
5802bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    if (alt_dis_format) {   // use ARM register names for disassembly
5812bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        reg_name = &alt_arm_reg_name[0];
5822bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    }
5832bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
5842bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    sprintf_buffer = di_buffer;     // quick 'n' dirty printf() vs sprintf()
5852bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    sprintf_buf_len = 39;           // should be passed in
5862bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
5872bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    instr =  *(u_int32_t *)loc;
5882bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    return (db_disasm_insn(instr, loc, false));
5892bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind}
5902bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
591