From nobody Sat Oct 11 04:10:47 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}