Commit df791dc1 authored by Jiong Wang's avatar Jiong Wang Committed by Alexei Starovoitov
Browse files

tools: bpftool: teach cfg code about JMP32



The cfg code need to be aware of the new JMP32 instruction class so it
could partition functions correctly.

Reviewed-by: default avatarJakub Kicinski <jakub.kicinski@netronome.com>
Signed-off-by: default avatarJiong Wang <jiong.wang@netronome.com>
Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
parent 56cbd82e
Loading
Loading
Loading
Loading
+7 −2
Original line number Original line Diff line number Diff line
@@ -157,6 +157,11 @@ static bool cfg_partition_funcs(struct cfg *cfg, struct bpf_insn *cur,
	return false;
	return false;
}
}


static bool is_jmp_insn(u8 code)
{
	return BPF_CLASS(code) == BPF_JMP || BPF_CLASS(code) == BPF_JMP32;
}

static bool func_partition_bb_head(struct func_node *func)
static bool func_partition_bb_head(struct func_node *func)
{
{
	struct bpf_insn *cur, *end;
	struct bpf_insn *cur, *end;
@@ -170,7 +175,7 @@ static bool func_partition_bb_head(struct func_node *func)
		return true;
		return true;


	for (; cur <= end; cur++) {
	for (; cur <= end; cur++) {
		if (BPF_CLASS(cur->code) == BPF_JMP) {
		if (is_jmp_insn(cur->code)) {
			u8 opcode = BPF_OP(cur->code);
			u8 opcode = BPF_OP(cur->code);


			if (opcode == BPF_EXIT || opcode == BPF_CALL)
			if (opcode == BPF_EXIT || opcode == BPF_CALL)
@@ -296,7 +301,7 @@ static bool func_add_bb_edges(struct func_node *func)
		e->src = bb;
		e->src = bb;


		insn = bb->tail;
		insn = bb->tail;
		if (BPF_CLASS(insn->code) != BPF_JMP ||
		if (!is_jmp_insn(insn->code) ||
		    BPF_OP(insn->code) == BPF_EXIT) {
		    BPF_OP(insn->code) == BPF_EXIT) {
			e->dst = bb_next(bb);
			e->dst = bb_next(bb);
			e->flags |= EDGE_FLAG_FALLTHROUGH;
			e->flags |= EDGE_FLAG_FALLTHROUGH;