xref: /openbmc/qemu/scripts/qemu-binfmt-conf.sh (revision 19361471b59441cd6f2aa22d4fbee7a6e9e76586)
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