14c3b5a48SBlue Swirl#!/bin/sh 2ecbed728SRichard Henderson# Enable automatic program execution by the kernel. 34c3b5a48SBlue Swirl 47c81570dSRichard Hendersonqemu_target_list="i386 i486 alpha arm armeb sparc sparc32plus sparc64 \ 57c81570dSRichard Hendersonppc ppc64 ppc64le m68k mips mipsel mipsn32 mipsn32el mips64 mips64el \ 6ecbed728SRichard Hendersonsh4 sh4eb s390x aarch64 aarch64_be hppa riscv32 riscv64 xtensa xtensaeb \ 70caebb91SSong Gaomicroblaze microblazeel or1k x86_64 hexagon loongarch64" 84c3b5a48SBlue Swirl 93bef0451SLaurent Vivieri386_magic='\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x03\x00' 10daf238dcSLaurent Vivieri386_mask='\xff\xff\xff\xff\xff\xfe\xfe\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff' 113bef0451SLaurent Vivieri386_family=i386 123bef0451SLaurent Vivier 133bef0451SLaurent Vivieri486_magic='\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x06\x00' 14daf238dcSLaurent Vivieri486_mask='\xff\xff\xff\xff\xff\xfe\xfe\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff' 153bef0451SLaurent Vivieri486_family=i386 163bef0451SLaurent Vivier 17b8dbfc9cSLaurent Vivierx86_64_magic='\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x3e\x00' 18b8dbfc9cSLaurent Vivierx86_64_mask='\xff\xff\xff\xff\xff\xfe\xfe\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff' 19b8dbfc9cSLaurent Vivierx86_64_family=i386 20b8dbfc9cSLaurent Vivier 213bef0451SLaurent Vivieralpha_magic='\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x26\x90' 22daf238dcSLaurent Vivieralpha_mask='\xff\xff\xff\xff\xff\xfe\xfe\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff' 233bef0451SLaurent Vivieralpha_family=alpha 243bef0451SLaurent Vivier 253bef0451SLaurent Vivierarm_magic='\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28\x00' 263bef0451SLaurent Vivierarm_mask='\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff' 273bef0451SLaurent Vivierarm_family=arm 283bef0451SLaurent Vivier 293bef0451SLaurent Vivierarmeb_magic='\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28' 303bef0451SLaurent Vivierarmeb_mask='\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff' 312ced93eeSMichael Weiserarmeb_family=armeb 323bef0451SLaurent Vivier 333bef0451SLaurent Viviersparc_magic='\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x02' 34daf238dcSLaurent Viviersparc_mask='\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff' 353bef0451SLaurent Viviersparc_family=sparc 363bef0451SLaurent Vivier 373bef0451SLaurent Viviersparc32plus_magic='\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x12' 38daf238dcSLaurent Viviersparc32plus_mask='\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff' 393bef0451SLaurent Viviersparc32plus_family=sparc 403bef0451SLaurent Vivier 417c81570dSRichard Hendersonsparc64_magic='\x7fELF\x02\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x2b' 427c81570dSRichard Hendersonsparc64_mask='\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff' 437c81570dSRichard Hendersonsparc64_family=sparc 447c81570dSRichard Henderson 453bef0451SLaurent Vivierppc_magic='\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x14' 463bef0451SLaurent Vivierppc_mask='\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff' 473bef0451SLaurent Vivierppc_family=ppc 483bef0451SLaurent Vivier 493bef0451SLaurent Vivierppc64_magic='\x7fELF\x02\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x15' 503bef0451SLaurent Vivierppc64_mask='\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff' 513bef0451SLaurent Vivierppc64_family=ppc 523bef0451SLaurent Vivier 533bef0451SLaurent Vivierppc64le_magic='\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x15\x00' 543bef0451SLaurent Vivierppc64le_mask='\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\x00' 553bef0451SLaurent Vivierppc64le_family=ppcle 563bef0451SLaurent Vivier 573bef0451SLaurent Vivierm68k_magic='\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x04' 58daf238dcSLaurent Vivierm68k_mask='\xff\xff\xff\xff\xff\xff\xfe\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff' 593bef0451SLaurent Vivierm68k_family=m68k 603bef0451SLaurent Vivier 613bef0451SLaurent Vivier# FIXME: We could use the other endianness on a MIPS host. 623bef0451SLaurent Vivier 6377d119ddSAndreas K. Hüttelmips_magic='\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x08\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 6477d119ddSAndreas K. Hüttelmips_mask='\xff\xff\xff\xff\xff\xff\xff\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20' 653bef0451SLaurent Viviermips_family=mips 663bef0451SLaurent Vivier 6777d119ddSAndreas K. Hüttelmipsel_magic='\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x08\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 6877d119ddSAndreas K. Hüttelmipsel_mask='\xff\xff\xff\xff\xff\xff\xff\x00\x00\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00' 693bef0451SLaurent Viviermipsel_family=mips 703bef0451SLaurent Vivier 7177d119ddSAndreas K. Hüttelmipsn32_magic='\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x08\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20' 7277d119ddSAndreas K. Hüttelmipsn32_mask='\xff\xff\xff\xff\xff\xff\xff\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20' 733bef0451SLaurent Viviermipsn32_family=mips 743bef0451SLaurent Vivier 7577d119ddSAndreas K. Hüttelmipsn32el_magic='\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x08\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00' 7677d119ddSAndreas K. Hüttelmipsn32el_mask='\xff\xff\xff\xff\xff\xff\xff\x00\x00\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00' 773bef0451SLaurent Viviermipsn32el_family=mips 783bef0451SLaurent Vivier 793bef0451SLaurent Viviermips64_magic='\x7fELF\x02\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x08' 8077d119ddSAndreas K. Hüttelmips64_mask='\xff\xff\xff\xff\xff\xff\xff\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff' 813bef0451SLaurent Viviermips64_family=mips 823bef0451SLaurent Vivier 833bef0451SLaurent Viviermips64el_magic='\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x08\x00' 8477d119ddSAndreas K. Hüttelmips64el_mask='\xff\xff\xff\xff\xff\xff\xff\x00\x00\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff' 853bef0451SLaurent Viviermips64el_family=mips 863bef0451SLaurent Vivier 873bef0451SLaurent Viviersh4_magic='\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x2a\x00' 88daf238dcSLaurent Viviersh4_mask='\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff' 893bef0451SLaurent Viviersh4_family=sh4 903bef0451SLaurent Vivier 913bef0451SLaurent Viviersh4eb_magic='\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x2a' 92daf238dcSLaurent Viviersh4eb_mask='\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff' 933bef0451SLaurent Viviersh4eb_family=sh4 943bef0451SLaurent Vivier 953bef0451SLaurent Viviers390x_magic='\x7fELF\x02\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x16' 96daf238dcSLaurent Viviers390x_mask='\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff' 973bef0451SLaurent Viviers390x_family=s390x 983bef0451SLaurent Vivier 993bef0451SLaurent Vivieraarch64_magic='\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xb7\x00' 1003bef0451SLaurent Vivieraarch64_mask='\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff' 1013bef0451SLaurent Vivieraarch64_family=arm 1023bef0451SLaurent Vivier 103f772f212SMichael Weiseraarch64_be_magic='\x7fELF\x02\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xb7' 104f772f212SMichael Weiseraarch64_be_mask='\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff' 1052ced93eeSMichael Weiseraarch64_be_family=armeb 106f772f212SMichael Weiser 107e4d966ccSLaurent Vivierhppa_magic='\x7f\x45\x4c\x46\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x0f' 108e4d966ccSLaurent Vivierhppa_mask='\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff' 109e4d966ccSLaurent Vivierhppa_family=hppa 110e4d966ccSLaurent Vivier 11125fa194bSMichael Clarkriscv32_magic='\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xf3\x00' 11225fa194bSMichael Clarkriscv32_mask='\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff' 11325fa194bSMichael Clarkriscv32_family=riscv 11425fa194bSMichael Clark 11525fa194bSMichael Clarkriscv64_magic='\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xf3\x00' 11625fa194bSMichael Clarkriscv64_mask='\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff' 11725fa194bSMichael Clarkriscv64_family=riscv 11825fa194bSMichael Clark 119d4090306SMax Filippovxtensa_magic='\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x5e\x00' 120d4090306SMax Filippovxtensa_mask='\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff' 121d4090306SMax Filippovxtensa_family=xtensa 122d4090306SMax Filippov 123d4090306SMax Filippovxtensaeb_magic='\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x5e' 124d4090306SMax Filippovxtensaeb_mask='\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff' 125d4090306SMax Filippovxtensaeb_family=xtensaeb 126d4090306SMax Filippov 127947aeab3SLaurent Viviermicroblaze_magic='\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xba\xab' 128947aeab3SLaurent Viviermicroblaze_mask='\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff' 129947aeab3SLaurent Viviermicroblaze_family=microblaze 130947aeab3SLaurent Vivier 131947aeab3SLaurent Viviermicroblazeel_magic='\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xab\xba' 132947aeab3SLaurent Viviermicroblazeel_mask='\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff' 133947aeab3SLaurent Viviermicroblazeel_family=microblazeel 134947aeab3SLaurent Vivier 135ecbed728SRichard Hendersonor1k_magic='\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x5c' 136ecbed728SRichard Hendersonor1k_mask='\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff' 137ecbed728SRichard Hendersonor1k_family=or1k 138ecbed728SRichard Henderson 1393e7a84eeSTaylor Simpsonhexagon_magic='\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xa4\x00' 1403e7a84eeSTaylor Simpsonhexagon_mask='\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff' 1413e7a84eeSTaylor Simpsonhexagon_family=hexagon 1423e7a84eeSTaylor Simpson 1430caebb91SSong Gaoloongarch64_magic='\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x02\x01' 1440caebb91SSong Gaoloongarch64_mask='\xff\xff\xff\xff\xff\xff\xff\xfc\x00\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff' 1450caebb91SSong Gaoloongarch64_family=loongarch 1460caebb91SSong Gao 1473bef0451SLaurent Vivierqemu_get_family() { 1483bef0451SLaurent Vivier cpu=${HOST_ARCH:-$(uname -m)} 1494c3b5a48SBlue Swirl case "$cpu" in 1503bef0451SLaurent Vivier amd64|i386|i486|i586|i686|i86pc|BePC|x86_64) 1513bef0451SLaurent Vivier echo "i386" 1524c3b5a48SBlue Swirl ;; 1534c3b5a48SBlue Swirl mips*) 1543bef0451SLaurent Vivier echo "mips" 1554c3b5a48SBlue Swirl ;; 1563bef0451SLaurent Vivier "Power Macintosh"|ppc64|powerpc|ppc) 1573bef0451SLaurent Vivier echo "ppc" 1584c3b5a48SBlue Swirl ;; 1593bef0451SLaurent Vivier ppc64el|ppc64le) 1603bef0451SLaurent Vivier echo "ppcle" 1613bef0451SLaurent Vivier ;; 1622ced93eeSMichael Weiser arm|armel|armhf|arm64|armv[4-9]*l|aarch64) 1633bef0451SLaurent Vivier echo "arm" 1643bef0451SLaurent Vivier ;; 1652ced93eeSMichael Weiser armeb|armv[4-9]*b|aarch64_be) 1662ced93eeSMichael Weiser echo "armeb" 1672ced93eeSMichael Weiser ;; 1683bef0451SLaurent Vivier sparc*) 1693bef0451SLaurent Vivier echo "sparc" 1703bef0451SLaurent Vivier ;; 17125fa194bSMichael Clark riscv*) 17225fa194bSMichael Clark echo "riscv" 17325fa194bSMichael Clark ;; 174*f8d1ae82SSong Gao loongarch*) 175*f8d1ae82SSong Gao echo "loongarch" 176*f8d1ae82SSong Gao ;; 1773bef0451SLaurent Vivier *) 1783bef0451SLaurent Vivier echo "$cpu" 1794c3b5a48SBlue Swirl ;; 1804c3b5a48SBlue Swirl esac 1813bef0451SLaurent Vivier} 1823bef0451SLaurent Vivier 1833bef0451SLaurent Vivierusage() { 1843bef0451SLaurent Vivier cat <<EOF 1853bef0451SLaurent VivierUsage: qemu-binfmt-conf.sh [--qemu-path PATH][--debian][--systemd CPU] 1863bef0451SLaurent Vivier [--help][--credential yes|no][--exportdir PATH] 1877155be7cSLaurent Vivier [--persistent yes|no][--qemu-suffix SUFFIX] 1886e1c0d7bSLaurent Vivier [--preserve-argv0 yes|no] 1893bef0451SLaurent Vivier 1903bef0451SLaurent Vivier Configure binfmt_misc to use qemu interpreter 1913bef0451SLaurent Vivier 1923bef0451SLaurent Vivier --help: display this usage 1933bef0451SLaurent Vivier --qemu-path: set path to qemu interpreter ($QEMU_PATH) 1947155be7cSLaurent Vivier --qemu-suffix: add a suffix to the default interpreter name 1953bef0451SLaurent Vivier --debian: don't write into /proc, 1963bef0451SLaurent Vivier instead generate update-binfmts templates 1973bef0451SLaurent Vivier --systemd: don't write into /proc, 1983bef0451SLaurent Vivier instead generate file for systemd-binfmt.service 1993ff48453SLaurent Vivier for the given CPU. If CPU is "ALL", generate a 2003ff48453SLaurent Vivier file for all known cpus 2013bef0451SLaurent Vivier --exportdir: define where to write configuration files 2023bef0451SLaurent Vivier (default: $SYSTEMDDIR or $DEBIANDIR) 2033bef0451SLaurent Vivier --credential: if yes, credential and security tokens are 2043bef0451SLaurent Vivier calculated according to the binary to interpret 20501ecd22aSLaurent Vivier --persistent: if yes, the interpreter is loaded when binfmt is 20601ecd22aSLaurent Vivier configured and remains in memory. All future uses 20701ecd22aSLaurent Vivier are cloned from the open file. 2086e1c0d7bSLaurent Vivier --preserve-argv0 preserve argv[0] 2093bef0451SLaurent Vivier 2103bef0451SLaurent Vivier To import templates with update-binfmts, use : 2113bef0451SLaurent Vivier 2123bef0451SLaurent Vivier sudo update-binfmts --importdir ${EXPORTDIR:-$DEBIANDIR} --import qemu-CPU 2133bef0451SLaurent Vivier 2143bef0451SLaurent Vivier To remove interpreter, use : 2153bef0451SLaurent Vivier 2163bef0451SLaurent Vivier sudo update-binfmts --package qemu-CPU --remove qemu-CPU $QEMU_PATH 2173bef0451SLaurent Vivier 2183bef0451SLaurent Vivier With systemd, binfmt files are loaded by systemd-binfmt.service 2193bef0451SLaurent Vivier 2203bef0451SLaurent Vivier The environment variable HOST_ARCH allows to override 'uname' to generate 2213bef0451SLaurent Vivier configuration files for a different architecture than the current one. 2223bef0451SLaurent Vivier 2233bef0451SLaurent Vivier where CPU is one of: 2243bef0451SLaurent Vivier 2253bef0451SLaurent Vivier $qemu_target_list 2263bef0451SLaurent Vivier 2273bef0451SLaurent VivierEOF 2283bef0451SLaurent Vivier} 2293bef0451SLaurent Vivier 2303bef0451SLaurent Vivierqemu_check_access() { 2313bef0451SLaurent Vivier if [ ! -w "$1" ] ; then 2323bef0451SLaurent Vivier echo "ERROR: cannot write to $1" 1>&2 2333bef0451SLaurent Vivier exit 1 2343bef0451SLaurent Vivier fi 2353bef0451SLaurent Vivier} 2363bef0451SLaurent Vivier 2373bef0451SLaurent Vivierqemu_check_bintfmt_misc() { 2383bef0451SLaurent Vivier # load the binfmt_misc module 2393bef0451SLaurent Vivier if [ ! -d /proc/sys/fs/binfmt_misc ]; then 2403bef0451SLaurent Vivier if ! /sbin/modprobe binfmt_misc ; then 2413bef0451SLaurent Vivier exit 1 2423bef0451SLaurent Vivier fi 2433bef0451SLaurent Vivier fi 2443bef0451SLaurent Vivier if [ ! -f /proc/sys/fs/binfmt_misc/register ]; then 2453bef0451SLaurent Vivier if ! mount binfmt_misc -t binfmt_misc /proc/sys/fs/binfmt_misc ; then 2463bef0451SLaurent Vivier exit 1 2473bef0451SLaurent Vivier fi 2483bef0451SLaurent Vivier fi 2493bef0451SLaurent Vivier 2503bef0451SLaurent Vivier qemu_check_access /proc/sys/fs/binfmt_misc/register 2513bef0451SLaurent Vivier} 2523bef0451SLaurent Vivier 2533bef0451SLaurent Vivierinstalled_dpkg() { 2543bef0451SLaurent Vivier dpkg --status "$1" > /dev/null 2>&1 2553bef0451SLaurent Vivier} 2563bef0451SLaurent Vivier 2573bef0451SLaurent Vivierqemu_check_debian() { 2583bef0451SLaurent Vivier if [ ! -e /etc/debian_version ] ; then 2593bef0451SLaurent Vivier echo "WARNING: your system is not a Debian based distro" 1>&2 2603bef0451SLaurent Vivier elif ! installed_dpkg binfmt-support ; then 2613bef0451SLaurent Vivier echo "WARNING: package binfmt-support is needed" 1>&2 2623bef0451SLaurent Vivier fi 2633bef0451SLaurent Vivier qemu_check_access "$EXPORTDIR" 2643bef0451SLaurent Vivier} 2653bef0451SLaurent Vivier 2663bef0451SLaurent Vivierqemu_check_systemd() { 2673bef0451SLaurent Vivier if ! systemctl -q is-enabled systemd-binfmt.service ; then 2683bef0451SLaurent Vivier echo "WARNING: systemd-binfmt.service is missing or disabled" 1>&2 2693bef0451SLaurent Vivier fi 2703bef0451SLaurent Vivier qemu_check_access "$EXPORTDIR" 2713bef0451SLaurent Vivier} 2723bef0451SLaurent Vivier 2733bef0451SLaurent Vivierqemu_generate_register() { 27470a77984SLaurent Vivier flags="" 27570a77984SLaurent Vivier if [ "$CREDENTIAL" = "yes" ] ; then 27670a77984SLaurent Vivier flags="OC" 27770a77984SLaurent Vivier fi 27801ecd22aSLaurent Vivier if [ "$PERSISTENT" = "yes" ] ; then 27901ecd22aSLaurent Vivier flags="${flags}F" 28001ecd22aSLaurent Vivier fi 2816e1c0d7bSLaurent Vivier if [ "$PRESERVE_ARG0" = "yes" ] ; then 2826e1c0d7bSLaurent Vivier flags="${flags}P" 2836e1c0d7bSLaurent Vivier fi 28470a77984SLaurent Vivier 28570a77984SLaurent Vivier echo ":qemu-$cpu:M::$magic:$mask:$qemu:$flags" 2863bef0451SLaurent Vivier} 2873bef0451SLaurent Vivier 2883bef0451SLaurent Vivierqemu_register_interpreter() { 2893bef0451SLaurent Vivier echo "Setting $qemu as binfmt interpreter for $cpu" 2903bef0451SLaurent Vivier qemu_generate_register > /proc/sys/fs/binfmt_misc/register 2913bef0451SLaurent Vivier} 2923bef0451SLaurent Vivier 2933bef0451SLaurent Vivierqemu_generate_systemd() { 2943bef0451SLaurent Vivier echo "Setting $qemu as binfmt interpreter for $cpu for systemd-binfmt.service" 2953bef0451SLaurent Vivier qemu_generate_register > "$EXPORTDIR/qemu-$cpu.conf" 2963bef0451SLaurent Vivier} 2973bef0451SLaurent Vivier 2983bef0451SLaurent Vivierqemu_generate_debian() { 2993bef0451SLaurent Vivier cat > "$EXPORTDIR/qemu-$cpu" <<EOF 3003bef0451SLaurent Vivierpackage qemu-$cpu 3013bef0451SLaurent Vivierinterpreter $qemu 3023bef0451SLaurent Viviermagic $magic 3033bef0451SLaurent Viviermask $mask 304e7594133SSilvano Cirujano Cuestacredentials $CREDENTIAL 305e7594133SSilvano Cirujano Cuestapreserve $PRESERVE_ARG0 306e7594133SSilvano Cirujano Cuestafix_binary $PERSISTENT 3073bef0451SLaurent VivierEOF 3083bef0451SLaurent Vivier} 3093bef0451SLaurent Vivier 3103bef0451SLaurent Vivierqemu_set_binfmts() { 3113bef0451SLaurent Vivier # probe cpu type 3123bef0451SLaurent Vivier host_family=$(qemu_get_family) 3134c3b5a48SBlue Swirl 3144c3b5a48SBlue Swirl # register the interpreter for each cpu except for the native one 3153bef0451SLaurent Vivier 3163bef0451SLaurent Vivier for cpu in ${qemu_target_list} ; do 3173bef0451SLaurent Vivier magic=$(eval echo \$${cpu}_magic) 3183bef0451SLaurent Vivier mask=$(eval echo \$${cpu}_mask) 3193bef0451SLaurent Vivier family=$(eval echo \$${cpu}_family) 3203bef0451SLaurent Vivier 3213bef0451SLaurent Vivier if [ "$magic" = "" ] || [ "$mask" = "" ] || [ "$family" = "" ] ; then 3223bef0451SLaurent Vivier echo "INTERNAL ERROR: unknown cpu $cpu" 1>&2 3233bef0451SLaurent Vivier continue 3244c3b5a48SBlue Swirl fi 3253bef0451SLaurent Vivier 3263bef0451SLaurent Vivier qemu="$QEMU_PATH/qemu-$cpu" 3273bef0451SLaurent Vivier if [ "$cpu" = "i486" ] ; then 3283bef0451SLaurent Vivier qemu="$QEMU_PATH/qemu-i386" 3294c3b5a48SBlue Swirl fi 3303bef0451SLaurent Vivier 3317155be7cSLaurent Vivier qemu="$qemu$QEMU_SUFFIX" 3323bef0451SLaurent Vivier if [ "$host_family" != "$family" ] ; then 3333bef0451SLaurent Vivier $BINFMT_SET 3344c3b5a48SBlue Swirl fi 3353bef0451SLaurent Vivier done 3363bef0451SLaurent Vivier} 3373bef0451SLaurent Vivier 3383bef0451SLaurent VivierCHECK=qemu_check_bintfmt_misc 3393bef0451SLaurent VivierBINFMT_SET=qemu_register_interpreter 3403bef0451SLaurent Vivier 3413bef0451SLaurent VivierSYSTEMDDIR="/etc/binfmt.d" 3423bef0451SLaurent VivierDEBIANDIR="/usr/share/binfmts" 3433bef0451SLaurent Vivier 3443bef0451SLaurent VivierQEMU_PATH=/usr/local/bin 34570a77984SLaurent VivierCREDENTIAL=no 34601ecd22aSLaurent VivierPERSISTENT=no 3476e1c0d7bSLaurent VivierPRESERVE_ARG0=no 3487155be7cSLaurent VivierQEMU_SUFFIX="" 3493bef0451SLaurent Vivier 350719fab3aSMartin Wilck_longopts="debian,systemd:,qemu-path:,qemu-suffix:,exportdir:,help,credential:,\ 351719fab3aSMartin Wilckpersistent:,preserve-argv0:" 352719fab3aSMartin Wilckoptions=$(getopt -o ds:Q:S:e:hc:p:g:F: -l ${_longopts} -- "$@") 3533bef0451SLaurent Viviereval set -- "$options" 3543bef0451SLaurent Vivier 3553bef0451SLaurent Vivierwhile true ; do 3563bef0451SLaurent Vivier case "$1" in 3573bef0451SLaurent Vivier -d|--debian) 3583bef0451SLaurent Vivier CHECK=qemu_check_debian 3593bef0451SLaurent Vivier BINFMT_SET=qemu_generate_debian 3603bef0451SLaurent Vivier EXPORTDIR=${EXPORTDIR:-$DEBIANDIR} 3613bef0451SLaurent Vivier ;; 3623bef0451SLaurent Vivier -s|--systemd) 3633bef0451SLaurent Vivier CHECK=qemu_check_systemd 3643bef0451SLaurent Vivier BINFMT_SET=qemu_generate_systemd 3653bef0451SLaurent Vivier EXPORTDIR=${EXPORTDIR:-$SYSTEMDDIR} 3663bef0451SLaurent Vivier shift 3673bef0451SLaurent Vivier # check given cpu is in the supported CPU list 3683ff48453SLaurent Vivier if [ "$1" != "ALL" ] ; then 3693bef0451SLaurent Vivier for cpu in ${qemu_target_list} ; do 3706f75023aSKamil Rytarowski if [ "$cpu" = "$1" ] ; then 3713bef0451SLaurent Vivier break 3721ed27a17SPeter Maydell fi 3733bef0451SLaurent Vivier done 3743bef0451SLaurent Vivier 3756f75023aSKamil Rytarowski if [ "$cpu" = "$1" ] ; then 3763bef0451SLaurent Vivier qemu_target_list="$1" 3773bef0451SLaurent Vivier else 3783bef0451SLaurent Vivier echo "ERROR: unknown CPU \"$1\"" 1>&2 3793bef0451SLaurent Vivier usage 3803bef0451SLaurent Vivier exit 1 3814c3b5a48SBlue Swirl fi 3823ff48453SLaurent Vivier fi 3833bef0451SLaurent Vivier ;; 3843bef0451SLaurent Vivier -Q|--qemu-path) 3853bef0451SLaurent Vivier shift 3863bef0451SLaurent Vivier QEMU_PATH="$1" 3873bef0451SLaurent Vivier ;; 3887155be7cSLaurent Vivier -F|--qemu-suffix) 3897155be7cSLaurent Vivier shift 3907155be7cSLaurent Vivier QEMU_SUFFIX="$1" 3917155be7cSLaurent Vivier ;; 3923bef0451SLaurent Vivier -e|--exportdir) 3933bef0451SLaurent Vivier shift 3943bef0451SLaurent Vivier EXPORTDIR="$1" 3953bef0451SLaurent Vivier ;; 3963bef0451SLaurent Vivier -h|--help) 3973bef0451SLaurent Vivier usage 3983bef0451SLaurent Vivier exit 1 3993bef0451SLaurent Vivier ;; 4003bef0451SLaurent Vivier -c|--credential) 4013bef0451SLaurent Vivier shift 40270a77984SLaurent Vivier CREDENTIAL="$1" 4033bef0451SLaurent Vivier ;; 40401ecd22aSLaurent Vivier -p|--persistent) 40501ecd22aSLaurent Vivier shift 40601ecd22aSLaurent Vivier PERSISTENT="$1" 4073bef0451SLaurent Vivier ;; 4086e1c0d7bSLaurent Vivier -g|--preserve-argv0) 4096e1c0d7bSLaurent Vivier shift 4106e1c0d7bSLaurent Vivier PRESERVE_ARG0="$1" 4116e1c0d7bSLaurent Vivier ;; 4123bef0451SLaurent Vivier *) 4133bef0451SLaurent Vivier break 4143bef0451SLaurent Vivier ;; 4153bef0451SLaurent Vivier esac 4163bef0451SLaurent Vivier shift 4173bef0451SLaurent Vivierdone 4183bef0451SLaurent Vivier 4193bef0451SLaurent Vivier$CHECK 4203bef0451SLaurent Vivierqemu_set_binfmts 421