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("-");