On Tue, Jan 28, 2025 at 4:29 AM Andrea Bolognani <abolo...@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 <davi...@rivosinc.com>
> Thanks: Daniel P. Berrangé <berra...@redhat.com>
> Signed-off-by: Andrea Bolognani <abolo...@redhat.com>

Reviewed-by: Alistair Francis <alistair.fran...@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
>

Reply via email to