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)",
--
⑨