]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
arm64/ptrace: add support for FEAT_POE
authorJoey Gouly <joey.gouly@arm.com>
Thu, 22 Aug 2024 15:11:03 +0000 (16:11 +0100)
committerWill Deacon <will@kernel.org>
Wed, 4 Sep 2024 11:54:05 +0000 (12:54 +0100)
Add a regset for POE containing POR_EL0.

Signed-off-by: Joey Gouly <joey.gouly@arm.com>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Will Deacon <will@kernel.org>
Reviewed-by: Mark Brown <broonie@kernel.org>
Reviewed-by: Catalin Marinas <catalin.marinas@arm.com>
Reviewed-by: Anshuman Khandual <anshuman.khandual@arm.com>
Link: https://lore.kernel.org/r/20240822151113.1479789-21-joey.gouly@arm.com
Signed-off-by: Will Deacon <will@kernel.org>
arch/arm64/kernel/ptrace.c
include/uapi/linux/elf.h

index 0d022599eb61b38183ffd34eae2bfa9c2f643a56..b756578aeaeea1d3250276734520e3eaae8a671d 100644 (file)
@@ -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 = {
index b54b313bcf0730a0d48a7aa006ec9e775269b7da..81762ff3c99e1ec205c4e7dd85eb1eb1513f549b 100644 (file)
@@ -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 */