[AARCH64] STGP instruction is not writing the value of the second register to memory
Host environment
- Operating system: Ubuntu 20.04.6 LTS
- OS/kernel version: Linux 5.4.0-153-generic #170-Ubuntu SMP Fri Jun 16 13:43:31 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
- Architecture:
- QEMU flavor: qemu-system-aarch64
- QEMU version: QEMU 8.0.90 - 885fc169
- QEMU command line: MTE must be enabled with "mte=on"
Emulated/Virtualized environment
- Operating system: Kinibi
- OS/kernel version: latest
- Architecture: AARCH64
Description of problem
My application is built with Clang 16 and the option -fsanitize=memtag-stack. It means the the MTE protection is activated for the stack. The local variables are tagged and the compiler is often using the STGP instruction "Store Allocation Tag and Pair of registers" in order to transfer the value of two 64-bit registers to memory. The following instruction was not working as expected: 18004: 69000895 stgp x21, x2, [x4] The value of the second register x2 is not transferred to the memory. Only x21 is written.
I think that the issue is in trans_STGP(). We don't call finalize_memop_pair() like we do for in the general trans_STP().
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
index 7d0c8f79a7..f599f3e136 100644
--- a/target/arm/tcg/translate-a64.c
+++ b/target/arm/tcg/translate-a64.c
@@ -3034,6 +3034,8 @@ static bool trans_STGP(DisasContext *s, arg_ldstpair *a)
tcg_rt = cpu_reg(s, a->rt);
tcg_rt2 = cpu_reg(s, a->rt2);
+ mop = a->sz + 1;
+ mop = finalize_memop_pair(s, mop);
assert(a->sz == 3);
With this fix, my OS (Kinibi) is now able to boot.