On Fri, 2022-06-10 at 17:35 +0300, Kirill A. Shutemov wrote: > +static int prctl_enable_tagged_addr(unsigned long nr_bits) > +{ > + struct mm_struct *mm = current->mm; do_arch_prctl_64() can be called via ptrace. I think you need to operate on the mm of 'task', or just block the operation if task != current. > + > + /* Already enabled? */ > + if (mm->context.lam_cr3_mask) > + return -EBUSY; > + > + /* LAM has to be enabled before spawning threads */ > + if (get_nr_threads(current) > 1) > + return -EBUSY; > + > + if (!nr_bits) { > + return -EINVAL; > + } else if (nr_bits <= 6) { > + mm->context.lam_cr3_mask = X86_CR3_LAM_U57; > + mm->context.untag_mask = ~GENMASK(62, 57); > + } else { > + return -EINVAL; > + } > + > + /* Update CR3 to get LAM active */ > + switch_mm(current->mm, current->mm, current); > + return 0; > +} > + > long do_arch_prctl_64(struct task_struct *task, int option, unsigned > long arg2) > { > int ret = 0; > @@ -829,7 +855,11 @@ long do_arch_prctl_64(struct task_struct *task, > int option, unsigned long arg2) > case ARCH_MAP_VDSO_64: > return prctl_map_vdso(&vdso_image_64, arg2); > #endif > - > + case ARCH_GET_UNTAG_MASK: > + return put_user(current->mm->context.untag_mask, > + (unsigned long __user *)arg2); > + case ARCH_ENABLE_TAGGED_ADDR: > + return prctl_enable_tagged_addr(arg2); > default: > ret = -EINVAL; > break;