From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752310AbbE0FVR (ORCPT ); Wed, 27 May 2015 01:21:17 -0400 Received: from szxga01-in.huawei.com ([58.251.152.64]:6653 "EHLO szxga01-in.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751265AbbE0FVO (ORCPT ); Wed, 27 May 2015 01:21:14 -0400 From: Wang Nan To: , , , , , , , , , CC: , , Subject: [RFC PATCH v4 17/29] bpf tools: Relocate eBPF programs Date: Wed, 27 May 2015 05:19:52 +0000 Message-ID: <1432704004-171454-18-git-send-email-wangnan0@huawei.com> X-Mailer: git-send-email 1.8.3.4 In-Reply-To: <1432704004-171454-1-git-send-email-wangnan0@huawei.com> References: <1432704004-171454-1-git-send-email-wangnan0@huawei.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [10.107.197.200] X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org If an eBPF program access a map, LLVM generates a relocated load instruction. To enable the usage of that map, relocation must be done by replacing original instructions by map loading instructions. Based on relocation description collected during 'opening' phase, this patch replaces the instructions with map loading with correct map fd. Signed-off-by: Wang Nan --- tools/lib/bpf/libbpf.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c index fe4d282..f2071ae 100644 --- a/tools/lib/bpf/libbpf.c +++ b/tools/lib/bpf/libbpf.c @@ -587,6 +587,53 @@ bpf_object__create_maps(struct bpf_object *obj) return 0; } +static int +bpf_program__relocate(struct bpf_program *prog, int *maps_fds) +{ + int i; + + if (!prog || !prog->reloc_desc) + return 0; + + for (i = 0; i < prog->nr_reloc; i++) { + int insn_idx, map_idx; + struct bpf_insn *insns = prog->insns; + + insn_idx = prog->reloc_desc[i].insn_idx; + map_idx = prog->reloc_desc[i].map_idx; + + if (insn_idx >= (int)prog->insns_cnt) { + pr_warning("relocation out of range: '%s'\n", + prog->section_name); + return -ERANGE; + } + insns[insn_idx].src_reg = BPF_PSEUDO_MAP_FD; + insns[insn_idx].imm = maps_fds[map_idx]; + } + + return 0; +} + + +static int +bpf_object__relocate(struct bpf_object *obj) +{ + struct bpf_program *prog; + size_t i; + int err; + + for (i = 0; i < obj->nr_programs; i++) { + prog = &obj->programs[i]; + + if ((err = bpf_program__relocate(prog, obj->maps_fds))) { + pr_warning("failed to relocate '%s'\n", + prog->section_name); + return err; + } + } + return 0; +} + static int bpf_object__collect_reloc(struct bpf_object *obj) { int i, err; @@ -694,6 +741,8 @@ int bpf_object__load(struct bpf_object *obj) if (bpf_object__create_maps(obj)) goto out; + if (bpf_object__relocate(obj)) + goto out; return 0; out: -- 1.8.3.4