@samitouri / QOSamiQemu / commits / 869e1cdec8

tests/tcg: add test for MTE FAR

This functionality was previously enabled but not advertised or tested. This commit adds a new test, mte-9, that tests the code for proper full-address reporting. FEAT_MTE_TAGGED_FAR requires that FAR_ELx report the full logical address, including tag bits. Signed-off-by: Gabriel Brookman <brookmangabriel@gmail.com> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20260529-feat-mte4-v7-14-ccbd3c14eb3c@gmail.com Signed-off-by: Peter Maydell <peter.maydell@linaro.org>

Gabriel Brookman committed May 29, 2026 at 12:52 UTC 869e1cdec89682f29e5a04ea701137be82ba0758
2 files changed +49 -1
tests/tcg/aarch64/Makefile.target
+1 -1
@@ -64,7 +64,7 @@ AARCH64_TESTS += bti-2
64
65 # MTE Tests
66 ifneq ($(CROSS_CC_HAS_ARMV8_MTE),)
67 -AARCH64_TESTS += mte-1 mte-2 mte-3 mte-4 mte-5 mte-6 mte-7 mte-8
67 +AARCH64_TESTS += mte-1 mte-2 mte-3 mte-4 mte-5 mte-6 mte-7 mte-8 mte-9
68 mte-%: CFLAGS += $(CROSS_CC_HAS_ARMV8_MTE)
69 endif
70
tests/tcg/aarch64/mte-9.c new
+48
@@ -0,0 +1,48 @@
1 +/*
2 + * Memory tagging, full-address reporting.
3 + *
4 + * Copyright (c) 2021 Linaro Ltd
5 + * SPDX-License-Identifier: GPL-2.0-or-later
6 + */
7 +
8 +#include "mte.h"
9 +
10 +static void *faulting_ptr;
11 +
12 +void pass(int sig, siginfo_t *info, void *uc)
13 +{
14 + assert(faulting_ptr == info->si_addr);
15 + exit(0);
16 +}
17 +
18 +int main(int ac, char **av)
19 +{
20 + struct sigaction sa;
21 + int *p0, *p1, *p2;
22 + long excl = 1;
23 +
24 + enable_mte(PR_MTE_TCF_SYNC);
25 + p0 = alloc_mte_mem(sizeof(*p0));
26 +
27 + /* Create two differently tagged pointers. */
28 + asm("irg %0,%1,%2" : "=r"(p1) : "r"(p0), "r"(excl));
29 + asm("gmi %0,%1,%0" : "+r"(excl) : "r" (p1));
30 + assert(excl != 1);
31 + asm("irg %0,%1,%2" : "=r"(p2) : "r"(p0), "r"(excl));
32 + assert(p1 != p2);
33 +
34 + /* Store the tag from the first pointer. */
35 + asm("stg %0, [%0]" : : "r"(p1));
36 +
37 + *p1 = 0;
38 +
39 + memset(&sa, 0, sizeof(sa));
40 + sa.sa_sigaction = pass;
41 + sa.sa_flags = SA_SIGINFO;
42 + sigaction(SIGSEGV, &sa, NULL);
43 +
44 + faulting_ptr = p2;
45 + *p2 = 0;
46 +
47 + abort();
48 +}