Module Name: src
Committed By: simonb
Date: Mon Apr 5 07:00:06 UTC 2021
Modified Files:
src/sys/arch/mips/include: mips_opcode.h
src/sys/arch/mips/mips: db_disasm.c
Log Message:
Tidy up NOP disassembly, handle "pause" as well.
To generate a diff of this commit:
cvs rdiff -u -r1.24 -r1.25 src/sys/arch/mips/include/mips_opcode.h
cvs rdiff -u -r1.37 -r1.38 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/include/mips_opcode.h
diff -u src/sys/arch/mips/include/mips_opcode.h:1.24 src/sys/arch/mips/include/mips_opcode.h:1.25
--- src/sys/arch/mips/include/mips_opcode.h:1.24 Mon Aug 17 03:14:08 2020
+++ src/sys/arch/mips/include/mips_opcode.h Mon Apr 5 07:00:06 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: mips_opcode.h,v 1.24 2020/08/17 03:14:08 mrg Exp $ */
+/* $NetBSD: mips_opcode.h,v 1.25 2021/04/05 07:00:06 simonb Exp $ */
/*-
* Copyright (c) 1992, 1993
@@ -292,6 +292,15 @@ typedef union {
#define OP_DSRA32 077 /* MIPS-II, for r4000 port */
/*
+ * Subvalues for SLL where the source and destination registers
+ * are both zero.
+ */
+#define OP_SLL_NOP 0
+#define OP_SLL_SSNOP 1
+#define OP_SLL_EHB 3
+#define OP_SLL_PAUSE 5
+
+/*
* Values for the 'func' field when 'op' == OP_SPECIAL2.
*/
#define OP_MADD 000 /* QED */
Index: src/sys/arch/mips/mips/db_disasm.c
diff -u src/sys/arch/mips/mips/db_disasm.c:1.37 src/sys/arch/mips/mips/db_disasm.c:1.38
--- src/sys/arch/mips/mips/db_disasm.c:1.37 Mon Apr 5 06:38:01 2021
+++ src/sys/arch/mips/mips/db_disasm.c Mon Apr 5 07:00:06 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: db_disasm.c,v 1.37 2021/04/05 06:38:01 simonb Exp $ */
+/* $NetBSD: db_disasm.c,v 1.38 2021/04/05 07:00:06 simonb Exp $ */
/*-
* Copyright (c) 1991, 1993
@@ -35,7 +35,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: db_disasm.c,v 1.37 2021/04/05 06:38:01 simonb Exp $");
+__KERNEL_RCSID(0, "$NetBSD: db_disasm.c,v 1.38 2021/04/05 07:00:06 simonb Exp $");
#include <sys/param.h>
#include <sys/cpu.h>
@@ -265,18 +265,32 @@ db_disasm_insn(int insn, db_addr_t loc,
switch (i.JType.op) {
case OP_SPECIAL: {
const char *name = spec_name[i.RType.func];
- if (i.word == 0) {
- db_printf("nop");
- break;
- }
- if (i.word == (1 << 6)) {
- db_printf("ssnop");
- break;
- }
- if (i.word == (3 << 6)) {
- db_printf("ehb");
+
+ /* Handle varations of NOPs */
+ if ((i.RType.func == OP_SLL) &&
+ (i.RType.rs == 0) &&
+ (i.RType.rt == 0) &&
+ (i.RType.rd == 0)) {
+ switch (i.RType.shamt) {
+ case OP_SLL_NOP:
+ db_printf("nop");
+ break;
+ case OP_SLL_SSNOP:
+ db_printf("ssnop");
+ break;
+ case OP_SLL_EHB:
+ db_printf("ehb");
+ break;
+ case OP_SLL_PAUSE:
+ db_printf("pause");
+ break;
+ default:
+ db_printf("nop *"); /* "undefined" NOP */
+ break;
+ }
break;
}
+
/*
* The following are equivalents of a "move dst,src":
* addu dst,src,zero (in 32-bit mode)
@@ -296,6 +310,7 @@ db_disasm_insn(int insn, db_addr_t loc,
reg_name[i.RType.rs]);
break;
}
+
if ((i.RType.func == OP_SRL || i.RType.func == OP_SRLV)
&& i.RType.rs == 1) {
name = (i.RType.func == OP_SRL) ? "rotr" : "rotrv";