diff --git a/arch/x86/include/asm/syscall_wrapper.h b/arch/x86/include/asm/syscall_wrapper.h
index 3d4fde311f9162b71a84f995e2b055bc73dd6d1e..bfdb945eebbf7e5872e9940e9236fb994960e2f3 100644
--- a/arch/x86/include/asm/syscall_wrapper.h
+++ b/arch/x86/include/asm/syscall_wrapper.h
@@ -233,36 +233,75 @@ extern long __ia32_sys_ni_syscall(const struct pt_regs *regs);
  * TODO: Instead of passing the array size we could pass one more arg directly
  * if we define a special bpf type (long array of length 1 / 2). */
 #define BPF_TASK_SYS_1(name)						\
-	BPF_CALL_5(bpf_task_sys##name, u64, arg1, u64, arg2, u64, arg3, u64 *, arg_tail, u64, size) \
+	BPF_CALL_1(bpf_task_sys##name, u64, arg1) \
 	{								\
 		return __do_sys##name(arg1);				\
-	}
+	}								\
+	const struct bpf_func_proto bpf_task_sys##name##_proto = {	\
+		.func		= bpf_task_sys##name,			\
+		.gpl_only	= true,					\
+		.ret_type	= RET_INTEGER,				\
+		.arg1_type = ARG_ANYTHING,				\
+	};
+
 #define BPF_TASK_SYS_2(name)						\
-	BPF_CALL_5(bpf_task_sys##name, u64, arg1, u64, arg2, u64, arg3, u64 *, arg_tail, u64, size) \
+	BPF_CALL_2(bpf_task_sys##name, u64, arg1, u64, arg2)		\
 	{								\
 		return __do_sys##name(arg1, arg2);			\
-	}
+	}								\
+	const struct bpf_func_proto bpf_task_sys##name##_proto = {	\
+		.func		= bpf_task_sys##name,			\
+		.gpl_only	= true,					\
+		.ret_type	= RET_INTEGER,				\
+		.arg1_type = ARG_ANYTHING,				\
+		.arg2_type = ARG_ANYTHING,				\
+	};
+
 #define BPF_TASK_SYS_3(name)						\
-	BPF_CALL_5(bpf_task_sys##name, u64, arg1, u64, arg2, u64, arg3, u64 *, arg_tail, u64, size) \
+	BPF_CALL_3(bpf_task_sys##name, u64, arg1, u64, arg2, u64, arg3) \
 	{								\
 		return __do_sys##name(arg1, arg2, arg3);		\
-	}
+	}								\
+	const struct bpf_func_proto bpf_task_sys##name##_proto = {	\
+		.func		= bpf_task_sys##name,			\
+		.gpl_only	= true,					\
+		.ret_type	= RET_INTEGER,				\
+		.arg1_type = ARG_ANYTHING,				\
+		.arg2_type = ARG_ANYTHING,				\
+		.arg3_type = ARG_ANYTHING,				\
+	};
+
 #define BPF_TASK_SYS_4(name)						\
-	BPF_CALL_5(bpf_task_sys##name, u64, arg1, u64, arg2, u64, arg3, u64 *, arg_tail, u64, size) \
+	BPF_CALL_4(bpf_task_sys##name, u64, arg1, u64, arg2, u64, arg3, u64, arg4) \
 	{								\
-		if (size != 1 * sizeof(u64)) {				\
-			return -EINVAL;					\
-		}							\
-		return __do_sys##name(arg1, arg2, arg3, arg_tail[0]);	\
-	}
+		return __do_sys##name(arg1, arg2, arg3, arg4);		\
+	}								\
+	const struct bpf_func_proto bpf_task_sys##name##_proto = {	\
+		.func		= bpf_task_sys##name,			\
+		.gpl_only	= true,					\
+		.ret_type	= RET_INTEGER,				\
+		.arg1_type = ARG_ANYTHING,				\
+		.arg2_type = ARG_ANYTHING,				\
+		.arg3_type = ARG_ANYTHING,				\
+		.arg4_type = ARG_ANYTHING,				\
+	};
+
 #define BPF_TASK_SYS_5(name)						\
