Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+2 −15
Original line number Diff line number Diff line
@@ -15,20 +15,7 @@ ifeq ($(CONFIG_BPFILTER_UMH), y)
HOSTLDFLAGS += -static
endif

# a bit of elf magic to convert bpfilter_umh binary into a binary blob
# 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)/bpfilter_umh_blob.o: $(obj)/bpfilter_umh

obj-$(CONFIG_BPFILTER_UMH) += bpfilter.o
bpfilter-objs += bpfilter_kern.o bpfilter_umh.o
bpfilter-objs += bpfilter_kern.o bpfilter_umh_blob.o
+5 −6
Original line number Diff line number Diff line
@@ -10,11 +10,8 @@
#include <linux/file.h>
#include "msgfmt.h"

#define UMH_start _binary_net_bpfilter_bpfilter_umh_start
#define UMH_end _binary_net_bpfilter_bpfilter_umh_end

extern char UMH_start;
extern char UMH_end;
extern char bpfilter_umh_start;
extern char bpfilter_umh_end;

static struct umh_info info;
/* since ip_getsockopt() can run in parallel, serialize access to umh */
@@ -93,7 +90,9 @@ static int __init load_umh(void)
	int err;

	/* 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)
		return err;
	pr_info("Loaded bpfilter_umh pid %d\n", info.pid);
+7 −0
Original line number Diff line number Diff line
/* 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: