From nobody Wed May 27 15:24:13 2026 X-Original-To: dev-commits-src-main@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 4gQYLl2S3cz6fBTt for ; Wed, 27 May 2026 15:24:15 +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 "R13" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4gQYLk1SqZz3PgK for ; Wed, 27 May 2026 15:24:14 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1779895454; 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=Vd2JjRe5KTIQ6HSW5URwUQIDEQzbcW7LuETprhxZ/nc=; b=d0SnM1dQXw7bnMQEO5+D/QUG6/jbmJKzvZGHEC1UeP/FJ42D2L7r78Uuo9zlBgvbw2oKAi H7MZ5Fg4UvvFfoEq7wZ9jSpn545iGisfsEpqZAVezbsF31fsqC5sYm+S6izpKzUL+6v9r4 lOrpLrufhejsZQP/7Mhgs5xl38nsaD8N8saKT3UQPqhk0dWXMIE6vCbWXH6Bx8MD2q17C+ KWpo4cGvvhaP4xmH5tR/mCNCqeUFnMi98blbsJ/ihXr9jyXz5FU/jKbsQ5XaZq/Y9m/eRM J5zVQ2oyanxVSxNdQqXHh9qlew1QE6Lz/sCrwjkmGA5n8ZIIn6hnb3H0AZIcHw== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1779895454; a=rsa-sha256; cv=none; b=cifQv3IcokmHGn3vWdX/jqj1I15NsAO4B5surDSzmOtv8hohrTmnUzJh90YLiXcC1QZ5nF utmX7iDaCX2aAQqhnfM1xfba8y8MMyrE3qI/XtMjQbkAhMI/P77jVltlS6ZrQgRFG7GqEn lvpfKo2HiTszd1kFvb5mOadh3mV/3Aduxy9NvOFZNeFVdstZljMGdhKNts641187R0Cdw7 Rje8NxmMHFVmoXMii+Bk8A6jKfgoJVxOhQpnIda7pJJreQsQ2D5j4ctjojWEK2kabHIqSe HytmZZjtWQ5usJaEf7cEDoRQQvfEyHhizyn0RvUxVxlrqh9FG6pmptdgShYRig== 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=1779895454; 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=Vd2JjRe5KTIQ6HSW5URwUQIDEQzbcW7LuETprhxZ/nc=; b=FPp6yQKxB7siF5B3P8jXo86gScNTOxAReXP5Z4JaIYCseGv/YXHkqw+CBtlwmap/r6xXij vN1FO+BlCY8sg8+dxJU+Bx3sMs9nje111QoC8Qc+WHuJkFmacLq3hhs4xW+lFfHvG2Bx91 Ytv5viBvOKHv6K1q1f+1ShKn+V1vcTbZ0HnKy0BYego7Z+5ihhtPwI2nZ0toHj6YDbGCpy JizqA03e4Op5TaxIRsNOOoYYq1SL0+UhQfUyuKQv5vI8OskBsRR2H2ijNQin24/aN/eMad zpl7MRPfkuRQLhzWxuPSKR8S5xOH6A8OYSysjiSuvPCA4IlH4WjfTNSbNACLHA== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4gQYLj6Fkhz14g5 for ; Wed, 27 May 2026 15:24:13 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 26e27 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Wed, 27 May 2026 15:24:13 +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: bb9497a2d462 - main - arm64: Add vm_page_t MTE flags List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-main@freebsd.org Sender: owner-dev-commits-src-main@FreeBSD.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list 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: bb9497a2d462e668455d0a561bd5677f447b4acf Auto-Submitted: auto-generated Date: Wed, 27 May 2026 15:24:13 +0000 Message-Id: <6a170c9d.26e27.6932ecae@gitrepo.freebsd.org> The branch main has been updated by andrew: URL: https://cgit.FreeBSD.org/src/commit/?id=bb9497a2d462e668455d0a561bd5677f447b4acf commit bb9497a2d462e668455d0a561bd5677f447b4acf Author: Harry Moulton AuthorDate: 2026-05-18 09:09:23 +0000 Commit: Andrew Turner CommitDate: 2026-05-27 15:22:26 +0000 arm64: Add vm_page_t MTE flags To track which pages have MTE tags. Add a flag field to md_page. We can then use this in MD code to mark which pages have MTE tags. Reviewed by: andrew Sponsored by: Arm Ltd Differential Revision: https://reviews.freebsd.org/D55954 --- sys/arm64/arm64/mte.c | 38 ++++++++++++++++++++++++++++++++++++++ sys/arm64/arm64/pmap.c | 1 + sys/arm64/include/cpu.h | 2 ++ sys/arm64/include/pmap.h | 3 +++ 4 files changed, 44 insertions(+) diff --git a/sys/arm64/arm64/mte.c b/sys/arm64/arm64/mte.c index 88f394dc72c3..ba5d9df3b01c 100644 --- a/sys/arm64/arm64/mte.c +++ b/sys/arm64/arm64/mte.c @@ -49,6 +49,13 @@ static u_int __read_mostly mte_version = 0; struct thread *mte_switch(struct thread *); +/* Fetch the block size used by tag load and store instructions */ +static inline size_t +mte_block_size(void) +{ + return (sizeof(int) << GMID_BS_SIZE(READ_SPECIALREG(GMID_EL1_REG))); +} + static void mte_update_sctlr(struct thread *td, uint64_t sctlr) { @@ -57,6 +64,37 @@ mte_update_sctlr(struct thread *td, uint64_t sctlr) td->td_md.md_sctlr |= sctlr; } +/** + * Clear/sync the allocation tags for a given page. This should be done on + * allocation of a page to ensure a tag check fault does not occur immediately + * after accessing newly tagged memory. + */ +void +mte_sync_tags(vm_page_t page) +{ + char *addr; + size_t block_size; + + if (!MTE_HAS_TAG_CHECK) + return; + + /* don't clear the tags on a page that's already setup for mte */ + if ((page->md.pv_flags & PV_MTE_TAGGED) != 0) + return; + + block_size = mte_block_size(); + addr = PHYS_TO_DMAP(page->phys_addr); + + for (size_t count = 0; count < PAGE_SIZE; + count += block_size, addr += block_size) + asm volatile( + ".arch_extension memtag \n" + "stgm xzr, [%0] \n" + ".arch_extension nomemtag" : : "r" (addr)); + + page->md.pv_flags |= PV_MTE_TAGGED; +} + void mte_fork(struct thread *new_td, struct thread *orig_td) { diff --git a/sys/arm64/arm64/pmap.c b/sys/arm64/arm64/pmap.c index 0aa1ee8d5801..6914fc13b065 100644 --- a/sys/arm64/arm64/pmap.c +++ b/sys/arm64/arm64/pmap.c @@ -6922,6 +6922,7 @@ pmap_zero_page(vm_page_t m) void *va = VM_PAGE_TO_DMAP(m); pagezero(va); + m->md.pv_flags &= ~PV_MTE_TAGGED; } /* diff --git a/sys/arm64/include/cpu.h b/sys/arm64/include/cpu.h index 8d8a80a8d02a..d36e1e56c91c 100644 --- a/sys/arm64/include/cpu.h +++ b/sys/arm64/include/cpu.h @@ -284,6 +284,8 @@ void mte_copy_thread(struct thread *, struct thread *); void mte_thread_alloc(struct thread *); void mte_thread0(struct thread *); +void mte_sync_tags(vm_page_t page); + /* Functions to read the sanitised view of the special registers */ void update_special_regs(u_int); void update_special_reg_iss(u_int, uint64_t, uint64_t); diff --git a/sys/arm64/include/pmap.h b/sys/arm64/include/pmap.h index 69ae8e5c80b7..cf20827fa666 100644 --- a/sys/arm64/include/pmap.h +++ b/sys/arm64/include/pmap.h @@ -74,6 +74,9 @@ struct md_page { uint8_t pv_reserve[2]; }; +/* machine page flags */ +#define PV_MTE_TAGGED 0x01 /* page is tagged with MTE */ + enum pmap_stage { PM_INVALID, PM_STAGE1,