Commit f8da5752 authored by Marc Zyngier's avatar Marc Zyngier Committed by Will Deacon
Browse files

arm64: cpufeatures: Allow disabling of Pointer Auth from the command-line



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: default avatarMarc Zyngier <maz@kernel.org>
Reviewed-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
Acked-by: default avatarDavid Brazdil <dbrazdil@google.com>
Tested-by: default avatarSrinivas Ramana <sramana@codeaurora.org>
Link: https://lore.kernel.org/r/20210208095732.3267263-23-maz@kernel.org


Signed-off-by: default avatarWill Deacon <will@kernel.org>
parent 7f624085
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -376,6 +376,9 @@
	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
+1 −0
Original line number Diff line number Diff line
@@ -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);
+3 −1
Original line number Diff line number Diff line
@@ -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),
+16 −0
Original line number Diff line number Diff line
@@ -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" },
};