* [PATCH v2 1/3] binfmt: Shuffle things around
2025-01-27 18:29 [PATCH v2 0/3] binfmt: Add --ignore-family option Andrea Bolognani
@ 2025-01-27 18:29 ` Andrea Bolognani
2025-02-20 10:46 ` Laurent Vivier
2025-02-24 1:36 ` Alistair Francis
2025-01-27 18:29 ` [PATCH v2 2/3] binfmt: Normalize host CPU architecture Andrea Bolognani
` (3 subsequent siblings)
4 siblings, 2 replies; 13+ messages in thread
From: Andrea Bolognani @ 2025-01-27 18:29 UTC (permalink / raw)
To: qemu-devel
Cc: Alistair Francis, Laurent Vivier, Daniel P . Berrangé,
David Abdurachmanov
This should make no difference from the functional point of
view and it's just preparation for upcoming changes.
Signed-off-by: Andrea Bolognani <abologna@redhat.com>
---
scripts/qemu-binfmt-conf.sh | 17 ++++++++++-------
1 file changed, 10 insertions(+), 7 deletions(-)
diff --git a/scripts/qemu-binfmt-conf.sh b/scripts/qemu-binfmt-conf.sh
index 6ef9f118d9..426f075e31 100755
--- a/scripts/qemu-binfmt-conf.sh
+++ b/scripts/qemu-binfmt-conf.sh
@@ -318,20 +318,23 @@ qemu_set_binfmts() {
mask=$(eval echo \$${cpu}_mask)
family=$(eval echo \$${cpu}_family)
+ target="$cpu"
+ if [ "$cpu" = "i486" ] ; then
+ target="i386"
+ fi
+
+ qemu="$QEMU_PATH/qemu-$target$QEMU_SUFFIX"
+
if [ "$magic" = "" ] || [ "$mask" = "" ] || [ "$family" = "" ] ; then
echo "INTERNAL ERROR: unknown cpu $cpu" 1>&2
continue
fi
- qemu="$QEMU_PATH/qemu-$cpu"
- if [ "$cpu" = "i486" ] ; then
- qemu="$QEMU_PATH/qemu-i386"
+ if [ "$host_family" = "$family" ] ; then
+ continue
fi
- qemu="$qemu$QEMU_SUFFIX"
- if [ "$host_family" != "$family" ] ; then
- $BINFMT_SET
- fi
+ $BINFMT_SET
done
}
--
2.48.1
^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [PATCH v2 1/3] binfmt: Shuffle things around
2025-01-27 18:29 ` [PATCH v2 1/3] binfmt: Shuffle things around Andrea Bolognani
@ 2025-02-20 10:46 ` Laurent Vivier
2025-02-24 1:36 ` Alistair Francis
1 sibling, 0 replies; 13+ messages in thread
From: Laurent Vivier @ 2025-02-20 10:46 UTC (permalink / raw)
To: Andrea Bolognani, qemu-devel
Cc: Alistair Francis, Daniel P . Berrangé, David Abdurachmanov
Le 27/01/2025 à 19:29, Andrea Bolognani a écrit :
> This should make no difference from the functional point of
> view and it's just preparation for upcoming changes.
>
> Signed-off-by: Andrea Bolognani <abologna@redhat.com>
> ---
> scripts/qemu-binfmt-conf.sh | 17 ++++++++++-------
> 1 file changed, 10 insertions(+), 7 deletions(-)
>
> diff --git a/scripts/qemu-binfmt-conf.sh b/scripts/qemu-binfmt-conf.sh
> index 6ef9f118d9..426f075e31 100755
> --- a/scripts/qemu-binfmt-conf.sh
> +++ b/scripts/qemu-binfmt-conf.sh
> @@ -318,20 +318,23 @@ qemu_set_binfmts() {
> mask=$(eval echo \$${cpu}_mask)
> family=$(eval echo \$${cpu}_family)
>
> + target="$cpu"
> + if [ "$cpu" = "i486" ] ; then
> + target="i386"
> + fi
> +
> + qemu="$QEMU_PATH/qemu-$target$QEMU_SUFFIX"
> +
> if [ "$magic" = "" ] || [ "$mask" = "" ] || [ "$family" = "" ] ; then
> echo "INTERNAL ERROR: unknown cpu $cpu" 1>&2
> continue
> fi
>
> - qemu="$QEMU_PATH/qemu-$cpu"
> - if [ "$cpu" = "i486" ] ; then
> - qemu="$QEMU_PATH/qemu-i386"
> + if [ "$host_family" = "$family" ] ; then
> + continue
> fi
>
> - qemu="$qemu$QEMU_SUFFIX"
> - if [ "$host_family" != "$family" ] ; then
> - $BINFMT_SET
> - fi
> + $BINFMT_SET
> done
> }
>
Reviewed-by: Laurent Vivier <laurent@vivier.eu>
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v2 1/3] binfmt: Shuffle things around
2025-01-27 18:29 ` [PATCH v2 1/3] binfmt: Shuffle things around Andrea Bolognani
2025-02-20 10:46 ` Laurent Vivier
@ 2025-02-24 1:36 ` Alistair Francis
1 sibling, 0 replies; 13+ messages in thread
From: Alistair Francis @ 2025-02-24 1:36 UTC (permalink / raw)
To: Andrea Bolognani
Cc: qemu-devel, Laurent Vivier, Daniel P . Berrangé,
David Abdurachmanov
On Tue, Jan 28, 2025 at 4:29 AM Andrea Bolognani <abologna@redhat.com> wrote:
>
> This should make no difference from the functional point of
> view and it's just preparation for upcoming changes.
>
> Signed-off-by: Andrea Bolognani <abologna@redhat.com>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Alistair
> ---
> scripts/qemu-binfmt-conf.sh | 17 ++++++++++-------
> 1 file changed, 10 insertions(+), 7 deletions(-)
>
> diff --git a/scripts/qemu-binfmt-conf.sh b/scripts/qemu-binfmt-conf.sh
> index 6ef9f118d9..426f075e31 100755
> --- a/scripts/qemu-binfmt-conf.sh
> +++ b/scripts/qemu-binfmt-conf.sh
> @@ -318,20 +318,23 @@ qemu_set_binfmts() {
> mask=$(eval echo \$${cpu}_mask)
> family=$(eval echo \$${cpu}_family)
>
> + target="$cpu"
> + if [ "$cpu" = "i486" ] ; then
> + target="i386"
> + fi
> +
> + qemu="$QEMU_PATH/qemu-$target$QEMU_SUFFIX"
> +
> if [ "$magic" = "" ] || [ "$mask" = "" ] || [ "$family" = "" ] ; then
> echo "INTERNAL ERROR: unknown cpu $cpu" 1>&2
> continue
> fi
>
> - qemu="$QEMU_PATH/qemu-$cpu"
> - if [ "$cpu" = "i486" ] ; then
> - qemu="$QEMU_PATH/qemu-i386"
> + if [ "$host_family" = "$family" ] ; then
> + continue
> fi
>
> - qemu="$qemu$QEMU_SUFFIX"
> - if [ "$host_family" != "$family" ] ; then
> - $BINFMT_SET
> - fi
> + $BINFMT_SET
> done
> }
>
> --
> 2.48.1
>
^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH v2 2/3] binfmt: Normalize host CPU architecture
2025-01-27 18:29 [PATCH v2 0/3] binfmt: Add --ignore-family option Andrea Bolognani
2025-01-27 18:29 ` [PATCH v2 1/3] binfmt: Shuffle things around Andrea Bolognani
@ 2025-01-27 18:29 ` Andrea Bolognani
2025-02-20 11:05 ` Laurent Vivier
2025-02-24 1:39 ` Alistair Francis
2025-01-27 18:29 ` [PATCH v2 3/3] binfmt: Add --ignore-family option Andrea Bolognani
` (2 subsequent siblings)
4 siblings, 2 replies; 13+ messages in thread
From: Andrea Bolognani @ 2025-01-27 18:29 UTC (permalink / raw)
To: qemu-devel
Cc: Alistair Francis, Laurent Vivier, Daniel P . Berrangé,
David Abdurachmanov
Right now information regarding the family each CPU type belongs
to is recorded in two places: the large data table at the top of
the script, and the qemu_host_family() function.
We can make things better by mapping host CPU architecture to
QEMU target in the few cases where the two don't already match
and then using the data table to look up the family, same as
we're already doing for the guest CPU architecture.
Being able to reason in terms of QEMU target regardless of
whether we're looking at the host or guest CPU architecture will
come in handy to implement upcoming changes.
A couple of entries are dropped in the process: BePC and Power
Macintosh. I'm quite certain neither of those have ever been
reported as CPU architectures by Linux. I believe many more of
the entries that are carried forward could be dropped as well,
but I don't have the same level of confidence there so I
decided to play it safe just in case.
Signed-off-by: Andrea Bolognani <abologna@redhat.com>
---
scripts/qemu-binfmt-conf.sh | 44 +++++++++++++++++++++----------------
1 file changed, 25 insertions(+), 19 deletions(-)
diff --git a/scripts/qemu-binfmt-conf.sh b/scripts/qemu-binfmt-conf.sh
index 426f075e31..8d9136a29f 100755
--- a/scripts/qemu-binfmt-conf.sh
+++ b/scripts/qemu-binfmt-conf.sh
@@ -144,35 +144,35 @@ loongarch64_magic='\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x
loongarch64_mask='\xff\xff\xff\xff\xff\xff\xff\xfc\x00\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff'
loongarch64_family=loongarch
-qemu_get_family() {
- cpu=${HOST_ARCH:-$(uname -m)}
+# Converts the name of a host CPU architecture to the corresponding QEMU
+# target.
+#
+# FIXME: This can probably be simplified a lot by dropping most entries.
+# Remember that the script is only used on Linux, so we only need to
+# handle the strings Linux uses to report the host CPU architecture.
+qemu_normalize() {
+ cpu="$1"
case "$cpu" in
- amd64|i386|i486|i586|i686|i86pc|BePC|x86_64)
+ i[3-6]86)
echo "i386"
;;
- mips*)
- echo "mips"
+ amd64)
+ echo "x86_64"
;;
- "Power Macintosh"|ppc64|powerpc|ppc)
+ powerpc)
echo "ppc"
;;
- ppc64el|ppc64le)
- echo "ppcle"
+ ppc64el)
+ echo "ppc64le"
;;
- arm|armel|armhf|arm64|armv[4-9]*l|aarch64)
+ armel|armhf|armv[4-9]*l)
echo "arm"
;;
- armeb|armv[4-9]*b|aarch64_be)
+ armv[4-9]*b)
echo "armeb"
;;
- sparc*)
- echo "sparc"
- ;;
- riscv*)
- echo "riscv"
- ;;
- loongarch*)
- echo "loongarch"
+ arm64)
+ echo "aarch64"
;;
*)
echo "$cpu"
@@ -309,7 +309,13 @@ EOF
qemu_set_binfmts() {
# probe cpu type
- host_family=$(qemu_get_family)
+ host_cpu=$(qemu_normalize ${HOST_ARCH:-$(uname -m)})
+ host_family=$(eval echo \$${host_cpu}_family)
+
+ if [ "$host_family" = "" ] ; then
+ echo "INTERNAL ERROR: unknown host cpu $host_cpu" 1>&2
+ exit 1
+ fi
# register the interpreter for each cpu except for the native one
--
2.48.1
^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [PATCH v2 2/3] binfmt: Normalize host CPU architecture
2025-01-27 18:29 ` [PATCH v2 2/3] binfmt: Normalize host CPU architecture Andrea Bolognani
@ 2025-02-20 11:05 ` Laurent Vivier
2025-02-24 1:39 ` Alistair Francis
1 sibling, 0 replies; 13+ messages in thread
From: Laurent Vivier @ 2025-02-20 11:05 UTC (permalink / raw)
To: Andrea Bolognani, qemu-devel
Cc: Alistair Francis, Daniel P . Berrangé, David Abdurachmanov
Le 27/01/2025 à 19:29, Andrea Bolognani a écrit :
> Right now information regarding the family each CPU type belongs
> to is recorded in two places: the large data table at the top of
> the script, and the qemu_host_family() function.
>
> We can make things better by mapping host CPU architecture to
> QEMU target in the few cases where the two don't already match
> and then using the data table to look up the family, same as
> we're already doing for the guest CPU architecture.
>
> Being able to reason in terms of QEMU target regardless of
> whether we're looking at the host or guest CPU architecture will
> come in handy to implement upcoming changes.
>
> A couple of entries are dropped in the process: BePC and Power
> Macintosh. I'm quite certain neither of those have ever been
> reported as CPU architectures by Linux. I believe many more of
> the entries that are carried forward could be dropped as well,
> but I don't have the same level of confidence there so I
> decided to play it safe just in case.
>
> Signed-off-by: Andrea Bolognani <abologna@redhat.com>
> ---
> scripts/qemu-binfmt-conf.sh | 44 +++++++++++++++++++++----------------
> 1 file changed, 25 insertions(+), 19 deletions(-)
>
> diff --git a/scripts/qemu-binfmt-conf.sh b/scripts/qemu-binfmt-conf.sh
> index 426f075e31..8d9136a29f 100755
> --- a/scripts/qemu-binfmt-conf.sh
> +++ b/scripts/qemu-binfmt-conf.sh
> @@ -144,35 +144,35 @@ loongarch64_magic='\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x
> loongarch64_mask='\xff\xff\xff\xff\xff\xff\xff\xfc\x00\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff'
> loongarch64_family=loongarch
>
> -qemu_get_family() {
> - cpu=${HOST_ARCH:-$(uname -m)}
> +# Converts the name of a host CPU architecture to the corresponding QEMU
> +# target.
> +#
> +# FIXME: This can probably be simplified a lot by dropping most entries.
> +# Remember that the script is only used on Linux, so we only need to
> +# handle the strings Linux uses to report the host CPU architecture.
> +qemu_normalize() {
> + cpu="$1"
> case "$cpu" in
> - amd64|i386|i486|i586|i686|i86pc|BePC|x86_64)
> + i[3-6]86)
> echo "i386"
> ;;
> - mips*)
> - echo "mips"
> + amd64)
> + echo "x86_64"
> ;;
> - "Power Macintosh"|ppc64|powerpc|ppc)
I don't know why we have "Power Macintosh" as a valid value for "uname -m".
I think it's a good idea to remove it.
It's here from the beginning
08785f48b73c ("updated so that PPC/ARM/SPARC executables are automatically launched when invoked")
Perhaps it's a value coming from the OpenFirmware or MkLinux.
> + powerpc)
> echo "ppc"
> ;;
> - ppc64el|ppc64le)
> - echo "ppcle"
> + ppc64el)
> + echo "ppc64le"
> ;;
> - arm|armel|armhf|arm64|armv[4-9]*l|aarch64)
> + armel|armhf|armv[4-9]*l)
> echo "arm"
> ;;
> - armeb|armv[4-9]*b|aarch64_be)
> + armv[4-9]*b)
> echo "armeb"
> ;;
> - sparc*)
> - echo "sparc"
> - ;;
> - riscv*)
> - echo "riscv"
> - ;;
> - loongarch*)
> - echo "loongarch"
> + arm64)
> + echo "aarch64"
> ;;
> *)
> echo "$cpu"
> @@ -309,7 +309,13 @@ EOF
>
> qemu_set_binfmts() {
> # probe cpu type
> - host_family=$(qemu_get_family)
> + host_cpu=$(qemu_normalize ${HOST_ARCH:-$(uname -m)})
> + host_family=$(eval echo \$${host_cpu}_family)
> +
> + if [ "$host_family" = "" ] ; then
> + echo "INTERNAL ERROR: unknown host cpu $host_cpu" 1>&2
> + exit 1
> + fi
>
> # register the interpreter for each cpu except for the native one
>
Reviewed-by: Laurent Vivier <laurent@vivier.eu>
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v2 2/3] binfmt: Normalize host CPU architecture
2025-01-27 18:29 ` [PATCH v2 2/3] binfmt: Normalize host CPU architecture Andrea Bolognani
2025-02-20 11:05 ` Laurent Vivier
@ 2025-02-24 1:39 ` Alistair Francis
2025-02-26 21:09 ` Andrea Bolognani
1 sibling, 1 reply; 13+ messages in thread
From: Alistair Francis @ 2025-02-24 1:39 UTC (permalink / raw)
To: Andrea Bolognani
Cc: qemu-devel, Laurent Vivier, Daniel P . Berrangé,
David Abdurachmanov
On Tue, Jan 28, 2025 at 4:29 AM Andrea Bolognani <abologna@redhat.com> wrote:
>
> Right now information regarding the family each CPU type belongs
> to is recorded in two places: the large data table at the top of
> the script, and the qemu_host_family() function.
>
> We can make things better by mapping host CPU architecture to
> QEMU target in the few cases where the two don't already match
> and then using the data table to look up the family, same as
> we're already doing for the guest CPU architecture.
>
> Being able to reason in terms of QEMU target regardless of
> whether we're looking at the host or guest CPU architecture will
> come in handy to implement upcoming changes.
>
> A couple of entries are dropped in the process: BePC and Power
> Macintosh. I'm quite certain neither of those have ever been
> reported as CPU architectures by Linux. I believe many more of
> the entries that are carried forward could be dropped as well,
> but I don't have the same level of confidence there so I
> decided to play it safe just in case.
>
> Signed-off-by: Andrea Bolognani <abologna@redhat.com>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Alistair
> ---
> scripts/qemu-binfmt-conf.sh | 44 +++++++++++++++++++++----------------
> 1 file changed, 25 insertions(+), 19 deletions(-)
>
> diff --git a/scripts/qemu-binfmt-conf.sh b/scripts/qemu-binfmt-conf.sh
> index 426f075e31..8d9136a29f 100755
> --- a/scripts/qemu-binfmt-conf.sh
> +++ b/scripts/qemu-binfmt-conf.sh
> @@ -144,35 +144,35 @@ loongarch64_magic='\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x
> loongarch64_mask='\xff\xff\xff\xff\xff\xff\xff\xfc\x00\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff'
> loongarch64_family=loongarch
>
> -qemu_get_family() {
> - cpu=${HOST_ARCH:-$(uname -m)}
> +# Converts the name of a host CPU architecture to the corresponding QEMU
> +# target.
> +#
> +# FIXME: This can probably be simplified a lot by dropping most entries.
> +# Remember that the script is only used on Linux, so we only need to
> +# handle the strings Linux uses to report the host CPU architecture.
> +qemu_normalize() {
> + cpu="$1"
> case "$cpu" in
> - amd64|i386|i486|i586|i686|i86pc|BePC|x86_64)
> + i[3-6]86)
> echo "i386"
> ;;
> - mips*)
> - echo "mips"
> + amd64)
> + echo "x86_64"
> ;;
> - "Power Macintosh"|ppc64|powerpc|ppc)
> + powerpc)
> echo "ppc"
> ;;
> - ppc64el|ppc64le)
> - echo "ppcle"
> + ppc64el)
> + echo "ppc64le"
> ;;
> - arm|armel|armhf|arm64|armv[4-9]*l|aarch64)
> + armel|armhf|armv[4-9]*l)
> echo "arm"
> ;;
> - armeb|armv[4-9]*b|aarch64_be)
> + armv[4-9]*b)
> echo "armeb"
> ;;
> - sparc*)
> - echo "sparc"
> - ;;
> - riscv*)
> - echo "riscv"
> - ;;
> - loongarch*)
> - echo "loongarch"
> + arm64)
> + echo "aarch64"
> ;;
> *)
> echo "$cpu"
> @@ -309,7 +309,13 @@ EOF
>
> qemu_set_binfmts() {
> # probe cpu type
> - host_family=$(qemu_get_family)
> + host_cpu=$(qemu_normalize ${HOST_ARCH:-$(uname -m)})
> + host_family=$(eval echo \$${host_cpu}_family)
> +
> + if [ "$host_family" = "" ] ; then
> + echo "INTERNAL ERROR: unknown host cpu $host_cpu" 1>&2
> + exit 1
> + fi
>
> # register the interpreter for each cpu except for the native one
>
> --
> 2.48.1
>
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v2 2/3] binfmt: Normalize host CPU architecture
2025-02-24 1:39 ` Alistair Francis
@ 2025-02-26 21:09 ` Andrea Bolognani
0 siblings, 0 replies; 13+ messages in thread
From: Andrea Bolognani @ 2025-02-26 21:09 UTC (permalink / raw)
To: Alistair Francis
Cc: qemu-devel, Laurent Vivier, Daniel P . Berrangé,
David Abdurachmanov
On Mon, Feb 24, 2025 at 11:39:46AM +1000, Alistair Francis wrote:
> On Tue, Jan 28, 2025 at 4:29 AM Andrea Bolognani <abologna@redhat.com> wrote:
> > Right now information regarding the family each CPU type belongs
> > to is recorded in two places: the large data table at the top of
> > the script, and the qemu_host_family() function.
> >
> > We can make things better by mapping host CPU architecture to
> > QEMU target in the few cases where the two don't already match
> > and then using the data table to look up the family, same as
> > we're already doing for the guest CPU architecture.
> >
> > Being able to reason in terms of QEMU target regardless of
> > whether we're looking at the host or guest CPU architecture will
> > come in handy to implement upcoming changes.
> >
> > A couple of entries are dropped in the process: BePC and Power
> > Macintosh. I'm quite certain neither of those have ever been
> > reported as CPU architectures by Linux. I believe many more of
> > the entries that are carried forward could be dropped as well,
> > but I don't have the same level of confidence there so I
> > decided to play it safe just in case.
> >
> > Signed-off-by: Andrea Bolognani <abologna@redhat.com>
>
> Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Thanks Alistair. Are you planning to review patch 3/3 as well?
--
Andrea Bolognani / Red Hat / Virtualization
^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH v2 3/3] binfmt: Add --ignore-family option
2025-01-27 18:29 [PATCH v2 0/3] binfmt: Add --ignore-family option Andrea Bolognani
2025-01-27 18:29 ` [PATCH v2 1/3] binfmt: Shuffle things around Andrea Bolognani
2025-01-27 18:29 ` [PATCH v2 2/3] binfmt: Normalize host CPU architecture Andrea Bolognani
@ 2025-01-27 18:29 ` Andrea Bolognani
2025-02-20 11:06 ` Laurent Vivier
2025-02-28 4:24 ` Alistair Francis
2025-02-11 15:59 ` [PATCH v2 0/3] " Andrea Bolognani
2025-02-28 4:33 ` Alistair Francis
4 siblings, 2 replies; 13+ messages in thread
From: Andrea Bolognani @ 2025-01-27 18:29 UTC (permalink / raw)
To: qemu-devel
Cc: Alistair Francis, Laurent Vivier, Daniel P . Berrangé,
David Abdurachmanov
Until now, the script has worked under the assumption that a
host CPU can run binaries targeting any CPU in the same family.
That's a fair enough assumption when it comes to running i386
binaries on x86_64, but it doesn't quite apply in the general
case.
For example, while riscv64 CPUs could theoretically run riscv32
applications natively, in practice there exist few (if any?)
CPUs that implement the necessary silicon; moreover, even if you
had one such CPU, your host OS would most likely not have
enabled the necessary kernel bits.
This new option gives distro packagers the ability to opt out of
the assumption, likely on a per-architecture basis, and make
things work out of the box for a larger fraction of their user
base.
As an interesting side effect, this makes it possible to enable
execution of 64-bit binaries on 32-bit CPUs of the same family,
which is a perfectly valid use case that apparently hadn't been
considered until now.
Link: https://src.fedoraproject.org/rpms/qemu/pull-request/72
Thanks: David Abdurachmanov <davidlt@rivosinc.com>
Thanks: Daniel P. Berrangé <berrange@redhat.com>
Signed-off-by: Andrea Bolognani <abologna@redhat.com>
---
scripts/qemu-binfmt-conf.sh | 19 ++++++++++++++++---
1 file changed, 16 insertions(+), 3 deletions(-)
diff --git a/scripts/qemu-binfmt-conf.sh b/scripts/qemu-binfmt-conf.sh
index 8d9136a29f..5fd462b1d1 100755
--- a/scripts/qemu-binfmt-conf.sh
+++ b/scripts/qemu-binfmt-conf.sh
@@ -205,6 +205,9 @@ Usage: qemu-binfmt-conf.sh [--qemu-path PATH][--debian][--systemd CPU]
--persistent: if yes, the interpreter is loaded when binfmt is
configured and remains in memory. All future uses
are cloned from the open file.
+ --ignore-family: if yes, it is assumed that the host CPU (e.g. riscv64)
+ can't natively run programs targeting a CPU that is
+ part of the same family (e.g. riscv32).
--preserve-argv0 preserve argv[0]
To import templates with update-binfmts, use :
@@ -337,7 +340,12 @@ qemu_set_binfmts() {
fi
if [ "$host_family" = "$family" ] ; then
- continue
+ # When --ignore-family is used, we have to generate rules even
+ # for targets that are in the same family as the host CPU. The
+ # only exception is of course when the CPU types exactly match
+ if [ "$target" = "$host_cpu" ] || [ "$IGNORE_FAMILY" = "no" ] ; then
+ continue
+ fi
fi
$BINFMT_SET
@@ -355,10 +363,11 @@ CREDENTIAL=no
PERSISTENT=no
PRESERVE_ARG0=no
QEMU_SUFFIX=""
+IGNORE_FAMILY=no
_longopts="debian,systemd:,qemu-path:,qemu-suffix:,exportdir:,help,credential:,\
-persistent:,preserve-argv0:"
-options=$(getopt -o ds:Q:S:e:hc:p:g:F: -l ${_longopts} -- "$@")
+persistent:,preserve-argv0:,ignore-family:"
+options=$(getopt -o ds:Q:S:e:hc:p:g:F:i: -l ${_longopts} -- "$@")
eval set -- "$options"
while true ; do
@@ -418,6 +427,10 @@ while true ; do
shift
PRESERVE_ARG0="$1"
;;
+ -i|--ignore-family)
+ shift
+ IGNORE_FAMILY="$1"
+ ;;
*)
break
;;
--
2.48.1
^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [PATCH v2 3/3] binfmt: Add --ignore-family option
2025-01-27 18:29 ` [PATCH v2 3/3] binfmt: Add --ignore-family option Andrea Bolognani
@ 2025-02-20 11:06 ` Laurent Vivier
2025-02-28 4:24 ` Alistair Francis
1 sibling, 0 replies; 13+ messages in thread
From: Laurent Vivier @ 2025-02-20 11:06 UTC (permalink / raw)
To: Andrea Bolognani, qemu-devel
Cc: Alistair Francis, Daniel P . Berrangé, David Abdurachmanov
Le 27/01/2025 à 19:29, Andrea Bolognani a écrit :
> Until now, the script has worked under the assumption that a
> host CPU can run binaries targeting any CPU in the same family.
> That's a fair enough assumption when it comes to running i386
> binaries on x86_64, but it doesn't quite apply in the general
> case.
>
> For example, while riscv64 CPUs could theoretically run riscv32
> applications natively, in practice there exist few (if any?)
> CPUs that implement the necessary silicon; moreover, even if you
> had one such CPU, your host OS would most likely not have
> enabled the necessary kernel bits.
>
> This new option gives distro packagers the ability to opt out of
> the assumption, likely on a per-architecture basis, and make
> things work out of the box for a larger fraction of their user
> base.
>
> As an interesting side effect, this makes it possible to enable
> execution of 64-bit binaries on 32-bit CPUs of the same family,
> which is a perfectly valid use case that apparently hadn't been
> considered until now.
>
> Link: https://src.fedoraproject.org/rpms/qemu/pull-request/72
> Thanks: David Abdurachmanov <davidlt@rivosinc.com>
> Thanks: Daniel P. Berrangé <berrange@redhat.com>
> Signed-off-by: Andrea Bolognani <abologna@redhat.com>
> ---
> scripts/qemu-binfmt-conf.sh | 19 ++++++++++++++++---
> 1 file changed, 16 insertions(+), 3 deletions(-)
>
> diff --git a/scripts/qemu-binfmt-conf.sh b/scripts/qemu-binfmt-conf.sh
> index 8d9136a29f..5fd462b1d1 100755
> --- a/scripts/qemu-binfmt-conf.sh
> +++ b/scripts/qemu-binfmt-conf.sh
> @@ -205,6 +205,9 @@ Usage: qemu-binfmt-conf.sh [--qemu-path PATH][--debian][--systemd CPU]
> --persistent: if yes, the interpreter is loaded when binfmt is
> configured and remains in memory. All future uses
> are cloned from the open file.
> + --ignore-family: if yes, it is assumed that the host CPU (e.g. riscv64)
> + can't natively run programs targeting a CPU that is
> + part of the same family (e.g. riscv32).
> --preserve-argv0 preserve argv[0]
>
> To import templates with update-binfmts, use :
> @@ -337,7 +340,12 @@ qemu_set_binfmts() {
> fi
>
> if [ "$host_family" = "$family" ] ; then
> - continue
> + # When --ignore-family is used, we have to generate rules even
> + # for targets that are in the same family as the host CPU. The
> + # only exception is of course when the CPU types exactly match
> + if [ "$target" = "$host_cpu" ] || [ "$IGNORE_FAMILY" = "no" ] ; then
> + continue
> + fi
> fi
>
> $BINFMT_SET
> @@ -355,10 +363,11 @@ CREDENTIAL=no
> PERSISTENT=no
> PRESERVE_ARG0=no
> QEMU_SUFFIX=""
> +IGNORE_FAMILY=no
>
> _longopts="debian,systemd:,qemu-path:,qemu-suffix:,exportdir:,help,credential:,\
> -persistent:,preserve-argv0:"
> -options=$(getopt -o ds:Q:S:e:hc:p:g:F: -l ${_longopts} -- "$@")
> +persistent:,preserve-argv0:,ignore-family:"
> +options=$(getopt -o ds:Q:S:e:hc:p:g:F:i: -l ${_longopts} -- "$@")
> eval set -- "$options"
>
> while true ; do
> @@ -418,6 +427,10 @@ while true ; do
> shift
> PRESERVE_ARG0="$1"
> ;;
> + -i|--ignore-family)
> + shift
> + IGNORE_FAMILY="$1"
> + ;;
> *)
> break
> ;;
Reviewed-by: Laurent Vivier <laurent@vivier.eu>
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v2 3/3] binfmt: Add --ignore-family option
2025-01-27 18:29 ` [PATCH v2 3/3] binfmt: Add --ignore-family option Andrea Bolognani
2025-02-20 11:06 ` Laurent Vivier
@ 2025-02-28 4:24 ` Alistair Francis
1 sibling, 0 replies; 13+ messages in thread
From: Alistair Francis @ 2025-02-28 4:24 UTC (permalink / raw)
To: Andrea Bolognani
Cc: qemu-devel, Laurent Vivier, Daniel P . Berrangé,
David Abdurachmanov
On Tue, Jan 28, 2025 at 4:29 AM Andrea Bolognani <abologna@redhat.com> wrote:
>
> Until now, the script has worked under the assumption that a
> host CPU can run binaries targeting any CPU in the same family.
> That's a fair enough assumption when it comes to running i386
> binaries on x86_64, but it doesn't quite apply in the general
> case.
>
> For example, while riscv64 CPUs could theoretically run riscv32
> applications natively, in practice there exist few (if any?)
> CPUs that implement the necessary silicon; moreover, even if you
> had one such CPU, your host OS would most likely not have
> enabled the necessary kernel bits.
>
> This new option gives distro packagers the ability to opt out of
> the assumption, likely on a per-architecture basis, and make
> things work out of the box for a larger fraction of their user
> base.
>
> As an interesting side effect, this makes it possible to enable
> execution of 64-bit binaries on 32-bit CPUs of the same family,
> which is a perfectly valid use case that apparently hadn't been
> considered until now.
>
> Link: https://src.fedoraproject.org/rpms/qemu/pull-request/72
> Thanks: David Abdurachmanov <davidlt@rivosinc.com>
> Thanks: Daniel P. Berrangé <berrange@redhat.com>
> Signed-off-by: Andrea Bolognani <abologna@redhat.com>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Alistair
> ---
> scripts/qemu-binfmt-conf.sh | 19 ++++++++++++++++---
> 1 file changed, 16 insertions(+), 3 deletions(-)
>
> diff --git a/scripts/qemu-binfmt-conf.sh b/scripts/qemu-binfmt-conf.sh
> index 8d9136a29f..5fd462b1d1 100755
> --- a/scripts/qemu-binfmt-conf.sh
> +++ b/scripts/qemu-binfmt-conf.sh
> @@ -205,6 +205,9 @@ Usage: qemu-binfmt-conf.sh [--qemu-path PATH][--debian][--systemd CPU]
> --persistent: if yes, the interpreter is loaded when binfmt is
> configured and remains in memory. All future uses
> are cloned from the open file.
> + --ignore-family: if yes, it is assumed that the host CPU (e.g. riscv64)
> + can't natively run programs targeting a CPU that is
> + part of the same family (e.g. riscv32).
> --preserve-argv0 preserve argv[0]
>
> To import templates with update-binfmts, use :
> @@ -337,7 +340,12 @@ qemu_set_binfmts() {
> fi
>
> if [ "$host_family" = "$family" ] ; then
> - continue
> + # When --ignore-family is used, we have to generate rules even
> + # for targets that are in the same family as the host CPU. The
> + # only exception is of course when the CPU types exactly match
> + if [ "$target" = "$host_cpu" ] || [ "$IGNORE_FAMILY" = "no" ] ; then
> + continue
> + fi
> fi
>
> $BINFMT_SET
> @@ -355,10 +363,11 @@ CREDENTIAL=no
> PERSISTENT=no
> PRESERVE_ARG0=no
> QEMU_SUFFIX=""
> +IGNORE_FAMILY=no
>
> _longopts="debian,systemd:,qemu-path:,qemu-suffix:,exportdir:,help,credential:,\
> -persistent:,preserve-argv0:"
> -options=$(getopt -o ds:Q:S:e:hc:p:g:F: -l ${_longopts} -- "$@")
> +persistent:,preserve-argv0:,ignore-family:"
> +options=$(getopt -o ds:Q:S:e:hc:p:g:F:i: -l ${_longopts} -- "$@")
> eval set -- "$options"
>
> while true ; do
> @@ -418,6 +427,10 @@ while true ; do
> shift
> PRESERVE_ARG0="$1"
> ;;
> + -i|--ignore-family)
> + shift
> + IGNORE_FAMILY="$1"
> + ;;
> *)
> break
> ;;
> --
> 2.48.1
>
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v2 0/3] binfmt: Add --ignore-family option
2025-01-27 18:29 [PATCH v2 0/3] binfmt: Add --ignore-family option Andrea Bolognani
` (2 preceding siblings ...)
2025-01-27 18:29 ` [PATCH v2 3/3] binfmt: Add --ignore-family option Andrea Bolognani
@ 2025-02-11 15:59 ` Andrea Bolognani
2025-02-28 4:33 ` Alistair Francis
4 siblings, 0 replies; 13+ messages in thread
From: Andrea Bolognani @ 2025-02-11 15:59 UTC (permalink / raw)
To: qemu-devel
Cc: Alistair Francis, Laurent Vivier, Daniel P . Berrangé,
David Abdurachmanov
On Mon, Jan 27, 2025 at 07:29:21PM +0100, Andrea Bolognani wrote:
> Changes from [v1]:
>
> * adopt a completely different, more general approach.
>
> [v1] https://mail.gnu.org/archive/html/qemu-devel/2024-12/msg00459.html
>
> Andrea Bolognani (3):
> binfmt: Shuffle things around
> binfmt: Normalize host CPU architecture
> binfmt: Add --ignore-family option
>
> scripts/qemu-binfmt-conf.sh | 78 ++++++++++++++++++++++++-------------
> 1 file changed, 50 insertions(+), 28 deletions(-)
ping
--
Andrea Bolognani / Red Hat / Virtualization
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v2 0/3] binfmt: Add --ignore-family option
2025-01-27 18:29 [PATCH v2 0/3] binfmt: Add --ignore-family option Andrea Bolognani
` (3 preceding siblings ...)
2025-02-11 15:59 ` [PATCH v2 0/3] " Andrea Bolognani
@ 2025-02-28 4:33 ` Alistair Francis
4 siblings, 0 replies; 13+ messages in thread
From: Alistair Francis @ 2025-02-28 4:33 UTC (permalink / raw)
To: Andrea Bolognani
Cc: qemu-devel, Laurent Vivier, Daniel P . Berrangé,
David Abdurachmanov
On Tue, Jan 28, 2025 at 4:29 AM Andrea Bolognani <abologna@redhat.com> wrote:
>
> Changes from [v1]:
>
> * adopt a completely different, more general approach.
>
> [v1] https://mail.gnu.org/archive/html/qemu-devel/2024-12/msg00459.html
>
> Andrea Bolognani (3):
> binfmt: Shuffle things around
> binfmt: Normalize host CPU architecture
> binfmt: Add --ignore-family option
Thanks!
Applied to riscv-to-apply.next
Alistair
>
> scripts/qemu-binfmt-conf.sh | 78 ++++++++++++++++++++++++-------------
> 1 file changed, 50 insertions(+), 28 deletions(-)
>
> --
> 2.48.1
>
^ permalink raw reply [flat|nested] 13+ messages in thread