Received: by 2002:ac0:a5b6:0:0:0:0:0 with SMTP id m51-v6csp3320697imm; Tue, 29 May 2018 05:20:08 -0700 (PDT) X-Google-Smtp-Source: AB8JxZqUnbNBRh8sWRbadbwTXZZTs9VlXwulRrPyBhopPzz3MIaRDBqCaUKdZdp7jUznZG2sfpXK X-Received: by 2002:a17:902:ba93:: with SMTP id k19-v6mr16949421pls.379.1527596408791; Tue, 29 May 2018 05:20:08 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1527596408; cv=none; d=google.com; s=arc-20160816; b=clTxomgY/wgvrM1XVCu/PSiPPEcGpgGj+KrZLj1huXAWa2d7CHMC7nAtQsIJ8yiYj/ 84bAxC4/e3LYgwrv/1II0D1uGw58F2ulQ8YPmQTVHm1RXOV7JYtRFRCuYNMn17RVbHx1 IL8o3BHzo78/YXBJb5px/U/C6jzRJ/Vfg5w8qepQ0u+fq4bGZtV+CnWV54nCwR54Kbbp k4ZbIzRsTdojHC0YqV3TowbwtxR8SxnE9EZXTHVjCkmvGUKiWir66xqlwnf9g10bzDl4 S6B9EbtEkr1EZDtuK/ZsmlS6EnS3oe+XWCfvSQXKjx5J6a5qQn5RkgJiEBM1oYn4Ksfr SRZg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:arc-authentication-results; bh=VN6EZQ69ATprriEgKTT7XoY459pLqHQKoEWcD7ZDEEs=; b=aBwoDhoqyKkb5Wp1xwUaxiJSjS+JtZ+8L43lBXrfl3CYMoCCkNacjylCAqRVxpR1N5 gmBW0rK1z/Bjwaxx5/kU5keRZUHKNQxM7uY19KCLEddFznrkaxORl/LqrsbWjZrPV6Ov K1iVYrFkO+SOGXlZAytc+ayNwOdOpZcndaxJAB8meYa+1GrQbPJbyy9AP6534lTtHE7u URhj3BzSzMHZvvNUU4zD5Nf7UdGS3FDpTPMnypo/+5vo6BRe7fOrbCi4KQ6d/jZAIkJm Fj1+Q6t2fXrjsX+ilZINKvog18LIYDGBjkoM58LiBuxr4Vxc1DtECOl/qrdrr/1w2Cl1 joUg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id b2-v6si23600695pgn.599.2018.05.29.05.19.55; Tue, 29 May 2018 05:20:08 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933905AbeE2MOw (ORCPT + 99 others); Tue, 29 May 2018 08:14:52 -0400 Received: from foss.arm.com ([217.140.101.70]:38554 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S933778AbeE2ML4 (ORCPT ); Tue, 29 May 2018 08:11:56 -0400 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 997FC15BF; Tue, 29 May 2018 05:11:56 -0700 (PDT) Received: from approximate.cambridge.arm.com (approximate.cambridge.arm.com [10.1.206.75]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 42A883F53D; Tue, 29 May 2018 05:11:54 -0700 (PDT) From: Marc Zyngier To: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, kvmarm@lists.cs.columbia.edu Cc: Will Deacon , Catalin Marinas , Thomas Gleixner , Andy Lutomirski , Kees Cook , Greg Kroah-Hartman , Christoffer Dall , Randy Dunlap , Dominik Brodowski , Julien Grall , Mark Rutland Subject: [PATCH v2 10/17] arm64: ssbd: Add prctl interface for per-thread mitigation Date: Tue, 29 May 2018 13:11:14 +0100 Message-Id: <20180529121121.24927-11-marc.zyngier@arm.com> X-Mailer: git-send-email 2.14.2 In-Reply-To: <20180529121121.24927-1-marc.zyngier@arm.com> References: <20180529121121.24927-1-marc.zyngier@arm.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org If running on a system that performs dynamic SSBD mitigation, allow userspace to request the mitigation for itself. This is implemented as a prctl call, allowing the mitigation to be enabled or disabled at will for this particular thread. Signed-off-by: Marc Zyngier --- arch/arm64/kernel/Makefile | 1 + arch/arm64/kernel/ssbd.c | 107 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 108 insertions(+) create mode 100644 arch/arm64/kernel/ssbd.c diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile index bf825f38d206..0025f8691046 100644 --- a/arch/arm64/kernel/Makefile +++ b/arch/arm64/kernel/Makefile @@ -54,6 +54,7 @@ arm64-obj-$(CONFIG_ARM64_RELOC_TEST) += arm64-reloc-test.o arm64-reloc-test-y := reloc_test_core.o reloc_test_syms.o arm64-obj-$(CONFIG_CRASH_DUMP) += crash_dump.o arm64-obj-$(CONFIG_ARM_SDE_INTERFACE) += sdei.o +arm64-obj-$(CONFIG_ARM64_SSBD) += ssbd.o obj-y += $(arm64-obj-y) vdso/ probes/ obj-m += $(arm64-obj-m) diff --git a/arch/arm64/kernel/ssbd.c b/arch/arm64/kernel/ssbd.c new file mode 100644 index 000000000000..07b12c034ec2 --- /dev/null +++ b/arch/arm64/kernel/ssbd.c @@ -0,0 +1,107 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2018 ARM Ltd, All Rights Reserved. + */ + +#include +#include +#include + +#include + +/* + * prctl interface for SSBD + */ +static int ssbd_prctl_set(struct task_struct *task, unsigned long ctrl) +{ + int state = arm64_get_ssbd_state(); + + /* Unsupported */ + if (state == ARM64_SSBD_UNKNOWN) + return -EINVAL; + + /* Treat the unaffected/mitigated state separately */ + if (state == ARM64_SSBD_MITIGATED) { + switch (ctrl) { + case PR_SPEC_ENABLE: + return -EPERM; + case PR_SPEC_DISABLE: + case PR_SPEC_FORCE_DISABLE: + return 0; + } + } + + /* + * Things are a bit backward here: the arm64 internal API + * *enables the mitigation* when the userspace API *disables + * speculation*. So much fun. + */ + switch (ctrl) { + case PR_SPEC_ENABLE: + /* If speculation is force disabled, enable is not allowed */ + if (state == ARM64_SSBD_FORCE_ENABLE || + task_spec_ssb_force_disable(task)) + return -EPERM; + task_clear_spec_ssb_disable(task); + clear_tsk_thread_flag(task, TIF_SSBD); + break; + case PR_SPEC_DISABLE: + if (state == ARM64_SSBD_FORCE_DISABLE) + return -EPERM; + task_set_spec_ssb_disable(task); + set_tsk_thread_flag(task, TIF_SSBD); + break; + case PR_SPEC_FORCE_DISABLE: + if (state == ARM64_SSBD_FORCE_DISABLE) + return -EPERM; + task_set_spec_ssb_disable(task); + task_set_spec_ssb_force_disable(task); + set_tsk_thread_flag(task, TIF_SSBD); + break; + default: + return -ERANGE; + } + + return 0; +} + +int arch_prctl_spec_ctrl_set(struct task_struct *task, unsigned long which, + unsigned long ctrl) +{ + switch (which) { + case PR_SPEC_STORE_BYPASS: + return ssbd_prctl_set(task, ctrl); + default: + return -ENODEV; + } +} + +static int ssbd_prctl_get(struct task_struct *task) +{ + switch (arm64_get_ssbd_state()) { + case ARM64_SSBD_UNKNOWN: + return -EINVAL; + case ARM64_SSBD_FORCE_ENABLE: + return PR_SPEC_DISABLE; + case ARM64_SSBD_KERNEL: + if (task_spec_ssb_force_disable(task)) + return PR_SPEC_PRCTL | PR_SPEC_FORCE_DISABLE; + if (task_spec_ssb_disable(task)) + return PR_SPEC_PRCTL | PR_SPEC_DISABLE; + return PR_SPEC_PRCTL | PR_SPEC_ENABLE; + case ARM64_SSBD_FORCE_DISABLE: + return PR_SPEC_ENABLE; + default: + return PR_SPEC_NOT_AFFECTED; + } +} + +int arch_prctl_spec_ctrl_get(struct task_struct *task, unsigned long which) +{ + switch (which) { + case PR_SPEC_STORE_BYPASS: + return ssbd_prctl_get(task); + default: + return -ENODEV; + } +} -- 2.14.2