| From eac77fbbdfd0b87bc6971eb3dccc1e1ed7596ea3 Mon Sep 17 00:00:00 2001 |
| From: Andrea Bolognani <abologna@redhat.com> |
| Date: Mon, 27 Jan 2025 19:29:23 +0100 |
| Subject: [PATCH 5/8] binfmt: Normalize host CPU architecture |
| |
| 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> |
| Reviewed-by: Laurent Vivier <laurent@vivier.eu> |
| Message-ID: <20250127182924.103510-3-abologna@redhat.com> |
| Signed-off-by: Alistair Francis <alistair.francis@wdc.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 |
| |
| |
| @@ -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 |
| |