aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorShuai Xue <xueshuai@linux.alibaba.com>2022-08-19 22:07:53 +0800
committerShuai Xue <xueshuai@linux.alibaba.com>2022-08-25 10:43:33 +0800
commitadbf8b3f6959f0eefbf89c3cb6775c4782d58140 (patch)
tree4e2973efa898d1ece3563432cff56f012a06268b
parent449c7138938b5e0ade28e8db73bcdb1e6bd144e2 (diff)
downloadras-tools-adbf8b3f6959f0eefbf89c3cb6775c4782d58140.tar.gz
einj_mem_uc: add explicitly str, strb and strh case for Arm64
Add cases to explicitly trigger write with STR, STRB, and STRH instruction on Arm64 platform. Signed-off-by: Shuai Xue <xueshuai@linux.alibaba.com>
-rw-r--r--einj_mem_uc.c68
1 files changed, 68 insertions, 0 deletions
diff --git a/einj_mem_uc.c b/einj_mem_uc.c
index adfd630..e1b3e83 100644
--- a/einj_mem_uc.c
+++ b/einj_mem_uc.c
@@ -376,6 +376,56 @@ int trigger_write(char *addr)
return 0;
}
+#ifdef __aarch64__
+#define __put_mem_asm(store, reg, x, addr) \
+ asm volatile( \
+ store " " reg "0, [%1]\n" \
+ : \
+ : "r" (x), "r" (addr))
+
+int trigger_write_byte(char *addr)
+{
+ int8_t __pu_val = 0x1E;
+ char *target = addr + write_offset;
+
+ PRINT_TRIGGERING;
+ __put_mem_asm("strb", "%w", __pu_val, target);
+
+ return 0;
+}
+
+int trigger_write_word(char *addr)
+{
+ int16_t __pu_val = 0x1EFF;
+ char *target = addr + write_offset;
+
+ PRINT_TRIGGERING;
+ __put_mem_asm("strh", "%w", __pu_val, target);
+
+ return 0;
+}
+
+int trigger_write_dword(char *addr)
+{
+ int32_t __pu_val = 0x1FFFEEEE;
+ char *target = addr + write_offset;
+
+ PRINT_TRIGGERING;
+ __put_mem_asm("str", "%w", __pu_val, target);
+ return 0;
+}
+
+int trigger_write_qword(char *addr)
+{
+ int64_t __pu_val = 0x1EEEFFFFFEEEE;
+ char *target = addr + write_offset;
+
+ PRINT_TRIGGERING;
+ __put_mem_asm("str", "%x", __pu_val, target);
+ return 0;
+}
+#endif
+
/*
* parameters to the memcpy and copyin tests.
*/
@@ -552,6 +602,24 @@ struct test {
"store", "Write to target address. Should generate a UCNA/CMCI",
data_alloc, inject_uc, 1, trigger_write, F_CMCI,
},
+#ifdef __aarch64__
+ {
+ "strbyte", "Write to target address. Should generate a UCNA/CMCI",
+ data_alloc, inject_uc, 1, trigger_write_byte, F_CMCI,
+ },
+ {
+ "strword", "Write to target address. Should generate a UCNA/CMCI",
+ data_alloc, inject_uc, 1, trigger_write_word, F_CMCI,
+ },
+ {
+ "strdword", "Write to target address. Should generate a UCNA/CMCI",
+ data_alloc, inject_uc, 1, trigger_write_dword, F_CMCI,
+ },
+ {
+ "strqword", "Write to target address. Should generate a UCNA/CMCI",
+ data_alloc, inject_uc, 1, trigger_write_qword, F_CMCI,
+ },
+#endif
{
"memcpy", "Streaming read from target address. Probably fatal",
data_alloc, inject_uc, 1, trigger_memcpy, F_MCE|F_CMCI|F_SIGBUS|F_FATAL,