* [PATCH v8 7/9] qemu-binfmt-conf.sh: generalize <CPU> to positional [TARGETS]
@ 2020-03-07 17:41 Unai Martinez-Corral
0 siblings, 0 replies; 2+ messages in thread
From: Unai Martinez-Corral @ 2020-03-07 17:41 UTC (permalink / raw)
To: qemu-devel; +Cc: riku.voipio, laurent
This breaks brackward compatibility.
Option '--systemd CPU' allows to register binfmt interpreters for a
single target architecture or for 'ALL' (of them). This patch
generalizes the approach to support it in any mode (default, '--debian'
or '--systemd'). To do so, option 'systemd' is changed to be boolean
(no args). Then, all the positional arguments are considered to be a
list of target architectures.
If no positional arguments are provided, all of the architectures in
qemu_target_list are registered. Conversely, argument value 'NONE'
allows to make a 'dry run' of the script. I.e., checks are executed
according to the mode, but no interpreter is registered.
Support QEMU_TARGETS environment variable, consistently with 'path',
'suffix', 'persistent' and 'credential', The supported formats are
the same as for positional arguments, which have priority. If both
the variable and the list of positional arguments are empty, defaults
to qemu_target_list.
Signed-off-by: Unai Martinez-Corral <unai.martinezcorral@ehu.eus>
Reviewed-by: Laurent Vivier <laurent@vivier.eu>
---
scripts/qemu-binfmt-conf.sh | 80 +++++++++++++++++++++----------------
1 file changed, 46 insertions(+), 34 deletions(-)
diff --git a/scripts/qemu-binfmt-conf.sh b/scripts/qemu-binfmt-conf.sh
index 80ec164eab..d5d3484b58 100755
--- a/scripts/qemu-binfmt-conf.sh
+++ b/scripts/qemu-binfmt-conf.sh
@@ -6,6 +6,28 @@ ppc ppc64 ppc64le m68k mips mipsel mipsn32 mipsn32el mips64 mips64el \
sh4 sh4eb s390x aarch64 aarch64_be hppa riscv32 riscv64 xtensa xtensaeb \
microblaze microblazeel or1k x86_64"
+# check if given TARGETS is/are in the supported target list
+qemu_check_target_list() {
+ if [ $# -eq 0 ] ; then
+ checked_target_list="$qemu_target_list"
+ return
+ fi
+ unset checked_target_list
+ for target ; do
+ for cpu in $qemu_target_list ; do
+ if [ "x$cpu" = "x$target" ] ; then
+ checked_target_list="$checked_target_list $target"
+ break
+ fi
+ done
+ if [ "x$cpu" != "x$target" ] ; then
+ echo "ERROR: unknown CPU \"$target\"" 1>&2
+ usage
+ exit 1
+ fi
+ done
+}
+
i386_magic='\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x03\x00'
i386_mask='\xff\xff\xff\xff\xff\xfe\xfe\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff'
i386_family=i386
@@ -171,14 +193,16 @@ qemu_get_family() {
usage() {
cat <<EOF
+Usage: qemu-binfmt-conf.sh [options] [TARGETS]
-Usage: qemu-binfmt-conf.sh [options]
-
-Configure binfmt_misc to use qemu interpreter
+Configure binfmt_misc to use qemu interpreter for the given TARGETS.
Options and associated environment variables:
Argument Env-variable Description
+TARGETS QEMU_TARGETS A single arch name or a list of them (see all names below);
+ if empty, configure all known targets;
+ if 'NONE', no interpreter is configured.
-h|--help display this usage
-Q|--path PATH QEMU_PATH set path to qemu interpreter(s)
-F|--suffix SUFFIX QEMU_SUFFIX add a suffix to the default interpreter name
@@ -188,12 +212,12 @@ Argument Env-variable Description
to the binary to interpret
-e|--exportdir PATH define where to write configuration files
(default: $SYSTEMDDIR or $DEBIANDIR)
--s|--systemd CPU don't write into /proc, generate file for
- systemd-binfmt.service for the given CPU; if CPU is "ALL",
- generate a file for all known cpus.
+-s|--systemd don't write into /proc, generate file(s) for
+ systemd-binfmt.service;
-d|--debian don't write into /proc, generate update-binfmts templates
Defaults:
+QEMU_TARGETS=$QEMU_TARGETS
QEMU_PATH=$QEMU_PATH
QEMU_SUFFIX=$QEMU_SUFFIX
QEMU_PERSISTENT=$QEMU_PERSISTENT
@@ -207,14 +231,10 @@ To remove interpreter, use :
sudo update-binfmts --package qemu-CPU --remove qemu-CPU $QEMU_PATH
-With systemd, binfmt files are loaded by systemd-binfmt.service
+The environment variable HOST_ARCH allows to override 'uname' to generate configuration files for
+a different architecture than the current one.
-The environment variable HOST_ARCH allows to override 'uname' to generate configuration files for a
-different architecture than the current one.
-
-where CPU is one of:
-
- $qemu_target_list
+QEMU target list: $qemu_target_list
EOF
}
@@ -298,9 +318,15 @@ qemu_set_binfmts() {
# probe cpu type
host_family=$(qemu_get_family)
- # register the interpreter for each cpu except for the native one
+ # reduce the list of target interpreters to those given in the CLI
+ targets=${@:-$QEMU_TARGET}
+ if [ "x$targets" = "xNONE" ] ; then
+ return
+ fi
+ qemu_check_target_list $targets
- for cpu in ${qemu_target_list} ; do
+ # register the interpreter for each target except for the native one
+ for cpu in $checked_target_list ; do
magic=$(eval echo \$${cpu}_magic)
mask=$(eval echo \$${cpu}_mask)
family=$(eval echo \$${cpu}_family)
@@ -328,12 +354,13 @@ BINFMT_SET=qemu_register_interpreter
SYSTEMDDIR="/etc/binfmt.d"
DEBIANDIR="/usr/share/binfmts"
+QEMU_TARGETS="${QEMU_TARGETS:-}"
QEMU_PATH="${QEMU_PATH:-/usr/local/bin}"
QEMU_SUFFIX="${QEMU_SUFFIX:-}"
QEMU_PERSISTENT="${QEMU_PERSISTENT:-no}"
QEMU_CREDENTIAL="${QEMU_CREDENTIAL:-no}"
-options=$(getopt -o ds:Q:S:e:hcp -l debian,systemd:,path:,suffix:,exportdir:,help,credential,persistent -- "$@")
+options=$(getopt -o dsQ:S:e:hcp -l debian,systemd,path:,suffix:,exportdir:,help,credential,persistent -- "$@")
eval set -- "$options"
while true ; do
@@ -347,23 +374,6 @@ while true ; do
CHECK=qemu_check_systemd
BINFMT_SET=qemu_generate_systemd
EXPORTDIR=${EXPORTDIR:-$SYSTEMDDIR}
- shift
- # check given cpu is in the supported CPU list
- if [ "$1" != "ALL" ] ; then
- for cpu in ${qemu_target_list} ; do
- if [ "$cpu" = "$1" ] ; then
- break
- fi
- done
-
- if [ "$cpu" = "$1" ] ; then
- qemu_target_list="$1"
- else
- echo "ERROR: unknown CPU \"$1\"" 1>&2
- usage
- exit 1
- fi
- fi
;;
-Q|--path)
shift
@@ -394,5 +404,7 @@ while true ; do
shift
done
+shift
+
$CHECK
-qemu_set_binfmts
+qemu_set_binfmts "$@"
--
2.25.1
^ permalink raw reply related [flat|nested] 2+ messages in thread* [PATCH v8 0/9] qemu-binfmt-conf.sh
@ 2020-03-07 17:04 unai.martinezcorral
2020-03-07 18:54 ` [PATCH v8 7/9] qemu-binfmt-conf.sh: generalize <CPU> to positional [TARGETS] Unai Martinez-Corral
0 siblings, 1 reply; 2+ messages in thread
From: unai.martinezcorral @ 2020-03-07 17:04 UTC (permalink / raw)
To: qemu-devel; +Cc: riku.voipio, laurent
Hi,
This series reworks qemu-binfmt-conf.sh:
* Argument <CPU> from option '--systemd' is generalized to <TARGETS>, and it is
accepted for any mode (default, debian or systemd). It can be a single target
arch or a list of them.
* Option '-r|--clear' is added, which allows to remove an already registered
target interpreter or a list of them. The implementation is functional but
partial. Please, see the corresponding commit.
* Option '-t|--test' is added, which allows to execute the CHECK according
to the provided arguments, but no interpreter is configured.
* Support to set options through environment variables: QEMU_TARGETS, QEMU_PATH,
QEMU_SUFFIX, QEMU_PERSISTENT, QEMU_CREDENTIAL, QEMU_CLEAR and QEMU_TEST.
The following changes are not backward compatible:
* Option '--persistent' no longer requires/accepts an argument.
* Option '--credential' no longer requires/accepts an argument.
* Option '--systemd' no longer requires/accepts an argument.
* Option '--qemu-path' is renamed to '--path'.
* Option '--qemu-suffix' is renamed to '--suffix'.
The functionality of all of them is untouched. Changes are related to syntax only.
v8:
* Fix typos and address review comments
v7:
* Check that a interpreter exists before trying to remove it.
v6:
* Don't need to use "find".
* Put the ";;" at the same position.
* Set BINFMT_CLEAR to ':', to allow --test to work with --clear.
* Do not show DEBIANDIR and SYSTEMDDIR in the Env-variable column.
Based on:
* [PATCH v5 0/10] qemu-binfmt-conf.sh
* should have been [PATCH v5 0/9] qemu-binfmt-conf.sh
* [PATCH v4 0/10] qemu-binfmt-conf.sh
* [PATCH v3 0/10] qemu-binfmt-conf.sh
* [PATCH v2] qemu-binfmt-conf.sh: add CPUS, add --reset, make -p and -c boolean (no arg)
* [PATCH] qemu-binfmt-conf.sh: add CPUS, add --reset, make -p and -c boolean (no arg)
* scripts/qemu-binfmt-conf.sh: allow clearing of entries
Regards
Unai Martinez-Corral (9):
qemu-binfmt-conf.sh: enforce safe style consistency
qemu-binfmt-conf.sh: make opts -p and -c boolean
qemu-binfmt-conf.sh: add QEMU_CREDENTIAL and QEMU_PERSISTENT
qemu-binfmt-conf.sh: use the same presentation format as for qemu-*
qemu-binfmt-conf.sh: remove 'qemu' prefix from cli options
qemu-binfmt-conf.sh: honour QEMU_PATH and/or QEMU_SUFFIX
qemu-binfmt-conf.sh: generalize <CPU> to positional TARGETS
qemu-binfmt-conf.sh: add option --clear
qemu-binfmt-conf.sh: add --test
scripts/qemu-binfmt-conf.sh | 211
1 file changed, 133 insertions(+), 78 deletions(-)
^ permalink raw reply [flat|nested] 2+ messages in thread* [PATCH v8 7/9] qemu-binfmt-conf.sh: generalize <CPU> to positional [TARGETS]
2020-03-07 17:04 [PATCH v8 0/9] qemu-binfmt-conf.sh unai.martinezcorral
@ 2020-03-07 18:54 ` Unai Martinez-Corral
0 siblings, 0 replies; 2+ messages in thread
From: Unai Martinez-Corral @ 2020-03-07 18:54 UTC (permalink / raw)
To: qemu-devel; +Cc: riku.voipio, laurent
This breaks brackward compatibility.
Option '--systemd CPU' allows to register binfmt interpreters for a
single target architecture or for 'ALL' (of them). This patch
generalizes the approach to support it in any mode (default, '--debian'
or '--systemd'). To do so, option 'systemd' is changed to be boolean
(no args). Then, all the positional arguments are considered to be a
list of target architectures.
If no positional arguments are provided, all of the architectures in
qemu_target_list are registered. Conversely, argument value 'NONE'
allows to make a 'dry run' of the script. I.e., checks are executed
according to the mode, but no interpreter is registered.
Support QEMU_TARGETS environment variable, consistently with 'path',
'suffix', 'persistent' and 'credential', The supported formats are
the same as for positional arguments, which have priority. If both
the variable and the list of positional arguments are empty, defaults
to qemu_target_list.
Signed-off-by: Unai Martinez-Corral <unai.martinezcorral@ehu.eus>
Reviewed-by: Laurent Vivier <laurent@vivier.eu>
---
scripts/qemu-binfmt-conf.sh | 80 +++++++++++++++++++++----------------
1 file changed, 46 insertions(+), 34 deletions(-)
diff --git a/scripts/qemu-binfmt-conf.sh b/scripts/qemu-binfmt-conf.sh
index 80ec164eab..d5d3484b58 100755
--- a/scripts/qemu-binfmt-conf.sh
+++ b/scripts/qemu-binfmt-conf.sh
@@ -6,6 +6,28 @@ ppc ppc64 ppc64le m68k mips mipsel mipsn32 mipsn32el mips64 mips64el \
sh4 sh4eb s390x aarch64 aarch64_be hppa riscv32 riscv64 xtensa xtensaeb \
microblaze microblazeel or1k x86_64"
+# check if given TARGETS is/are in the supported target list
+qemu_check_target_list() {
+ if [ $# -eq 0 ] ; then
+ checked_target_list="$qemu_target_list"
+ return
+ fi
+ unset checked_target_list
+ for target ; do
+ for cpu in $qemu_target_list ; do
+ if [ "x$cpu" = "x$target" ] ; then
+ checked_target_list="$checked_target_list $target"
+ break
+ fi
+ done
+ if [ "x$cpu" != "x$target" ] ; then
+ echo "ERROR: unknown CPU \"$target\"" 1>&2
+ usage
+ exit 1
+ fi
+ done
+}
+
i386_magic='\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x03\x00'
i386_mask='\xff\xff\xff\xff\xff\xfe\xfe\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff'
i386_family=i386
@@ -171,14 +193,16 @@ qemu_get_family() {
usage() {
cat <<EOF
+Usage: qemu-binfmt-conf.sh [options] [TARGETS]
-Usage: qemu-binfmt-conf.sh [options]
-
-Configure binfmt_misc to use qemu interpreter
+Configure binfmt_misc to use qemu interpreter for the given TARGETS.
Options and associated environment variables:
Argument Env-variable Description
+TARGETS QEMU_TARGETS A single arch name or a list of them (see all names below);
+ if empty, configure all known targets;
+ if 'NONE', no interpreter is configured.
-h|--help display this usage
-Q|--path PATH QEMU_PATH set path to qemu interpreter(s)
-F|--suffix SUFFIX QEMU_SUFFIX add a suffix to the default interpreter name
@@ -188,12 +212,12 @@ Argument Env-variable Description
to the binary to interpret
-e|--exportdir PATH define where to write configuration files
(default: $SYSTEMDDIR or $DEBIANDIR)
--s|--systemd CPU don't write into /proc, generate file for
- systemd-binfmt.service for the given CPU; if CPU is "ALL",
- generate a file for all known cpus.
+-s|--systemd don't write into /proc, generate file(s) for
+ systemd-binfmt.service;
-d|--debian don't write into /proc, generate update-binfmts templates
Defaults:
+QEMU_TARGETS=$QEMU_TARGETS
QEMU_PATH=$QEMU_PATH
QEMU_SUFFIX=$QEMU_SUFFIX
QEMU_PERSISTENT=$QEMU_PERSISTENT
@@ -207,14 +231,10 @@ To remove interpreter, use :
sudo update-binfmts --package qemu-CPU --remove qemu-CPU $QEMU_PATH
-With systemd, binfmt files are loaded by systemd-binfmt.service
+The environment variable HOST_ARCH allows to override 'uname' to generate configuration files for
+a different architecture than the current one.
-The environment variable HOST_ARCH allows to override 'uname' to generate configuration files for a
-different architecture than the current one.
-
-where CPU is one of:
-
- $qemu_target_list
+QEMU target list: $qemu_target_list
EOF
}
@@ -298,9 +318,15 @@ qemu_set_binfmts() {
# probe cpu type
host_family=$(qemu_get_family)
- # register the interpreter for each cpu except for the native one
+ # reduce the list of target interpreters to those given in the CLI
+ targets=${@:-$QEMU_TARGET}
+ if [ "x$targets" = "xNONE" ] ; then
+ return
+ fi
+ qemu_check_target_list $targets
- for cpu in ${qemu_target_list} ; do
+ # register the interpreter for each target except for the native one
+ for cpu in $checked_target_list ; do
magic=$(eval echo \$${cpu}_magic)
mask=$(eval echo \$${cpu}_mask)
family=$(eval echo \$${cpu}_family)
@@ -328,12 +354,13 @@ BINFMT_SET=qemu_register_interpreter
SYSTEMDDIR="/etc/binfmt.d"
DEBIANDIR="/usr/share/binfmts"
+QEMU_TARGETS="${QEMU_TARGETS:-}"
QEMU_PATH="${QEMU_PATH:-/usr/local/bin}"
QEMU_SUFFIX="${QEMU_SUFFIX:-}"
QEMU_PERSISTENT="${QEMU_PERSISTENT:-no}"
QEMU_CREDENTIAL="${QEMU_CREDENTIAL:-no}"
-options=$(getopt -o ds:Q:S:e:hcp -l debian,systemd:,path:,suffix:,exportdir:,help,credential,persistent -- "$@")
+options=$(getopt -o dsQ:S:e:hcp -l debian,systemd,path:,suffix:,exportdir:,help,credential,persistent -- "$@")
eval set -- "$options"
while true ; do
@@ -347,23 +374,6 @@ while true ; do
CHECK=qemu_check_systemd
BINFMT_SET=qemu_generate_systemd
EXPORTDIR=${EXPORTDIR:-$SYSTEMDDIR}
- shift
- # check given cpu is in the supported CPU list
- if [ "$1" != "ALL" ] ; then
- for cpu in ${qemu_target_list} ; do
- if [ "$cpu" = "$1" ] ; then
- break
- fi
- done
-
- if [ "$cpu" = "$1" ] ; then
- qemu_target_list="$1"
- else
- echo "ERROR: unknown CPU \"$1\"" 1>&2
- usage
- exit 1
- fi
- fi
;;
-Q|--path)
shift
@@ -394,5 +404,7 @@ while true ; do
shift
done
+shift
+
$CHECK
-qemu_set_binfmts
+qemu_set_binfmts "$@"
--
2.25.1
^ permalink raw reply related [flat|nested] 2+ messages in thread
end of thread, other threads:[~2020-03-07 18:55 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-03-07 17:41 [PATCH v8 7/9] qemu-binfmt-conf.sh: generalize <CPU> to positional [TARGETS] Unai Martinez-Corral
-- strict thread matches above, loose matches on Subject: below --
2020-03-07 17:04 [PATCH v8 0/9] qemu-binfmt-conf.sh unai.martinezcorral
2020-03-07 18:54 ` [PATCH v8 7/9] qemu-binfmt-conf.sh: generalize <CPU> to positional [TARGETS] Unai Martinez-Corral
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.