ref: 8a6e8d239bf6c3e1e31cc210f1f3c637ea12b22f
parent: 0b30fe7e72e1b3ce70f2119dac5ab04cc4faf696
	author: mia soweli <mia@soweli.net>
	date: Fri Aug 15 11:49:50 EDT 2025
	
libmach: disassemble DMB, DSB, and ISB correctly the arm v7 manual says these have an immediate like they do in arm v8
--- a/sys/src/libmach/5db.c
+++ b/sys/src/libmach/5db.c
@@ -192,7 +192,7 @@
op = (48) + ((w >> 21) & 0xf);
break;
case 2: /* load/store byte/word i(r) */
-		if ((w & 0xffffff8f) == 0xf57ff00f) {	/* barriers, clrex */+		if ((w & 0xffffff80) == 0xf57ff000) {	/* barriers, clrex */done = 1;
 			switch ((w >> 4) & 7) {case 1:
@@ -589,6 +589,13 @@
format(o->o, i, buf);
}
+static void
+armdmb(Opcode *o, Instr *i)
+{+ i->imm = (i->w & 0xf);
+ format(o->o, i, o->a);
+}
+
static int
armcondpass(Map *map, Rgetter rget, uchar cond)
 {@@ -973,9 +980,9 @@
"CLREX", armunk, 0, "",
/* 96 */
- "DSB", armunk, 0, "",
- "DMB", armunk, 0, "",
- "ISB", armunk, 0, "",
+ "DSB", armdmb, 0, "$%i",
+ "DMB", armdmb, 0, "$%i",
+ "ISB", armdmb, 0, "$%i",
/* 99 */
"RFEV7%P%a", armbdt, 0, "(R%n)",
--
⑨