Received: by 2002:a05:6a10:8c0a:0:0:0:0 with SMTP id go10csp1877350pxb; Mon, 18 Jan 2021 02:14:58 -0800 (PST) X-Google-Smtp-Source: ABdhPJx/uZaEs10DfGUQiQzWJ9AAsU2OOaG6SzjTACc2ug9KuUgiQ65V2oH631KKeyEl60eqRYS2 X-Received: by 2002:a05:6402:757:: with SMTP id p23mr317101edy.245.1610964898771; Mon, 18 Jan 2021 02:14:58 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1610964898; cv=none; d=google.com; s=arc-20160816; b=sTV5MYZ8+Wdt5jWq0e39aXmb+pmcUblyh6wfzJRPFFwDNqyZgvGz+IXl0OsZ+TXhwB Gdedrn7162yoxIRl4ibkYCGlWMCCUqZNb84/wEvXvTgIKLMU4g+pj9UecqZqgr/GxO0s 9wGIGmJAVlgp/eh8MS8xFIOCG2FJ/hBZtgwOUE+vQP76gcHsBXzuigot60t36vxvg9/8 Aqe4llf+NIwFgrtiYKkZHsYcW1gKcD640eQJcgPyUG7y9N8cg/aMRQly/8WTDn72YMwp Gynnwz7rKlGKOSXvcnnpHoLWVIip0DK3CAkz8n5bgLl3apKxyECFv601a2cq5ws6lgds jYSQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from; bh=YGRM8aUBQi7CudbOfahzAHlGPDQta6vJcPZfPxsm25E=; b=S1zN5NqXNstqkQvUUiLi5lZ0bp1P5ZhhoT5Zd5TKmZ22MVD5AjDC/a/xvepjTbeY74 KE/Si64MMdbbsrBaI9PWotUSqtQV0HTFcpApHqASSqUdj3F8yKfj2mwSihA0XgL9ROwc Ab8K4omk0fOMQh7wly0vSt28x55zXcyiVnsIP6cBBJC65u3Ef4JtyWfmprxboYHuxYBZ Xw5XrSczjibAuR/rCSNlLcMI+oZKiBGRuoPQct3ZA9XPFVqKsDxLqEN1ZZ8bAZIXkgF8 IeSI3t7yjMJI6WEDPRvVufs1Jbn/FUdVAzgARGHdpKKQH4LV1YwKQ7cL0V1C7evy8A3c PJew== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id e26si8272995edv.153.2021.01.18.02.14.35; Mon, 18 Jan 2021 02:14:58 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2389364AbhARKBB (ORCPT + 99 others); Mon, 18 Jan 2021 05:01:01 -0500 Received: from mail.kernel.org ([198.145.29.99]:35932 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2389243AbhARJqo (ORCPT ); Mon, 18 Jan 2021 04:46:44 -0500 Received: from disco-boy.misterjones.org (disco-boy.misterjones.org [51.254.78.96]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id E235322240; Mon, 18 Jan 2021 09:46:01 +0000 (UTC) Received: from 78.163-31-62.static.virginmediabusiness.co.uk ([62.31.163.78] helo=why.lan) by disco-boy.misterjones.org with esmtpsa (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94) (envelope-from ) id 1l1R6l-008RhD-GV; Mon, 18 Jan 2021 09:45:59 +0000 From: Marc Zyngier To: linux-arm-kernel@lists.infradead.org, kvmarm@lists.cs.columbia.edu, linux-kernel@vger.kernel.org Cc: Catalin Marinas , Will Deacon , Mark Rutland , David Brazdil , Alexandru Elisei , Ard Biesheuvel , Jing Zhang , Ajay Patil , Prasad Sodagudi , Srinivas Ramana , James Morse , Julien Thierry , Suzuki K Poulose , kernel-team@android.com Subject: [PATCH v4 00/21] arm64: Early CPU feature override, and applications to VHE, BTI and PAuth Date: Mon, 18 Jan 2021 09:45:12 +0000 Message-Id: <20210118094533.2874082-1-maz@kernel.org> X-Mailer: git-send-email 2.29.2 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SA-Exim-Connect-IP: 62.31.163.78 X-SA-Exim-Rcpt-To: linux-arm-kernel@lists.infradead.org, kvmarm@lists.cs.columbia.edu, linux-kernel@vger.kernel.org, catalin.marinas@arm.com, will@kernel.org, mark.rutland@arm.com, dbrazdil@google.com, alexandru.elisei@arm.com, ardb@kernel.org, jingzhangos@google.com, pajay@qti.qualcomm.com, psodagud@codeaurora.org, sramana@codeaurora.org, james.morse@arm.com, julien.thierry.kdev@gmail.com, suzuki.poulose@arm.com, kernel-team@android.com X-SA-Exim-Mail-From: maz@kernel.org X-SA-Exim-Scanned: No (on disco-boy.misterjones.org); SAEximRunCond expanded to false Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org It recently came to light that there is a need to be able to override some CPU features very early on, before the kernel is fully up and running. The reasons for this range from specific feature support (such as using Protected KVM on VHE HW, which is the main motivation for this work) to errata workaround (a feature is broken on a CPU and needs to be turned off, or rather not enabled). This series tries to offer a limited framework for this kind of problems, by allowing a set of options to be passed on the command-line and altering the feature set that the cpufeature subsystem exposes to the rest of the kernel. Note that this doesn't change anything for code that directly uses the CPU ID registers. The series completely changes the way a VHE-capable system boots, by *always* booting non-VHE first, and then upgrading to VHE when deemed capable. Although it sounds scary, this is actually simple to implement (and I wish I had done that five years ago). The "upgrade to VHE" path is then conditioned on the VHE feature not being disabled from the command-line. Said command-line parsing borrows a lot from the kaslr code, and subsequently allows the "nokaslr" option to be moved to the new infrastructure (though it all looks a bit... odd). Further patches now add support for disabling BTI and PAuth, the latter being based on an initial series by Srinivas Ramana[0]. There is some ongoing discussions about being able to disable MTE, but no clear resolution on that subject yet. This has been tested on multiple VHE and non-VHE systems. * From v3 [3]: - Fixed the VHE_RESTART stub (duh!) - Switched to using arm64_ftr_safe_value() instead of the user provided value - Per-feature override warning * From v2 [2]: - Simplify the VHE_RESTART stub - Fixed a number of spelling mistakes, and hopefully introduced a few more - Override features in __read_sysreg_by_encoding() - Allow both BTI and PAuth to be overridden on the command line - Rebased on -rc3 * From v1 [1]: - Fix SPE init on VHE when EL2 doesn't own SPE - Fix re-init when KASLR is used - Handle the resume path - Rebased to 5.11-rc2 [0] https://lore.kernel.org/r/1610152163-16554-1-git-send-email-sramana@codeaurora.org [1] https://lore.kernel.org/r/20201228104958.1848833-1-maz@kernel.org [2] https://lore.kernel.org/r/20210104135011.2063104-1-maz@kernel.org [3] https://lore.kernel.org/r/20210111132811.2455113-1-maz@kernel.org Marc Zyngier (20): arm64: Fix labels in el2_setup macros arm64: Fix outdated TCR setup comment arm64: Turn the MMU-on sequence into a macro arm64: Provide an 'upgrade to VHE' stub hypercall arm64: Initialise as nVHE before switching to VHE arm64: Move VHE-specific SPE setup to mutate_to_vhe() arm64: Simplify init_el2_state to be non-VHE only arm64: Move SCTLR_EL1 initialisation to EL-agnostic code arm64: cpufeature: Add global feature override facility arm64: cpufeature: Use IDreg override in __read_sysreg_by_encoding() arm64: Extract early FDT mapping from kaslr_early_init() arm64: cpufeature: Add an early command-line cpufeature override facility arm64: Allow ID_AA64MMFR1_EL1.VH to be overridden from the command line arm64: Honor VHE being disabled from the command-line arm64: Add an aliasing facility for the idreg override arm64: Make kvm-arm.mode={nvhe,protected} an alias of id_aa64mmfr1.vh=0 KVM: arm64: Document HVC_VHE_RESTART stub hypercall arm64: Move "nokaslr" over to the early cpufeature infrastructure arm64: cpufeatures: Allow disabling of BTI from the command-line arm64: cpufeatures: Allow disabling of Pointer Auth from the command-line Srinivas Ramana (1): arm64: Defer enabling pointer authentication on boot core .../admin-guide/kernel-parameters.txt | 9 + Documentation/virt/kvm/arm/hyp-abi.rst | 9 + arch/arm64/include/asm/assembler.h | 17 ++ arch/arm64/include/asm/cpufeature.h | 10 + arch/arm64/include/asm/el2_setup.h | 60 ++---- arch/arm64/include/asm/pointer_auth.h | 10 + arch/arm64/include/asm/setup.h | 11 + arch/arm64/include/asm/stackprotector.h | 1 + arch/arm64/include/asm/virt.h | 7 +- arch/arm64/kernel/Makefile | 2 +- arch/arm64/kernel/cpufeature.c | 75 ++++++- arch/arm64/kernel/head.S | 75 ++----- arch/arm64/kernel/hyp-stub.S | 124 ++++++++++- arch/arm64/kernel/idreg-override.c | 199 ++++++++++++++++++ arch/arm64/kernel/kaslr.c | 44 +--- arch/arm64/kernel/setup.c | 15 ++ arch/arm64/kernel/sleep.S | 1 + arch/arm64/kvm/arm.c | 3 + arch/arm64/kvm/hyp/nvhe/hyp-init.S | 2 +- arch/arm64/mm/mmu.c | 2 +- arch/arm64/mm/proc.S | 16 +- 21 files changed, 523 insertions(+), 169 deletions(-) create mode 100644 arch/arm64/include/asm/setup.h create mode 100644 arch/arm64/kernel/idreg-override.c -- 2.29.2