From nobody Thu Apr 16 14:23:05 2026 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4fxKxB5GhLz6Zkm1 for ; Thu, 16 Apr 2026 14:23:10 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R12" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4fxKxB40Bsz48tP for ; Thu, 16 Apr 2026 14:23:10 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1776349390; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=97oi/BGir8n3/hAK8PjmiZK2S+ZK3hsRQDD6ikI9oY8=; b=XE24wdZVvSbyVJaYD1RodSJ81lzcRt0HBJtdKnsFTtjuNbHuQunpQtNMBXITcxlV1AZsJ2 wiD1GkstgI54Mrqiiy/x3EH4x4H/Q0EFfWuRQdmDtqFQzrFtkmhNWmf6XS1jKJfJHw0doy XyALmR/uDo3luEup0NkESurzvRjkOpQa8LQhcxOgc2TXaXpwSCzimFc6APCn4TVrWA5VWz DSpzJRVca0QZbtxJoBx5qZyhSl5wlCwl9rEq7y4lncYM74x12VWnJK6z5dNlovsbnqRAB4 xWsyvAJ/ljKbdGqeW4pL+WgDxWp4uyAdCuTByJIZQMwMiMqGjz+cDCVQkCXWwg== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1776349390; a=rsa-sha256; cv=none; b=DFHnvNvNCqGQQbQfZnM9uOYyBp+lE4XttjA2g0qLuBUhGf0IebrwTNlS4qSylnF0laYFKS +VMZjFoayhMzHtBdp0D7Vc9AYSnku8Wwh3miDrmV70CGxuNkgWhe/yqhf2LcIOxeS2Jw5k IsyXm2bHNAKkza9bofXbUYItfET+KTN8lxeyPO/+cvgPb1XhXkF1A2lkaj5wLKeHvdHFZR dG4+gl4EUIzeqsFhnszaf8JP06xAaRM87oQocjo6tH/GHwxDBHz+d0DpdkLpXGWBSCtm80 At0v98of6G2YgIoSvs9L/hOnHGcvjEyGjtESLSbN52vKJ1+29Rubzt/uZDqwPw== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1776349390; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=97oi/BGir8n3/hAK8PjmiZK2S+ZK3hsRQDD6ikI9oY8=; b=GvbLQEqsKCmWBQu0AocgEmwTi8Rpe5wQZX5w74ktMu6kntpOF3L4wmu6Zt/kN7UQNDZzup v5ddWNLdrE1ZEHeqvnBup6VC89DzJijLWpHVATy0fIB+KLNRgvPT+fdDnpGwXeHniI49EQ 16BuqNwoK9SreRShsTAOzt6r2jCM96+4mLuOJXnT5NbWg5npo0flI6X/LbJcf8shJYm+rT X/q6H93mqf4byNjSEryl+ASbDlxN6k02eJ01PJOqt1SMXWv9tc/YFKKbkOqYji5iTo9OoR i4W7pCsfziHlKIkpadsgpoRRerjrfd5ziR/pYGq9RgB0HKTkDl1avSGSDFCDRA== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4fxKxB3Tkzz19gZ for ; Thu, 16 Apr 2026 14:23:10 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 18622 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Thu, 16 Apr 2026 14:23:05 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org Cc: Harry Moulton From: Andrew Turner Subject: git: 6f9e9eba984f - main - arm64: mte: handle synchronous tag check faults List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: andrew X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 6f9e9eba984f5c8d8a022c0ec99f844a911687fe Auto-Submitted: auto-generated Date: Thu, 16 Apr 2026 14:23:05 +0000 Message-Id: <69e0f0c9.18622.10353280@gitrepo.freebsd.org> The branch main has been updated by andrew: URL: https://cgit.FreeBSD.org/src/commit/?id=6f9e9eba984f5c8d8a022c0ec99f844a911687fe commit 6f9e9eba984f5c8d8a022c0ec99f844a911687fe Author: Harry Moulton AuthorDate: 2026-04-16 13:29:14 +0000 Commit: Andrew Turner CommitDate: 2026-04-16 14:22:24 +0000 arm64: mte: handle synchronous tag check faults The Memory Tagging Extension supports both Synchronous and Asynchronous faults, called Tag Check Faults, which are configurable via SCTLR_EL1.TCF0 for userspace and SCTLR_EL1.TCF for the kernel. This commit adds support for handling synchronous tag check faults at EL0 and EL1, although these are only enabled on a per-process basis in userspace, kernel space does not enable tag check faults. A TCF in the kernel will cause a kernel panic like any other virtual memory fault, and a TCF in userspace will result in a SIGSEGV Reviewed by: kib Sponsored by: Arm Ltd Signed-off-by: Harry Moulton Differential Revision: https://reviews.freebsd.org/D55947 --- sys/arm64/arm64/trap.c | 22 ++++++++++++++++++++++ sys/sys/signal.h | 2 ++ 2 files changed, 24 insertions(+) diff --git a/sys/arm64/arm64/trap.c b/sys/arm64/arm64/trap.c index ad461aa1bffc..1178817108e5 100644 --- a/sys/arm64/arm64/trap.c +++ b/sys/arm64/arm64/trap.c @@ -94,6 +94,7 @@ typedef void (abort_handler)(struct thread *, struct trapframe *, uint64_t, static abort_handler align_abort; static abort_handler data_abort; static abort_handler external_abort; +static abort_handler tag_check_abort; static abort_handler *abort_handlers[] = { [ISS_DATA_DFSC_TF_L0] = data_abort, @@ -106,6 +107,7 @@ static abort_handler *abort_handlers[] = { [ISS_DATA_DFSC_PF_L1] = data_abort, [ISS_DATA_DFSC_PF_L2] = data_abort, [ISS_DATA_DFSC_PF_L3] = data_abort, + [ISS_DATA_DFSC_TAG] = tag_check_abort, [ISS_DATA_DFSC_ALIGN] = align_abort, [ISS_DATA_DFSC_EXT] = external_abort, [ISS_DATA_DFSC_EXT_L0] = external_abort, @@ -250,6 +252,26 @@ external_abort(struct thread *td, struct trapframe *frame, uint64_t esr, panic("Unhandled external data abort"); } +static void +tag_check_abort(struct thread *td, struct trapframe *frame, uint64_t esr, + uint64_t far, int lower) +{ + /* + * A Tag Check Fault should be handled as a SIGSEGV if it occurs + * at EL0 and a kernel panic if at EL1. + */ + if (!lower) { + print_registers(frame); + print_gp_register("far", far); + printf(" esr: 0x%.16lx\n", esr); + panic("Tag Check Fault"); + } + + call_trapsignal(td, SIGSEGV, SEGV_MTESERR, (void *)far, + ESR_ELx_EXCEPTION(frame->tf_esr)); + userret(td, frame); +} + /* * It is unsafe to access the stack canary value stored in "td" until * kernel map translation faults are handled, see the pmap_klookup() call below. diff --git a/sys/sys/signal.h b/sys/sys/signal.h index c0b65c0c9ef0..863b981c2b7a 100644 --- a/sys/sys/signal.h +++ b/sys/sys/signal.h @@ -307,6 +307,8 @@ struct __siginfo32 { #define SEGV_ACCERR 2 /* Invalid permissions for mapped */ /* object. */ #define SEGV_PKUERR 100 /* x86: PKU violation */ +#define SEGV_MTEAERR 100 /* arm64: Asynchronous Arm MTE error */ +#define SEGV_MTESERR 101 /* arm64: Synchronous Arm MTE error */ /* codes for SIGFPE */ #define FPE_INTOVF 1 /* Integer overflow. */