#include <linux/license.h>
 #include <linux/filter.h>
 #include <linux/version.h>
+#include <linux/kernel.h>
 
 DEFINE_PER_CPU(int, bpf_prog_active);
 
        return map;
 }
 
-/* helper to convert user pointers passed inside __aligned_u64 fields */
-static void __user *u64_to_ptr(__u64 val)
-{
-       return (void __user *) (unsigned long) val;
-}
-
 int __weak bpf_stackmap_copy(struct bpf_map *map, void *key, void *value)
 {
        return -ENOTSUPP;
 
 static int map_lookup_elem(union bpf_attr *attr)
 {
-       void __user *ukey = u64_to_ptr(attr->key);
-       void __user *uvalue = u64_to_ptr(attr->value);
+       void __user *ukey = u64_to_user_ptr(attr->key);
+       void __user *uvalue = u64_to_user_ptr(attr->value);
        int ufd = attr->map_fd;
        struct bpf_map *map;
        void *key, *value, *ptr;
 
 static int map_update_elem(union bpf_attr *attr)
 {
-       void __user *ukey = u64_to_ptr(attr->key);
-       void __user *uvalue = u64_to_ptr(attr->value);
+       void __user *ukey = u64_to_user_ptr(attr->key);
+       void __user *uvalue = u64_to_user_ptr(attr->value);
        int ufd = attr->map_fd;
        struct bpf_map *map;
        void *key, *value;
 
 static int map_delete_elem(union bpf_attr *attr)
 {
-       void __user *ukey = u64_to_ptr(attr->key);
+       void __user *ukey = u64_to_user_ptr(attr->key);
        int ufd = attr->map_fd;
        struct bpf_map *map;
        struct fd f;
 
 static int map_get_next_key(union bpf_attr *attr)
 {
-       void __user *ukey = u64_to_ptr(attr->key);
-       void __user *unext_key = u64_to_ptr(attr->next_key);
+       void __user *ukey = u64_to_user_ptr(attr->key);
+       void __user *unext_key = u64_to_user_ptr(attr->next_key);
        int ufd = attr->map_fd;
        struct bpf_map *map;
        void *key, *next_key;
                return -EINVAL;
 
        /* copy eBPF program license from user space */
-       if (strncpy_from_user(license, u64_to_ptr(attr->license),
+       if (strncpy_from_user(license, u64_to_user_ptr(attr->license),
                              sizeof(license) - 1) < 0)
                return -EFAULT;
        license[sizeof(license) - 1] = 0;
        prog->len = attr->insn_cnt;
 
        err = -EFAULT;
-       if (copy_from_user(prog->insns, u64_to_ptr(attr->insns),
+       if (copy_from_user(prog->insns, u64_to_user_ptr(attr->insns),
                           prog->len * sizeof(struct bpf_insn)) != 0)
                goto free_prog;
 
        if (CHECK_ATTR(BPF_OBJ))
                return -EINVAL;
 
-       return bpf_obj_pin_user(attr->bpf_fd, u64_to_ptr(attr->pathname));
+       return bpf_obj_pin_user(attr->bpf_fd, u64_to_user_ptr(attr->pathname));
 }
 
 static int bpf_obj_get(const union bpf_attr *attr)
        if (CHECK_ATTR(BPF_OBJ) || attr->bpf_fd != 0)
                return -EINVAL;
 
-       return bpf_obj_get_user(u64_to_ptr(attr->pathname));
+       return bpf_obj_get_user(u64_to_user_ptr(attr->pathname));
 }
 
 SYSCALL_DEFINE3(bpf, int, cmd, union bpf_attr __user *, uattr, unsigned int, size)