Module Name:    src
Committed By:   matt
Date:           Mon Mar  3 08:51:39 UTC 2014

Modified Files:
        src/sys/arch/arm/arm: disassem.c

Log Message:
Add more instructions including ldrex/strex variants


To generate a diff of this commit:
cvs rdiff -u -r1.23 -r1.24 src/sys/arch/arm/arm/disassem.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/arm/arm/disassem.c
diff -u src/sys/arch/arm/arm/disassem.c:1.23 src/sys/arch/arm/arm/disassem.c:1.24
--- src/sys/arch/arm/arm/disassem.c:1.23	Fri Jan 10 23:52:53 2014
+++ src/sys/arch/arm/arm/disassem.c	Mon Mar  3 08:51:39 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: disassem.c,v 1.23 2014/01/10 23:52:53 matt Exp $	*/
+/*	$NetBSD: disassem.c,v 1.24 2014/03/03 08:51:39 matt Exp $	*/
 
 /*
  * Copyright (c) 1996 Mark Brinicombe.
@@ -49,7 +49,7 @@
 
 #include <sys/param.h>
 
-__KERNEL_RCSID(0, "$NetBSD: disassem.c,v 1.23 2014/01/10 23:52:53 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: disassem.c,v 1.24 2014/03/03 08:51:39 matt Exp $");
 
 #include <sys/systm.h>
 
@@ -122,6 +122,9 @@ struct arm32_insn {
 static const struct arm32_insn arm32_i[] = {
     { 0x0fffffff, 0x0ff00000, "imb",	"c" },		/* Before swi */
     { 0x0fffffff, 0x0ff00001, "imbrange",	"c" },	/* Before swi */
+    { 0x0fffffff, 0x0320f003, "yield",	"" },	/* Before swi */
+    { 0x0fffffff, 0x0320f002, "wfe",	"" },	/* Before swi */
+    { 0x0fffffff, 0x0320f003, "wfi",	"" },	/* Before swi */
     { 0x0f000000, 0x0f000000, "swi",	"c" },
     { 0xfe000000, 0xfa000000, "blx",	"t" },		/* Before b and bl */
     { 0x0f000000, 0x0a000000, "b",	"b" },
@@ -140,10 +143,20 @@ static const struct arm32_insn arm32_i[]
     { 0x0c500000, 0x04100000, "ldr",	"daW" },
     { 0x0c500000, 0x04400000, "strb",	"daW" },
     { 0x0c500000, 0x04500000, "ldrb",	"daW" },
+    { 0x0fff0000, 0x092d0000, "push",	"l" },	/* separate out r13 base */
+    { 0x0fff0000, 0x08bd0000, "pop",	"l" },	/* separate out r13 base */
     { 0x0e1f0000, 0x080d0000, "stm",	"YnWl" },/* separate out r13 base */
     { 0x0e1f0000, 0x081d0000, "ldm",	"YnWl" },/* separate out r13 base */    
     { 0x0e100000, 0x08000000, "stm",	"XnWl" },
     { 0x0e100000, 0x08100000, "ldm",	"XnWl" },    
+    { 0x0ff00fff, 0x01900f9f, "ldrex",	"da" },
+    { 0x0ff00fff, 0x01b00f9f, "ldrexd",	"da" },
+    { 0x0ff00fff, 0x01d00f9f, "ldrexb",	"da" },
+    { 0x0ff00fff, 0x01f00f9f, "ldrexh",	"da" },
+    { 0x0ff00ff0, 0x01800f90, "strex",	"dma" },
+    { 0x0ff00ff0, 0x01a00f90, "strexd",	"dma" },
+    { 0x0ff00ff0, 0x01c00f90, "strexb",	"dma" },
+    { 0x0ff00ff0, 0x01e00f90, "strexh",	"dma" },
     { 0x0e1000f0, 0x00100090, "ldrb",	"de" },
     { 0x0e1000f0, 0x00000090, "strb",	"de" },
     { 0x0e1000f0, 0x001000d0, "ldrsb",	"de" },
@@ -667,7 +680,8 @@ disasm_insn_ldrstr(const disasm_interfac
 		di->di_printaddr(loc + 8);
  	} else {
 		di->di_printf("[r%d", (insn >> 16) & 0x0f);
-		if ((insn & 0x03000fff) != 0x01000000) {
+		if ((insn & 0x03000fff) != 0x01000000
+		    && (insn & 0x0f800ff0) != 0x01800f90) {
 			di->di_printf("%s, ", (insn & (1 << 24)) ? "" : "]");
 			if (!(insn & 0x00800000))
 				di->di_printf("-");

Reply via email to