From nobody Sat Oct 11 00:24:18 2025 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id E002322331E; Wed, 11 Jun 2025 18:07:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.140.110.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749665265; cv=none; b=aa2P7zCBOZuuFUd+Rp6PI0GE0jCLVBAxRI0HIu3SiG7cihlQCClpXWxQCvj+VEdgJJjwVLY/bUx60fGcRj6O3J3xHp0T5/bWcM+xXZCyyHCsjKAqh9sAoLpGnavccVJAaJ/Wyup/CiWFik1fcu1bN5qrjlYcwHH88UuFGI5YzyI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749665265; c=relaxed/simple; bh=+JIrPuGS8nUD4SB8FQOcnnhPfYRc/S7ugJdAbyTE1SM=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=px/npZbt0mo+T4baIVzjQtHJ/wqKEF2QrCo8Mg2haZa+5byMpHFdE2YATBQ8xQkYJMbKLdZPpH5lvBE0IgYHl6pWhiyQDkUageeKqBbE/yF0EIaEZO//OFQ+dupYYBPbrtBGaQwMrsn5vVp54iNewqebi03Y5IT8YlhE/8Nj4LY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com; spf=pass smtp.mailfrom=arm.com; arc=none smtp.client-ip=217.140.110.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=arm.com Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 5E7391688; Wed, 11 Jun 2025 11:07:23 -0700 (PDT) Received: from e129823.cambridge.arm.com (e129823.arm.com [10.1.197.6]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id CCE3A3F673; Wed, 11 Jun 2025 11:07:40 -0700 (PDT) From: Yeoreum Yun To: catalin.marinas@arm.com, pcc@google.com, will@kernel.org, broonie@kernel.org, anshuman.khandual@arm.com, joey.gouly@arm.com, yury.khrustalev@arm.com, maz@kernel.org, oliver.upton@linux.dev, frederic@kernel.org, akpm@linux-foundation.org, surenb@google.com Cc: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Yeoreum Yun Subject: [PATCH v8 1/9] arm64/cpufeature: add FEAT_MTE_TAGGED_FAR feature Date: Wed, 11 Jun 2025 19:07:26 +0100 Message-Id: <20250611180734.63657-2-yeoreum.yun@arm.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250611180734.63657-1-yeoreum.yun@arm.com> References: <20250611180734.63657-1-yeoreum.yun@arm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add FEAT_MTE_TAGGED_FAR cpucap which makes FAR_ELx report all non-address bits on a synchronous MTE tag check fault since Armv8.9 Signed-off-by: Yeoreum Yun Acked-by: Yury Khrustalev --- arch/arm64/kernel/cpufeature.c | 8 ++++++++ arch/arm64/tools/cpucaps | 1 + 2 files changed, 9 insertions(+) diff --git a/arch/arm64/kernel/cpufeature.c b/arch/arm64/kernel/cpufeature.c index b34044e20128..af6a6924a3e8 100644 --- a/arch/arm64/kernel/cpufeature.c +++ b/arch/arm64/kernel/cpufeature.c @@ -320,6 +320,7 @@ static const struct arm64_ftr_bits ftr_id_aa64pfr1[] = =3D { =20 static const struct arm64_ftr_bits ftr_id_aa64pfr2[] =3D { ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_LOWER_SAFE, ID_AA64PFR2_EL1_F= PMR_SHIFT, 4, 0), + ARM64_FTR_BITS(FTR_VISIBLE, FTR_NONSTRICT, FTR_LOWER_SAFE, ID_AA64PFR2_EL= 1_MTEFAR_SHIFT, 4, ID_AA64PFR2_EL1_MTEFAR_NI), ARM64_FTR_END, }; =20 @@ -2874,6 +2875,13 @@ static const struct arm64_cpu_capabilities arm64_fea= tures[] =3D { .matches =3D has_cpuid_feature, ARM64_CPUID_FIELDS(ID_AA64PFR1_EL1, MTE, MTE3) }, + { + .desc =3D "FAR on MTE Tag Check Fault", + .capability =3D ARM64_MTE_FAR, + .type =3D ARM64_CPUCAP_SYSTEM_FEATURE, + .matches =3D has_cpuid_feature, + ARM64_CPUID_FIELDS(ID_AA64PFR2_EL1, MTEFAR, IMP) + }, #endif /* CONFIG_ARM64_MTE */ { .desc =3D "RCpc load-acquire (LDAPR)", diff --git a/arch/arm64/tools/cpucaps b/arch/arm64/tools/cpucaps index 10effd4cff6b..fe8f4f8ce95c 100644 --- a/arch/arm64/tools/cpucaps +++ b/arch/arm64/tools/cpucaps @@ -68,6 +68,7 @@ MPAM MPAM_HCR MTE MTE_ASYMM +MTE_FAR SME SME_FA64 SME2 --=20 LEVI:{C3F47F37-75D8-414A-A8BA-3980EC8A46D7} From nobody Sat Oct 11 00:24:18 2025 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 2F76D27CCDB; Wed, 11 Jun 2025 18:07:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.140.110.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749665267; cv=none; b=BAiFC96z9ljPiY4L//g3rGmVAu6+/RwIPLMJmpq0RTESxp3Ju96r/fJtkG0KFhgDtrDxSBTfKR6EwxcZ4YLOQQBua7aZ/r3e40GeN77vywq978wnxYtvweU6sCoNpwSa6SqL/vAgnkplmcFmHjWvvw+6fOUwOmxuqGIanGT6lmg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749665267; c=relaxed/simple; bh=85tOdC7OURh2ZbL/F08AO0a0Wwl27m6CoU9i/qdIXU4=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=L0/OJlPXzhyW1a28D07UUzuijpH9Shi0jtlNq5532mq7Abd7otTRYN6LKFSkmWvF76sztl8Iv80HCAAQJMEaOiPHsr8DwvwCoqGxGejXmK6YZuxVzb8by7jw9Tdj0H0zmVMXXjyifPJ7e76GelM5x0G8dH1VwAXhW/Vw1SoW+9A= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com; spf=pass smtp.mailfrom=arm.com; arc=none smtp.client-ip=217.140.110.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=arm.com Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id E3CEC15A1; Wed, 11 Jun 2025 11:07:25 -0700 (PDT) Received: from e129823.cambridge.arm.com (e129823.arm.com [10.1.197.6]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 5CAFB3F673; Wed, 11 Jun 2025 11:07:43 -0700 (PDT) From: Yeoreum Yun To: catalin.marinas@arm.com, pcc@google.com, will@kernel.org, broonie@kernel.org, anshuman.khandual@arm.com, joey.gouly@arm.com, yury.khrustalev@arm.com, maz@kernel.org, oliver.upton@linux.dev, frederic@kernel.org, akpm@linux-foundation.org, surenb@google.com Cc: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Yeoreum Yun Subject: [PATCH v8 2/9] arm64: report address tag when FEAT_MTE_TAGGED_FAR is supported Date: Wed, 11 Jun 2025 19:07:27 +0100 Message-Id: <20250611180734.63657-3-yeoreum.yun@arm.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250611180734.63657-1-yeoreum.yun@arm.com> References: <20250611180734.63657-1-yeoreum.yun@arm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" If FEAT_MTE_TAGGED_FAR (Armv8.9) is supported, bits 63:60 of the fault addr= ess are preserved in response to synchronous tag check faults (SEGV_MTESERR). This patch modifies below to support this feature: - Use the original FAR_EL1 value when an MTE tag check fault occurs, if ARM64_MTE_FAR is supported so that not only logical tag (bits 59:56) but also address tag (bits 63:60] being reported too. - Add HWCAP for mtefar to let user know bits 63:60 includes address tag information when when FEAT_MTE_TAGGED_FAR is supported. Applications that require this information should install a signal handler with the SA_EXPOSE_TAGBITS flag. While this introduces a minor ABI change, most applications do not set this flag and therefore will not be affected. Signed-off-by: Yeoreum Yun --- Documentation/arch/arm64/elf_hwcaps.rst | 3 +++ Documentation/arch/arm64/tagged-pointers.rst | 11 ++++++----- arch/arm64/include/asm/hwcap.h | 1 + arch/arm64/include/uapi/asm/hwcap.h | 1 + arch/arm64/kernel/cpufeature.c | 1 + arch/arm64/kernel/cpuinfo.c | 1 + arch/arm64/mm/fault.c | 7 +++++-- 7 files changed, 18 insertions(+), 7 deletions(-) diff --git a/Documentation/arch/arm64/elf_hwcaps.rst b/Documentation/arch/a= rm64/elf_hwcaps.rst index 69d7afe56853..358f5af035ff 100644 --- a/Documentation/arch/arm64/elf_hwcaps.rst +++ b/Documentation/arch/arm64/elf_hwcaps.rst @@ -435,6 +435,9 @@ HWCAP2_SME_SF8DP4 HWCAP2_POE Functionality implied by ID_AA64MMFR3_EL1.S1POE =3D=3D 0b0001. =20 +HWCAP3_MTE_FAR + Functionality implied by ID_AA64PFR2_EL1.MTEFAR =3D=3D 0b0001. + 4. Unused AT_HWCAP bits ----------------------- =20 diff --git a/Documentation/arch/arm64/tagged-pointers.rst b/Documentation/a= rch/arm64/tagged-pointers.rst index 81b6c2a770dd..f87a925ca9a5 100644 --- a/Documentation/arch/arm64/tagged-pointers.rst +++ b/Documentation/arch/arm64/tagged-pointers.rst @@ -60,11 +60,12 @@ that signal handlers in applications making use of tags= cannot rely on the tag information for user virtual addresses being maintained in these fields unless the flag was set. =20 -Due to architecture limitations, bits 63:60 of the fault address -are not preserved in response to synchronous tag check faults -(SEGV_MTESERR) even if SA_EXPOSE_TAGBITS was set. Applications should -treat the values of these bits as undefined in order to accommodate -future architecture revisions which may preserve the bits. +If FEAT_MTE_TAGGED_FAR (Armv8.9) is supported, bits 63:60 of the fault add= ress +are preserved in response to synchronous tag check faults (SEGV_MTESERR) +otherwise not preserved even if SA_EXPOSE_TAGBITS was set. +Applications should interpret the values of these bits based on +the support for the HWCAP3_MTE_FAR. If the support is not present, +the values of these bits should be considered as undefined otherwise valid. =20 For signals raised in response to watchpoint debug exceptions, the tag information will be preserved regardless of the SA_EXPOSE_TAGBITS diff --git a/arch/arm64/include/asm/hwcap.h b/arch/arm64/include/asm/hwcap.h index 1c3f9617d54f..28dd1ac29ecc 100644 --- a/arch/arm64/include/asm/hwcap.h +++ b/arch/arm64/include/asm/hwcap.h @@ -176,6 +176,7 @@ #define KERNEL_HWCAP_POE __khwcap2_feature(POE) =20 #define __khwcap3_feature(x) (const_ilog2(HWCAP3_ ## x) + 128) +#define KERNEL_HWCAP_MTE_FAR __khwcap3_feature(MTE_FAR) =20 /* * This yields a mask that user programs can use to figure out what diff --git a/arch/arm64/include/uapi/asm/hwcap.h b/arch/arm64/include/uapi/= asm/hwcap.h index 705a7afa8e58..7d22527a7975 100644 --- a/arch/arm64/include/uapi/asm/hwcap.h +++ b/arch/arm64/include/uapi/asm/hwcap.h @@ -143,5 +143,6 @@ /* * HWCAP3 flags - for AT_HWCAP3 */ +#define HWCAP3_MTE_FAR (1UL << 0) =20 #endif /* _UAPI__ASM_HWCAP_H */ diff --git a/arch/arm64/kernel/cpufeature.c b/arch/arm64/kernel/cpufeature.c index af6a6924a3e8..8a5284c733b7 100644 --- a/arch/arm64/kernel/cpufeature.c +++ b/arch/arm64/kernel/cpufeature.c @@ -3219,6 +3219,7 @@ static const struct arm64_cpu_capabilities arm64_elf_= hwcaps[] =3D { #ifdef CONFIG_ARM64_MTE HWCAP_CAP(ID_AA64PFR1_EL1, MTE, MTE2, CAP_HWCAP, KERNEL_HWCAP_MTE), HWCAP_CAP(ID_AA64PFR1_EL1, MTE, MTE3, CAP_HWCAP, KERNEL_HWCAP_MTE3), + HWCAP_CAP(ID_AA64PFR2_EL1, MTEFAR, IMP, CAP_HWCAP, KERNEL_HWCAP_MTE_FAR), #endif /* CONFIG_ARM64_MTE */ HWCAP_CAP(ID_AA64MMFR0_EL1, ECV, IMP, CAP_HWCAP, KERNEL_HWCAP_ECV), HWCAP_CAP(ID_AA64MMFR1_EL1, AFP, IMP, CAP_HWCAP, KERNEL_HWCAP_AFP), diff --git a/arch/arm64/kernel/cpuinfo.c b/arch/arm64/kernel/cpuinfo.c index c1f2b6b04b41..e552cb305641 100644 --- a/arch/arm64/kernel/cpuinfo.c +++ b/arch/arm64/kernel/cpuinfo.c @@ -160,6 +160,7 @@ static const char *const hwcap_str[] =3D { [KERNEL_HWCAP_SME_SFEXPA] =3D "smesfexpa", [KERNEL_HWCAP_SME_STMOP] =3D "smestmop", [KERNEL_HWCAP_SME_SMOP4] =3D "smesmop4", + [KERNEL_HWCAP_MTE_FAR] =3D "mtefar", }; =20 #ifdef CONFIG_COMPAT diff --git a/arch/arm64/mm/fault.c b/arch/arm64/mm/fault.c index ec0a337891dd..832d8540e13b 100644 --- a/arch/arm64/mm/fault.c +++ b/arch/arm64/mm/fault.c @@ -837,9 +837,12 @@ static int do_tag_check_fault(unsigned long far, unsig= ned long esr, /* * The architecture specifies that bits 63:60 of FAR_EL1 are UNKNOWN * for tag check faults. Set them to corresponding bits in the untagged - * address. + * address if ARM64_MTE_FAR isn't supported. + * Otherwise, bits 63:60 of FAR_EL1 are not UNKNOWN. */ - far =3D (__untagged_addr(far) & ~MTE_TAG_MASK) | (far & MTE_TAG_MASK); + if (!cpus_have_cap(ARM64_MTE_FAR)) + far =3D (__untagged_addr(far) & ~MTE_TAG_MASK) | (far & MTE_TAG_MASK); + do_bad_area(far, esr, regs); return 0; } --=20 LEVI:{C3F47F37-75D8-414A-A8BA-3980EC8A46D7} From nobody Sat Oct 11 00:24:18 2025 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id DA55128C876; Wed, 11 Jun 2025 18:07:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.140.110.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749665270; cv=none; b=PDAWPCwYY37xqdSjZ/9kXOdanA2rsWGEsxlEZ8ZUPum1vIv0QL7uK1zBtaNq/aI4WYjwF2nq3YqrUvZRkjzO+MT4t/xYx2IIuqWvvz7iTmY2CGE7ArUStXijzWoMwlg82qJLOEVCFeU8rPT+DZsXNbj11Gm/EUjmMkR7gkSamJE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749665270; c=relaxed/simple; bh=YVJN70PPzT45Ed+Rn7QD3cSXjFB9D3eO316oNojiBiM=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=blfqPO69to2hHkeHJq+QsM1oQQWUvTh6WMLIaiBMrZIcjQ/yflztSeZUtAN9Af39pm2h2VlmStFhKwZZoU3JMhvW7rUnpcxEcnt+CLSzIki+SOe1ZeUfc/9fdVbFFjnO/UUDZagnc33WyvfFFELktHfH7Ku6g1YiO6FYVUDqsJA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com; spf=pass smtp.mailfrom=arm.com; arc=none smtp.client-ip=217.140.110.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=arm.com Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 8566115A1; Wed, 11 Jun 2025 11:07:28 -0700 (PDT) Received: from e129823.cambridge.arm.com (e129823.arm.com [10.1.197.6]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id E080A3F673; Wed, 11 Jun 2025 11:07:45 -0700 (PDT) From: Yeoreum Yun To: catalin.marinas@arm.com, pcc@google.com, will@kernel.org, broonie@kernel.org, anshuman.khandual@arm.com, joey.gouly@arm.com, yury.khrustalev@arm.com, maz@kernel.org, oliver.upton@linux.dev, frederic@kernel.org, akpm@linux-foundation.org, surenb@google.com Cc: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Yeoreum Yun Subject: [PATCH v8 3/9] tools/kselftest: add MTE_FAR hwcap test Date: Wed, 11 Jun 2025 19:07:28 +0100 Message-Id: <20250611180734.63657-4-yeoreum.yun@arm.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250611180734.63657-1-yeoreum.yun@arm.com> References: <20250611180734.63657-1-yeoreum.yun@arm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" add MTE_FAR hwcap test on kselftest. Signed-off-by: Yeoreum Yun Reviewed-by: Mark Brown --- tools/testing/selftests/arm64/abi/hwcap.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tools/testing/selftests/arm64/abi/hwcap.c b/tools/testing/self= tests/arm64/abi/hwcap.c index 35f521e5f41c..e60bfb798ba2 100644 --- a/tools/testing/selftests/arm64/abi/hwcap.c +++ b/tools/testing/selftests/arm64/abi/hwcap.c @@ -1098,6 +1098,12 @@ static const struct hwcap_data { .sigill_fn =3D hbc_sigill, .sigill_reliable =3D true, }, + { + .name =3D "MTE_FAR", + .at_hwcap =3D AT_HWCAP3, + .hwcap_bit =3D HWCAP3_MTE_FAR, + .cpuinfo =3D "mtefar", + }, }; =20 typedef void (*sighandler_fn)(int, siginfo_t *, void *); --=20 LEVI:{C3F47F37-75D8-414A-A8BA-3980EC8A46D7} From nobody Sat Oct 11 00:24:18 2025 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 4E54C2BD015; Wed, 11 Jun 2025 18:07:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.140.110.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749665273; cv=none; b=LAfqOn20wiX89okCeFawHseuzqNs6xSO9yVMpQy8ty0t401iy1TyQ+/+AGzY5XtpHAtSiLeb8xOh+Z81cpjGk34YpNdSecHLxLYXhS8FcOcF6VYiweFgh49Zrv+H5ZibSxmQVvPf93wDD40H0Ud/BWlXZjOjggk9YIakaPY4xds= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749665273; c=relaxed/simple; bh=2k+/Ki0NTtqVgGnbH15IcLWubCSrgd5KKXBaHhocAUg=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=XJyg5SwMYKscq4s2vXkcW/zI8TabvNVvvnSPfNxOB+5Kp39gKdHDdSmbXCnT7RiQ1BkGLhPcazoU51JGhUHtmVEFtswp5rT0W2DTxUAHXvt3PDW9hSRuAasHjJC6R/zx8xNaOOuYbQVcS+q/ZG9Qq2JwkoykMm6xYCO9kP+AdIg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com; spf=pass smtp.mailfrom=arm.com; arc=none smtp.client-ip=217.140.110.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=arm.com Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 0CA1715A1; Wed, 11 Jun 2025 11:07:31 -0700 (PDT) Received: from e129823.cambridge.arm.com (e129823.arm.com [10.1.197.6]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 793BC3F673; Wed, 11 Jun 2025 11:07:48 -0700 (PDT) From: Yeoreum Yun To: catalin.marinas@arm.com, pcc@google.com, will@kernel.org, broonie@kernel.org, anshuman.khandual@arm.com, joey.gouly@arm.com, yury.khrustalev@arm.com, maz@kernel.org, oliver.upton@linux.dev, frederic@kernel.org, akpm@linux-foundation.org, surenb@google.com Cc: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Yeoreum Yun Subject: [PATCH v8 4/9] kselftest/arm64/mte: register mte signal handler with SA_EXPOSE_TAGBITS Date: Wed, 11 Jun 2025 19:07:29 +0100 Message-Id: <20250611180734.63657-5-yeoreum.yun@arm.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250611180734.63657-1-yeoreum.yun@arm.com> References: <20250611180734.63657-1-yeoreum.yun@arm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" To test address tag[63:60] and memory tag[59:56] is preserved when memory tag fault happen, Let mte_register_signal() to register signal handler with SA_EXPOSE_TAGBITS. Signed-off-by: Yeoreum Yun Reviewed-by: Mark Brown --- tools/testing/selftests/arm64/mte/check_buffer_fill.c | 2 +- .../testing/selftests/arm64/mte/check_child_memory.c | 4 ++-- .../selftests/arm64/mte/check_hugetlb_options.c | 4 ++-- tools/testing/selftests/arm64/mte/check_ksm_options.c | 4 ++-- .../testing/selftests/arm64/mte/check_mmap_options.c | 4 ++-- .../selftests/arm64/mte/check_tags_inclusion.c | 2 +- tools/testing/selftests/arm64/mte/check_user_mem.c | 2 +- tools/testing/selftests/arm64/mte/mte_common_util.c | 11 ++++++++++- tools/testing/selftests/arm64/mte/mte_common_util.h | 3 ++- 9 files changed, 23 insertions(+), 13 deletions(-) diff --git a/tools/testing/selftests/arm64/mte/check_buffer_fill.c b/tools/= testing/selftests/arm64/mte/check_buffer_fill.c index 2ee7f114d7fa..5248b5265aa4 100644 --- a/tools/testing/selftests/arm64/mte/check_buffer_fill.c +++ b/tools/testing/selftests/arm64/mte/check_buffer_fill.c @@ -415,7 +415,7 @@ int main(int argc, char *argv[]) return err; =20 /* Register SIGSEGV handler */ - mte_register_signal(SIGSEGV, mte_default_handler); + mte_register_signal(SIGSEGV, mte_default_handler, false); =20 /* Set test plan */ ksft_set_plan(20); diff --git a/tools/testing/selftests/arm64/mte/check_child_memory.c b/tools= /testing/selftests/arm64/mte/check_child_memory.c index 7597fc632cad..b97ea3981c21 100644 --- a/tools/testing/selftests/arm64/mte/check_child_memory.c +++ b/tools/testing/selftests/arm64/mte/check_child_memory.c @@ -160,8 +160,8 @@ int main(int argc, char *argv[]) return err; =20 /* Register SIGSEGV handler */ - mte_register_signal(SIGSEGV, mte_default_handler); - mte_register_signal(SIGBUS, mte_default_handler); + mte_register_signal(SIGSEGV, mte_default_handler, false); + mte_register_signal(SIGBUS, mte_default_handler, false); =20 /* Set test plan */ ksft_set_plan(12); diff --git a/tools/testing/selftests/arm64/mte/check_hugetlb_options.c b/to= ols/testing/selftests/arm64/mte/check_hugetlb_options.c index 3bfcd3848432..4e644a606394 100644 --- a/tools/testing/selftests/arm64/mte/check_hugetlb_options.c +++ b/tools/testing/selftests/arm64/mte/check_hugetlb_options.c @@ -235,8 +235,8 @@ int main(int argc, char *argv[]) return err; =20 /* Register signal handlers */ - mte_register_signal(SIGBUS, mte_default_handler); - mte_register_signal(SIGSEGV, mte_default_handler); + mte_register_signal(SIGBUS, mte_default_handler, false); + mte_register_signal(SIGSEGV, mte_default_handler, false); =20 allocate_hugetlb(); =20 diff --git a/tools/testing/selftests/arm64/mte/check_ksm_options.c b/tools/= testing/selftests/arm64/mte/check_ksm_options.c index 88c74bc46d4f..afea4e381862 100644 --- a/tools/testing/selftests/arm64/mte/check_ksm_options.c +++ b/tools/testing/selftests/arm64/mte/check_ksm_options.c @@ -141,8 +141,8 @@ int main(int argc, char *argv[]) return KSFT_FAIL; } /* Register signal handlers */ - mte_register_signal(SIGBUS, mte_default_handler); - mte_register_signal(SIGSEGV, mte_default_handler); + mte_register_signal(SIGBUS, mte_default_handler, false); + mte_register_signal(SIGSEGV, mte_default_handler, false); =20 /* Set test plan */ ksft_set_plan(4); diff --git a/tools/testing/selftests/arm64/mte/check_mmap_options.c b/tools= /testing/selftests/arm64/mte/check_mmap_options.c index 17694caaff53..b37bf481c9f9 100644 --- a/tools/testing/selftests/arm64/mte/check_mmap_options.c +++ b/tools/testing/selftests/arm64/mte/check_mmap_options.c @@ -201,8 +201,8 @@ int main(int argc, char *argv[]) sizes[item - 1] =3D page_size + 1; =20 /* Register signal handlers */ - mte_register_signal(SIGBUS, mte_default_handler); - mte_register_signal(SIGSEGV, mte_default_handler); + mte_register_signal(SIGBUS, mte_default_handler, false); + mte_register_signal(SIGSEGV, mte_default_handler, false); =20 /* Set test plan */ ksft_set_plan(22); diff --git a/tools/testing/selftests/arm64/mte/check_tags_inclusion.c b/too= ls/testing/selftests/arm64/mte/check_tags_inclusion.c index a3d1e23fe02a..b96296ab9870 100644 --- a/tools/testing/selftests/arm64/mte/check_tags_inclusion.c +++ b/tools/testing/selftests/arm64/mte/check_tags_inclusion.c @@ -180,7 +180,7 @@ int main(int argc, char *argv[]) return err; =20 /* Register SIGSEGV handler */ - mte_register_signal(SIGSEGV, mte_default_handler); + mte_register_signal(SIGSEGV, mte_default_handler, false); =20 /* Set test plan */ ksft_set_plan(4); diff --git a/tools/testing/selftests/arm64/mte/check_user_mem.c b/tools/tes= ting/selftests/arm64/mte/check_user_mem.c index f4ae5f87a3b7..d1d14aaaba16 100644 --- a/tools/testing/selftests/arm64/mte/check_user_mem.c +++ b/tools/testing/selftests/arm64/mte/check_user_mem.c @@ -211,7 +211,7 @@ int main(int argc, char *argv[]) return err; =20 /* Register signal handlers */ - mte_register_signal(SIGSEGV, mte_default_handler); + mte_register_signal(SIGSEGV, mte_default_handler, false); =20 /* Set test plan */ ksft_set_plan(64); diff --git a/tools/testing/selftests/arm64/mte/mte_common_util.c b/tools/te= sting/selftests/arm64/mte/mte_common_util.c index a1dc2fe5285b..83240b980f9c 100644 --- a/tools/testing/selftests/arm64/mte/mte_common_util.c +++ b/tools/testing/selftests/arm64/mte/mte_common_util.c @@ -19,6 +19,10 @@ #include "mte_common_util.h" #include "mte_def.h" =20 +#ifndef SA_EXPOSE_TAGBITS +#define SA_EXPOSE_TAGBITS 0x00000800 +#endif + #define INIT_BUFFER_SIZE 256 =20 struct mte_fault_cxt cur_mte_cxt; @@ -79,12 +83,17 @@ void mte_default_handler(int signum, siginfo_t *si, voi= d *uc) } } =20 -void mte_register_signal(int signal, void (*handler)(int, siginfo_t *, voi= d *)) +void mte_register_signal(int signal, void (*handler)(int, siginfo_t *, voi= d *), + bool export_tags) { struct sigaction sa; =20 sa.sa_sigaction =3D handler; sa.sa_flags =3D SA_SIGINFO; + + if (export_tags && signal =3D=3D SIGSEGV) + sa.sa_flags |=3D SA_EXPOSE_TAGBITS; + sigemptyset(&sa.sa_mask); sigaction(signal, &sa, NULL); } diff --git a/tools/testing/selftests/arm64/mte/mte_common_util.h b/tools/te= sting/selftests/arm64/mte/mte_common_util.h index a0017a303beb..6b109e84fa39 100644 --- a/tools/testing/selftests/arm64/mte/mte_common_util.h +++ b/tools/testing/selftests/arm64/mte/mte_common_util.h @@ -40,7 +40,8 @@ extern struct mte_fault_cxt cur_mte_cxt; =20 /* MTE utility functions */ void mte_default_handler(int signum, siginfo_t *si, void *uc); -void mte_register_signal(int signal, void (*handler)(int, siginfo_t *, voi= d *)); +void mte_register_signal(int signal, void (*handler)(int, siginfo_t *, voi= d *), + bool export_tags); void mte_wait_after_trig(void); void *mte_allocate_memory(size_t size, int mem_type, int mapping, bool tag= s); void *mte_allocate_memory_tag_range(size_t size, int mem_type, int mapping, --=20 LEVI:{C3F47F37-75D8-414A-A8BA-3980EC8A46D7} From nobody Sat Oct 11 00:24:18 2025 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 9A7D12BD5A7; Wed, 11 Jun 2025 18:07:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.140.110.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749665277; cv=none; b=qQ9ieJ9no9pVLqKcNn1BsBnj0Gfj/uIeDNCkau/rP3BKYBHGWxeHaJfPkTRe3AsfpPfyOseH9hr1iGdwMbdd9EJF3jJ/2WKfWKCpOF7GZKT71DWeErfoBzmTe5Uo+u6q4E9r/Rf23MUyPxnEmGHH5ntVEqQuBr1GsslCKCQF4gU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749665277; c=relaxed/simple; bh=2dLXgiGlLIuWNytTHUgJmAIojt6o20xHkHiEsBOOFwo=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=CGpaJAeMnL/0+7UwYqp03fCzjsGQoUvI5rMPsxokt9SSspgJSEAcIkjHO8Vz8YkgZvdAcm/4FwWkUOv2v3DyjX5egOYpEGa3WFN/UQsqqn8nDkvGx8loPX4UkavXAVZkgdMvgxtZdxTkYctN3RX3VnrlCvhJ0+d7gHV0cibyyAQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com; spf=pass smtp.mailfrom=arm.com; arc=none smtp.client-ip=217.140.110.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=arm.com Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 8F19E15A1; Wed, 11 Jun 2025 11:07:33 -0700 (PDT) Received: from e129823.cambridge.arm.com (e129823.arm.com [10.1.197.6]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 093643F673; Wed, 11 Jun 2025 11:07:50 -0700 (PDT) From: Yeoreum Yun To: catalin.marinas@arm.com, pcc@google.com, will@kernel.org, broonie@kernel.org, anshuman.khandual@arm.com, joey.gouly@arm.com, yury.khrustalev@arm.com, maz@kernel.org, oliver.upton@linux.dev, frederic@kernel.org, akpm@linux-foundation.org, surenb@google.com Cc: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Yeoreum Yun Subject: [PATCH v8 5/9] kselftest/arm64/mte: check MTE_FAR feature is supported Date: Wed, 11 Jun 2025 19:07:30 +0100 Message-Id: <20250611180734.63657-6-yeoreum.yun@arm.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250611180734.63657-1-yeoreum.yun@arm.com> References: <20250611180734.63657-1-yeoreum.yun@arm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" To run the MTE_FAR test when cpu supports MTE_FAR feature, check the MTE_FAR feature is supported in mte test. Signed-off-by: Yeoreum Yun Reviewed-by: Mark Brown --- tools/testing/selftests/arm64/mte/mte_common_util.c | 4 ++++ tools/testing/selftests/arm64/mte/mte_common_util.h | 1 + 2 files changed, 5 insertions(+) diff --git a/tools/testing/selftests/arm64/mte/mte_common_util.c b/tools/te= sting/selftests/arm64/mte/mte_common_util.c index 83240b980f9c..5c5680a87498 100644 --- a/tools/testing/selftests/arm64/mte/mte_common_util.c +++ b/tools/testing/selftests/arm64/mte/mte_common_util.c @@ -26,6 +26,7 @@ #define INIT_BUFFER_SIZE 256 =20 struct mte_fault_cxt cur_mte_cxt; +bool mtefar_support; static unsigned int mte_cur_mode; static unsigned int mte_cur_pstate_tco; =20 @@ -325,12 +326,15 @@ int mte_switch_mode(int mte_option, unsigned long inc= l_mask) int mte_default_setup(void) { unsigned long hwcaps2 =3D getauxval(AT_HWCAP2); + unsigned long hwcaps3 =3D getauxval(AT_HWCAP3); unsigned long en =3D 0; int ret; =20 if (!(hwcaps2 & HWCAP2_MTE)) ksft_exit_skip("MTE features unavailable\n"); =20 + mtefar_support =3D !!(hwcaps3 & HWCAP3_MTE_FAR); + /* Get current mte mode */ ret =3D prctl(PR_GET_TAGGED_ADDR_CTRL, en, 0, 0, 0); if (ret < 0) { diff --git a/tools/testing/selftests/arm64/mte/mte_common_util.h b/tools/te= sting/selftests/arm64/mte/mte_common_util.h index 6b109e84fa39..4e1dd959df9b 100644 --- a/tools/testing/selftests/arm64/mte/mte_common_util.h +++ b/tools/testing/selftests/arm64/mte/mte_common_util.h @@ -37,6 +37,7 @@ struct mte_fault_cxt { }; =20 extern struct mte_fault_cxt cur_mte_cxt; +extern bool mtefar_support; =20 /* MTE utility functions */ void mte_default_handler(int signum, siginfo_t *si, void *uc); --=20 LEVI:{C3F47F37-75D8-414A-A8BA-3980EC8A46D7} From nobody Sat Oct 11 00:24:18 2025 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 7642426E6FD; Wed, 11 Jun 2025 18:07:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.140.110.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749665278; cv=none; b=ptCZk+yBgC0dipWLA3hXc/bXZpOPZgecyU7Uh7YZLtQtNu2B15e4sOLHvxvud3hqB8XV8gOVm+3O8MSK7DIh8WbD1P8S4zqwSO/YXExQQyDAv/HaFET0wKVVK12123cxarQ1sNJTu2sSqo1t4hR64a80XGMmOh2c9erilm3el+k= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749665278; c=relaxed/simple; bh=/scxFsdOhOWauDCYQ6qQPC249bPouqja97HS52+FhHc=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=QtyompBBeWkkW4qZeqk4MgDgZJR8qabkKArjBganh24EhgjP07iR5mlLLxNtPFIHW37+UCD6FSUa+PpV26de9bIAp0OmtAMjfe3HJew4WV/qthdBhht4tPBssnaP3PpeDOB95q/sywONRIMNDSmbBxjJvvoatlxIhvs7AQrInrI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com; spf=pass smtp.mailfrom=arm.com; arc=none smtp.client-ip=217.140.110.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=arm.com Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 207F21688; Wed, 11 Jun 2025 11:07:36 -0700 (PDT) Received: from e129823.cambridge.arm.com (e129823.arm.com [10.1.197.6]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 8D3DD3F673; Wed, 11 Jun 2025 11:07:53 -0700 (PDT) From: Yeoreum Yun To: catalin.marinas@arm.com, pcc@google.com, will@kernel.org, broonie@kernel.org, anshuman.khandual@arm.com, joey.gouly@arm.com, yury.khrustalev@arm.com, maz@kernel.org, oliver.upton@linux.dev, frederic@kernel.org, akpm@linux-foundation.org, surenb@google.com Cc: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Yeoreum Yun Subject: [PATCH v8 6/9] kselftest/arm64/mte: add address tag related macro and function Date: Wed, 11 Jun 2025 19:07:31 +0100 Message-Id: <20250611180734.63657-7-yeoreum.yun@arm.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250611180734.63657-1-yeoreum.yun@arm.com> References: <20250611180734.63657-1-yeoreum.yun@arm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add address tag related macro and function to test MTE_FAR feature. Signed-off-by: Yeoreum Yun Reviewed-by: Mark Brown --- .../selftests/arm64/mte/mte_common_util.c | 17 +++++++++++++++++ .../selftests/arm64/mte/mte_common_util.h | 2 ++ tools/testing/selftests/arm64/mte/mte_def.h | 8 ++++++++ 3 files changed, 27 insertions(+) diff --git a/tools/testing/selftests/arm64/mte/mte_common_util.c b/tools/te= sting/selftests/arm64/mte/mte_common_util.c index 5c5680a87498..d9702a542cb6 100644 --- a/tools/testing/selftests/arm64/mte/mte_common_util.c +++ b/tools/testing/selftests/arm64/mte/mte_common_util.c @@ -6,6 +6,7 @@ #include #include #include +#include #include =20 #include @@ -130,6 +131,19 @@ void mte_clear_tags(void *ptr, size_t size) mte_clear_tag_address_range(ptr, size); } =20 +void *mte_insert_atag(void *ptr) +{ + unsigned char atag; + + atag =3D 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 ma= pping, size_t range_before, size_t range_after, bool tags, int fd) @@ -330,6 +344,9 @@ int mte_default_setup(void) unsigned long en =3D 0; int ret; =20 + /* To generate random address tag */ + srandom(time(NULL)); + if (!(hwcaps2 & HWCAP2_MTE)) ksft_exit_skip("MTE features unavailable\n"); =20 diff --git a/tools/testing/selftests/arm64/mte/mte_common_util.h b/tools/te= sting/selftests/arm64/mte/mte_common_util.h index 4e1dd959df9b..045e4ad2f018 100644 --- a/tools/testing/selftests/arm64/mte/mte_common_util.h +++ b/tools/testing/selftests/arm64/mte/mte_common_util.h @@ -56,6 +56,8 @@ void mte_free_memory_tag_range(void *ptr, size_t size, in= t 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); diff --git a/tools/testing/selftests/arm64/mte/mte_def.h b/tools/testing/se= lftests/arm64/mte/mte_def.h index 9b188254b61a..6ad22f07c9b8 100644 --- a/tools/testing/selftests/arm64/mte/mte_def.h +++ b/tools/testing/selftests/arm64/mte/mte_def.h @@ -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 =20 #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)) =20 +#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 --=20 LEVI:{C3F47F37-75D8-414A-A8BA-3980EC8A46D7} From nobody Sat Oct 11 00:24:18 2025 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 03D452BDC3D; Wed, 11 Jun 2025 18:07:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.140.110.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749665280; cv=none; b=RfL8QI0kzqjfEdMUGJFIFHho8kis9W2V1eaYtI8tkMKDMmXNL4Hn9OsVhYAU9DReD31v/1Z9ZBg4/+Us1mmwtnfE4VwSQ+qtS5gQwbsRRjKO4ROi8qaFsi/3jFFP3cjhDatfQCJC8HHzMVVasmgjentU8L6MixOAVGoNBybfK8g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749665280; c=relaxed/simple; bh=HA88CUWHfkAZaPnP2oWeB91Vz2S970QlnpfZ5k0CruQ=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=dAQ8U8KsDvZVB0pPSiWDijLYfWRFF6QPTXTw7Xd/y9G0lK3c7+35WLEwP1D33PW3Fi6mQ/x0WiaIE9+SItx0ngcLU49HLBEMq6CcHqocx393hfQdQei1aapYm8YQNvvOJ2obAb5z0u0w6QFGCv1sc6gmikVYDKgbjKaHvRQrJ3E= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com; spf=pass smtp.mailfrom=arm.com; arc=none smtp.client-ip=217.140.110.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=arm.com Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id A498515A1; Wed, 11 Jun 2025 11:07:38 -0700 (PDT) Received: from e129823.cambridge.arm.com (e129823.arm.com [10.1.197.6]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 1D5193F673; Wed, 11 Jun 2025 11:07:55 -0700 (PDT) From: Yeoreum Yun To: catalin.marinas@arm.com, pcc@google.com, will@kernel.org, broonie@kernel.org, anshuman.khandual@arm.com, joey.gouly@arm.com, yury.khrustalev@arm.com, maz@kernel.org, oliver.upton@linux.dev, frederic@kernel.org, akpm@linux-foundation.org, surenb@google.com Cc: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Yeoreum Yun Subject: [PATCH v8 7/9] kselftest/arm64/mte: add verification for address tag in signal handler Date: Wed, 11 Jun 2025 19:07:32 +0100 Message-Id: <20250611180734.63657-8-yeoreum.yun@arm.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250611180734.63657-1-yeoreum.yun@arm.com> References: <20250611180734.63657-1-yeoreum.yun@arm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add the address tag [63:60] verification when synchronous mte fault is happ= en. when signal handler is registered with SA_EXPOSE_TAGBITS, address includes not only memory tag [59:56] but also address tag. Therefore, when verify fault address location, remove both tags Signed-off-by: Yeoreum Yun Reviewed-by: Mark Brown --- .../selftests/arm64/mte/mte_common_util.c | 38 ++++++++++++++----- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/tools/testing/selftests/arm64/mte/mte_common_util.c b/tools/te= sting/selftests/arm64/mte/mte_common_util.c index d9702a542cb6..10dcbc37e379 100644 --- a/tools/testing/selftests/arm64/mte/mte_common_util.c +++ b/tools/testing/selftests/arm64/mte/mte_common_util.c @@ -33,12 +33,25 @@ static unsigned int mte_cur_pstate_tco; =20 void mte_default_handler(int signum, siginfo_t *si, void *uc) { + struct sigaction sa; unsigned long addr =3D (unsigned long)si->si_addr; + unsigned char si_tag, si_atag; + + sigaction(signum, NULL, &sa); + + if (sa.sa_flags & SA_EXPOSE_TAGBITS) { + si_tag =3D MT_FETCH_TAG(addr); + si_atag =3D MT_FETCH_ATAG(addr); + addr =3D MT_CLEAR_TAGS(addr); + } else { + si_tag =3D 0; + si_atag =3D 0; + } =20 if (signum =3D=3D SIGSEGV) { #ifdef DEBUG - ksft_print_msg("INFO: SIGSEGV signal at pc=3D%lx, fault addr=3D%lx, si_c= ode=3D%lx\n", - ((ucontext_t *)uc)->uc_mcontext.pc, addr, si->si_code); + ksft_print_msg("INFO: SIGSEGV signal at pc=3D%lx, fault addr=3D%lx, si_c= ode=3D%lx, si_tag=3D%x, si_atag=3D%x\n", + ((ucontext_t *)uc)->uc_mcontext.pc, addr, si->si_code, si_tag, si_atag= ); #endif if (si->si_code =3D=3D SEGV_MTEAERR) { if (cur_mte_cxt.trig_si_code =3D=3D si->si_code) @@ -51,13 +64,18 @@ void mte_default_handler(int signum, siginfo_t *si, voi= d *uc) } /* Compare the context for precise error */ else if (si->si_code =3D=3D SEGV_MTESERR) { + if ((!mtefar_support && si_atag) || (si_atag !=3D MT_FETCH_ATAG(cur_mte= _cxt.trig_addr))) { + ksft_print_msg("Invalid MTE synchronous exception caught for address t= ag! si_tag=3D%x, si_atag: %x\n", si_tag, si_atag); + exit(KSFT_FAIL); + } + if (cur_mte_cxt.trig_si_code =3D=3D si->si_code && ((cur_mte_cxt.trig_range >=3D 0 && - addr >=3D MT_CLEAR_TAG(cur_mte_cxt.trig_addr) && - addr <=3D (MT_CLEAR_TAG(cur_mte_cxt.trig_addr) + cur_mte_cxt.trig= _range)) || + addr >=3D MT_CLEAR_TAGS(cur_mte_cxt.trig_addr) && + addr <=3D (MT_CLEAR_TAGS(cur_mte_cxt.trig_addr) + cur_mte_cxt.tri= g_range)) || (cur_mte_cxt.trig_range < 0 && - addr <=3D MT_CLEAR_TAG(cur_mte_cxt.trig_addr) && - addr >=3D (MT_CLEAR_TAG(cur_mte_cxt.trig_addr) + cur_mte_cxt.trig= _range)))) { + addr <=3D MT_CLEAR_TAGS(cur_mte_cxt.trig_addr) && + addr >=3D (MT_CLEAR_TAGS(cur_mte_cxt.trig_addr) + cur_mte_cxt.tri= g_range)))) { cur_mte_cxt.fault_valid =3D true; /* Adjust the pc by 4 */ ((ucontext_t *)uc)->uc_mcontext.pc +=3D 4; @@ -73,11 +91,11 @@ void mte_default_handler(int signum, siginfo_t *si, voi= d *uc) ksft_print_msg("INFO: SIGBUS signal at pc=3D%llx, fault addr=3D%lx, si_c= ode=3D%x\n", ((ucontext_t *)uc)->uc_mcontext.pc, addr, si->si_code); if ((cur_mte_cxt.trig_range >=3D 0 && - addr >=3D MT_CLEAR_TAG(cur_mte_cxt.trig_addr) && - addr <=3D (MT_CLEAR_TAG(cur_mte_cxt.trig_addr) + cur_mte_cxt.trig_r= ange)) || + addr >=3D MT_CLEAR_TAGS(cur_mte_cxt.trig_addr) && + addr <=3D (MT_CLEAR_TAGS(cur_mte_cxt.trig_addr) + cur_mte_cxt.trig_= range)) || (cur_mte_cxt.trig_range < 0 && - addr <=3D MT_CLEAR_TAG(cur_mte_cxt.trig_addr) && - addr >=3D (MT_CLEAR_TAG(cur_mte_cxt.trig_addr) + cur_mte_cxt.trig_r= ange))) { + addr <=3D MT_CLEAR_TAGS(cur_mte_cxt.trig_addr) && + addr >=3D (MT_CLEAR_TAGS(cur_mte_cxt.trig_addr) + cur_mte_cxt.trig_= range))) { cur_mte_cxt.fault_valid =3D true; /* Adjust the pc by 4 */ ((ucontext_t *)uc)->uc_mcontext.pc +=3D 4; --=20 LEVI:{C3F47F37-75D8-414A-A8BA-3980EC8A46D7} From nobody Sat Oct 11 00:24:18 2025 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 40C6A2BE7C0; Wed, 11 Jun 2025 18:08:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.140.110.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749665283; cv=none; b=fGB9VO3/DEyk39Uuufdt+3SjQEP+p/wIvL0rYj4Qib4aVW2Mao5f26ZVAa0Ny0IwTfGmXH3woKoTTF00D9babQyEOJRpMUx6qMo2vVoEwyCCZEUuNA+DQi9JBfjK7ZJkMygnEZ9y5vDq1ZrEiI4i7ThCNoX2pvHUaQsjjXZ2z2A= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749665283; c=relaxed/simple; bh=3yYopPMzbPPAcQb5u88F/DY3HGR4llaLo3SO0HxtaZs=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=oxOhgKBlWFTabIC1lUjRlYp/QtU05iX+yNMZdHXH6WN9AQ+YzM950OggPvNoScflAShv6iC4czPfNfB75gvPVY4OWD0qPcwe+9zKNp1GwG2E/8mCkBRJ8bk+ISiGaALrcPvAVLLBjDUTRRlQ4C6bSKhQK4xvsmnFwFhDoD+uJPY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com; spf=pass smtp.mailfrom=arm.com; arc=none smtp.client-ip=217.140.110.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=arm.com Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 350CD1688; Wed, 11 Jun 2025 11:07:41 -0700 (PDT) Received: from e129823.cambridge.arm.com (e129823.arm.com [10.1.197.6]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id A1D553F673; Wed, 11 Jun 2025 11:07:58 -0700 (PDT) From: Yeoreum Yun To: catalin.marinas@arm.com, pcc@google.com, will@kernel.org, broonie@kernel.org, anshuman.khandual@arm.com, joey.gouly@arm.com, yury.khrustalev@arm.com, maz@kernel.org, oliver.upton@linux.dev, frederic@kernel.org, akpm@linux-foundation.org, surenb@google.com Cc: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Yeoreum Yun Subject: [PATCH v8 8/9] kselftest/arm64/mte: refactor check_mmap_option test Date: Wed, 11 Jun 2025 19:07:33 +0100 Message-Id: <20250611180734.63657-9-yeoreum.yun@arm.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250611180734.63657-1-yeoreum.yun@arm.com> References: <20250611180734.63657-1-yeoreum.yun@arm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Before add mtefar testcase on check_mmap_option.c, refactor check_mmap_option: - make testcase suite array with test options (mem_type, mte_sync type an= d etc) to use general testcase pattern - generate each test case name acoording to test options. Signed-off-by: Yeoreum Yun Reviewed-by: Mark Brown --- .../selftests/arm64/mte/check_mmap_options.c | 367 +++++++++++++++--- 1 file changed, 313 insertions(+), 54 deletions(-) diff --git a/tools/testing/selftests/arm64/mte/check_mmap_options.c b/tools= /testing/selftests/arm64/mte/check_mmap_options.c index b37bf481c9f9..0df7ce532465 100644 --- a/tools/testing/selftests/arm64/mte/check_mmap_options.c +++ b/tools/testing/selftests/arm64/mte/check_mmap_options.c @@ -3,6 +3,7 @@ =20 #define _GNU_SOURCE =20 +#include #include #include #include @@ -24,6 +25,23 @@ #define TAG_CHECK_ON 0 #define TAG_CHECK_OFF 1 =20 +#define TEST_NAME_MAX 256 + +enum mte_mem_check_type { + CHECK_ANON_MEM =3D 0, + CHECK_FILE_MEM =3D 1, + CHECK_CLEAR_PROT_MTE =3D 2, +}; + +struct check_mmap_testcase { + int check_type; + int mem_type; + int mte_sync; + int mapping; + int tag_check; + bool enable_tco; +}; + static size_t page_size; static int sizes[] =3D { 1, 537, 989, 1269, MT_GRANULE_SIZE - 1, MT_GRANULE_SIZE, @@ -183,10 +201,271 @@ static int check_clear_prot_mte_flag(int mem_type, i= nt mode, int mapping) return KSFT_PASS; } =20 +const char *format_test_name(struct check_mmap_testcase *tc) +{ + static char test_name[TEST_NAME_MAX]; + const char *check_type_str; + const char *mem_type_str; + const char *sync_str; + const char *mapping_str; + const char *tag_check_str; + + switch (tc->check_type) { + case CHECK_ANON_MEM: + check_type_str =3D "anonymous memory"; + break; + case CHECK_FILE_MEM: + check_type_str =3D "file memory"; + break; + case CHECK_CLEAR_PROT_MTE: + check_type_str =3D "clear PROT_MTE flags"; + break; + default: + assert(0); + break; + } + + switch (tc->mem_type) { + case USE_MMAP: + mem_type_str =3D "mmap"; + break; + case USE_MPROTECT: + mem_type_str =3D "mmap/mprotect"; + break; + default: + assert(0); + break; + } + + switch (tc->mte_sync) { + case MTE_NONE_ERR: + sync_str =3D "no error"; + break; + case MTE_SYNC_ERR: + sync_str =3D "sync error"; + break; + case MTE_ASYNC_ERR: + sync_str =3D "async error"; + break; + default: + assert(0); + break; + } + + switch (tc->mapping) { + case MAP_SHARED: + mapping_str =3D "shared"; + break; + case MAP_PRIVATE: + mapping_str =3D "private"; + break; + default: + assert(0); + break; + } + + switch (tc->tag_check) { + case TAG_CHECK_ON: + tag_check_str =3D "tag check on"; + break; + case TAG_CHECK_OFF: + tag_check_str =3D "tag check off"; + break; + default: + assert(0); + break; + } + + snprintf(test_name, sizeof(test_name), + "Check %s with %s mapping, %s mode, %s memory and %s\n", + check_type_str, mapping_str, sync_str, mem_type_str, + tag_check_str); + + return test_name; +} + int main(int argc, char *argv[]) { - int err; + int err, i; int item =3D ARRAY_SIZE(sizes); + struct check_mmap_testcase test_cases[]=3D { + { + .check_type =3D CHECK_ANON_MEM, + .mem_type =3D USE_MMAP, + .mte_sync =3D MTE_SYNC_ERR, + .mapping =3D MAP_PRIVATE, + .tag_check =3D TAG_CHECK_OFF, + .enable_tco =3D true, + }, + { + .check_type =3D CHECK_FILE_MEM, + .mem_type =3D USE_MPROTECT, + .mte_sync =3D MTE_SYNC_ERR, + .mapping =3D MAP_PRIVATE, + .tag_check =3D TAG_CHECK_OFF, + .enable_tco =3D true, + }, + { + .check_type =3D CHECK_ANON_MEM, + .mem_type =3D USE_MMAP, + .mte_sync =3D MTE_NONE_ERR, + .mapping =3D MAP_PRIVATE, + .tag_check =3D TAG_CHECK_OFF, + .enable_tco =3D false, + }, + { + .check_type =3D CHECK_FILE_MEM, + .mem_type =3D USE_MPROTECT, + .mte_sync =3D MTE_NONE_ERR, + .mapping =3D MAP_PRIVATE, + .tag_check =3D TAG_CHECK_OFF, + .enable_tco =3D false, + }, + { + .check_type =3D CHECK_ANON_MEM, + .mem_type =3D USE_MMAP, + .mte_sync =3D MTE_SYNC_ERR, + .mapping =3D MAP_PRIVATE, + .tag_check =3D TAG_CHECK_ON, + .enable_tco =3D false, + }, + { + .check_type =3D CHECK_ANON_MEM, + .mem_type =3D USE_MPROTECT, + .mte_sync =3D MTE_SYNC_ERR, + .mapping =3D MAP_PRIVATE, + .tag_check =3D TAG_CHECK_ON, + .enable_tco =3D false, + }, + { + .check_type =3D CHECK_ANON_MEM, + .mem_type =3D USE_MMAP, + .mte_sync =3D MTE_SYNC_ERR, + .mapping =3D MAP_SHARED, + .tag_check =3D TAG_CHECK_ON, + .enable_tco =3D false, + }, + { + .check_type =3D CHECK_ANON_MEM, + .mem_type =3D USE_MPROTECT, + .mte_sync =3D MTE_SYNC_ERR, + .mapping =3D MAP_SHARED, + .tag_check =3D TAG_CHECK_ON, + .enable_tco =3D false, + }, + { + .check_type =3D CHECK_ANON_MEM, + .mem_type =3D USE_MMAP, + .mte_sync =3D MTE_ASYNC_ERR, + .mapping =3D MAP_PRIVATE, + .tag_check =3D TAG_CHECK_ON, + .enable_tco =3D false, + }, + { + .check_type =3D CHECK_ANON_MEM, + .mem_type =3D USE_MPROTECT, + .mte_sync =3D MTE_ASYNC_ERR, + .mapping =3D MAP_PRIVATE, + .tag_check =3D TAG_CHECK_ON, + .enable_tco =3D false, + }, + { + .check_type =3D CHECK_ANON_MEM, + .mem_type =3D USE_MMAP, + .mte_sync =3D MTE_ASYNC_ERR, + .mapping =3D MAP_SHARED, + .tag_check =3D TAG_CHECK_ON, + .enable_tco =3D false, + }, + { + .check_type =3D CHECK_ANON_MEM, + .mem_type =3D USE_MPROTECT, + .mte_sync =3D MTE_ASYNC_ERR, + .mapping =3D MAP_SHARED, + .tag_check =3D TAG_CHECK_ON, + .enable_tco =3D false, + }, + { + .check_type =3D CHECK_FILE_MEM, + .mem_type =3D USE_MMAP, + .mte_sync =3D MTE_SYNC_ERR, + .mapping =3D MAP_PRIVATE, + .tag_check =3D TAG_CHECK_ON, + .enable_tco =3D false, + }, + { + .check_type =3D CHECK_FILE_MEM, + .mem_type =3D USE_MPROTECT, + .mte_sync =3D MTE_SYNC_ERR, + .mapping =3D MAP_PRIVATE, + .tag_check =3D TAG_CHECK_ON, + .enable_tco =3D false, + }, + { + .check_type =3D CHECK_FILE_MEM, + .mem_type =3D USE_MMAP, + .mte_sync =3D MTE_SYNC_ERR, + .mapping =3D MAP_SHARED, + .tag_check =3D TAG_CHECK_ON, + .enable_tco =3D false, + }, + { + .check_type =3D CHECK_FILE_MEM, + .mem_type =3D USE_MPROTECT, + .mte_sync =3D MTE_SYNC_ERR, + .mapping =3D MAP_SHARED, + .tag_check =3D TAG_CHECK_ON, + .enable_tco =3D false, + }, + { + .check_type =3D CHECK_FILE_MEM, + .mem_type =3D USE_MMAP, + .mte_sync =3D MTE_ASYNC_ERR, + .mapping =3D MAP_PRIVATE, + .tag_check =3D TAG_CHECK_ON, + .enable_tco =3D false, + }, + { + .check_type =3D CHECK_FILE_MEM, + .mem_type =3D USE_MPROTECT, + .mte_sync =3D MTE_ASYNC_ERR, + .mapping =3D MAP_PRIVATE, + .tag_check =3D TAG_CHECK_ON, + .enable_tco =3D false, + }, + { + .check_type =3D CHECK_FILE_MEM, + .mem_type =3D USE_MMAP, + .mte_sync =3D MTE_ASYNC_ERR, + .mapping =3D MAP_SHARED, + .tag_check =3D TAG_CHECK_ON, + .enable_tco =3D false, + }, + { + .check_type =3D CHECK_FILE_MEM, + .mem_type =3D USE_MPROTECT, + .mte_sync =3D MTE_ASYNC_ERR, + .mapping =3D MAP_SHARED, + .tag_check =3D TAG_CHECK_ON, + .enable_tco =3D false, + }, + { + .check_type =3D CHECK_CLEAR_PROT_MTE, + .mem_type =3D USE_MMAP, + .mte_sync =3D MTE_SYNC_ERR, + .mapping =3D MAP_PRIVATE, + .tag_check =3D TAG_CHECK_ON, + .enable_tco =3D false, + }, + { + .check_type =3D CHECK_CLEAR_PROT_MTE, + .mem_type =3D USE_MPROTECT, + .mte_sync =3D MTE_SYNC_ERR, + .mapping =3D MAP_PRIVATE, + .tag_check =3D TAG_CHECK_ON, + .enable_tco =3D false, + }, + }; =20 err =3D mte_default_setup(); if (err) @@ -205,59 +484,39 @@ int main(int argc, char *argv[]) mte_register_signal(SIGSEGV, mte_default_handler, false); =20 /* Set test plan */ - ksft_set_plan(22); - - mte_enable_pstate_tco(); - - evaluate_test(check_anonymous_memory_mapping(USE_MMAP, MTE_SYNC_ERR, MAP_= PRIVATE, TAG_CHECK_OFF), - "Check anonymous memory with private mapping, sync error mode, mmap memor= y and tag check off\n"); - evaluate_test(check_file_memory_mapping(USE_MPROTECT, MTE_SYNC_ERR, MAP_P= RIVATE, TAG_CHECK_OFF), - "Check file memory with private mapping, sync error mode, mmap/mprotect m= emory and tag check off\n"); - - mte_disable_pstate_tco(); - evaluate_test(check_anonymous_memory_mapping(USE_MMAP, MTE_NONE_ERR, MAP_= PRIVATE, TAG_CHECK_OFF), - "Check anonymous memory with private mapping, no error mode, mmap memory = and tag check off\n"); - evaluate_test(check_file_memory_mapping(USE_MPROTECT, MTE_NONE_ERR, MAP_P= RIVATE, TAG_CHECK_OFF), - "Check file memory with private mapping, no error mode, mmap/mprotect mem= ory and tag check off\n"); - - evaluate_test(check_anonymous_memory_mapping(USE_MMAP, MTE_SYNC_ERR, MAP_= PRIVATE, TAG_CHECK_ON), - "Check anonymous memory with private mapping, sync error mode, mmap memor= y and tag check on\n"); - evaluate_test(check_anonymous_memory_mapping(USE_MPROTECT, MTE_SYNC_ERR, = MAP_PRIVATE, TAG_CHECK_ON), - "Check anonymous memory with private mapping, sync error mode, mmap/mprot= ect memory and tag check on\n"); - evaluate_test(check_anonymous_memory_mapping(USE_MMAP, MTE_SYNC_ERR, MAP_= SHARED, TAG_CHECK_ON), - "Check anonymous memory with shared mapping, sync error mode, mmap memory= and tag check on\n"); - evaluate_test(check_anonymous_memory_mapping(USE_MPROTECT, MTE_SYNC_ERR, = MAP_SHARED, TAG_CHECK_ON), - "Check anonymous memory with shared mapping, sync error mode, mmap/mprote= ct memory and tag check on\n"); - evaluate_test(check_anonymous_memory_mapping(USE_MMAP, MTE_ASYNC_ERR, MAP= _PRIVATE, TAG_CHECK_ON), - "Check anonymous memory with private mapping, async error mode, mmap memo= ry and tag check on\n"); - evaluate_test(check_anonymous_memory_mapping(USE_MPROTECT, MTE_ASYNC_ERR,= MAP_PRIVATE, TAG_CHECK_ON), - "Check anonymous memory with private mapping, async error mode, mmap/mpro= tect memory and tag check on\n"); - evaluate_test(check_anonymous_memory_mapping(USE_MMAP, MTE_ASYNC_ERR, MAP= _SHARED, TAG_CHECK_ON), - "Check anonymous memory with shared mapping, async error mode, mmap memor= y and tag check on\n"); - evaluate_test(check_anonymous_memory_mapping(USE_MPROTECT, MTE_ASYNC_ERR,= MAP_SHARED, TAG_CHECK_ON), - "Check anonymous memory with shared mapping, async error mode, mmap/mprot= ect memory and tag check on\n"); - - evaluate_test(check_file_memory_mapping(USE_MMAP, MTE_SYNC_ERR, MAP_PRIVA= TE, TAG_CHECK_ON), - "Check file memory with private mapping, sync error mode, mmap memory and= tag check on\n"); - evaluate_test(check_file_memory_mapping(USE_MPROTECT, MTE_SYNC_ERR, MAP_P= RIVATE, TAG_CHECK_ON), - "Check file memory with private mapping, sync error mode, mmap/mprotect m= emory and tag check on\n"); - evaluate_test(check_file_memory_mapping(USE_MMAP, MTE_SYNC_ERR, MAP_SHARE= D, TAG_CHECK_ON), - "Check file memory with shared mapping, sync error mode, mmap memory and = tag check on\n"); - evaluate_test(check_file_memory_mapping(USE_MPROTECT, MTE_SYNC_ERR, MAP_S= HARED, TAG_CHECK_ON), - "Check file memory with shared mapping, sync error mode, mmap/mprotect me= mory and tag check on\n"); - evaluate_test(check_file_memory_mapping(USE_MMAP, MTE_ASYNC_ERR, MAP_PRIV= ATE, TAG_CHECK_ON), - "Check file memory with private mapping, async error mode, mmap memory an= d tag check on\n"); - evaluate_test(check_file_memory_mapping(USE_MPROTECT, MTE_ASYNC_ERR, MAP_= PRIVATE, TAG_CHECK_ON), - "Check file memory with private mapping, async error mode, mmap/mprotect = memory and tag check on\n"); - evaluate_test(check_file_memory_mapping(USE_MMAP, MTE_ASYNC_ERR, MAP_SHAR= ED, TAG_CHECK_ON), - "Check file memory with shared mapping, async error mode, mmap memory and= tag check on\n"); - evaluate_test(check_file_memory_mapping(USE_MPROTECT, MTE_ASYNC_ERR, MAP_= SHARED, TAG_CHECK_ON), - "Check file memory with shared mapping, async error mode, mmap/mprotect m= emory and tag check on\n"); - - evaluate_test(check_clear_prot_mte_flag(USE_MMAP, MTE_SYNC_ERR, MAP_PRIVA= TE), - "Check clear PROT_MTE flags with private mapping, sync error mode and mma= p memory\n"); - evaluate_test(check_clear_prot_mte_flag(USE_MPROTECT, MTE_SYNC_ERR, MAP_P= RIVATE), - "Check clear PROT_MTE flags with private mapping and sync error mode and = mmap/mprotect memory\n"); + ksft_set_plan(ARRAY_SIZE(test_cases)); + + for (i =3D 0 ; i < ARRAY_SIZE(test_cases); i++) { + if (test_cases[i].enable_tco) + mte_enable_pstate_tco(); + else + mte_disable_pstate_tco(); + + switch (test_cases[i].check_type) { + case CHECK_ANON_MEM: + evaluate_test(check_anonymous_memory_mapping(test_cases[i].mem_type, + test_cases[i].mte_sync, + test_cases[i].mapping, + test_cases[i].tag_check), + format_test_name(&test_cases[i])); + break; + case CHECK_FILE_MEM: + evaluate_test(check_file_memory_mapping(test_cases[i].mem_type, + test_cases[i].mte_sync, + test_cases[i].mapping, + test_cases[i].tag_check), + format_test_name(&test_cases[i])); + break; + case CHECK_CLEAR_PROT_MTE: + evaluate_test(check_clear_prot_mte_flag(test_cases[i].mem_type, + test_cases[i].mte_sync, + test_cases[i].mapping), + format_test_name(&test_cases[i])); + break; + default: + exit(KSFT_FAIL); + } + } =20 mte_restore_setup(); ksft_print_cnts(); --=20 LEVI:{C3F47F37-75D8-414A-A8BA-3980EC8A46D7} From nobody Sat Oct 11 00:24:18 2025 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 16EC1280CC8; Wed, 11 Jun 2025 18:08:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.140.110.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749665285; cv=none; b=W08D+NxpuDrDjUJsa8gvsmQEwwhQGz7+EDM8jQ1xi3PeueWP4ClfZSSzO7Iui9ocO+hiZf4kf6k8TatRMXMz4UaaxRxaS+jiB60GpWFHOyKXFf/prMo8SRqq+Aw9pfhLKNRBK66uIcYTtkdBEP+CXfbWoM83nWo4fA5AlT720wQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749665285; c=relaxed/simple; bh=7V4oiCEkS9aJ3ve68tq2ieHdW9fB8X9omuEAGqdBhZc=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=PPx/OLFdzE0lLLBqEKzxJH6V20VqS6hb33r0dn/dRscylQAFrFr46aW1djSHQZg7NMeVvYhFp6OWL3bjleDhiSOseAFetUf319L1M1WdlGKWGiLmKK61mtQ3BLBC1mapkzklTFq3dl+tPOo19BaDYZ4YoYowf6908K3UcdhW8Bk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com; spf=pass smtp.mailfrom=arm.com; arc=none smtp.client-ip=217.140.110.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=arm.com Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id B8B1515A1; Wed, 11 Jun 2025 11:07:43 -0700 (PDT) Received: from e129823.cambridge.arm.com (e129823.arm.com [10.1.197.6]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 327893F673; Wed, 11 Jun 2025 11:08:01 -0700 (PDT) From: Yeoreum Yun To: catalin.marinas@arm.com, pcc@google.com, will@kernel.org, broonie@kernel.org, anshuman.khandual@arm.com, joey.gouly@arm.com, yury.khrustalev@arm.com, maz@kernel.org, oliver.upton@linux.dev, frederic@kernel.org, akpm@linux-foundation.org, surenb@google.com Cc: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Yeoreum Yun Subject: [PATCH v8 9/9] kselftest/arm64/mte: add mtefar tests on check_mmap_options Date: Wed, 11 Jun 2025 19:07:34 +0100 Message-Id: <20250611180734.63657-10-yeoreum.yun@arm.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250611180734.63657-1-yeoreum.yun@arm.com> References: <20250611180734.63657-1-yeoreum.yun@arm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" If FEAT_MTE_TAGGED_FAR (Armv8.9) is supported, bits 63:60 of the fault addr= ess are preserved in response to synchronous tag check faults (SEGV_MTESERR). This patch adds new test cases using address tags (bits 63:60), corresponding to each existing test in check_mmap_option. Signed-off-by: Yeoreum Yun Reviewed-by: Mark Brown --- .../selftests/arm64/mte/check_mmap_options.c | 194 +++++++++++++++--- 1 file changed, 171 insertions(+), 23 deletions(-) diff --git a/tools/testing/selftests/arm64/mte/check_mmap_options.c b/tools= /testing/selftests/arm64/mte/check_mmap_options.c index 0df7ce532465..91a81b4a9bfa 100644 --- a/tools/testing/selftests/arm64/mte/check_mmap_options.c +++ b/tools/testing/selftests/arm64/mte/check_mmap_options.c @@ -24,6 +24,8 @@ #define OVERFLOW MT_GRANULE_SIZE #define TAG_CHECK_ON 0 #define TAG_CHECK_OFF 1 +#define ATAG_CHECK_ON 1 +#define ATAG_CHECK_OFF 0 =20 #define TEST_NAME_MAX 256 =20 @@ -39,6 +41,7 @@ struct check_mmap_testcase { int mte_sync; int mapping; int tag_check; + int atag_check; bool enable_tco; }; =20 @@ -48,8 +51,14 @@ static int sizes[] =3D { /* page size - 1*/ 0, /* page_size */ 0, /* page size + 1 */ 0 }; =20 -static int check_mte_memory(char *ptr, int size, int mode, int tag_check) +static int check_mte_memory(char *ptr, int size, int mode, int tag_check, = int atag_check) { + if (!mtefar_support && atag_check =3D=3D ATAG_CHECK_ON) + return KSFT_SKIP; + + if (atag_check =3D=3D ATAG_CHECK_ON) + ptr =3D mte_insert_atag(ptr); + mte_initialize_current_context(mode, (uintptr_t)ptr, size); memset(ptr, '1', size); mte_wait_after_trig(); @@ -75,7 +84,7 @@ static int check_mte_memory(char *ptr, int size, int mode= , int tag_check) return KSFT_PASS; } =20 -static int check_anonymous_memory_mapping(int mem_type, int mode, int mapp= ing, int tag_check) +static int check_anonymous_memory_mapping(int mem_type, int mode, int mapp= ing, int tag_check, int atag_check) { char *ptr, *map_ptr; int run, result, map_size; @@ -97,16 +106,16 @@ static int check_anonymous_memory_mapping(int mem_type= , int mode, int mapping, i munmap((void *)map_ptr, map_size); return KSFT_FAIL; } - result =3D check_mte_memory(ptr, sizes[run], mode, tag_check); + result =3D check_mte_memory(ptr, sizes[run], mode, tag_check, atag_check= ); mte_clear_tags((void *)ptr, sizes[run]); mte_free_memory((void *)map_ptr, map_size, mem_type, false); - if (result =3D=3D KSFT_FAIL) - return KSFT_FAIL; + if (result !=3D KSFT_PASS) + return result; } return KSFT_PASS; } =20 -static int check_file_memory_mapping(int mem_type, int mode, int mapping, = int tag_check) +static int check_file_memory_mapping(int mem_type, int mode, int mapping, = int tag_check, int atag_check) { char *ptr, *map_ptr; int run, fd, map_size; @@ -135,17 +144,17 @@ static int check_file_memory_mapping(int mem_type, in= t mode, int mapping, int ta close(fd); return KSFT_FAIL; } - result =3D check_mte_memory(ptr, sizes[run], mode, tag_check); + result =3D check_mte_memory(ptr, sizes[run], mode, tag_check, atag_check= ); mte_clear_tags((void *)ptr, sizes[run]); munmap((void *)map_ptr, map_size); close(fd); - if (result =3D=3D KSFT_FAIL) - break; + if (result !=3D KSFT_PASS) + return result; } - return result; + return KSFT_PASS; } =20 -static int check_clear_prot_mte_flag(int mem_type, int mode, int mapping) +static int check_clear_prot_mte_flag(int mem_type, int mode, int mapping, = int atag_check) { char *ptr, *map_ptr; int run, prot_flag, result, fd, map_size; @@ -168,7 +177,7 @@ static int check_clear_prot_mte_flag(int mem_type, int = mode, int mapping) ksft_print_msg("FAIL: mprotect not ignoring clear PROT_MTE property\n"); return KSFT_FAIL; } - result =3D check_mte_memory(ptr, sizes[run], mode, TAG_CHECK_ON); + result =3D check_mte_memory(ptr, sizes[run], mode, TAG_CHECK_ON, atag_ch= eck); mte_free_memory_tag_range((void *)ptr, sizes[run], mem_type, UNDERFLOW, = OVERFLOW); if (result !=3D KSFT_PASS) return KSFT_FAIL; @@ -192,11 +201,11 @@ static int check_clear_prot_mte_flag(int mem_type, in= t mode, int mapping) close(fd); return KSFT_FAIL; } - result =3D check_mte_memory(ptr, sizes[run], mode, TAG_CHECK_ON); + result =3D check_mte_memory(ptr, sizes[run], mode, TAG_CHECK_ON, atag_ch= eck); mte_free_memory_tag_range((void *)ptr, sizes[run], mem_type, UNDERFLOW, = OVERFLOW); close(fd); if (result !=3D KSFT_PASS) - return KSFT_FAIL; + return result; } return KSFT_PASS; } @@ -209,6 +218,7 @@ const char *format_test_name(struct check_mmap_testcase= *tc) const char *sync_str; const char *mapping_str; const char *tag_check_str; + const char *atag_check_str; =20 switch (tc->check_type) { case CHECK_ANON_MEM: @@ -276,10 +286,22 @@ const char *format_test_name(struct check_mmap_testca= se *tc) break; } =20 + switch (tc->atag_check) { + case ATAG_CHECK_ON: + atag_check_str =3D "with address tag [63:60]"; + break; + case ATAG_CHECK_OFF: + atag_check_str =3D "without address tag [63:60]"; + break; + default: + assert(0); + break; + } + snprintf(test_name, sizeof(test_name), - "Check %s with %s mapping, %s mode, %s memory and %s\n", + "Check %s with %s mapping, %s mode, %s memory and %s (%s)\n", check_type_str, mapping_str, sync_str, mem_type_str, - tag_check_str); + tag_check_str, atag_check_str); =20 return test_name; } @@ -295,6 +317,7 @@ int main(int argc, char *argv[]) .mte_sync =3D MTE_SYNC_ERR, .mapping =3D MAP_PRIVATE, .tag_check =3D TAG_CHECK_OFF, + .atag_check =3D ATAG_CHECK_OFF, .enable_tco =3D true, }, { @@ -303,6 +326,7 @@ int main(int argc, char *argv[]) .mte_sync =3D MTE_SYNC_ERR, .mapping =3D MAP_PRIVATE, .tag_check =3D TAG_CHECK_OFF, + .atag_check =3D ATAG_CHECK_OFF, .enable_tco =3D true, }, { @@ -311,6 +335,7 @@ int main(int argc, char *argv[]) .mte_sync =3D MTE_NONE_ERR, .mapping =3D MAP_PRIVATE, .tag_check =3D TAG_CHECK_OFF, + .atag_check =3D ATAG_CHECK_OFF, .enable_tco =3D false, }, { @@ -319,6 +344,7 @@ int main(int argc, char *argv[]) .mte_sync =3D MTE_NONE_ERR, .mapping =3D MAP_PRIVATE, .tag_check =3D TAG_CHECK_OFF, + .atag_check =3D ATAG_CHECK_OFF, .enable_tco =3D false, }, { @@ -327,6 +353,7 @@ int main(int argc, char *argv[]) .mte_sync =3D MTE_SYNC_ERR, .mapping =3D MAP_PRIVATE, .tag_check =3D TAG_CHECK_ON, + .atag_check =3D ATAG_CHECK_OFF, .enable_tco =3D false, }, { @@ -335,6 +362,7 @@ int main(int argc, char *argv[]) .mte_sync =3D MTE_SYNC_ERR, .mapping =3D MAP_PRIVATE, .tag_check =3D TAG_CHECK_ON, + .atag_check =3D ATAG_CHECK_OFF, .enable_tco =3D false, }, { @@ -343,6 +371,7 @@ int main(int argc, char *argv[]) .mte_sync =3D MTE_SYNC_ERR, .mapping =3D MAP_SHARED, .tag_check =3D TAG_CHECK_ON, + .atag_check =3D ATAG_CHECK_OFF, .enable_tco =3D false, }, { @@ -351,6 +380,7 @@ int main(int argc, char *argv[]) .mte_sync =3D MTE_SYNC_ERR, .mapping =3D MAP_SHARED, .tag_check =3D TAG_CHECK_ON, + .atag_check =3D ATAG_CHECK_OFF, .enable_tco =3D false, }, { @@ -359,6 +389,7 @@ int main(int argc, char *argv[]) .mte_sync =3D MTE_ASYNC_ERR, .mapping =3D MAP_PRIVATE, .tag_check =3D TAG_CHECK_ON, + .atag_check =3D ATAG_CHECK_OFF, .enable_tco =3D false, }, { @@ -367,6 +398,7 @@ int main(int argc, char *argv[]) .mte_sync =3D MTE_ASYNC_ERR, .mapping =3D MAP_PRIVATE, .tag_check =3D TAG_CHECK_ON, + .atag_check =3D ATAG_CHECK_OFF, .enable_tco =3D false, }, { @@ -375,6 +407,7 @@ int main(int argc, char *argv[]) .mte_sync =3D MTE_ASYNC_ERR, .mapping =3D MAP_SHARED, .tag_check =3D TAG_CHECK_ON, + .atag_check =3D ATAG_CHECK_OFF, .enable_tco =3D false, }, { @@ -383,6 +416,7 @@ int main(int argc, char *argv[]) .mte_sync =3D MTE_ASYNC_ERR, .mapping =3D MAP_SHARED, .tag_check =3D TAG_CHECK_ON, + .atag_check =3D ATAG_CHECK_OFF, .enable_tco =3D false, }, { @@ -391,6 +425,7 @@ int main(int argc, char *argv[]) .mte_sync =3D MTE_SYNC_ERR, .mapping =3D MAP_PRIVATE, .tag_check =3D TAG_CHECK_ON, + .atag_check =3D ATAG_CHECK_OFF, .enable_tco =3D false, }, { @@ -399,6 +434,7 @@ int main(int argc, char *argv[]) .mte_sync =3D MTE_SYNC_ERR, .mapping =3D MAP_PRIVATE, .tag_check =3D TAG_CHECK_ON, + .atag_check =3D ATAG_CHECK_OFF, .enable_tco =3D false, }, { @@ -407,6 +443,7 @@ int main(int argc, char *argv[]) .mte_sync =3D MTE_SYNC_ERR, .mapping =3D MAP_SHARED, .tag_check =3D TAG_CHECK_ON, + .atag_check =3D ATAG_CHECK_OFF, .enable_tco =3D false, }, { @@ -415,6 +452,7 @@ int main(int argc, char *argv[]) .mte_sync =3D MTE_SYNC_ERR, .mapping =3D MAP_SHARED, .tag_check =3D TAG_CHECK_ON, + .atag_check =3D ATAG_CHECK_OFF, .enable_tco =3D false, }, { @@ -423,6 +461,7 @@ int main(int argc, char *argv[]) .mte_sync =3D MTE_ASYNC_ERR, .mapping =3D MAP_PRIVATE, .tag_check =3D TAG_CHECK_ON, + .atag_check =3D ATAG_CHECK_OFF, .enable_tco =3D false, }, { @@ -431,6 +470,7 @@ int main(int argc, char *argv[]) .mte_sync =3D MTE_ASYNC_ERR, .mapping =3D MAP_PRIVATE, .tag_check =3D TAG_CHECK_ON, + .atag_check =3D ATAG_CHECK_OFF, .enable_tco =3D false, }, { @@ -439,6 +479,7 @@ int main(int argc, char *argv[]) .mte_sync =3D MTE_ASYNC_ERR, .mapping =3D MAP_SHARED, .tag_check =3D TAG_CHECK_ON, + .atag_check =3D ATAG_CHECK_OFF, .enable_tco =3D false, }, { @@ -447,6 +488,106 @@ int main(int argc, char *argv[]) .mte_sync =3D MTE_ASYNC_ERR, .mapping =3D MAP_SHARED, .tag_check =3D TAG_CHECK_ON, + .atag_check =3D ATAG_CHECK_OFF, + .enable_tco =3D false, + }, + { + .check_type =3D CHECK_CLEAR_PROT_MTE, + .mem_type =3D USE_MMAP, + .mte_sync =3D MTE_SYNC_ERR, + .mapping =3D MAP_PRIVATE, + .tag_check =3D TAG_CHECK_ON, + .atag_check =3D ATAG_CHECK_OFF, + .enable_tco =3D false, + }, + { + .check_type =3D CHECK_CLEAR_PROT_MTE, + .mem_type =3D USE_MPROTECT, + .mte_sync =3D MTE_SYNC_ERR, + .mapping =3D MAP_PRIVATE, + .tag_check =3D TAG_CHECK_ON, + .atag_check =3D ATAG_CHECK_OFF, + .enable_tco =3D false, + }, + { + .check_type =3D CHECK_ANON_MEM, + .mem_type =3D USE_MMAP, + .mte_sync =3D MTE_SYNC_ERR, + .mapping =3D MAP_PRIVATE, + .tag_check =3D TAG_CHECK_ON, + .atag_check =3D ATAG_CHECK_ON, + .enable_tco =3D false, + }, + { + .check_type =3D CHECK_ANON_MEM, + .mem_type =3D USE_MPROTECT, + .mte_sync =3D MTE_SYNC_ERR, + .mapping =3D MAP_PRIVATE, + .tag_check =3D TAG_CHECK_ON, + .atag_check =3D ATAG_CHECK_ON, + .enable_tco =3D false, + }, + { + .check_type =3D CHECK_ANON_MEM, + .mem_type =3D USE_MMAP, + .mte_sync =3D MTE_SYNC_ERR, + .mapping =3D MAP_SHARED, + .tag_check =3D TAG_CHECK_ON, + .atag_check =3D ATAG_CHECK_ON, + .enable_tco =3D false, + }, + { + .check_type =3D CHECK_ANON_MEM, + .mem_type =3D USE_MPROTECT, + .mte_sync =3D MTE_SYNC_ERR, + .mapping =3D MAP_SHARED, + .tag_check =3D TAG_CHECK_ON, + .atag_check =3D ATAG_CHECK_ON, + .enable_tco =3D false, + }, + { + .check_type =3D CHECK_FILE_MEM, + .mem_type =3D USE_MMAP, + .mte_sync =3D MTE_SYNC_ERR, + .mapping =3D MAP_PRIVATE, + .tag_check =3D TAG_CHECK_ON, + .atag_check =3D ATAG_CHECK_ON, + .enable_tco =3D false, + }, + { + .check_type =3D CHECK_FILE_MEM, + .mem_type =3D USE_MPROTECT, + .mte_sync =3D MTE_SYNC_ERR, + .mapping =3D MAP_PRIVATE, + .tag_check =3D TAG_CHECK_ON, + .atag_check =3D ATAG_CHECK_ON, + .enable_tco =3D false, + }, + { + .check_type =3D CHECK_FILE_MEM, + .mem_type =3D USE_MMAP, + .mte_sync =3D MTE_SYNC_ERR, + .mapping =3D MAP_SHARED, + .tag_check =3D TAG_CHECK_ON, + .atag_check =3D ATAG_CHECK_ON, + .enable_tco =3D false, + }, + { + .check_type =3D CHECK_FILE_MEM, + .mem_type =3D USE_MPROTECT, + .mte_sync =3D MTE_SYNC_ERR, + .mapping =3D MAP_SHARED, + .tag_check =3D TAG_CHECK_ON, + .atag_check =3D ATAG_CHECK_ON, + .enable_tco =3D false, + }, + { + .check_type =3D CHECK_FILE_MEM, + .mem_type =3D USE_MMAP, + .mte_sync =3D MTE_ASYNC_ERR, + .mapping =3D MAP_PRIVATE, + .tag_check =3D TAG_CHECK_ON, + .atag_check =3D ATAG_CHECK_ON, .enable_tco =3D false, }, { @@ -455,6 +596,7 @@ int main(int argc, char *argv[]) .mte_sync =3D MTE_SYNC_ERR, .mapping =3D MAP_PRIVATE, .tag_check =3D TAG_CHECK_ON, + .atag_check =3D ATAG_CHECK_ON, .enable_tco =3D false, }, { @@ -463,6 +605,7 @@ int main(int argc, char *argv[]) .mte_sync =3D MTE_SYNC_ERR, .mapping =3D MAP_PRIVATE, .tag_check =3D TAG_CHECK_ON, + .atag_check =3D ATAG_CHECK_ON, .enable_tco =3D false, }, }; @@ -479,14 +622,16 @@ int main(int argc, char *argv[]) sizes[item - 2] =3D page_size; sizes[item - 1] =3D page_size + 1; =20 - /* Register signal handlers */ - mte_register_signal(SIGBUS, mte_default_handler, false); - mte_register_signal(SIGSEGV, mte_default_handler, false); - /* Set test plan */ ksft_set_plan(ARRAY_SIZE(test_cases)); =20 for (i =3D 0 ; i < ARRAY_SIZE(test_cases); i++) { + /* Register signal handlers */ + mte_register_signal(SIGBUS, mte_default_handler, + test_cases[i].atag_check =3D=3D ATAG_CHECK_ON); + mte_register_signal(SIGSEGV, mte_default_handler, + test_cases[i].atag_check =3D=3D ATAG_CHECK_ON); + if (test_cases[i].enable_tco) mte_enable_pstate_tco(); else @@ -497,20 +642,23 @@ int main(int argc, char *argv[]) evaluate_test(check_anonymous_memory_mapping(test_cases[i].mem_type, test_cases[i].mte_sync, test_cases[i].mapping, - test_cases[i].tag_check), + test_cases[i].tag_check, + test_cases[i].atag_check), format_test_name(&test_cases[i])); break; case CHECK_FILE_MEM: evaluate_test(check_file_memory_mapping(test_cases[i].mem_type, test_cases[i].mte_sync, test_cases[i].mapping, - test_cases[i].tag_check), + test_cases[i].tag_check, + test_cases[i].atag_check), format_test_name(&test_cases[i])); break; case CHECK_CLEAR_PROT_MTE: evaluate_test(check_clear_prot_mte_flag(test_cases[i].mem_type, test_cases[i].mte_sync, - test_cases[i].mapping), + test_cases[i].mapping, + test_cases[i].atag_check), format_test_name(&test_cases[i])); break; default: --=20 LEVI:{C3F47F37-75D8-414A-A8BA-3980EC8A46D7}