-	BPF_CALL_5(bpf_task_sys##name, u64, arg1, u64, arg2, u64, arg3, u64 *, arg_tail, u64, size) \
+	BPF_CALL_5(bpf_task_sys##name, u64, arg1, u64, arg2, u64, arg3, u64, arg4, u64, arg5) \
 	{								\
-		if (size != 2 * sizeof(u64)) {				\
-			return -EINVAL;					\
-		}							\
-		return __do_sys##name(arg1, arg2, arg3, arg_tail[0], arg_tail[1]); \
-	}
+		return __do_sys##name(arg1, arg2, arg3, arg4, arg5);	\
+	}								\
+	const struct bpf_func_proto bpf_task_sys##name##_proto = {	\
+		.func		= bpf_task_sys##name,			\
+		.gpl_only	= true,					\
+		.ret_type	= RET_INTEGER,				\
+		.arg1_type = ARG_ANYTHING,				\
+		.arg2_type = ARG_ANYTHING,				\
+		.arg3_type = ARG_ANYTHING,				\
+		.arg4_type = ARG_ANYTHING,				\
+		.arg5_type = ARG_ANYTHING,				\
+	};
+
 #define BPF_TASK_SYS_6(name)						\
 	BPF_CALL_5(bpf_task_sys##name, u64, arg1, u64, arg2, u64, arg3, u64 *, arg_tail, u64, size) \
 	{								\
@@ -270,7 +309,17 @@ extern long __ia32_sys_ni_syscall(const struct pt_regs *regs);
 			return -EINVAL;					\
 		}							\
 		return __do_sys##name(arg1, arg2, arg3, arg_tail[0], arg_tail[1], arg_tail[2]); \
-	}
+	}								\
+	const struct bpf_func_proto bpf_task_sys##name##_proto = {	\
+		.func		= bpf_task_sys##name,			\
+		.gpl_only	= true,					\
+		.ret_type	= RET_INTEGER,				\
+		.arg1_type = ARG_ANYTHING,				\
+		.arg2_type = ARG_ANYTHING,				\
+		.arg3_type = ARG_ANYTHING,				\
+		.arg4_type = ARG_PTR_TO_MEM_OR_NULL,			\
+		.arg5_type = ARG_CONST_SIZE_OR_ZERO,			\
+	};								\
 
 #define __SYSCALL_DEFINEx(x, name, ...)					\
 	static long __se_sys##name(__MAP(x,__SC_LONG,__VA_ARGS__));	\
@@ -285,16 +334,6 @@ extern long __ia32_sys_ni_syscall(const struct pt_regs *regs);
 		return ret;						\
 	}								\
 	BPF_TASK_SYS(x, name, __VA_ARGS__)				\
-	const struct bpf_func_proto bpf_task_sys##name##_proto = {	\
-		.func		= bpf_task_sys##name,			\
-		.gpl_only	= true,					\
-		.ret_type	= RET_INTEGER,				\
-		.arg1_type = ARG_ANYTHING,				\
-		.arg2_type = ARG_ANYTHING,				\
-		.arg3_type = ARG_ANYTHING,				\
-		.arg4_type = ARG_PTR_TO_MEM_OR_NULL,			\
-		.arg5_type = ARG_CONST_SIZE_OR_ZERO,			\
-	};								\
 	static inline long __do_sys##name(__MAP(x,__SC_DECL,__VA_ARGS__))
 
 /*
@@ -308,8 +347,8 @@ extern long __ia32_sys_ni_syscall(const struct pt_regs *regs);
 	SYSCALL_METADATA(_##sname, 0);					\
 	static long __do_sys_##sname(const struct pt_regs *__unused);	\
 	__X64_SYS_STUB0(sname)						\
-	__IA32_SYS_STUB0(sname)						\
-	BPF_CALL_5(bpf_task_sys_##sname, u64, arg1, u64, arg2, u64, arg3, u64 *, arg_tail, u64, size) \
+		__IA32_SYS_STUB0(sname)					\
+		BPF_CALL_0(bpf_task_sys_##sname)			\
 	{								\
 		return __do_sys_##sname(NULL);				\
 	}								\
@@ -317,11 +356,6 @@ extern long __ia32_sys_ni_syscall(const struct pt_regs *regs);
 		.func		= bpf_task_sys_##sname,			\
 		.gpl_only	= true,					\
 		.ret_type	= RET_INTEGER,				\
-		.arg1_type = ARG_ANYTHING,				\
-		.arg2_type = ARG_ANYTHING,				\
-		.arg3_type = ARG_ANYTHING,				\
-		.arg4_type = ARG_PTR_TO_MEM_OR_NULL,			\
-		.arg5_type = ARG_CONST_SIZE_OR_ZERO,			\
 	};								\
 	static long __do_sys_##sname(const struct pt_regs *__unused)