Received: by 2002:a25:4158:0:0:0:0:0 with SMTP id o85csp865761yba; Mon, 1 Apr 2019 19:30:35 -0700 (PDT) X-Google-Smtp-Source: APXvYqxD3rMYcq+iDcoY9ngnzbX02BVcAWi4DhoLlJilWutSgCT452nzk0NfNYK3DEVwHM4+sZWG X-Received: by 2002:a62:b612:: with SMTP id j18mr6059372pff.124.1554172235843; Mon, 01 Apr 2019 19:30:35 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1554172235; cv=none; d=google.com; s=arc-20160816; b=SBQXts7NPwr1Bi0DJ/JV3w4uTk5/kzpj1pdCPjKVLArSfowgw+HzcErxmE0zl73aCK tclYbTelMQ7hMfvGci56PlKpUs3L8ECAEfWtmGnZHqQrwhyCxXWn/Ces0fYZh5i41UCv 2UEibwgwDXkLgEMKOe8ruJNwbzcD0tyDEhE18667hPO3pQt1maXduCAePiIleXD2Np/+ pSslkz4f/K1W8Jokl/ML5QzuwZvXzwChuEKHIXULbUtBhTeh8WxW75e6xhMUh5ThyW1h laVpKQPbOqK9pt8D1WoJ+uh49/gOnZe/VMVP881Sh/FuuV1v7Obwzm9R8T2icBOeK8He stCQ== 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; bh=fksEgHwodK9UgHHS2nKIpknGmtaFccmjGA8D7N/YsmY=; b=AdG07yDb2Tk6T9MicvRGNkvmQuXFdH6DiBRDuQ59+Er5H8bkQDK65eaLc2c3YdhkB3 E5Y1dWYL5JfXjDeoCX5d12S/Wzae3UeNr8pj1wjOZ3kMynClzLIghDbK7DWQKiLFs6x6 3g60bc+Me5eI13ZzPPXzFvSYphOHZd+Yt+FbpdKru4PA3HhD3cl6821MghOgOCWJ0PvY LD15x/IBlgJQ2s5DtGnQT8XY65tQ8qRVtoeSiVmx7NGa7uYc2y+vA48sRRQx6aelKBfL gH4prFRxZ+/obI3axUTsp+QPEJNNDv/1DbXoMywjSlp9h+D7p3GhX7PR4KjRaR1ugIMb wK+A== 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 z13si10044882pgv.508.2019.04.01.19.30.19; Mon, 01 Apr 2019 19:30:35 -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 S1728914AbfDBC2G (ORCPT + 99 others); Mon, 1 Apr 2019 22:28:06 -0400 Received: from usa-sjc-mx-foss1.foss.arm.com ([217.140.101.70]:43584 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726269AbfDBC2G (ORCPT ); Mon, 1 Apr 2019 22:28:06 -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 D5022168F; Mon, 1 Apr 2019 19:28:05 -0700 (PDT) Received: from a075553-lin.blr.arm.com (a075553-lin.blr.arm.com [10.162.0.144]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 2573A3F59C; Mon, 1 Apr 2019 19:28:00 -0700 (PDT) From: Amit Daniel Kachhap To: linux-arm-kernel@lists.infradead.org Cc: Christoffer Dall , Marc Zyngier , Catalin Marinas , Will Deacon , Andrew Jones , Dave Martin , Ramana Radhakrishnan , kvmarm@lists.cs.columbia.edu, Kristina Martsenko , linux-kernel@vger.kernel.org, Amit Daniel Kachhap , Mark Rutland , James Morse , Julien Thierry Subject: [PATCH v8 6/9] KVM: arm64: Add vcpu feature flags to control ptrauth accessibility Date: Tue, 2 Apr 2019 07:57:14 +0530 Message-Id: <1554172037-4516-7-git-send-email-amit.kachhap@arm.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1554172037-4516-1-git-send-email-amit.kachhap@arm.com> References: <1554172037-4516-1-git-send-email-amit.kachhap@arm.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Since Pointer authentication will be enabled or disabled on a per-vcpu basis, vcpu feature flags are added in order to know which vcpus have it enabled from userspace. This features will allow the KVM guest to allow the handling of pointer authentication instructions or to treat them as undefined if not set. The helper macro added checks the feature flag along with other conditions such as VHE mode present and system support for pointer address/generic authentication. Necessary documentations are added to reflect the changes done. Signed-off-by: Amit Daniel Kachhap Cc: Mark Rutland Cc: Marc Zyngier Cc: Christoffer Dall Cc: kvmarm@lists.cs.columbia.edu --- Changes since v7: * Moved the check for userspace features in this patch [James Morse]. * Moved the vcpu feature flags Documentation in this patch [James Morse]. Documentation/arm64/pointer-authentication.txt | 13 +++++++++---- Documentation/virtual/kvm/api.txt | 4 ++++ arch/arm64/include/asm/kvm_host.h | 8 +++++++- arch/arm64/include/uapi/asm/kvm.h | 2 ++ arch/arm64/kvm/reset.c | 7 +++++++ 5 files changed, 29 insertions(+), 5 deletions(-) diff --git a/Documentation/arm64/pointer-authentication.txt b/Documentation/arm64/pointer-authentication.txt index 5baca42..b164886 100644 --- a/Documentation/arm64/pointer-authentication.txt +++ b/Documentation/arm64/pointer-authentication.txt @@ -87,7 +87,12 @@ used to get and set the keys for a thread. Virtualization -------------- -Pointer authentication is not currently supported in KVM guests. KVM -will mask the feature bits from ID_AA64ISAR1_EL1, and attempted use of -the feature will result in an UNDEFINED exception being injected into -the guest. +Pointer authentication is enabled in KVM guest when each virtual cpu is +initialised by passing flags KVM_ARM_VCPU_PTRAUTH_[ADDRESS/GENERIC] and +requesting these two separate cpu features to be enabled. The current KVM +guest implementation works by enabling both features together, so both these +userspace flags are checked together before enabling pointer authentication. +The separate userspace flag will allow to have no userspace ABI changes when +both features are implemented in an isolated way in future. + +Pointer Authentication is supported in KVM guest only in VHE mode. diff --git a/Documentation/virtual/kvm/api.txt b/Documentation/virtual/kvm/api.txt index 7de9eee..aaa048d 100644 --- a/Documentation/virtual/kvm/api.txt +++ b/Documentation/virtual/kvm/api.txt @@ -2659,6 +2659,10 @@ Possible features: Depends on KVM_CAP_ARM_PSCI_0_2. - KVM_ARM_VCPU_PMU_V3: Emulate PMUv3 for the CPU. Depends on KVM_CAP_ARM_PMU_V3. + - KVM_ARM_VCPU_PTRAUTH_ADDRESS: Enables Address Pointer authentication + for the CPU and supported only on arm64 architecture. + - KVM_ARM_VCPU_PTRAUTH_GENERIC: Enables Generic Pointer authentication + for the CPU and supported only on arm64 architecture. 4.83 KVM_ARM_PREFERRED_TARGET diff --git a/arch/arm64/include/asm/kvm_host.h b/arch/arm64/include/asm/kvm_host.h index e3ccd7b..9dd2918 100644 --- a/arch/arm64/include/asm/kvm_host.h +++ b/arch/arm64/include/asm/kvm_host.h @@ -45,7 +45,7 @@ #define KVM_MAX_VCPUS VGIC_V3_MAX_CPUS -#define KVM_VCPU_MAX_FEATURES 4 +#define KVM_VCPU_MAX_FEATURES 6 #define KVM_REQ_SLEEP \ KVM_ARCH_REQ_FLAGS(0, KVM_REQUEST_WAIT | KVM_REQUEST_NO_WAKEUP) @@ -491,6 +491,12 @@ static inline bool kvm_arch_requires_vhe(void) return false; } +#define vcpu_has_ptrauth(vcpu) (has_vhe() && \ + system_supports_address_auth() && \ + system_supports_generic_auth() && \ + test_bit(KVM_ARM_VCPU_PTRAUTH_ADDRESS, vcpu->arch.features) && \ + test_bit(KVM_ARM_VCPU_PTRAUTH_GENERIC, vcpu->arch.features)) + static inline void kvm_arch_hardware_unsetup(void) {} static inline void kvm_arch_sync_events(struct kvm *kvm) {} static inline void kvm_arch_vcpu_uninit(struct kvm_vcpu *vcpu) {} diff --git a/arch/arm64/include/uapi/asm/kvm.h b/arch/arm64/include/uapi/asm/kvm.h index 97c3478..8806f71 100644 --- a/arch/arm64/include/uapi/asm/kvm.h +++ b/arch/arm64/include/uapi/asm/kvm.h @@ -102,6 +102,8 @@ struct kvm_regs { #define KVM_ARM_VCPU_EL1_32BIT 1 /* CPU running a 32bit VM */ #define KVM_ARM_VCPU_PSCI_0_2 2 /* CPU uses PSCI v0.2 */ #define KVM_ARM_VCPU_PMU_V3 3 /* Support guest PMUv3 */ +#define KVM_ARM_VCPU_PTRAUTH_ADDRESS 4 /* VCPU uses address authentication */ +#define KVM_ARM_VCPU_PTRAUTH_GENERIC 5 /* VCPU uses generic authentication */ struct kvm_vcpu_init { __u32 target; diff --git a/arch/arm64/kvm/reset.c b/arch/arm64/kvm/reset.c index f16a5f8..717afed 100644 --- a/arch/arm64/kvm/reset.c +++ b/arch/arm64/kvm/reset.c @@ -128,6 +128,13 @@ int kvm_reset_vcpu(struct kvm_vcpu *vcpu) if (loaded) kvm_arch_vcpu_put(vcpu); + if (test_bit(KVM_ARM_VCPU_PTRAUTH_ADDRESS, vcpu->arch.features) || + test_bit(KVM_ARM_VCPU_PTRAUTH_GENERIC, vcpu->arch.features)) { + /* Verify that KVM startup matches the conditions for ptrauth */ + if (!vcpu_has_ptrauth(vcpu)) + goto out; + } + switch (vcpu->arch.target) { default: if (test_bit(KVM_ARM_VCPU_EL1_32BIT, vcpu->arch.features)) { -- 2.7.4