shithub: front

Download patch

ref: 7b4febff70a365887d380ed4f50c7027ae982b37
parent: d11644834cca4298822d18b89f38c271aa9bb938
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)",
--