Skip to content

Commit 58e2af8

Browse files
Jakub Kicinskidavem330
authored andcommitted
bpf: expose internal verfier structures
Move verifier's internal structures to a header file and prefix their names with bpf_ to avoid potential namespace conflicts. Those structures will soon be used by external analyzers. Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com> Acked-by: Alexei Starovoitov <ast@kernel.org> Acked-by: Daniel Borkmann <daniel@iogearbox.net> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent 3df126f commit 58e2af8

File tree

2 files changed

+182
-163
lines changed

2 files changed

+182
-163
lines changed

include/linux/bpf_verifier.h

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
/* Copyright (c) 2011-2014 PLUMgrid, http://plumgrid.com
2+
*
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.
6+
*/
7+
#ifndef _LINUX_BPF_VERIFIER_H
8+
#define _LINUX_BPF_VERIFIER_H 1
9+
10+
#include <linux/bpf.h> /* for enum bpf_reg_type */
11+
#include <linux/filter.h> /* for MAX_BPF_STACK */
12+
13+
struct bpf_reg_state {
14+
enum bpf_reg_type type;
15+
union {
16+
/* valid when type == CONST_IMM | PTR_TO_STACK | UNKNOWN_VALUE */
17+
s64 imm;
18+
19+
/* valid when type == PTR_TO_PACKET* */
20+
struct {
21+
u32 id;
22+
u16 off;
23+
u16 range;
24+
};
25+
26+
/* valid when type == CONST_PTR_TO_MAP | PTR_TO_MAP_VALUE |
27+
* PTR_TO_MAP_VALUE_OR_NULL
28+
*/
29+
struct bpf_map *map_ptr;
30+
};
31+
};
32+
33+
enum bpf_stack_slot_type {
34+
STACK_INVALID, /* nothing was stored in this stack slot */
35+
STACK_SPILL, /* register spilled into stack */
36+
STACK_MISC /* BPF program wrote some data into this slot */
37+
};
38+
39+
#define BPF_REG_SIZE 8 /* size of eBPF register in bytes */
40+
41+
/* state of the program:
42+
* type of all registers and stack info
43+
*/
44+
struct bpf_verifier_state {
45+
struct bpf_reg_state regs[MAX_BPF_REG];
46+
u8 stack_slot_type[MAX_BPF_STACK];
47+
struct bpf_reg_state spilled_regs[MAX_BPF_STACK / BPF_REG_SIZE];
48+
};
49+
50+
/* linked list of verifier states used to prune search */
51+
struct bpf_verifier_state_list {
52+
struct bpf_verifier_state state;
53+
struct bpf_verifier_state_list *next;
54+
};
55+
56+
struct bpf_insn_aux_data {
57+
enum bpf_reg_type ptr_type; /* pointer type for load/store insns */
58+
};
59+
60+
#define MAX_USED_MAPS 64 /* max number of maps accessed by one eBPF program */
61+
62+
/* single container for all structs
63+
* one verifier_env per bpf_check() call
64+
*/
65+
struct bpf_verifier_env {
66+
struct bpf_prog *prog; /* eBPF program being verified */
67+
struct bpf_verifier_stack_elem *head; /* stack of verifier states to be processed */
68+
int stack_size; /* number of states to be processed */
69+
struct bpf_verifier_state cur_state; /* current verifier state */
70+
struct bpf_verifier_state_list **explored_states; /* search pruning optimization */
71+
struct bpf_map *used_maps[MAX_USED_MAPS]; /* array of map's used by eBPF program */
72+
u32 used_map_cnt; /* number of used maps */
73+
u32 id_gen; /* used to generate unique reg IDs */
74+
bool allow_ptr_leaks;
75+
bool seen_direct_write;
76+
struct bpf_insn_aux_data *insn_aux_data; /* array of per-insn state */
77+
};
78+
79+
#endif /* _LINUX_BPF_VERIFIER_H */

0 commit comments

Comments
 (0)