}
 
 static __always_inline int validate_range(struct mm_struct *mm,
-                                         __u64 start, __u64 len)
+                                         __u64 *start, __u64 len)
 {
        __u64 task_size = mm->task_size;
 
-       if (start & ~PAGE_MASK)
+       *start = untagged_addr(*start);
+
+       if (*start & ~PAGE_MASK)
                return -EINVAL;
        if (len & ~PAGE_MASK)
                return -EINVAL;
        if (!len)
                return -EINVAL;
-       if (start < mmap_min_addr)
+       if (*start < mmap_min_addr)
                return -EINVAL;
-       if (start >= task_size)
+       if (*start >= task_size)
                return -EINVAL;
-       if (len > task_size - start)
+       if (len > task_size - *start)
                return -EINVAL;
        return 0;
 }
                goto out;
        }
 
-       ret = validate_range(mm, uffdio_register.range.start,
+       ret = validate_range(mm, &uffdio_register.range.start,
                             uffdio_register.range.len);
        if (ret)
                goto out;
        if (copy_from_user(&uffdio_unregister, buf, sizeof(uffdio_unregister)))
                goto out;
 
-       ret = validate_range(mm, uffdio_unregister.start,
+       ret = validate_range(mm, &uffdio_unregister.start,
                             uffdio_unregister.len);
        if (ret)
                goto out;
        if (copy_from_user(&uffdio_wake, buf, sizeof(uffdio_wake)))
                goto out;
 
-       ret = validate_range(ctx->mm, uffdio_wake.start, uffdio_wake.len);
+       ret = validate_range(ctx->mm, &uffdio_wake.start, uffdio_wake.len);
        if (ret)
                goto out;
 
                           sizeof(uffdio_copy)-sizeof(__s64)))
                goto out;
 
-       ret = validate_range(ctx->mm, uffdio_copy.dst, uffdio_copy.len);
+       ret = validate_range(ctx->mm, &uffdio_copy.dst, uffdio_copy.len);
        if (ret)
                goto out;
        /*
                           sizeof(uffdio_zeropage)-sizeof(__s64)))
                goto out;
 
-       ret = validate_range(ctx->mm, uffdio_zeropage.range.start,
+       ret = validate_range(ctx->mm, &uffdio_zeropage.range.start,
                             uffdio_zeropage.range.len);
        if (ret)
                goto out;