Commit 8e75887d authored by Masahiro Yamada's avatar Masahiro Yamada Committed by David S. Miller

bpfilter: include bpfilter_umh in assembly instead of using objcopy

What we want here is to embed a user-space program into the kernel.
Instead of the complex ELF magic, let's simply wrap it in the assembly
with the '.incbin' directive.
Signed-off-by: default avatarMasahiro Yamada <yamada.masahiro@socionext.com>
Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 977c7114
...@@ -15,20 +15,7 @@ ifeq ($(CONFIG_BPFILTER_UMH), y) ...@@ -15,20 +15,7 @@ ifeq ($(CONFIG_BPFILTER_UMH), y)
HOSTLDFLAGS += -static HOSTLDFLAGS += -static
endif endif
# a bit of elf magic to convert bpfilter_umh binary into a binary blob $(obj)/bpfilter_umh_blob.o: $(obj)/bpfilter_umh
# inside bpfilter_umh.o elf file referenced by
# _binary_net_bpfilter_bpfilter_umh_start symbol
# which bpfilter_kern.c passes further into umh blob loader at run-time
quiet_cmd_copy_umh = GEN $@
cmd_copy_umh = echo ':' > $(obj)/.bpfilter_umh.o.cmd; \
$(OBJCOPY) -I binary \
`LC_ALL=C $(OBJDUMP) -f net/bpfilter/bpfilter_umh \
|awk -F' |,' '/file format/{print "-O",$$NF} \
/^architecture:/{print "-B",$$2}'` \
--rename-section .data=.init.rodata $< $@
$(obj)/bpfilter_umh.o: $(obj)/bpfilter_umh
$(call cmd,copy_umh)
obj-$(CONFIG_BPFILTER_UMH) += bpfilter.o obj-$(CONFIG_BPFILTER_UMH) += bpfilter.o
bpfilter-objs += bpfilter_kern.o bpfilter_umh.o bpfilter-objs += bpfilter_kern.o bpfilter_umh_blob.o
...@@ -10,11 +10,8 @@ ...@@ -10,11 +10,8 @@
#include <linux/file.h> #include <linux/file.h>
#include "msgfmt.h" #include "msgfmt.h"
#define UMH_start _binary_net_bpfilter_bpfilter_umh_start extern char bpfilter_umh_start;
#define UMH_end _binary_net_bpfilter_bpfilter_umh_end extern char bpfilter_umh_end;
extern char UMH_start;
extern char UMH_end;
static struct umh_info info; static struct umh_info info;
/* since ip_getsockopt() can run in parallel, serialize access to umh */ /* since ip_getsockopt() can run in parallel, serialize access to umh */
...@@ -93,7 +90,9 @@ static int __init load_umh(void) ...@@ -93,7 +90,9 @@ static int __init load_umh(void)
int err; int err;
/* fork usermode process */ /* fork usermode process */
err = fork_usermode_blob(&UMH_start, &UMH_end - &UMH_start, &info); err = fork_usermode_blob(&bpfilter_umh_start,
&bpfilter_umh_end - &bpfilter_umh_start,
&info);
if (err) if (err)
return err; return err;
pr_info("Loaded bpfilter_umh pid %d\n", info.pid); pr_info("Loaded bpfilter_umh pid %d\n", info.pid);
......
/* SPDX-License-Identifier: GPL-2.0 */
.section .init.rodata, "a"
.global bpfilter_umh_start
bpfilter_umh_start:
.incbin "net/bpfilter/bpfilter_umh"
.global bpfilter_umh_end
bpfilter_umh_end:
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment