Alexei Starovoitov wrote: > From: Alexei Starovoitov <ast@xxxxxxxxxx> > > Add placeholders for bpf_sys_bpf() helper and new program type. > > v1->v2: > - check that expected_attach_type is zero > - allow more helper functions to be used in this program type, since they will > only execute from user context via bpf_prog_test_run. > > Signed-off-by: Alexei Starovoitov <ast@xxxxxxxxxx> > --- Acked-by: John Fastabend <john.fastabend@xxxxxxxxx> > +int bpf_prog_test_run_syscall(struct bpf_prog *prog, > + const union bpf_attr *kattr, > + union bpf_attr __user *uattr) > +{ > + void __user *ctx_in = u64_to_user_ptr(kattr->test.ctx_in); > + __u32 ctx_size_in = kattr->test.ctx_size_in; > + void *ctx = NULL; > + u32 retval; > + int err = 0; > + > + /* doesn't support data_in/out, ctx_out, duration, or repeat or flags */ > + if (kattr->test.data_in || kattr->test.data_out || > + kattr->test.ctx_out || kattr->test.duration || > + kattr->test.repeat || kattr->test.flags) > + return -EINVAL; > + > + if (ctx_size_in < prog->aux->max_ctx_offset || > + ctx_size_in > U16_MAX) > + return -EINVAL; > + > + if (ctx_size_in) { > + ctx = kzalloc(ctx_size_in, GFP_USER); > + if (!ctx) > + return -ENOMEM; > + if (copy_from_user(ctx, ctx_in, ctx_size_in)) { > + err = -EFAULT; > + goto out; > + } > + } > + retval = bpf_prog_run_pin_on_cpu(prog, ctx); > + > + if (copy_to_user(&uattr->test.retval, &retval, sizeof(u32))) > + err = -EFAULT; > + if (ctx_size_in) > + if (copy_to_user(ctx_in, ctx, ctx_size_in)) { > + err = -EFAULT; > + goto out; > + } stupid nit, the last goto there is not needed. > +out: > + kfree(ctx); > + return err; > +}