From nobody Thu Dec 18 03:21:15 2025 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 9DEC0207A27; Wed, 7 May 2025 09:58:09 +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=1746611891; cv=none; b=IYaFUEop0lcWf3OiGBe5WJ7lKblIhnK0AjfH56q3/ZNdOP5C4SILEt/XC2cXI7hDolzLg1vWBh9bXI1dqVZrP6iB9fNVHTzxv+DjLkrEigaytr9QQADuxKqPrO62Nx1wsxb59ZaUnHYTcdo8AbcFXZstjIDtpn4f3FJ06IoO10s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1746611891; c=relaxed/simple; bh=YxvVmEAaU+iUsX2FWzlfDIf/dolKXpRXag/JAFjWFNc=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=rR7dgR12FH5Ahl4rTJkoKcMtHYlaF4yP5IWSts75UBz13/MjCPtrOUSmBeanPVeVoBnenQBXkRK3Ir9/LYYnL/S2/FdCjxFmNrpw4rBBntSuqcci33jr6Eo62haM2YYpJRxG2TGXPRjPv2SfHENGjbdIIjmzjaGyMOh1Ph3Clag= 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 CFCF616F2; Wed, 7 May 2025 02:57:58 -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 EE04A3F5A1; Wed, 7 May 2025 02:58:05 -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, shmeerali.kolothum.thodi@huawei.com, james.morse@arm.com, mark.rutland@arm.com, huangxiaojia2@huawei.com, akpm@linux-foundation.org, surenb@google.com, robin.murphy@arm.com Cc: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Yeoreum Yun Subject: [PATCH v4 1/6] arm64/cpufeature: add FEAT_MTE_TAGGED_FAR feature Date: Wed, 7 May 2025 10:57:52 +0100 Message-Id: <20250507095757.1663684-2-yeoreum.yun@arm.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250507095757.1663684-1-yeoreum.yun@arm.com> References: <20250507095757.1663684-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 9c4d6d552b25..fdb3c1cef236 100644 --- a/arch/arm64/kernel/cpufeature.c +++ b/arch/arm64/kernel/cpufeature.c @@ -312,6 +312,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 @@ -2861,6 +2862,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 772c1b008e43..ef62ea04ba37 100644 --- a/arch/arm64/tools/cpucaps +++ b/arch/arm64/tools/cpucaps @@ -67,6 +67,7 @@ MPAM MPAM_HCR MTE MTE_ASYMM +MTE_FAR SME SME_FA64 SME2 --=20 LEVI:{C3F47F37-75D8-414A-A8BA-3980EC8A46D7} From nobody Thu Dec 18 03:21:15 2025 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id B2AD320E6F7; Wed, 7 May 2025 09:58:12 +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=1746611894; cv=none; b=TJVqcohZCmmtIkNi7FnAabnmTGGwZKG6YpmYW3ciUHjb7hA7H5/G3qtFZrr71qq9E18jOy7wQe/IeZwD3GpUp4lYJGr0evTWjlHXUXl8wjJ0XRooa/4lU3VqiOd6MovBsnfxGQj9wm6qmeohSU6paTsR2RsN+saFeJiC2O0jQEc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1746611894; c=relaxed/simple; bh=xy6Ex47g/4k/BX1mt12BT1M3/5kqv78j5tf5dVbCqCk=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=ptQeR9x4ZaniurqQWCiHpF1tSkkYh0xV/m28Km3Kt7ZG/cErT6hjmeAptAy3bTPPYgG76BuW2x/enyhwh5xAACgrnvcGVbOeP5oG9dkLha1kcatisukn5vYSXq4Kbx2FS8tjTiiVmFWObfnwP8BXSsD7+avEAdqiG5zUC9me72c= 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 0ED491FC4; Wed, 7 May 2025 02:58:02 -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 2E1353F5A1; Wed, 7 May 2025 02:58:09 -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, shmeerali.kolothum.thodi@huawei.com, james.morse@arm.com, mark.rutland@arm.com, huangxiaojia2@huawei.com, akpm@linux-foundation.org, surenb@google.com, robin.murphy@arm.com Cc: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Yeoreum Yun Subject: [PATCH v4 2/6] arm64: report address tag when FEAT_MTE_TAGGED_FAR is supported Date: Wed, 7 May 2025 10:57:53 +0100 Message-Id: <20250507095757.1663684-3-yeoreum.yun@arm.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250507095757.1663684-1-yeoreum.yun@arm.com> References: <20250507095757.1663684-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..73c59a9c7a63 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 'mte_far' hwcap. 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 fdb3c1cef236..183b4b7e3074 100644 --- a/arch/arm64/kernel/cpufeature.c +++ b/arch/arm64/kernel/cpufeature.c @@ -3199,6 +3199,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 285d7d538342..058e21295003 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..f21d972f99b1 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 KNOWN. */ - 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 Thu Dec 18 03:21:15 2025 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 49A49205E02; Wed, 7 May 2025 09:58:16 +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=1746611897; cv=none; b=q9/2BNMttrxNsCyNwsIm3szCtLRWsLxCm2bjxsnFfuUGKGwggdM4DjPgsjIteknN88kAcxDf4xTZUEfhtkZo164wmUez+wrK42wnNkHMm9T7e5qLxhcczPlS9QkbMA/iJAzM11GMToIeikrGi7mfKChMcFJvMpQVvwadI85si6g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1746611897; c=relaxed/simple; bh=YVJN70PPzT45Ed+Rn7QD3cSXjFB9D3eO316oNojiBiM=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=Ma97KteGwRdrgmcv47ZKh8gDWw4gfTjhSNfMetf2XYfB1elRAaZQjpfwRe4iBitkS4/z2vGS+h3WhYmkmw4eT7OeOPr9TQ5qPLY0gHkV1eIdjUy6dzzjuGs9urDIh5+EZCzekv+dYi0UCPUfNScS1JNsLT4ro87grgc+69wQMf8= 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 58D98339; Wed, 7 May 2025 02:58:05 -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 608953F5A1; Wed, 7 May 2025 02:58:12 -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, shmeerali.kolothum.thodi@huawei.com, james.morse@arm.com, mark.rutland@arm.com, huangxiaojia2@huawei.com, akpm@linux-foundation.org, surenb@google.com, robin.murphy@arm.com Cc: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Yeoreum Yun Subject: [PATCH v4 3/6] tools/kselftest: add MTE_FAR hwcap test Date: Wed, 7 May 2025 10:57:54 +0100 Message-Id: <20250507095757.1663684-4-yeoreum.yun@arm.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250507095757.1663684-1-yeoreum.yun@arm.com> References: <20250507095757.1663684-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 Thu Dec 18 03:21:15 2025 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 532B7213E6A; Wed, 7 May 2025 09:58:19 +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=1746611901; cv=none; b=Q+k8QJ0GfbgHBpEMQiUJQk5OQO2T2FFcbd7rt9dcAELLFlmhqnE3jnqd/tnFbzBqsipI5Msn3sUcfLIZlWu+HXWeTnwQ3VbAmU7+rQ+hHUvVA+EjvpfdQJt4I0kxsFgSsZCz0RhJ8vpZqdzUXZZ9r12h3uDjoeWEfOWJpgayG9k= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1746611901; c=relaxed/simple; bh=PUV2rE/JlzOBU3SGyyRucb3Obn0aXwskI8nwY4ZCyIU=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=tdBHSmLcXMM9I3wFMKomntCzfVGoCGz3Il1B9eF9B/+mLIas5fjj8Wwf2Y5omVHbSIyGan78zeu34dxnNckDXVDF37Brn8zhRuUca0AZm/8HIyFPobe2GP5/dc6XYqjtSPCp7UD1Sq+QnLgrTw24gVhiUJDnMzkovVIOlWAX8wg= 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 99EA3339; Wed, 7 May 2025 02:58:08 -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 A87693F5A1; Wed, 7 May 2025 02:58:15 -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, shmeerali.kolothum.thodi@huawei.com, james.morse@arm.com, mark.rutland@arm.com, huangxiaojia2@huawei.com, akpm@linux-foundation.org, surenb@google.com, robin.murphy@arm.com Cc: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Yeoreum Yun Subject: [PATCH v4 4/6] kselftest/arm64/mte: preparation for mtefar test Date: Wed, 7 May 2025 10:57:55 +0100 Message-Id: <20250507095757.1663684-5-yeoreum.yun@arm.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250507095757.1663684-1-yeoreum.yun@arm.com> References: <20250507095757.1663684-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 is preparation for testing FEAT_MTE_TAGGED_FAR. It shouldn't change the test result. Signed-off-by: Yeoreum Yun --- .../selftests/arm64/mte/check_buffer_fill.c | 2 +- .../selftests/arm64/mte/check_child_memory.c | 4 +- .../arm64/mte/check_hugetlb_options.c | 4 +- .../selftests/arm64/mte/check_ksm_options.c | 4 +- .../selftests/arm64/mte/check_mmap_options.c | 4 +- .../arm64/mte/check_tags_inclusion.c | 2 +- .../selftests/arm64/mte/check_user_mem.c | 2 +- .../selftests/arm64/mte/mte_common_util.c | 70 ++++++++++++++++--- .../selftests/arm64/mte/mte_common_util.h | 8 ++- tools/testing/selftests/arm64/mte/mte_def.h | 8 +++ 10 files changed, 85 insertions(+), 23 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..47e5f940b804 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 @@ -19,20 +20,38 @@ #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; +bool mtefar_support; static unsigned int mte_cur_mode; 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) @@ -45,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_mt= e_cxt.trig_addr))) { + ksft_print_msg("Invalid MTE synchronous exception caught for address = tag! si_tag=3D%x, si_atag: %x\n", si_tag, si_atag); + exit(1); + } + 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; @@ -67,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; @@ -79,12 +103,17 @@ void mte_default_handler(int signum, siginfo_t *si, vo= id *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); } @@ -120,6 +149,20 @@ 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; + + srandom(time(NULL)); + 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) @@ -264,6 +307,7 @@ void mte_initialize_current_context(int mode, uintptr_t= ptr, ssize_t range) cur_mte_cxt.fault_valid =3D false; cur_mte_cxt.trig_addr =3D ptr; cur_mte_cxt.trig_range =3D range; + if (mode =3D=3D MTE_SYNC_ERR) cur_mte_cxt.trig_si_code =3D SEGV_MTESERR; else if (mode =3D=3D MTE_ASYNC_ERR) @@ -316,12 +360,16 @@ 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 + if (hwcaps3 & HWCAP3_MTE_FAR) + mtefar_support =3D true; + /* 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 a0017a303beb..7dbb5e1046ae 100644 --- a/tools/testing/selftests/arm64/mte/mte_common_util.h +++ b/tools/testing/selftests/arm64/mte/mte_common_util.h @@ -34,13 +34,17 @@ struct mte_fault_cxt { unsigned long trig_si_code; /* Flag to denote if correct fault caught */ bool fault_valid; + /* Expected address tag when mte tag fault triggered */ + unsigned char address_tag; }; =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); -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, @@ -54,6 +58,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 Thu Dec 18 03:21:15 2025 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 862EF20B800; Wed, 7 May 2025 09:58:22 +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=1746611904; cv=none; b=M+hz5A0kNy+R+X6u6wg7H67owiZzAybVSXDPdgQhtSoZr+yNTx6Jb7VSYHeJHXbEfPyp6DJtqow6OyAboJ5UKTkatQ6rmunky6i18EV4C4b1NZgRaZPc+rUEXaS+nlbhl/0QLXgBXGQ8BTTKJWEBnYKV0+8jXEPUze3DwykmsAg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1746611904; c=relaxed/simple; bh=TWFzodArfUb56G2s5s6j00RgWcg438jjSrUiM05c4wU=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=GrspzLVe3CE0cftM4Lkpx/BVwUZNpTQsE0PpJ/sxeBDfC+Ebn7nRlIFfnLBsCEDrONczb1voFUzGjDoFu3ZAJ0aXKiXjxWwewwvVd4Cg+QwwZSrmZvWAxzHfNNs3HFswxfoTQ+VESMvvpn6R/p4l7J1Ugng/xEtNb8USRCiNI+w= 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 CA7D9339; Wed, 7 May 2025 02:58:11 -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 E9EC83F5A1; Wed, 7 May 2025 02:58:18 -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, shmeerali.kolothum.thodi@huawei.com, james.morse@arm.com, mark.rutland@arm.com, huangxiaojia2@huawei.com, akpm@linux-foundation.org, surenb@google.com, robin.murphy@arm.com Cc: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Yeoreum Yun Subject: [PATCH v4 5/6] kselftest/arm64/mte: refactor check_mmap_option test Date: Wed, 7 May 2025 10:57:56 +0100 Message-Id: <20250507095757.1663684-6-yeoreum.yun@arm.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250507095757.1663684-1-yeoreum.yun@arm.com> References: <20250507095757.1663684-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. Signed-off-by: Yeoreum Yun --- .../selftests/arm64/mte/check_mmap_options.c | 158 +++++++++++++----- 1 file changed, 118 insertions(+), 40 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..a784b3a31d4f 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,12 @@ #define TAG_CHECK_ON 0 #define TAG_CHECK_OFF 1 =20 +#define TEST_NAME_MAX 256 + +#define CHECK_ANON_MEM 0 +#define CHECK_FILE_MEM 1 +#define CHECK_CLEAR_PROT_MTE 2 + static size_t page_size; static int sizes[] =3D { 1, 537, 989, 1269, MT_GRANULE_SIZE - 1, MT_GRANULE_SIZE, @@ -183,10 +190,98 @@ static int check_clear_prot_mte_flag(int mem_type, in= t mode, int mapping) return KSFT_PASS; } =20 +const char *format_test_name(int check_type, int mem_type, int sync, + int mapping, int tag_check) +{ + 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 (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 (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 (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 (mapping) { + case MAP_SHARED: + mapping_str =3D "shared"; + break; + case MAP_PRIVATE: + mapping_str =3D "private"; + break; + default: + assert(0); + break; + } + + switch (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, TEST_NAME_MAX, + "Check %s with %s mapping, %s mode, %s memory and %s\n", + check_type_str, mapping_str, sync_str, mem_type_str, tag_check_s= tr); + + return test_name; +} + int main(int argc, char *argv[]) { int err; int item =3D ARRAY_SIZE(sizes); + int check_type[] =3D { CHECK_ANON_MEM, CHECK_FILE_MEM }; + int mem_type[] =3D { USE_MMAP, USE_MPROTECT }; + int mte_sync[] =3D { MTE_SYNC_ERR, MTE_ASYNC_ERR }; + int mapping[] =3D { MAP_PRIVATE, MAP_SHARED }; + int c, mt, s, m; =20 err =3D mte_default_setup(); if (err) @@ -210,54 +305,37 @@ int main(int argc, char *argv[]) mte_enable_pstate_tco(); =20 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"); + format_test_name(CHECK_ANON_MEM, USE_MMAP, MTE_SYNC_ERR, MAP_PRIVA= TE, TAG_CHECK_OFF)); + 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"); + format_test_name(CHECK_FILE_MEM, USE_MPROTECT, MTE_SYNC_ERR, MAP_P= RIVATE, TAG_CHECK_OFF)); =20 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"); + format_test_name(CHECK_ANON_MEM, USE_MMAP, MTE_NONE_ERR, MAP_PRIVA= TE, TAG_CHECK_OFF)); 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"); + format_test_name(CHECK_FILE_MEM, USE_MPROTECT, MTE_NONE_ERR, MAP_P= RIVATE, TAG_CHECK_OFF)); + + for (c =3D 0 ; c < ARRAY_SIZE(check_type); c++) { + for (s =3D 0; s < ARRAY_SIZE(mte_sync); s++) { + for (m =3D 0; m < ARRAY_SIZE(mapping); m++) { + for (mt =3D 0; mt < ARRAY_SIZE(mem_type); mt++) { + if (check_type[c] =3D=3D CHECK_ANON_MEM) + evaluate_test(check_anonymous_memory_mapping(mem_type[mt], mte_sync[= s], mapping[m], TAG_CHECK_ON), + format_test_name(CHECK_ANON_MEM, mem_type[mt], mte_sync[s], mapping= [m], TAG_CHECK_ON)); + else + evaluate_test(check_file_memory_mapping(mem_type[mt], mte_sync[s], m= apping[m], TAG_CHECK_ON), + format_test_name(CHECK_FILE_MEM, mem_type[mt], mte_sync[s], mapping= [m], TAG_CHECK_ON)); + } + } + } + } =20 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"); + format_test_name(CHECK_CLEAR_PROT_MTE, USE_MMAP, MTE_SYNC_ERR, MAP= _PRIVATE, TAG_CHECK_ON)); 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"); + format_test_name(CHECK_CLEAR_PROT_MTE, USE_MPROTECT, MTE_SYNC_ERR,= MAP_PRIVATE, TAG_CHECK_ON)); =20 mte_restore_setup(); ksft_print_cnts(); --=20 LEVI:{C3F47F37-75D8-414A-A8BA-3980EC8A46D7} From nobody Thu Dec 18 03:21:15 2025 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 62394213E6A; Wed, 7 May 2025 09:58:25 +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=1746611908; cv=none; b=WmlO4Fd/c+2PgjcNkUjFUW4paElqjU9zCAhGcHmlaxS2B+4O3UCJi65jSHTUDNfUzjHrZui9TTFhoTqQWec1xjbjXCcF4EZajOSR562CSVe+j77y0hp/d4W8KDPwLyFeSA0/nSU/ORv0sa2CFHsGzcJJpfolz7ihpYAN4w15s5M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1746611908; c=relaxed/simple; bh=CdsGf/7xKMmbGVYHunkGolE7VzdDVLZSB9UsioP4co0=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=L1xVE/UUg9QRuNZnGmD3oK3WxDZcGlmPhFjns+6ooksmk0nUUtnZ4RSfnnfqCdHq3qNo8zrIxvBKOJIYakE/KOgPILlkj+h6vzcaR+jwlXnWSdic392bJEIefS72rZjewisVfzKBajQcQr3D7z7VaLe/XrodR5xD/ihX7ceEvo4= 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 19D2C1FC4; Wed, 7 May 2025 02:58:15 -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 286F33F5A1; Wed, 7 May 2025 02:58:22 -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, shmeerali.kolothum.thodi@huawei.com, james.morse@arm.com, mark.rutland@arm.com, huangxiaojia2@huawei.com, akpm@linux-foundation.org, surenb@google.com, robin.murphy@arm.com Cc: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Yeoreum Yun Subject: [PATCH v4 6/6] kselftest/arm64/mte: add mtefar test on check_mmap_option Date: Wed, 7 May 2025 10:57:57 +0100 Message-Id: <20250507095757.1663684-7-yeoreum.yun@arm.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250507095757.1663684-1-yeoreum.yun@arm.com> References: <20250507095757.1663684-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 --- .../selftests/arm64/mte/check_mmap_options.c | 132 +++++++++++------- 1 file changed, 80 insertions(+), 52 deletions(-) diff --git a/tools/testing/selftests/arm64/mte/check_mmap_options.c b/tools= /testing/selftests/arm64/mte/check_mmap_options.c index a784b3a31d4f..4f26617c8e69 100644 --- a/tools/testing/selftests/arm64/mte/check_mmap_options.c +++ b/tools/testing/selftests/arm64/mte/check_mmap_options.c @@ -31,14 +31,25 @@ #define CHECK_FILE_MEM 1 #define CHECK_CLEAR_PROT_MTE 2 =20 +#define ATAG_TEST_ON 1 +#define ATAG_TEST_OFF 0 + static size_t page_size; static int sizes[] =3D { 1, 537, 989, 1269, MT_GRANULE_SIZE - 1, MT_GRANULE_SIZE, /* 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_test) { + int err; + + if (!mtefar_support && atag_test =3D=3D ATAG_TEST_ON) + return KSFT_SKIP; + + if (atag_test =3D=3D ATAG_TEST_ON) + ptr =3D mte_insert_atag(ptr); + mte_initialize_current_context(mode, (uintptr_t)ptr, size); memset(ptr, '1', size); mte_wait_after_trig(); @@ -64,7 +75,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_test) { char *ptr, *map_ptr; int run, result, map_size; @@ -86,16 +97,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_test); 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_SKIP) + 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_test) { char *ptr, *map_ptr; int run, fd, map_size; @@ -124,7 +135,7 @@ static int check_file_memory_mapping(int mem_type, int = 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_test); mte_clear_tags((void *)ptr, sizes[run]); munmap((void *)map_ptr, map_size); close(fd); @@ -134,7 +145,7 @@ static int check_file_memory_mapping(int mem_type, int = mode, int mapping, int ta return result; } =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_test) { char *ptr, *map_ptr; int run, prot_flag, result, fd, map_size; @@ -157,10 +168,10 @@ static int check_clear_prot_mte_flag(int mem_type, in= t 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_te= st); mte_free_memory_tag_range((void *)ptr, sizes[run], mem_type, UNDERFLOW, = OVERFLOW); if (result !=3D KSFT_PASS) - return KSFT_FAIL; + return result; =20 fd =3D create_temp_file(); if (fd =3D=3D -1) @@ -181,17 +192,17 @@ 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_te= st); 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; } =20 const char *format_test_name(int check_type, int mem_type, int sync, - int mapping, int tag_check) + int mapping, int tag_check, int atag_test) { static char test_name[TEST_NAME_MAX]; const char* check_type_str; @@ -199,6 +210,7 @@ const char *format_test_name(int check_type, int mem_ty= pe, int sync, const char* sync_str; const char* mapping_str; const char* tag_check_str; + const char *atag_test_str; =20 switch (check_type) { case CHECK_ANON_MEM: @@ -266,9 +278,22 @@ const char *format_test_name(int check_type, int mem_t= ype, int sync, break; } =20 + switch (atag_test) { + case ATAG_TEST_ON: + atag_test_str =3D "with address tag [63:60]"; + break; + case ATAG_TEST_OFF: + atag_test_str =3D "without address tag [63:60]"; + break; + default: + assert(0); + break; + } + snprintf(test_name, TEST_NAME_MAX, - "Check %s with %s mapping, %s mode, %s memory and %s\n", - check_type_str, mapping_str, sync_str, mem_type_str, tag_check_s= tr); + "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, atag_test_str); =20 return test_name; } @@ -281,7 +306,8 @@ int main(int argc, char *argv[]) int mem_type[] =3D { USE_MMAP, USE_MPROTECT }; int mte_sync[] =3D { MTE_SYNC_ERR, MTE_ASYNC_ERR }; int mapping[] =3D { MAP_PRIVATE, MAP_SHARED }; - int c, mt, s, m; + int atag_test[] =3D { ATAG_TEST_OFF, ATAG_TEST_ON }; + int c, mt, s, m, a; =20 err =3D mte_default_setup(); if (err) @@ -295,47 +321,49 @@ 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(22); - - mte_enable_pstate_tco(); - - evaluate_test(check_anonymous_memory_mapping(USE_MMAP, MTE_SYNC_ERR, MAP_= PRIVATE, TAG_CHECK_OFF), - format_test_name(CHECK_ANON_MEM, USE_MMAP, MTE_SYNC_ERR, MAP_PRIVA= TE, TAG_CHECK_OFF)); - - evaluate_test(check_file_memory_mapping(USE_MPROTECT, MTE_SYNC_ERR, MAP_P= RIVATE, TAG_CHECK_OFF), - format_test_name(CHECK_FILE_MEM, USE_MPROTECT, MTE_SYNC_ERR, MAP_P= RIVATE, TAG_CHECK_OFF)); - - mte_disable_pstate_tco(); - - evaluate_test(check_anonymous_memory_mapping(USE_MMAP, MTE_NONE_ERR, MAP_= PRIVATE, TAG_CHECK_OFF), - format_test_name(CHECK_ANON_MEM, USE_MMAP, MTE_NONE_ERR, MAP_PRIVA= TE, TAG_CHECK_OFF)); - evaluate_test(check_file_memory_mapping(USE_MPROTECT, MTE_NONE_ERR, MAP_P= RIVATE, TAG_CHECK_OFF), - format_test_name(CHECK_FILE_MEM, USE_MPROTECT, MTE_NONE_ERR, MAP_P= RIVATE, TAG_CHECK_OFF)); - - for (c =3D 0 ; c < ARRAY_SIZE(check_type); c++) { - for (s =3D 0; s < ARRAY_SIZE(mte_sync); s++) { - for (m =3D 0; m < ARRAY_SIZE(mapping); m++) { - for (mt =3D 0; mt < ARRAY_SIZE(mem_type); mt++) { - if (check_type[c] =3D=3D CHECK_ANON_MEM) - evaluate_test(check_anonymous_memory_mapping(mem_type[mt], mte_sync[= s], mapping[m], TAG_CHECK_ON), - format_test_name(CHECK_ANON_MEM, mem_type[mt], mte_sync[s], mapping= [m], TAG_CHECK_ON)); - else - evaluate_test(check_file_memory_mapping(mem_type[mt], mte_sync[s], m= apping[m], TAG_CHECK_ON), - format_test_name(CHECK_FILE_MEM, mem_type[mt], mte_sync[s], mapping= [m], TAG_CHECK_ON)); + ksft_set_plan(44); + + for (a =3D 0; a < ARRAY_SIZE(atag_test); a++) { + /* Register signal handlers */ + mte_register_signal(SIGBUS, mte_default_handler, atag_test[a]); + mte_register_signal(SIGSEGV, mte_default_handler, atag_test[a]); + + mte_enable_pstate_tco(); + + evaluate_test(check_anonymous_memory_mapping(USE_MMAP, MTE_SYNC_ERR, MAP= _PRIVATE, TAG_CHECK_OFF, atag_test[a]), + format_test_name(CHECK_ANON_MEM, USE_MMAP, MTE_SYNC_ERR, MAP_PRIV= ATE, TAG_CHECK_OFF, atag_test[a])); + + evaluate_test(check_file_memory_mapping(USE_MPROTECT, MTE_SYNC_ERR, MAP_= PRIVATE, TAG_CHECK_OFF, atag_test[a]), + format_test_name(CHECK_FILE_MEM, USE_MPROTECT, MTE_SYNC_ERR, MAP_= PRIVATE, TAG_CHECK_OFF, atag_test[a])); + + mte_disable_pstate_tco(); + + evaluate_test(check_anonymous_memory_mapping(USE_MMAP, MTE_NONE_ERR, MAP= _PRIVATE, TAG_CHECK_OFF, atag_test[a]), + format_test_name(CHECK_ANON_MEM, USE_MMAP, MTE_NONE_ERR, MAP_PRIV= ATE, TAG_CHECK_OFF, atag_test[a])); + evaluate_test(check_file_memory_mapping(USE_MPROTECT, MTE_NONE_ERR, MAP_= PRIVATE, TAG_CHECK_OFF, atag_test[a]), + format_test_name(CHECK_FILE_MEM, USE_MPROTECT, MTE_NONE_ERR, MAP_= PRIVATE, TAG_CHECK_OFF, atag_test[a])); + + for (c =3D 0 ; c < ARRAY_SIZE(check_type); c++) { + for (s =3D 0; s < ARRAY_SIZE(mte_sync); s++) { + for (m =3D 0; m < ARRAY_SIZE(mapping); m++) { + for (mt =3D 0; mt < ARRAY_SIZE(mem_type); mt++) { + if (check_type[c] =3D=3D CHECK_ANON_MEM) + evaluate_test(check_anonymous_memory_mapping(mem_type[mt], mte_sync= [s], mapping[m], TAG_CHECK_ON, atag_test[a]), + format_test_name(CHECK_ANON_MEM, mem_type[mt], mte_sync[s], mappin= g[m], TAG_CHECK_ON, atag_test[a])); + else + evaluate_test(check_file_memory_mapping(mem_type[mt], mte_sync[s], = mapping[m], TAG_CHECK_ON, atag_test[a]), + format_test_name(CHECK_FILE_MEM, mem_type[mt], mte_sync[s], mappin= g[m], TAG_CHECK_ON, atag_test[a])); + } } } } - } =20 - evaluate_test(check_clear_prot_mte_flag(USE_MMAP, MTE_SYNC_ERR, MAP_PRIVA= TE), - format_test_name(CHECK_CLEAR_PROT_MTE, USE_MMAP, MTE_SYNC_ERR, MAP= _PRIVATE, TAG_CHECK_ON)); - evaluate_test(check_clear_prot_mte_flag(USE_MPROTECT, MTE_SYNC_ERR, MAP_P= RIVATE), - format_test_name(CHECK_CLEAR_PROT_MTE, USE_MPROTECT, MTE_SYNC_ERR,= MAP_PRIVATE, TAG_CHECK_ON)); + evaluate_test(check_clear_prot_mte_flag(USE_MMAP, MTE_SYNC_ERR, MAP_PRIV= ATE, atag_test[a]), + format_test_name(CHECK_CLEAR_PROT_MTE, USE_MMAP, MTE_SYNC_ERR, MA= P_PRIVATE, TAG_CHECK_ON, atag_test[a])); + evaluate_test(check_clear_prot_mte_flag(USE_MPROTECT, MTE_SYNC_ERR, MAP_= PRIVATE, atag_test[a]), + format_test_name(CHECK_CLEAR_PROT_MTE, USE_MPROTECT, MTE_SYNC_ERR= , MAP_PRIVATE, TAG_CHECK_ON, atag_test[a])); + } =20 mte_restore_setup(); ksft_print_cnts(); --=20 LEVI:{C3F47F37-75D8-414A-A8BA-3980EC8A46D7}