From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751633AbeAWM2q (ORCPT ); Tue, 23 Jan 2018 07:28:46 -0500 Received: from usa-sjc-mx-foss1.foss.arm.com ([217.140.101.70]:40672 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751510AbeAWM2o (ORCPT ); Tue, 23 Jan 2018 07:28:44 -0500 From: Suzuki K Poulose To: linux-arm-kernel@lists.infradead.org Cc: linux-kernel@vger.kernel.org, ard.biesheuvel@linaro.org, will.deacon@arm.com, mark.rutland@arm.com, marc.zyngier@arm.com, catalin.marinas@arm.com, ckadabi@codeaurora.org, jnair@caviumnetworks.com, Suzuki K Poulose Subject: [PATCH 10/16] arm64: Make KPTI strict CPU local feature Date: Tue, 23 Jan 2018 12:28:03 +0000 Message-Id: <20180123122809.16269-11-suzuki.poulose@arm.com> X-Mailer: git-send-email 2.13.6 In-Reply-To: <20180123122809.16269-1-suzuki.poulose@arm.com> References: <20180123122809.16269-1-suzuki.poulose@arm.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org KPTI capability is a security feature which should be enabled when at least one CPU on the system needs it. Any late CPU which needs the kernel support, should be prevented from booting (and thus making the system unsecure) if the feature was not already enabled. Cc: Will Deacon Signed-off-by: Suzuki K Poulose --- arch/arm64/kernel/cpufeature.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/arch/arm64/kernel/cpufeature.c b/arch/arm64/kernel/cpufeature.c index 111f6c4b4cd7..2627a836e99d 100644 --- a/arch/arm64/kernel/cpufeature.c +++ b/arch/arm64/kernel/cpufeature.c @@ -862,9 +862,8 @@ static bool has_no_fpsimd(const struct arm64_cpu_capabilities *entry, int __unus static int __kpti_forced; /* 0: not forced, >0: forced on, <0: forced off */ static bool unmap_kernel_at_el0(const struct arm64_cpu_capabilities *entry, - int __unused) + int scope) { - u64 pfr0 = read_sanitised_ftr_reg(SYS_ID_AA64PFR0_EL1); /* Forced on command line? */ if (__kpti_forced) { @@ -878,8 +877,7 @@ static bool unmap_kernel_at_el0(const struct arm64_cpu_capabilities *entry, return true; /* Defer to CPU feature registers */ - return !cpuid_feature_extract_unsigned_field(pfr0, - ID_AA64PFR0_CSV3_SHIFT); + return !has_cpuid_feature(entry, scope); } static int __init parse_kpti(char *str) @@ -1003,7 +1001,10 @@ static const struct arm64_cpu_capabilities arm64_features[] = { { .desc = "Kernel page table isolation (KPTI)", .capability = ARM64_UNMAP_KERNEL_AT_EL0, - .type = ARM64_CPUCAP_BOOT_SYSTEM_FEATURE, + .type = ARM64_CPUCAP_STRICT_CPU_LOCAL_FEATURE, + .sys_reg = SYS_ID_AA64PFR0_EL1, + .field_pos = ID_AA64PFR0_CSV3_SHIFT, + .min_field_value = 1, .matches = unmap_kernel_at_el0, }, #endif -- 2.13.6 From mboxrd@z Thu Jan 1 00:00:00 1970 From: suzuki.poulose@arm.com (Suzuki K Poulose) Date: Tue, 23 Jan 2018 12:28:03 +0000 Subject: [PATCH 10/16] arm64: Make KPTI strict CPU local feature In-Reply-To: <20180123122809.16269-1-suzuki.poulose@arm.com> References: <20180123122809.16269-1-suzuki.poulose@arm.com> Message-ID: <20180123122809.16269-11-suzuki.poulose@arm.com> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org KPTI capability is a security feature which should be enabled when at least one CPU on the system needs it. Any late CPU which needs the kernel support, should be prevented from booting (and thus making the system unsecure) if the feature was not already enabled. Cc: Will Deacon Signed-off-by: Suzuki K Poulose --- arch/arm64/kernel/cpufeature.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/arch/arm64/kernel/cpufeature.c b/arch/arm64/kernel/cpufeature.c index 111f6c4b4cd7..2627a836e99d 100644 --- a/arch/arm64/kernel/cpufeature.c +++ b/arch/arm64/kernel/cpufeature.c @@ -862,9 +862,8 @@ static bool has_no_fpsimd(const struct arm64_cpu_capabilities *entry, int __unus static int __kpti_forced; /* 0: not forced, >0: forced on, <0: forced off */ static bool unmap_kernel_at_el0(const struct arm64_cpu_capabilities *entry, - int __unused) + int scope) { - u64 pfr0 = read_sanitised_ftr_reg(SYS_ID_AA64PFR0_EL1); /* Forced on command line? */ if (__kpti_forced) { @@ -878,8 +877,7 @@ static bool unmap_kernel_at_el0(const struct arm64_cpu_capabilities *entry, return true; /* Defer to CPU feature registers */ - return !cpuid_feature_extract_unsigned_field(pfr0, - ID_AA64PFR0_CSV3_SHIFT); + return !has_cpuid_feature(entry, scope); } static int __init parse_kpti(char *str) @@ -1003,7 +1001,10 @@ static const struct arm64_cpu_capabilities arm64_features[] = { { .desc = "Kernel page table isolation (KPTI)", .capability = ARM64_UNMAP_KERNEL_AT_EL0, - .type = ARM64_CPUCAP_BOOT_SYSTEM_FEATURE, + .type = ARM64_CPUCAP_STRICT_CPU_LOCAL_FEATURE, + .sys_reg = SYS_ID_AA64PFR0_EL1, + .field_pos = ID_AA64PFR0_CSV3_SHIFT, + .min_field_value = 1, .matches = unmap_kernel_at_el0, }, #endif -- 2.13.6