[PATCH v4 21/29] arm64/ptrace: add support for FEAT_POE
Anshuman Khandual
anshuman.khandual at arm.com
Tue Jul 16 03:35:56 PDT 2024
On 5/3/24 18:31, Joey Gouly wrote:
> Add a regset for POE containing POR_EL0.
>
> Signed-off-by: Joey Gouly <joey.gouly at arm.com>
> Cc: Catalin Marinas <catalin.marinas at arm.com>
> Cc: Will Deacon <will at kernel.org>
> Reviewed-by: Mark Brown <broonie at kernel.org>
> Reviewed-by: Catalin Marinas <catalin.marinas at arm.com>
Reviewed-by: Anshuman Khandual <anshuman.khandual at arm.com>
> ---
> arch/arm64/kernel/ptrace.c | 46 ++++++++++++++++++++++++++++++++++++++
> include/uapi/linux/elf.h | 1 +
> 2 files changed, 47 insertions(+)
>
> diff --git a/arch/arm64/kernel/ptrace.c b/arch/arm64/kernel/ptrace.c
> index 0d022599eb61..b756578aeaee 100644
> --- a/arch/arm64/kernel/ptrace.c
> +++ b/arch/arm64/kernel/ptrace.c
> @@ -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 = {
> diff --git a/include/uapi/linux/elf.h b/include/uapi/linux/elf.h
> index b54b313bcf07..81762ff3c99e 100644
> --- a/include/uapi/linux/elf.h
> +++ b/include/uapi/linux/elf.h
> @@ -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 */
More information about the linux-arm-kernel
mailing list