Module Name: src Committed By: matt Date: Mon Jun 15 02:55:02 UTC 2015
Modified Files: src/sys/arch/mips/mips: db_disasm.c Log Message: Add decoder for ehb. Fix ins/ext instruction decoding To generate a diff of this commit: cvs rdiff -u -r1.28 -r1.29 src/sys/arch/mips/mips/db_disasm.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/mips/mips/db_disasm.c diff -u src/sys/arch/mips/mips/db_disasm.c:1.28 src/sys/arch/mips/mips/db_disasm.c:1.29 --- src/sys/arch/mips/mips/db_disasm.c:1.28 Sat Jun 6 22:19:07 2015 +++ src/sys/arch/mips/mips/db_disasm.c Mon Jun 15 02:55:02 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: db_disasm.c,v 1.28 2015/06/06 22:19:07 matt Exp $ */ +/* $NetBSD: db_disasm.c,v 1.29 2015/06/15 02:55:02 matt Exp $ */ /*- * Copyright (c) 1991, 1993 @@ -35,7 +35,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: db_disasm.c,v 1.28 2015/06/06 22:19:07 matt Exp $"); +__KERNEL_RCSID(0, "$NetBSD: db_disasm.c,v 1.29 2015/06/15 02:55:02 matt Exp $"); #include <sys/param.h> #include <sys/cpu.h> @@ -243,11 +243,21 @@ db_disasm_insn(int insn, db_addr_t loc, db_printf("nop"); break; } + if (i.word == (3 << 6)) { + db_printf("ehb"); + break; + } /* XXX * "addu" is a "move" only in 32-bit mode. What's the correct * answer - never decode addu/daddu as "move"? */ - if (i.RType.func == OP_ADDU && i.RType.rt == 0) { + if (true +#ifdef __mips_o32 + && i.RType.func == OP_ADDU +#else + && i.RType.func == OP_DADDU +#endif + && i.RType.rt == 0) { db_printf("move\t%s,%s", reg_name[i.RType.rd], reg_name[i.RType.rs]); @@ -260,7 +270,7 @@ db_disasm_insn(int insn, db_addr_t loc, && i.RType.shamt == 1) { name = (i.RType.func == OP_DSRL) ? "drotr" : "drotrv"; } - + db_printf("%s", name); switch (i.RType.func) { case OP_SLL: @@ -422,15 +432,16 @@ db_disasm_insn(int insn, db_addr_t loc, break; } if (i.RType.func <= OP_DINS) { - int lsb = i.RType.shamt - + ((i.RType.func & 3) == 2) ? 32 : 0; - int msb = i.RType.rd - + (((i.RType.func - 1) & 3) < 2) ? 32 : 0; + int pos = i.RType.shamt; + int size = i.RType.rd - pos + 1; + size += (((i.RType.func & 3) == 1) ? 32 : 0); + pos += (((i.RType.func & 3) == 2) ? 32 : 0); + db_printf("%s\t%s,%s,%d,%d", spec3_name[i.RType.func], reg_name[i.RType.rt], reg_name[i.RType.rs], - lsb, msb - lsb + 1); + pos, size); break; } if (i.RType.func == OP_RDHWR) {