Date: Wed, 22 May 2013 17:17:29 -0500 From: Stacey Son <sson@FreeBSD.org> To: freebsd-arch@freebsd.org Subject: binmiscctl(8) (and imgact_binmisc kernel module) Message-ID: <CD3A8F5A-7AF9-4190-8B01-67D13B3121F9@FreeBSD.org>
next in thread | raw e-mail | index | archive | help
Hi all: I added a command-line utility called 'binmiscctl' for the imgact_binmisc kernel module that I previously proposed on this list. As you may recall, imgact_binmisc is an image activator for miscellaneous binary file types that are executed with the help of a user-level interpreter or emulator. It has been proposed that imgact_binmisc be added to the kernel as a module. The main reason I created this is to support cross building packages using qemu user mode (see my dev summit slides at http://people.freebsd.org/~sson/imgact_binmisc/20130515-bsdcan-xbuild-ports.pdf) but there are a lot of other applications for this module as well. For example, Nathan Whitehorn previously proposed on this list a similar code change (but much less general) to support transparently execute LLVM bitcode using the 'lli' JIT compiler. This kernel module if flexible enough that it supports that as well. Baptiste has also added support in poudrière for cross-building mips64 packages in a "cross jail" using qemu user mode. See his slides from BSDCan 2013 (pg. 7): http://people.freebsd.org/~bapt/modern-package-management.pdf Bapt mentioned that he built over 10,000 mips64 packages in about 30 hours. Of course, this is before adding imgact_binmisc which greatly improves the cross build speed by allowing both native (amd64) cross build tools to be used along with emulated mips64 binaries in a hybrid fashion. With my limited testing of cross building a handful of ports the overhead compared to building the port natively on a commodity amd64 host is 2x to 4x using this kernel module. Without the module the overhead is 10x or much more. The recently added 'binmiscctl' command-line utility allows for easy configuration and management of the image activators in this imgact_binmisc kernel module. For example, to add an image activator for qemu-mips64 (the qemu user mode emulator for mips64): # binmiscctl add mips64elf --interpreter "/usr/local/bin/qemu-mips64" --magic \ "\x7f\x45\x4c\x46\x02\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x08" \ --mask "\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff" --size 20 --set-enabled To disable the above without removing it from the module's activator list: # binmiscctl disable mips64elf To enable: # binmiscctl enable mips64elf To remove from the module's activator list: # binmiscctl remove mips64elf To lookup and print out the activator entry: # binmiscctl lookup mips64elf name: mips64elf interpreter: /usr/local/bin/qemu-mips64 flags: ENABLED USE_MASK magic size: 20 magic offset: 0 magic: 0x7f 0x45 0x4c 0x46 0x02 0x02 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 0x00 0x08 mask: 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0x00 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xfe 0xff 0xff To take a snapshot and list all the activators # binmiscctl list name: mips64elf [...] To add an image activator for LLVM bitcode JIT lli(1) compiler: # binmiscctl add llvmbc --interpreter ''/usr/bin/lli --fake-argv0=#a'' \ --magic ''BC\xc0\xde'' --size 4 --set-enabled Note the "#a", in the above example, is replaced with the old argv0 value so lli(1) can use it to fake the argv0 as described in the lli(1) man page. The source code, man page, and diff to add it to the source tree can be found at: http://people.freebsd.org/~sson/imgact_binmisc/ Of course, comments, suggestions, concerns, detailed code reviews, etc. are welcome. Best Regards, -stacey.
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CD3A8F5A-7AF9-4190-8B01-67D13B3121F9>
