Commit 17519819 authored by Joey Gouly's avatar Joey Gouly Committed by Will Deacon
Browse files

arm64/ptrace: add support for FEAT_POE



Add a regset for POE containing POR_EL0.

Signed-off-by: default avatarJoey Gouly <joey.gouly@arm.com>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Will Deacon <will@kernel.org>
Reviewed-by: default avatarMark Brown <broonie@kernel.org>
Reviewed-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
Reviewed-by: default avatarAnshuman Khandual <anshuman.khandual@arm.com>
Link: https://lore.kernel.org/r/20240822151113.1479789-21-joey.gouly@arm.com


Signed-off-by: default avatarWill Deacon <will@kernel.org>
parent 9160f7e9
Loading
Loading
Loading
Loading
+46 −0
Original line number Diff line number Diff line
@@ -1440,6 +1440,39 @@ static int tagged_addr_ctrl_set(struct task_struct *target, const struct
}
#endif

#ifdef CONFIG_ARM64_POE
static int poe_get(struct task_struct *target,
		   const struct user_regset *regset,
		   struct membuf to)
{
	if (!system_supports_poe())
		return -EINVAL;

	return membuf_write(&to, &target->thread.por_el0,
			    sizeof(target->thread.por_el0));
}

static int poe_set(struct task_struct *target, const struct
		   user_regset *regset, unsigned int pos,
		   unsigned int count, const void *kbuf, const
		   void __user *ubuf)
{
	int ret;
	long ctrl;

	if (!system_supports_poe())
		return -EINVAL;

	ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, &ctrl, 0, -1);
	if (ret)
		return ret;

	target->thread.por_el0 = ctrl;

	return 0;
}
#endif

enum aarch64_regset {
	REGSET_GPR,
	REGSET_FPR,
@@ -1469,6 +1502,9 @@ enum aarch64_regset {
#ifdef CONFIG_ARM64_TAGGED_ADDR_ABI
	REGSET_TAGGED_ADDR_CTRL,
#endif
#ifdef CONFIG_ARM64_POE
	REGSET_POE
#endif
};

static const struct user_regset aarch64_regsets[] = {
@@ -1628,6 +1664,16 @@ static const struct user_regset aarch64_regsets[] = {
		.set = tagged_addr_ctrl_set,
	},
#endif
#ifdef CONFIG_ARM64_POE
	[REGSET_POE] = {
		.core_note_type = NT_ARM_POE,
		.n = 1,
		.size = sizeof(long),
		.align = sizeof(long),
		.regset_get = poe_get,
		.set = poe_set,
	},
#endif
};

static const struct user_regset_view user_aarch64_view = {
+1 −0
Original line number Diff line number Diff line
@@ -441,6 +441,7 @@ typedef struct elf64_shdr {
#define NT_ARM_ZA	0x40c		/* ARM SME ZA registers */
#define NT_ARM_ZT	0x40d		/* ARM SME ZT registers */
#define NT_ARM_FPMR	0x40e		/* ARM floating point mode register */
#define NT_ARM_POE	0x40f		/* ARM POE registers */
#define NT_ARC_V2	0x600		/* ARCv2 accumulator/extra registers */
#define NT_VMCOREDD	0x700		/* Vmcore Device Dump Note */
#define NT_MIPS_DSP	0x800		/* MIPS DSP ASE registers */