Commit ed434c6e authored by Yeoreum Yun's avatar Yeoreum Yun Committed by Catalin Marinas
Browse files

kselftest/arm64/mte: Add address tag related macro and function



Add address tag related macro and function to test MTE_FAR feature.

Signed-off-by: default avatarYeoreum Yun <yeoreum.yun@arm.com>
Reviewed-by: default avatarMark Brown <broonie@kernel.org>
Link: https://lore.kernel.org/r/20250618084513.1761345-8-yeoreum.yun@arm.com


Signed-off-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
parent 2e3e3565
Loading
Loading
Loading
Loading
+17 −0
Original line number Diff line number Diff line
@@ -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");

+2 −0
Original line number Diff line number Diff line
@@ -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);
+8 −0
Original line number Diff line number Diff line
@@ -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))
@@ -49,6 +51,12 @@
#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