1 /* Copyright (c) 2011-2014 PLUMgrid, http://plumgrid.com
3 * This program is free software; you can redistribute it and/or
4 * modify it under the terms of version 2 of the GNU General Public
5 * License as published by the Free Software Foundation.
7 * This program is distributed in the hope that it will be useful, but
8 * WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
10 * General Public License for more details.
12 #include <linux/bpf.h>
13 #include <linux/rcupdate.h>
15 /* If kernel subsystem is allowing eBPF programs to call this function,
16 * inside its own verifier_ops->get_func_proto() callback it should return
17 * bpf_map_lookup_elem_proto, so that verifier can properly check the arguments
19 * Different map implementations will rely on rcu in map methods
20 * lookup/update/delete, therefore eBPF programs must run under rcu lock
21 * if program is allowed to access maps, so check rcu_read_lock_held in
22 * all three functions.
24 static u64
bpf_map_lookup_elem(u64 r1
, u64 r2
, u64 r3
, u64 r4
, u64 r5
)
26 /* verifier checked that R1 contains a valid pointer to bpf_map
27 * and R2 points to a program stack and map->key_size bytes were
30 struct bpf_map
*map
= (struct bpf_map
*) (unsigned long) r1
;
31 void *key
= (void *) (unsigned long) r2
;
34 WARN_ON_ONCE(!rcu_read_lock_held());
36 value
= map
->ops
->map_lookup_elem(map
, key
);
38 /* lookup() returns either pointer to element value or NULL
39 * which is the meaning of PTR_TO_MAP_VALUE_OR_NULL type
41 return (unsigned long) value
;
44 struct bpf_func_proto bpf_map_lookup_elem_proto
= {
45 .func
= bpf_map_lookup_elem
,
47 .ret_type
= RET_PTR_TO_MAP_VALUE_OR_NULL
,
48 .arg1_type
= ARG_CONST_MAP_PTR
,
49 .arg2_type
= ARG_PTR_TO_MAP_KEY
,
52 static u64
bpf_map_update_elem(u64 r1
, u64 r2
, u64 r3
, u64 r4
, u64 r5
)
54 struct bpf_map
*map
= (struct bpf_map
*) (unsigned long) r1
;
55 void *key
= (void *) (unsigned long) r2
;
56 void *value
= (void *) (unsigned long) r3
;
58 WARN_ON_ONCE(!rcu_read_lock_held());
60 return map
->ops
->map_update_elem(map
, key
, value
, r4
);
63 struct bpf_func_proto bpf_map_update_elem_proto
= {
64 .func
= bpf_map_update_elem
,
66 .ret_type
= RET_INTEGER
,
67 .arg1_type
= ARG_CONST_MAP_PTR
,
68 .arg2_type
= ARG_PTR_TO_MAP_KEY
,
69 .arg3_type
= ARG_PTR_TO_MAP_VALUE
,
70 .arg4_type
= ARG_ANYTHING
,
73 static u64
bpf_map_delete_elem(u64 r1
, u64 r2
, u64 r3
, u64 r4
, u64 r5
)
75 struct bpf_map
*map
= (struct bpf_map
*) (unsigned long) r1
;
76 void *key
= (void *) (unsigned long) r2
;
78 WARN_ON_ONCE(!rcu_read_lock_held());
80 return map
->ops
->map_delete_elem(map
, key
);
83 struct bpf_func_proto bpf_map_delete_elem_proto
= {
84 .func
= bpf_map_delete_elem
,
86 .ret_type
= RET_INTEGER
,
87 .arg1_type
= ARG_CONST_MAP_PTR
,
88 .arg2_type
= ARG_PTR_TO_MAP_KEY
,