arm64: cpufeatures: Allow disabling of Pointer Auth from the command-line
authorMarc Zyngier <maz@kernel.org>
Mon, 8 Feb 2021 09:57:31 +0000 (09:57 +0000)
committerWill Deacon <will@kernel.org>
Tue, 9 Feb 2021 13:50:57 +0000 (13:50 +0000)
In order to be able to disable Pointer Authentication  at runtime,
whether it is for testing purposes, or to work around HW issues,
let's add support for overriding the ID_AA64ISAR1_EL1.{GPI,GPA,API,APA}
fields.

This is further mapped on the arm64.nopauth command-line alias.

Signed-off-by: Marc Zyngier <maz@kernel.org>
Reviewed-by: Catalin Marinas <catalin.marinas@arm.com>
Acked-by: David Brazdil <dbrazdil@google.com>
Tested-by: Srinivas Ramana <sramana@codeaurora.org>
Link: https://lore.kernel.org/r/20210208095732.3267263-23-maz@kernel.org
Signed-off-by: Will Deacon <will@kernel.org>
Documentation/admin-guide/kernel-parameters.txt
arch/arm64/include/asm/cpufeature.h
arch/arm64/kernel/cpufeature.c
arch/arm64/kernel/idreg-override.c

index c00236b..cbb51ab 100644 (file)
        arm64.nobti     [ARM64] Unconditionally disable Branch Target
                        Identification support
 
+       arm64.nopauth   [ARM64] Unconditionally disable Pointer Authentication
+                       support
+
        ataflop=        [HW,M68k]
 
        atarimouse=     [HW,MOUSE] Atari Mouse
index 30917b9..61177ba 100644 (file)
@@ -820,6 +820,7 @@ static inline unsigned int get_vmid_bits(u64 mmfr1)
 
 extern struct arm64_ftr_override id_aa64mmfr1_override;
 extern struct arm64_ftr_override id_aa64pfr1_override;
+extern struct arm64_ftr_override id_aa64isar1_override;
 
 u32 get_kvm_ipa_limit(void);
 void dump_cpu_features(void);
index 7fbeab4..3bce87a 100644 (file)
@@ -559,6 +559,7 @@ static const struct arm64_ftr_bits ftr_raz[] = {
 
 struct arm64_ftr_override __ro_after_init id_aa64mmfr1_override;
 struct arm64_ftr_override __ro_after_init id_aa64pfr1_override;
+struct arm64_ftr_override __ro_after_init id_aa64isar1_override;
 
 static const struct __ftr_reg_entry {
        u32                     sys_id;
@@ -604,7 +605,8 @@ static const struct __ftr_reg_entry {
 
        /* Op1 = 0, CRn = 0, CRm = 6 */
        ARM64_FTR_REG(SYS_ID_AA64ISAR0_EL1, ftr_id_aa64isar0),
-       ARM64_FTR_REG(SYS_ID_AA64ISAR1_EL1, ftr_id_aa64isar1),
+       ARM64_FTR_REG_OVERRIDE(SYS_ID_AA64ISAR1_EL1, ftr_id_aa64isar1,
+                              &id_aa64isar1_override),
 
        /* Op1 = 0, CRn = 0, CRm = 7 */
        ARM64_FTR_REG(SYS_ID_AA64MMFR0_EL1, ftr_id_aa64mmfr0),
index d691e90..dffb166 100644 (file)
@@ -46,6 +46,18 @@ static const struct ftr_set_desc pfr1 __initconst = {
        },
 };
 
+static const struct ftr_set_desc isar1 __initconst = {
+       .name           = "id_aa64isar1",
+       .override       = &id_aa64isar1_override,
+       .fields         = {
+               { "gpi", ID_AA64ISAR1_GPI_SHIFT },
+               { "gpa", ID_AA64ISAR1_GPA_SHIFT },
+               { "api", ID_AA64ISAR1_API_SHIFT },
+               { "apa", ID_AA64ISAR1_APA_SHIFT },
+               {}
+       },
+};
+
 extern struct arm64_ftr_override kaslr_feature_override;
 
 static const struct ftr_set_desc kaslr __initconst = {
@@ -62,6 +74,7 @@ static const struct ftr_set_desc kaslr __initconst = {
 static const struct ftr_set_desc * const regs[] __initconst = {
        &mmfr1,
        &pfr1,
+       &isar1,
        &kaslr,
 };
 
@@ -72,6 +85,9 @@ static const struct {
        { "kvm-arm.mode=nvhe",          "id_aa64mmfr1.vh=0" },
        { "kvm-arm.mode=protected",     "id_aa64mmfr1.vh=0" },
        { "arm64.nobti",                "id_aa64pfr1.bt=0" },
+       { "arm64.nopauth",
+         "id_aa64isar1.gpi=0 id_aa64isar1.gpa=0 "
+         "id_aa64isar1.api=0 id_aa64isar1.apa=0"          },
        { "nokaslr",                    "kaslr.disabled=1" },
 };