arm64: mte: ptrace: Add NT_ARM_TAGGED_ADDR_CTRL regset
authorCatalin Marinas <catalin.marinas@arm.com>
Fri, 3 Jul 2020 14:12:57 +0000 (15:12 +0100)
committerCatalin Marinas <catalin.marinas@arm.com>
Fri, 4 Sep 2020 11:46:07 +0000 (12:46 +0100)
This regset allows read/write access to a ptraced process
prctl(PR_SET_TAGGED_ADDR_CTRL) setting.

Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
Cc: Will Deacon <will@kernel.org>
Cc: Alan Hayward <Alan.Hayward@arm.com>
Cc: Luis Machado <luis.machado@linaro.org>
Cc: Omair Javaid <omair.javaid@linaro.org>
arch/arm64/kernel/ptrace.c
include/uapi/linux/elf.h

index 101040a..f49b349 100644 (file)
@@ -1033,6 +1033,35 @@ static int pac_generic_keys_set(struct task_struct *target,
 #endif /* CONFIG_CHECKPOINT_RESTORE */
 #endif /* CONFIG_ARM64_PTR_AUTH */
 
+#ifdef CONFIG_ARM64_TAGGED_ADDR_ABI
+static int tagged_addr_ctrl_get(struct task_struct *target,
+                               const struct user_regset *regset,
+                               struct membuf to)
+{
+       long ctrl = get_tagged_addr_ctrl(target);
+
+       if (IS_ERR_VALUE(ctrl))
+               return ctrl;
+
+       return membuf_write(&to, &ctrl, sizeof(ctrl));
+}
+
+static int tagged_addr_ctrl_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;
+
+       ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, &ctrl, 0, -1);
+       if (ret)
+               return ret;
+
+       return set_tagged_addr_ctrl(target, ctrl);
+}
+#endif
+
 enum aarch64_regset {
        REGSET_GPR,
        REGSET_FPR,
@@ -1052,6 +1081,9 @@ enum aarch64_regset {
        REGSET_PACG_KEYS,
 #endif
 #endif
+#ifdef CONFIG_ARM64_TAGGED_ADDR_ABI
+       REGSET_TAGGED_ADDR_CTRL,
+#endif
 };
 
 static const struct user_regset aarch64_regsets[] = {
@@ -1149,6 +1181,16 @@ static const struct user_regset aarch64_regsets[] = {
        },
 #endif
 #endif
+#ifdef CONFIG_ARM64_TAGGED_ADDR_ABI
+       [REGSET_TAGGED_ADDR_CTRL] = {
+               .core_note_type = NT_ARM_TAGGED_ADDR_CTRL,
+               .n = 1,
+               .size = sizeof(long),
+               .align = sizeof(long),
+               .regset_get = tagged_addr_ctrl_get,
+               .set = tagged_addr_ctrl_set,
+       },
+#endif
 };
 
 static const struct user_regset_view user_aarch64_view = {
index 2222094..30f68b4 100644 (file)
@@ -425,6 +425,7 @@ typedef struct elf64_shdr {
 #define NT_ARM_PAC_MASK                0x406   /* ARM pointer authentication code masks */
 #define NT_ARM_PACA_KEYS       0x407   /* ARM pointer authentication address keys */
 #define NT_ARM_PACG_KEYS       0x408   /* ARM pointer authentication generic key */
+#define NT_ARM_TAGGED_ADDR_CTRL        0x409   /* arm64 tagged address control (prctl()) */
 #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 */