From patchwork Wed Jan 11 12:37:26 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Kirill A. Shutemov" X-Patchwork-Id: 13096670 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id C929BC46467 for ; Wed, 11 Jan 2023 13:24:21 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 6283F94000D; Wed, 11 Jan 2023 08:24:08 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 56045940010; Wed, 11 Jan 2023 08:24:08 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 1B7B094000D; Wed, 11 Jan 2023 08:24:08 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0011.hostedemail.com [216.40.44.11]) by kanga.kvack.org (Postfix) with ESMTP id 0075D94000E for ; Wed, 11 Jan 2023 08:24:07 -0500 (EST) Received: from smtpin11.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay08.hostedemail.com (Postfix) with ESMTP id D6DF2140A88 for ; Wed, 11 Jan 2023 13:24:07 +0000 (UTC) X-FDA: 80342586534.11.9FB459C Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by imf01.hostedemail.com (Postfix) with ESMTP id EA1D640006 for ; Wed, 11 Jan 2023 13:24:05 +0000 (UTC) Authentication-Results: imf01.hostedemail.com; dkim=pass header.d=intel.com header.s=Intel header.b=YQrgtK9f; spf=none (imf01.hostedemail.com: domain of kirill.shutemov@linux.intel.com has no SPF policy when checking 134.134.136.24) smtp.mailfrom=kirill.shutemov@linux.intel.com; dmarc=pass (policy=none) header.from=intel.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1673443446; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=6WRPVos/HMIaBDHmKS6MLy3kevGkb6PumiQBQUSfvn0=; b=m4brO7PmTzJg9ADO5yPTg4GDy/K+I+NPKHJpwaK1qd2Q3tVLjq3lWlZjCPAylS7dupG85C GYhUQCiuOfr2fhwLC4Ml/vgteUwSRNbTNFatXLKXo1TGeys+erNJnglVcgFk9nQHQsNNvW dkhzYJUcSJiPaoFgbKnDP9p9tTkhm48= ARC-Authentication-Results: i=1; imf01.hostedemail.com; dkim=pass header.d=intel.com header.s=Intel header.b=YQrgtK9f; spf=none (imf01.hostedemail.com: domain of kirill.shutemov@linux.intel.com has no SPF policy when checking 134.134.136.24) smtp.mailfrom=kirill.shutemov@linux.intel.com; dmarc=pass (policy=none) header.from=intel.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1673443446; a=rsa-sha256; cv=none; b=A6OHM5NMjsr69DmxWkYXu1QPVW6gv03/fW95L7W/ifHlAqjKn6QqmoEm19eHOb61R9eo8E Us5QNH8GWG43cllQkPx8KAmNlo5BIFWVW4cuAtQBAc0twaF7lWWCZcTJCSLwGeC0ZtDTf9 GbT8stGWoiwObqtOl7U20wBL3orqUE0= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1673443446; x=1704979446; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=UBKxNmRcAlY5Gk5PHZ4C0nPPjFoKYauY1gpRMXD9SVM=; b=YQrgtK9fLc5QoinQQBD8FSAW+oRMwodKjcVpkU7GQV85L4MOc3I4OKFV zD6Z5t5i6cQHFMXvQVfZvNsfl9vtnwn6XNw+NhK5cyyUSPVLzO4WkJ+j2 9EJdsDcqAUPZnuYi9JlbGrHZPL/+lniGWzUzUT5Ug3IQ88NXDqk+eKI6d Uh/mEaNM+WdhNtoyUsiWyGkxH/v1DNGzhNm4Q+CSKgbwH00ylNwaPB0Lp UzY5UXEnswSxdsNrTO55loeXGRz+PIFl+vBlLH6dtJ4KGM/KqPbGRzxvG pQVfBp+Mmn/x+0XpcJ8oYqyELJC4/Nj1D6vYqm7/BrzaZpteWh8ghvDr7 A==; X-IronPort-AV: E=McAfee;i="6500,9779,10586"; a="324646130" X-IronPort-AV: E=Sophos;i="5.96,317,1665471600"; d="scan'208";a="324646130" Received: from fmsmga008.fm.intel.com ([10.253.24.58]) by orsmga102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 11 Jan 2023 05:23:55 -0800 X-IronPort-AV: E=McAfee;i="6500,9779,10586"; a="720725492" X-IronPort-AV: E=Sophos;i="5.96,317,1665471600"; d="scan'208";a="720725492" Received: from bachaue1-mobl1.ger.corp.intel.com (HELO box.shutemov.name) ([10.252.37.250]) by fmsmga008-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 11 Jan 2023 05:23:50 -0800 Received: by box.shutemov.name (Postfix, from userid 1000) id 48E17109CB2; Wed, 11 Jan 2023 15:37:41 +0300 (+03) From: "Kirill A. Shutemov" To: Dave Hansen , Andy Lutomirski , Peter Zijlstra Cc: x86@kernel.org, Kostya Serebryany , Andrey Ryabinin , Andrey Konovalov , Alexander Potapenko , Taras Madan , Dmitry Vyukov , "H . J . Lu" , Andi Kleen , Rick Edgecombe , Bharata B Rao , Jacob Pan , Ashok Raj , Linus Torvalds , linux-mm@kvack.org, linux-kernel@vger.kernel.org, "Kirill A. Shutemov" Subject: [PATCHv14 07/17] x86/mm: Provide arch_prctl() interface for LAM Date: Wed, 11 Jan 2023 15:37:26 +0300 Message-Id: <20230111123736.20025-8-kirill.shutemov@linux.intel.com> X-Mailer: git-send-email 2.38.2 In-Reply-To: <20230111123736.20025-1-kirill.shutemov@linux.intel.com> References: <20230111123736.20025-1-kirill.shutemov@linux.intel.com> MIME-Version: 1.0 X-Stat-Signature: wnpoqd3wga46q98bcyqzq7e7yjic3wfe X-Rspam-User: X-Rspamd-Queue-Id: EA1D640006 X-Rspamd-Server: rspam06 X-HE-Tag: 1673443445-295273 X-HE-Meta: U2FsdGVkX1+HfKKexsk96m5Q1iOXg29XmgL0PBUCqLQ7MfZVZVm4CnJBoeM60FPQ1/qp89UBhyp+8SHBY8ADWhpN7TyLFIYD4i3Yin+DEFa87xGM4NGJwHp3w+6a4l8FMmAucZ+jqQPqeFtdHHWo7x8Fq3wG4cDn/dKUe9qoE1NcNXsnQGv6J3phjTHFQUgjhaqQciqCXfqqpQij/p7GILvtL4DGh2ND5K8HyxzhQgao287yBTHRDJye5ZUrm6UthVRYxa2u8Au+iHCE50GXYinVbYVVaObHJ5xLqxUEH3bHwRjIU+9aJ5w/XBVg4XZd/GG6IO94iY8bS3sKLAhvG4FteSqA0MRACZRy7d4DPRTXr7wIMC/4SqTrBTojeCHL+v0scx0aQpFXD1KsXz7p8tUL0weN481bfTvmv4VBo9vbtKaIVZ3I4V0wqwMk+rsARnAx82iCjBZnLa7wqa0xvq6hy+ygAZUbVNG9aDrjVjx8mQ2QtlTWPGSOTKkfx/cYYrc2eeYM6sBa+DeKkklrYIzmt5U+CMPjMncTa8Uy7MiWj0rM0dbPWTVuq75kCKAfI+qkbVMrBNTY1FGX8AGY6xPwkgyfKcrS3qCF5srmivHAakiGY7s3Qh9pK35/PKY1M/xHtXXak2Pn2zoLEO+2QzBQhXgzQ3iV0iWrgXIKwH4qeocS+AmIkedb4djSH++h5ZF9T+x4E21Vnfor0uELf2osbxxn8AwtFTuWbXHKoBzFSv5MyZNdf7/4Xm2jbootgBIY3h8xDdfsDFBAh5envMLVBocBviyiKcdmH9N7exVqWxvqGSVOu4Q0ROe84FgWAjFGxAlcGVYNnXMI0/hO9Ytl4HZxO3pgdN+/NKYZaxm3Us4+Tne6ZcwEkVdUlUCxhjTkid0XLZ7IDNuwjg459m5LMz9tLWMrKb5m8HFSxhifabViA3IsUXTiIsm5unCxvCpBa6bdh0c1BFo/LVR 3dUSOVhm dX1mwT0f5pAK2lRaUHNgAmwVWxzoafsSLg0VC X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: Add a few of arch_prctl() handles: - ARCH_ENABLE_TAGGED_ADDR enabled LAM. The argument is required number of tag bits. It is rounded up to the nearest LAM mode that can provide it. For now only LAM_U57 is supported, with 6 tag bits. - ARCH_GET_UNTAG_MASK returns untag mask. It can indicates where tag bits located in the address. - ARCH_GET_MAX_TAG_BITS returns the maximum tag bits user can request. Zero if LAM is not supported. Signed-off-by: Kirill A. Shutemov --- arch/x86/include/asm/mmu.h | 2 ++ arch/x86/include/uapi/asm/prctl.h | 4 +++ arch/x86/kernel/process.c | 3 ++ arch/x86/kernel/process_64.c | 55 ++++++++++++++++++++++++++++++- 4 files changed, 63 insertions(+), 1 deletion(-) diff --git a/arch/x86/include/asm/mmu.h b/arch/x86/include/asm/mmu.h index 9cac8c45a647..e80762e998ce 100644 --- a/arch/x86/include/asm/mmu.h +++ b/arch/x86/include/asm/mmu.h @@ -12,6 +12,8 @@ #define MM_CONTEXT_UPROBE_IA32 0 /* vsyscall page is accessible on this MM */ #define MM_CONTEXT_HAS_VSYSCALL 1 +/* Do not allow changing LAM mode */ +#define MM_CONTEXT_LOCK_LAM 2 /* * x86 has arch-specific MMU state beyond what lives in mm_struct. diff --git a/arch/x86/include/uapi/asm/prctl.h b/arch/x86/include/uapi/asm/prctl.h index 500b96e71f18..a31e27b95b19 100644 --- a/arch/x86/include/uapi/asm/prctl.h +++ b/arch/x86/include/uapi/asm/prctl.h @@ -20,4 +20,8 @@ #define ARCH_MAP_VDSO_32 0x2002 #define ARCH_MAP_VDSO_64 0x2003 +#define ARCH_GET_UNTAG_MASK 0x4001 +#define ARCH_ENABLE_TAGGED_ADDR 0x4002 +#define ARCH_GET_MAX_TAG_BITS 0x4003 + #endif /* _ASM_X86_PRCTL_H */ diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c index ef6bde1d40d8..cc0677f58f42 100644 --- a/arch/x86/kernel/process.c +++ b/arch/x86/kernel/process.c @@ -162,6 +162,9 @@ int copy_thread(struct task_struct *p, const struct kernel_clone_args *args) savesegment(es, p->thread.es); savesegment(ds, p->thread.ds); + + if (p->mm && (clone_flags & (CLONE_VM | CLONE_VFORK)) == CLONE_VM) + set_bit(MM_CONTEXT_LOCK_LAM, &p->mm->context.flags); #else p->thread.sp0 = (unsigned long) (childregs + 1); savesegment(gs, p->thread.gs); diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c index 8b06034e8c70..88aae519c8f8 100644 --- a/arch/x86/kernel/process_64.c +++ b/arch/x86/kernel/process_64.c @@ -743,6 +743,48 @@ static long prctl_map_vdso(const struct vdso_image *image, unsigned long addr) } #endif +#ifdef CONFIG_ADDRESS_MASKING + +#define LAM_U57_BITS 6 + +static int prctl_enable_tagged_addr(struct mm_struct *mm, unsigned long nr_bits) +{ + if (!cpu_feature_enabled(X86_FEATURE_LAM)) + return -ENODEV; + + /* PTRACE_ARCH_PRCTL */ + if (current->mm != mm) + return -EINVAL; + + if (mmap_write_lock_killable(mm)) + return -EINTR; + + if (test_bit(MM_CONTEXT_LOCK_LAM, &mm->context.flags)) { + mmap_write_unlock(mm); + return -EBUSY; + } + + if (!nr_bits) { + mmap_write_unlock(mm); + return -EINVAL; + } else if (nr_bits <= LAM_U57_BITS) { + mm->context.lam_cr3_mask = X86_CR3_LAM_U57; + mm->context.untag_mask = ~GENMASK(62, 57); + } else { + mmap_write_unlock(mm); + return -EINVAL; + } + + write_cr3(__read_cr3() | mm->context.lam_cr3_mask); + set_tlbstate_lam_mode(mm); + set_bit(MM_CONTEXT_LOCK_LAM, &mm->context.flags); + + mmap_write_unlock(mm); + + return 0; +} +#endif + long do_arch_prctl_64(struct task_struct *task, int option, unsigned long arg2) { int ret = 0; @@ -830,7 +872,18 @@ long do_arch_prctl_64(struct task_struct *task, int option, unsigned long arg2) case ARCH_MAP_VDSO_64: return prctl_map_vdso(&vdso_image_64, arg2); #endif - +#ifdef CONFIG_ADDRESS_MASKING + case ARCH_GET_UNTAG_MASK: + return put_user(task->mm->context.untag_mask, + (unsigned long __user *)arg2); + case ARCH_ENABLE_TAGGED_ADDR: + return prctl_enable_tagged_addr(task->mm, arg2); + case ARCH_GET_MAX_TAG_BITS: + if (!cpu_feature_enabled(X86_FEATURE_LAM)) + return put_user(0, (unsigned long __user *)arg2); + else + return put_user(LAM_U57_BITS, (unsigned long __user *)arg2); +#endif default: ret = -EINVAL; break;