diff options
Diffstat (limited to 'kernel/trace/bpf_trace.c')
| -rw-r--r-- | kernel/trace/bpf_trace.c | 30 | 
1 files changed, 30 insertions, 0 deletions
diff --git a/kernel/trace/bpf_trace.c b/kernel/trace/bpf_trace.c index 94b0e37d90ef..b496ffdf5f36 100644 --- a/kernel/trace/bpf_trace.c +++ b/kernel/trace/bpf_trace.c @@ -577,6 +577,12 @@ tracing_func_proto(enum bpf_func_id func_id, const struct bpf_prog *prog)  		return &bpf_map_update_elem_proto;  	case BPF_FUNC_map_delete_elem:  		return &bpf_map_delete_elem_proto; +	case BPF_FUNC_map_push_elem: +		return &bpf_map_push_elem_proto; +	case BPF_FUNC_map_pop_elem: +		return &bpf_map_pop_elem_proto; +	case BPF_FUNC_map_peek_elem: +		return &bpf_map_peek_elem_proto;  	case BPF_FUNC_probe_read:  		return &bpf_probe_read_proto;  	case BPF_FUNC_ktime_get_ns: @@ -917,6 +923,27 @@ const struct bpf_verifier_ops raw_tracepoint_verifier_ops = {  const struct bpf_prog_ops raw_tracepoint_prog_ops = {  }; +static bool raw_tp_writable_prog_is_valid_access(int off, int size, +						 enum bpf_access_type type, +						 const struct bpf_prog *prog, +						 struct bpf_insn_access_aux *info) +{ +	if (off == 0) { +		if (size != sizeof(u64) || type != BPF_READ) +			return false; +		info->reg_type = PTR_TO_TP_BUFFER; +	} +	return raw_tp_prog_is_valid_access(off, size, type, prog, info); +} + +const struct bpf_verifier_ops raw_tracepoint_writable_verifier_ops = { +	.get_func_proto  = raw_tp_prog_func_proto, +	.is_valid_access = raw_tp_writable_prog_is_valid_access, +}; + +const struct bpf_prog_ops raw_tracepoint_writable_prog_ops = { +}; +  static bool pe_prog_is_valid_access(int off, int size, enum bpf_access_type type,  				    const struct bpf_prog *prog,  				    struct bpf_insn_access_aux *info) @@ -1206,6 +1233,9 @@ static int __bpf_probe_register(struct bpf_raw_event_map *btp, struct bpf_prog *  	if (prog->aux->max_ctx_offset > btp->num_args * sizeof(u64))  		return -EINVAL; +	if (prog->aux->max_tp_access > btp->writable_size) +		return -EINVAL; +  	return tracepoint_probe_register(tp, (void *)btp->bpf_func, prog);  }  |