]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
kselftest/arm64/mte: Add address tag related macro and function
authorYeoreum Yun <yeoreum.yun@arm.com>
Wed, 18 Jun 2025 08:45:10 +0000 (09:45 +0100)
committerCatalin Marinas <catalin.marinas@arm.com>
Wed, 2 Jul 2025 16:55:20 +0000 (17:55 +0100)
Add address tag related macro and function to test MTE_FAR feature.

Signed-off-by: Yeoreum Yun <yeoreum.yun@arm.com>
Reviewed-by: Mark Brown <broonie@kernel.org>
Link: https://lore.kernel.org/r/20250618084513.1761345-8-yeoreum.yun@arm.com
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
tools/testing/selftests/arm64/mte/mte_common_util.c
tools/testing/selftests/arm64/mte/mte_common_util.h
tools/testing/selftests/arm64/mte/mte_def.h

index 5c5680a874982a04ec4b516500e77981febb8314..d9702a542cb63559847c24aeed340eb58b27bad8 100644 (file)
@@ -6,6 +6,7 @@
 #include <signal.h>
 #include <stdio.h>
 #include <stdlib.h>
+#include <time.h>
 #include <unistd.h>
 
 #include <linux/auxvec.h>
@@ -130,6 +131,19 @@ void mte_clear_tags(void *ptr, size_t size)
        mte_clear_tag_address_range(ptr, size);
 }
 
+void *mte_insert_atag(void *ptr)
+{
+       unsigned char atag;
+
+       atag =  mtefar_support ? (random() % MT_ATAG_MASK) + 1 : 0;
+       return (void *)MT_SET_ATAG((unsigned long)ptr, atag);
+}
+
+void *mte_clear_atag(void *ptr)
+{
+       return (void *)MT_CLEAR_ATAG((unsigned long)ptr);
+}
+
 static void *__mte_allocate_memory_range(size_t size, int mem_type, int mapping,
                                         size_t range_before, size_t range_after,
                                         bool tags, int fd)
@@ -330,6 +344,9 @@ int mte_default_setup(void)
        unsigned long en = 0;
        int ret;
 
+       /* To generate random address tag */
+       srandom(time(NULL));
+
        if (!(hwcaps2 & HWCAP2_MTE))
                ksft_exit_skip("MTE features unavailable\n");
 
index 4e1dd959df9b80eed80e025de8b8a9d5c46405cd..045e4ad2f0182faefd4b98a912b073ed38555695 100644 (file)
@@ -56,6 +56,8 @@ void mte_free_memory_tag_range(void *ptr, size_t size, int mem_type,
                               size_t range_before, size_t range_after);
 void *mte_insert_tags(void *ptr, size_t size);
 void mte_clear_tags(void *ptr, size_t size);
+void *mte_insert_atag(void *ptr);
+void *mte_clear_atag(void *ptr);
 int mte_default_setup(void);
 void mte_restore_setup(void);
 int mte_switch_mode(int mte_option, unsigned long incl_mask);
index 9b188254b61a34f83b1a3abf64b6a77817f9f1bc..6ad22f07c9b884fb8ed074e2f47b3ad16024a2b9 100644 (file)
@@ -42,6 +42,8 @@
 #define MT_TAG_COUNT           16
 #define MT_INCLUDE_TAG_MASK    0xFFFF
 #define MT_EXCLUDE_TAG_MASK    0x0
+#define MT_ATAG_SHIFT          60
+#define MT_ATAG_MASK           0xFUL
 
 #define MT_ALIGN_GRANULE       (MT_GRANULE_SIZE - 1)
 #define MT_CLEAR_TAG(x)                ((x) & ~(MT_TAG_MASK << MT_TAG_SHIFT))
 #define MT_FETCH_TAG(x)                ((x >> MT_TAG_SHIFT) & (MT_TAG_MASK))
 #define MT_ALIGN_UP(x)         ((x + MT_ALIGN_GRANULE) & ~(MT_ALIGN_GRANULE))
 
+#define MT_CLEAR_ATAG(x)       ((x) & ~(MT_TAG_MASK << MT_ATAG_SHIFT))
+#define MT_SET_ATAG(x, y)      ((x) | (((y) & MT_ATAG_MASK) << MT_ATAG_SHIFT))
+#define MT_FETCH_ATAG(x)       ((x >> MT_ATAG_SHIFT) & (MT_ATAG_MASK))
+
+#define MT_CLEAR_TAGS(x)       (MT_CLEAR_ATAG(MT_CLEAR_TAG(x)))
+
 #define MT_PSTATE_TCO_SHIFT    25
 #define MT_PSTATE_TCO_MASK     ~(0x1 << MT_PSTATE_TCO_SHIFT)
 #define MT_PSTATE_TCO_EN       1