From e1fb410b5c72c89b6702e81aca91dee9250608ab Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Sat, 14 Dec 2024 22:11:57 +0000 Subject: [PATCH] VEX/priv/guest_riscv64_toIR.c: Recognize both fence and fence.tso fence.tso is used for __atomic_thread_fence (__ATOMIC_ACQ_REL) There are 3 fence variants. fence.tso fm set to 1000 and pred and succ both set to 0011. fence with fm set to 0000 and pred and succ both set to 1111. fence with fm set to 0000 and pred and succ with some iorw flags set. https://bugs.kde.org/show_bug.cgi?id=468575#c42 --- VEX/priv/guest_riscv64_toIR.c | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/VEX/priv/guest_riscv64_toIR.c b/VEX/priv/guest_riscv64_toIR.c index 93ea5a173..e76a602a0 100644 --- a/VEX/priv/guest_riscv64_toIR.c +++ b/VEX/priv/guest_riscv64_toIR.c @@ -1610,19 +1610,26 @@ static Bool dis_RV64I(/*MB_OUT*/ DisResult* dres, } /* ------------------------ fence ------------------------ */ - if (INSN(19, 0) == 0b00000000000000001111 && INSN(31, 28) == 0b0000) { + if (INSN(19, 0) == 0b00000000000000001111) { + UInt fm = INSN(31, 28); UInt succ = INSN(23, 20); UInt pred = INSN(27, 24); - stmt(irsb, IRStmt_MBE(Imbe_Fence)); - if (pred == 0b1111 && succ == 0b1111) - DIP("fence\n"); - else - DIP("fence %s%s%s%s,%s%s%s%s\n", (pred & 0x8) ? "i" : "", - (pred & 0x4) ? "o" : "", (pred & 0x2) ? "r" : "", - (pred & 0x1) ? "w" : "", (succ & 0x8) ? "i" : "", - (succ & 0x4) ? "o" : "", (succ & 0x2) ? "r" : "", - (succ & 0x1) ? "w" : ""); - return True; + if ((fm == 0b1000 && pred == 0b0011 && succ == 0b0011) + || fm == 0b0000) + { + if (fm == 0b1000) + DIP("fence.tso\n"); + else if (pred == 0b1111 && succ == 0b1111) + DIP("fence\n"); + else + DIP("fence %s%s%s%s,%s%s%s%s\n", (pred & 0x8) ? "i" : "", + (pred & 0x4) ? "o" : "", (pred & 0x2) ? "r" : "", + (pred & 0x1) ? "w" : "", (succ & 0x8) ? "i" : "", + (succ & 0x4) ? "o" : "", (succ & 0x2) ? "r" : "", + (succ & 0x1) ? "w" : ""); + stmt(irsb, IRStmt_MBE(Imbe_Fence)); + return True; + } } /* ------------------------ ecall ------------------------ */ -- 2.47.2