From: "Alex Bennée" <alex.bennee@linaro.org>
To: qemu-devel@nongnu.org
Cc: "Wainer dos Santos Moschetta" <wainersm@redhat.com>,
"Beraldo Leal" <bleal@redhat.com>,
"David Hildenbrand" <david@redhat.com>,
"Paolo Bonzini" <pbonzini@redhat.com>,
"Philippe Mathieu-Daudé" <philmd@linaro.org>,
"Pierrick Bouvier" <pierrick.bouvier@linaro.org>,
"Alexandre Iooss" <erdnaxe@crans.org>,
"Thomas Huth" <thuth@redhat.com>,
"Mahmoud Mandour" <ma.mandourr@gmail.com>,
"Peter Maydell" <peter.maydell@linaro.org>,
qemu-arm@nongnu.org, "Aleksandar Rikalo" <arikalo@gmail.com>,
"Mads Ynddal" <mads@ynddal.dk>,
"Yanan Wang" <wangyanan55@huawei.com>,
"Eduardo Habkost" <eduardo@habkost.net>,
"Peter Xu" <peterx@redhat.com>,
"Richard Henderson" <richard.henderson@linaro.org>,
"Marcel Apfelbaum" <marcel.apfelbaum@gmail.com>,
"Paul Burton" <paulburton@kernel.org>,
"Stefan Hajnoczi" <stefanha@redhat.com>,
"Alex Bennée" <alex.bennee@linaro.org>,
"Laurent Vivier" <laurent@vivier.eu>,
"Gustavo Romero" <gustavo.romero@linaro.org>
Subject: [PATCH v2 40/40] tests/tcg/aarch64: Add MTE gdbstub tests
Date: Fri, 5 Jul 2024 09:40:47 +0100 [thread overview]
Message-ID: <20240705084047.857176-41-alex.bennee@linaro.org> (raw)
In-Reply-To: <20240705084047.857176-1-alex.bennee@linaro.org>
From: Gustavo Romero <gustavo.romero@linaro.org>
Add tests to exercise the MTE stubs. The tests will only run if a
version of GDB that supports MTE is available in the test environment.
Signed-off-by: Gustavo Romero <gustavo.romero@linaro.org>
[AJB: re-base and checkpatch fixes]
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Message-Id: <20240628050850.536447-12-gustavo.romero@linaro.org>
---
configure | 4 ++
tests/tcg/aarch64/mte-8.c | 99 +++++++++++++++++++++++++++
tests/tcg/aarch64/Makefile.target | 14 +++-
tests/tcg/aarch64/gdbstub/test-mte.py | 86 +++++++++++++++++++++++
4 files changed, 202 insertions(+), 1 deletion(-)
create mode 100644 tests/tcg/aarch64/mte-8.c
create mode 100644 tests/tcg/aarch64/gdbstub/test-mte.py
diff --git a/configure b/configure
index 8b6a2f16ce..019fcbd0ef 100755
--- a/configure
+++ b/configure
@@ -1673,6 +1673,10 @@ for target in $target_list; do
echo "GDB=$gdb_bin" >> $config_target_mak
fi
+ if test "${arch}" = "aarch64" && version_ge ${gdb_version##* } 15.0; then
+ echo "GDB_HAS_MTE=y" >> $config_target_mak
+ fi
+
echo "run-tcg-tests-$target: $qemu\$(EXESUF)" >> Makefile.prereqs
tcg_tests_targets="$tcg_tests_targets $target"
fi
diff --git a/tests/tcg/aarch64/mte-8.c b/tests/tcg/aarch64/mte-8.c
new file mode 100644
index 0000000000..808135ba43
--- /dev/null
+++ b/tests/tcg/aarch64/mte-8.c
@@ -0,0 +1,99 @@
+/*
+ * To be compiled with -march=armv8.5-a+memtag
+ *
+ * This test is adapted from a Linux test. Please see:
+ *
+ * https://www.kernel.org/doc/html/next/arch/arm64/memory-tagging-extension.html#example-of-correct-usage
+ */
+#include <errno.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/auxv.h>
+#include <sys/mman.h>
+#include <sys/prctl.h>
+#include <string.h>
+/*
+ * From arch/arm64/include/uapi/asm/hwcap.h
+ */
+#define HWCAP2_MTE (1 << 18)
+
+/*
+ * From arch/arm64/include/uapi/asm/mman.h
+ */
+#define PROT_MTE 0x20
+
+/*
+ * Insert a random logical tag into the given pointer.
+ */
+#define insert_random_tag(ptr) ({ \
+ uint64_t __val; \
+ asm("irg %0, %1" : "=r" (__val) : "r" (ptr)); \
+ __val; \
+})
+
+/*
+ * Set the allocation tag on the destination address.
+ */
+#define set_tag(tagged_addr) do { \
+ asm volatile("stg %0, [%0]" : : "r" (tagged_addr) : "memory"); \
+} while (0)
+
+
+int main(int argc, char *argv[])
+{
+ unsigned char *a;
+ unsigned long page_sz = sysconf(_SC_PAGESIZE);
+ unsigned long hwcap2 = getauxval(AT_HWCAP2);
+
+ /* check if MTE is present */
+ if (!(hwcap2 & HWCAP2_MTE)) {
+ return EXIT_FAILURE;
+ }
+
+ /*
+ * Enable the tagged address ABI, synchronous or asynchronous MTE
+ * tag check faults (based on per-CPU preference) and allow all
+ * non-zero tags in the randomly generated set.
+ */
+ if (prctl(PR_SET_TAGGED_ADDR_CTRL,
+ PR_TAGGED_ADDR_ENABLE | PR_MTE_TCF_SYNC | PR_MTE_TCF_ASYNC |
+ (0xfffe << PR_MTE_TAG_SHIFT),
+ 0, 0, 0)) {
+ perror("prctl() failed");
+ return EXIT_FAILURE;
+ }
+
+ a = mmap(0, page_sz, PROT_READ | PROT_WRITE,
+ MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
+ if (a == MAP_FAILED) {
+ perror("mmap() failed");
+ return EXIT_FAILURE;
+ }
+
+ printf("a[] address is %p\n", a);
+
+ /*
+ * Enable MTE on the above anonymous mmap. The flag could be passed
+ * directly to mmap() and skip this step.
+ */
+ if (mprotect(a, page_sz, PROT_READ | PROT_WRITE | PROT_MTE)) {
+ perror("mprotect() failed");
+ return EXIT_FAILURE;
+ }
+
+ /* access with the default tag (0) */
+ a[0] = 1;
+ a[1] = 2;
+
+ printf("a[0] = %hhu a[1] = %hhu\n", a[0], a[1]);
+
+ /* set the logical and allocation tags */
+ a = (unsigned char *)insert_random_tag(a);
+ set_tag(a);
+
+ printf("%p\n", a);
+
+ return 0;
+}
diff --git a/tests/tcg/aarch64/Makefile.target b/tests/tcg/aarch64/Makefile.target
index ad1774c2ce..b53218e115 100644
--- a/tests/tcg/aarch64/Makefile.target
+++ b/tests/tcg/aarch64/Makefile.target
@@ -64,7 +64,7 @@ AARCH64_TESTS += bti-2
# MTE Tests
ifneq ($(CROSS_CC_HAS_ARMV8_MTE),)
-AARCH64_TESTS += mte-1 mte-2 mte-3 mte-4 mte-5 mte-6 mte-7
+AARCH64_TESTS += mte-1 mte-2 mte-3 mte-4 mte-5 mte-6 mte-7 mte-8
mte-%: CFLAGS += $(CROSS_CC_HAS_ARMV8_MTE)
endif
@@ -131,6 +131,18 @@ run-gdbstub-sve-ioctls: sve-ioctls
basic gdbstub SVE ZLEN support)
EXTRA_RUNS += run-gdbstub-sysregs run-gdbstub-sve-ioctls
+
+ifeq ($(GDB_HAS_MTE),y)
+run-gdbstub-mte: mte-8
+ $(call run-test, $@, $(GDB_SCRIPT) \
+ --gdb $(GDB) \
+ --qemu $(QEMU) --qargs "$(QEMU_OPTS)" \
+ --bin $< --test $(AARCH64_SRC)/gdbstub/test-mte.py, \
+ gdbstub MTE support)
+
+EXTRA_RUNS += run-gdbstub-mte
+endif
+
endif
endif
diff --git a/tests/tcg/aarch64/gdbstub/test-mte.py b/tests/tcg/aarch64/gdbstub/test-mte.py
new file mode 100644
index 0000000000..2db0663c1a
--- /dev/null
+++ b/tests/tcg/aarch64/gdbstub/test-mte.py
@@ -0,0 +1,86 @@
+from __future__ import print_function
+#
+# Test GDB memory-tag commands that exercise the stubs for the qIsAddressTagged,
+# qMemTag, and QMemTag packets. Logical tag-only commands rely on local
+# operations, hence don't exercise any stub.
+#
+# The test consists in breaking just after a atag() call (which sets the
+# allocation tag -- see mte-8.c for details) and setting/getting tags in
+# different memory locations and ranges starting at the address of the array
+# 'a'.
+#
+# This is launched via tests/guest-debug/run-test.py
+#
+
+
+import gdb
+import re
+from test_gdbstub import main, report
+
+
+PATTERN_0 = "Memory tags for address 0x[0-9a-f]+ match \(0x[0-9a-f]+\)."
+PATTERN_1 = ".*(0x[0-9a-f]+)"
+
+
+def run_test():
+ gdb.execute("break 95", False, True)
+ gdb.execute("continue", False, True)
+ try:
+ # Test if we can check correctly that the allocation tag for
+ # array 'a' matches the logical tag after atag() is called.
+ co = gdb.execute("memory-tag check a", False, True)
+ tags_match = re.findall(PATTERN_0, co, re.MULTILINE)
+ if tags_match:
+ report(True, f"{tags_match[0]}")
+ else:
+ report(False, "Logical and allocation tags don't match!")
+
+ # Test allocation tag 'set and print' commands. Commands on logical
+ # tags rely on local operation and so don't exercise any stub.
+
+ # Set the allocation tag for the first granule (16 bytes) of
+ # address starting at 'a' address to a known value, i.e. 0x04.
+ gdb.execute("memory-tag set-allocation-tag a 1 04", False, True)
+
+ # Then set the allocation tag for the second granule to a known
+ # value, i.e. 0x06. This tests that contiguous tag granules are
+ # set correct and don't run over each other.
+ gdb.execute("memory-tag set-allocation-tag a+16 1 06", False, True)
+
+ # Read the known values back and check if they remain the same.
+
+ co = gdb.execute("memory-tag print-allocation-tag a", False, True)
+ first_tag = re.match(PATTERN_1, co)[1]
+
+ co = gdb.execute("memory-tag print-allocation-tag a+16", False, True)
+ second_tag = re.match(PATTERN_1, co)[1]
+
+ if first_tag == "0x4" and second_tag == "0x6":
+ report(True, "Allocation tags are correctly set/printed.")
+ else:
+ report(False, "Can't set/print allocation tags!")
+
+ # Now test fill pattern by setting a whole page with a pattern.
+ gdb.execute("memory-tag set-allocation-tag a 4096 0a0b", False, True)
+
+ # And read back the tags of the last two granules in page so
+ # we also test if the pattern is set correctly up to the end of
+ # the page.
+ co = gdb.execute("memory-tag print-allocation-tag a+4096-32", False, True)
+ tag = re.match(PATTERN_1, co)[1]
+
+ co = gdb.execute("memory-tag print-allocation-tag a+4096-16", False, True)
+ last_tag = re.match(PATTERN_1, co)[1]
+
+ if tag == "0xa" and last_tag == "0xb":
+ report(True, "Fill pattern is ok.")
+ else:
+ report(False, "Fill pattern failed!")
+
+ except gdb.error:
+ # This usually happens because a GDB version that does not
+ # support memory tagging was used to run the test.
+ report(False, "'memory-tag' command failed!")
+
+
+main(run_test, expected_arch="aarch64")
--
2.39.2
prev parent reply other threads:[~2024-07-05 8:58 UTC|newest]
Thread overview: 54+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-07-05 8:40 [PATCH v2 00/40] July maintainer updates (32bit, testing, plugins, gdbstub) Alex Bennée
2024-07-05 8:40 ` [PATCH v2 01/40] tests/lcitool: fix debian-i686-cross toolchain prefix Alex Bennée
2024-07-05 8:40 ` [PATCH v2 02/40] testing: restore some testing for i686 Alex Bennée
2024-07-05 8:40 ` [PATCH v2 03/40] tracepoints: move physmem trace points Alex Bennée
2024-07-05 8:40 ` [PATCH v2 04/40] hw/core: ensure kernel_end never gets used undefined Alex Bennée
2024-07-05 9:49 ` Manos Pitsidianakis
2024-07-05 8:40 ` [PATCH v2 05/40] tests/docker: Specify --userns keep-id for Podman Alex Bennée
2024-07-05 8:40 ` [PATCH v2 06/40] tests/tcg/minilib: Constify digits in print_num Alex Bennée
2024-07-05 8:40 ` [PATCH v2 07/40] tests/tcg: Adjust variable defintion from cc-option Alex Bennée
2024-07-05 8:40 ` [PATCH v2 08/40] tests/tcg/aarch64: Drop -fno-tree-loop-distribute-patterns Alex Bennée
2024-07-05 8:40 ` [PATCH v2 09/40] tests/tcg/aarch64: Explicitly specify register width Alex Bennée
2024-07-05 8:40 ` [PATCH v2 10/40] tests/tcg/aarch64: Fix irg operand type Alex Bennée
2024-07-05 8:40 ` [PATCH v2 11/40] tests/tcg/aarch64: Do not use x constraint Alex Bennée
2024-07-05 8:40 ` [PATCH v2 12/40] tests/tcg/aarch64: Add -fno-integrated-as for sme Alex Bennée
2024-07-05 8:40 ` [PATCH v2 13/40] tests/tcg/arm: Fix fcvt result messages Alex Bennée
2024-07-05 8:40 ` [PATCH v2 14/40] tests/tcg/arm: Drop -N from LDFLAGS Alex Bennée
2024-07-05 8:40 ` [PATCH v2 15/40] tests/tcg/arm: Use -fno-integrated-as for test-arm-iwmmxt Alex Bennée
2024-07-05 8:40 ` [PATCH v2 16/40] tests/tcg/arm: Manually register allocate half-precision numbers Alex Bennée
2024-07-05 8:40 ` [PATCH v2 17/40] tests/tcg/arm: Use -march and -mfpu for fcvt Alex Bennée
2024-07-05 8:40 ` [PATCH v2 18/40] tests/tcg/arm: Use vmrs/vmsr instead of mcr/mrc Alex Bennée
2024-07-05 8:40 ` [PATCH v2 19/40] linux-user/main: Suppress out-of-range comparison warning for clang Alex Bennée
2024-07-05 8:40 ` [PATCH v2 20/40] gitlab: don't bother with KVM for TCI builds Alex Bennée
2024-07-05 8:49 ` Thomas Huth
2024-07-05 16:34 ` Philippe Mathieu-Daudé
2024-07-05 16:49 ` Thomas Huth
2024-07-05 21:44 ` Philippe Mathieu-Daudé
2024-07-08 4:59 ` Thomas Huth
2024-07-05 8:40 ` [PATCH v2 21/40] test/plugin: make insn plugin less noisy by default Alex Bennée
2024-07-05 10:02 ` Manos Pitsidianakis
2024-07-05 8:40 ` [PATCH v2 22/40] test/plugins: preserve the instruction record over translations Alex Bennée
2024-07-05 10:15 ` Manos Pitsidianakis
2024-07-05 8:40 ` [PATCH v2 23/40] plugins/lockstep: preserve sock_path Alex Bennée
2024-07-05 9:54 ` Manos Pitsidianakis
2024-07-05 8:40 ` [PATCH v2 24/40] plugins/lockstep: make mixed-mode safe Alex Bennée
2024-07-05 8:40 ` [PATCH v2 25/40] plugins/lockstep: mention the one-insn-per-tb option Alex Bennée
2024-07-05 10:04 ` Manos Pitsidianakis
2024-07-05 8:40 ` [PATCH v2 26/40] plugins/lockstep: clean-up output Alex Bennée
2024-07-05 8:40 ` [PATCH v2 27/40] plugins: Ensure vCPU index is assigned in init/exit hooks Alex Bennée
2024-07-05 8:40 ` [PATCH v2 28/40] plugins: Free CPUPluginState before destroying vCPU state Alex Bennée
2024-07-05 8:40 ` [PATCH v2 29/40] accel/tcg: Move qemu_plugin_vcpu_init__async() to plugins/ Alex Bennée
2024-07-05 8:40 ` [PATCH v2 30/40] gdbstub: Clean up process_string_cmd Alex Bennée
2024-07-05 8:40 ` [PATCH v2 31/40] gdbstub: Move GdbCmdParseEntry into a new header file Alex Bennée
2024-07-05 8:40 ` [PATCH v2 32/40] gdbstub: Add support for target-specific stubs Alex Bennée
2024-07-05 8:40 ` [PATCH v2 33/40] target/arm: Fix exception case in allocation_tag_mem_probe Alex Bennée
2024-07-05 8:40 ` [PATCH v2 34/40] target/arm: Make some MTE helpers widely available Alex Bennée
2024-07-05 8:40 ` [PATCH v2 35/40] target/arm: Factor out code for setting MTE TCF0 field Alex Bennée
2024-07-05 10:07 ` Manos Pitsidianakis
2024-07-05 8:40 ` [PATCH v2 36/40] gdbstub: Make hex conversion function non-internal Alex Bennée
2024-07-05 8:40 ` [PATCH v2 37/40] gdbstub: Pass CPU context to command handler Alex Bennée
2024-07-05 10:08 ` Manos Pitsidianakis
2024-07-05 8:40 ` [PATCH v2 38/40] gdbstub: Use true to set cmd_startswith Alex Bennée
2024-07-05 10:03 ` Manos Pitsidianakis
2024-07-05 8:40 ` [PATCH v2 39/40] gdbstub: Add support for MTE in user mode Alex Bennée
2024-07-05 8:40 ` Alex Bennée [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240705084047.857176-41-alex.bennee@linaro.org \
--to=alex.bennee@linaro.org \
--cc=arikalo@gmail.com \
--cc=bleal@redhat.com \
--cc=david@redhat.com \
--cc=eduardo@habkost.net \
--cc=erdnaxe@crans.org \
--cc=gustavo.romero@linaro.org \
--cc=laurent@vivier.eu \
--cc=ma.mandourr@gmail.com \
--cc=mads@ynddal.dk \
--cc=marcel.apfelbaum@gmail.com \
--cc=paulburton@kernel.org \
--cc=pbonzini@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=peterx@redhat.com \
--cc=philmd@linaro.org \
--cc=pierrick.bouvier@linaro.org \
--cc=qemu-arm@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=richard.henderson@linaro.org \
--cc=stefanha@redhat.com \
--cc=thuth@redhat.com \
--cc=wainersm@redhat.com \
--cc=wangyanan55@huawei.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).