SHA256
1
0
forked from pool/qemu

Accepting request 1008185 from home:dfaggioli:devel:Virtualization

- The old qemu-binfmt weappers around the various qemu-$ARCH Linux
  user emulation binaries (see, e.g., bsc#1186256) are not necessary
  any longer, and bsc#1143725 can now be considered fixed.
* Patches dropped:
  linux-user-add-binfmt-wrapper-for-argv-0.patch
  linux-user-binfmt-support-host-binaries.patch

OBS-URL: https://build.opensuse.org/request/show/1008185
OBS-URL: https://build.opensuse.org/package/show/Virtualization/qemu?expand=0&rev=736
This commit is contained in:
Dario Faggioli 2022-10-05 11:19:47 +00:00 committed by Git OBS Bridge
parent d4b795b3fc
commit a815c92a45
8 changed files with 41 additions and 260 deletions

View File

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:16313b28799b38f8a397b8c3886445780eaff2dc86234f366d8ee5fdfcdb5046
size 44932
oid sha256:04241a8192981377e1baa044d408dd6f38295f292af74a34a247d14f2aa1845f
size 42692

View File

@ -1,99 +0,0 @@
From: Alexander Graf <agraf@suse.de>
Date: Fri, 30 Sep 2011 19:40:36 +0200
Subject: linux-user: add binfmt wrapper for argv[0] handling
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
When using qemu's linux-user binaries through binfmt, argv[0] gets lost
along the execution because qemu only gets passed in the full file name
to the executable while argv[0] can be something completely different.
This breaks in some subtile situations, such as the grep and make test
suites.
This patch adds a wrapper binary called qemu-$TARGET-binfmt that can be
used with binfmt's P flag which passes the full path _and_ argv[0] to
the binfmt handler.
The binary would be smart enough to be versatile and only exist in the
system once, creating the qemu binary path names from its own argv[0].
However, this seemed like it didn't fit the make system too well, so
we're currently creating a new binary for each target archictecture.
CC: Reinhard Max <max@suse.de>
Signed-off-by: Alexander Graf <agraf@suse.de>
[AF: Rebased onto new Makefile infrastructure, twice]
[AF: Updated for aarch64 for v2.0.0-rc1]
[AF: Rebased onto Makefile changes for v2.1.0-rc0]
[AF: Rebased onto script rewrite for v2.7.0-rc2 - to be fixed]
Signed-off-by: Andreas Färber <afaerber@suse.de>
---
linux-user/binfmt.c | 42 ++++++++++++++++++++++++++++++++++++++++++
meson.build | 5 +++++
2 files changed, 47 insertions(+)
diff --git a/linux-user/binfmt.c b/linux-user/binfmt.c
new file mode 100644
index 0000000000000000000000000000000000000000..cd1f513b334f3b263d9e4b5adb1981e376429fa6
--- /dev/null
+++ b/linux-user/binfmt.c
@@ -0,0 +1,42 @@
+#include <stdio.h>
+#include <stdarg.h>
+#include <unistd.h>
+#include <libgen.h>
+#include <string.h>
+#include <stdlib.h>
+
+
+int main(int argc, char **argv, char **envp)
+{
+ char *binfmt;
+ char **new_argv;
+
+ /*
+ * Check if our file name ends with -binfmt
+ */
+ binfmt = argv[0] + strlen(argv[0]) - strlen("-binfmt");
+ if (strcmp(binfmt, "-binfmt")) {
+ fprintf(stderr, "%s: Invalid executable name\n", argv[0]);
+ exit(1);
+ }
+ if (argc < 3) {
+ fprintf(stderr, "%s: Please use me through binfmt with P flag\n",
+ argv[0]);
+ exit(1);
+ }
+
+ binfmt[0] = '\0';
+ /* Now argv[0] is the real qemu binary name */
+
+ new_argv = (char **)malloc((argc + 2) * sizeof(*new_argv));
+ if (argc > 3) {
+ memcpy(&new_argv[4], &argv[3], (argc - 3) * sizeof(*new_argv));
+ }
+ new_argv[0] = argv[0];
+ new_argv[1] = (char *)"-0";
+ new_argv[2] = argv[2];
+ new_argv[3] = argv[1];
+ new_argv[argc + 1] = NULL;
+
+ return execve(new_argv[0], new_argv, envp);
+}
diff --git a/meson.build b/meson.build
index 20fddbd707c91c1baee604202fb1..ce227b6c25e3c71f16416f0a8f25 100644
--- a/meson.build
+++ b/meson.build
@@ -3585,6 +3585,11 @@ endforeach
# Other build targets
+if 'CONFIG_LINUX_USER' in config_target
+ executable('qemu-binfmt', files('linux-user/binfmt.c'),
+ install: true)
+endif
+
if 'CONFIG_PLUGIN' in config_host
install_headers('include/qemu/qemu-plugin.h')
endif

View File

@ -1,56 +0,0 @@
From: Alexander Graf <agraf@suse.de>
Date: Thu, 2 Feb 2012 18:02:33 +0100
Subject: linux-user: binfmt: support host binaries
When we have a working host binary equivalent for the guest binary we're
trying to run, let's just use that instead as it will be a lot faster.
Signed-off-by: Alexander Graf <agraf@suse.de>
---
linux-user/binfmt.c | 26 ++++++++++++++++++++++++++
1 file changed, 26 insertions(+)
diff --git a/linux-user/binfmt.c b/linux-user/binfmt.c
index cd1f513b334f3b263d9e4b5adb19..458f136fb41727702854cae4e542 100644
--- a/linux-user/binfmt.c
+++ b/linux-user/binfmt.c
@@ -5,6 +5,9 @@
#include <string.h>
#include <stdlib.h>
+#ifdef __x86_64__
+#define ARCH_NAME "x86_64"
+#endif
int main(int argc, char **argv, char **envp)
{
@@ -28,6 +31,29 @@ int main(int argc, char **argv, char **envp)
binfmt[0] = '\0';
/* Now argv[0] is the real qemu binary name */
+#ifdef ARCH_NAME
+ {
+ char *hostbin;
+ char *guestarch;
+ int r;
+
+ guestarch = strrchr(argv[0], '-') ;
+ if (!guestarch) {
+ goto skip;
+ }
+ guestarch++;
+ r = asprintf(&hostbin, "/emul/" ARCH_NAME "-for-%s/%s", guestarch, argv[1]);
+ if ((r > 0) && !access(hostbin, X_OK)) {
+ /*
+ * We found a host binary replacement for the non-host binary. Let's
+ * use that instead!
+ */
+ return execve(hostbin, &argv[2], envp);
+ }
+ }
+skip:
+#endif
+
new_argv = (char **)malloc((argc + 2) * sizeof(*new_argv));
if (argc > 3) {
memcpy(&new_argv[4], &argv[3], (argc - 3) * sizeof(*new_argv));

View File

@ -38,7 +38,7 @@ Signed-off-by: Dario Faggioli <dfaggioli@suse.com>
1 file changed, 12 insertions(+)
diff --git a/meson.build b/meson.build
index 09145d35aa3e684e92da7895ac67..a923eedefd56bc1401a111d6d8f7 100644
index 41f693a822a7ec58085bb53a8518..6641e86c0107906bb07d6b35d54a 100644
--- a/meson.build
+++ b/meson.build
@@ -248,6 +248,18 @@ if targetos == 'linux'

View File

@ -21,7 +21,7 @@ Signed-off-by: Dario Faggioli <dfaggioli@suse.com>
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/meson.build b/meson.build
index ce227b6c25e3c71f16416f0a8f25..09145d35aa3e684e92da7895ac67 100644
index 20fddbd707c91c1baee604202fb1..41f693a822a7ec58085bb53a8518 100644
--- a/meson.build
+++ b/meson.build
@@ -1736,7 +1736,7 @@ config_host_data.set_quoted('CONFIG_SYSCONFDIR', get_option('prefix') / get_opti

View File

@ -1,3 +1,13 @@
-------------------------------------------------------------------
Tue Oct 4 13:49:43 UTC 2022 - Dario Faggioli <dfaggioli@suse.com>
- The old qemu-binfmt weappers around the various qemu-$ARCH Linux
user emulation binaries (see, e.g., bsc#1186256) are not necessary
any longer, and bsc#1143725 can now be considered fixed.
* Patches dropped:
linux-user-add-binfmt-wrapper-for-argv-0.patch
linux-user-binfmt-support-host-binaries.patch
-------------------------------------------------------------------
Tue Oct 4 11:49:53 UTC 2022 - Dario Faggioli <dfaggioli@suse.com>

View File

@ -165,35 +165,33 @@ Patch00002: roms-Makefile-add-cross-file-to-qboot-me.patch
Patch00003: hw-smbios-handle-both-file-formats-regar.patch
Patch00004: Revert-roms-efirom-tests-uefi-test-tools.patch
Patch00005: qemu-binfmt-conf-Modify-default-path.patch
Patch00006: linux-user-add-binfmt-wrapper-for-argv-0.patch
Patch00007: linux-user-binfmt-support-host-binaries.patch
Patch00008: linux-user-Fake-proc-cpuinfo.patch
Patch00009: linux-user-use-target_ulong.patch
Patch00010: linux-user-lseek-explicitly-cast-non-set.patch
Patch00011: PPC-KVM-Disable-mmu-notifier-check.patch
Patch00012: Make-char-muxer-more-robust-wrt-small-FI.patch
Patch00013: qemu-bridge-helper-reduce-security-profi.patch
Patch00014: Raise-soft-address-space-limit-to-hard-l.patch
Patch00015: increase-x86_64-physical-bits-to-42.patch
Patch00016: xen_disk-Add-suse-specific-flush-disable.patch
Patch00017: xen-add-block-resize-support-for-xen-dis.patch
Patch00018: xen-ignore-live-parameter-from-xen-save-.patch
Patch00019: scsi-generic-replace-logical-block-count.patch
Patch00020: hw-scsi-megasas-check-for-NULL-frame-in-.patch
Patch00021: scsi-generic-check-for-additional-SG_IO-.patch
Patch00022: Revert-tests-qtest-enable-more-vhost-use.patch
Patch00023: tests-change-error-message-in-test-162.patch
Patch00024: tests-qemu-iotests-Triple-timeout-of-i-o.patch
Patch00025: Disable-some-tests-that-have-problems-in.patch
Patch00026: Make-installed-scripts-explicitly-python.patch
Patch00027: meson-install-ivshmem-client-and-ivshmem.patch
Patch00028: meson-remove-pkgversion-from-CONFIG_STAM.patch
Patch00029: linux-user-use-max-as-default-CPU-model-.patch
Patch00030: net-tulip-Restrict-DMA-engine-to-memorie.patch
Patch00031: linux-user-add-more-compat-ioctl-definit.patch
Patch00032: linux-user-remove-conditionals-for-many-.patch
Patch00033: meson-enforce-a-minimum-Linux-kernel-hea.patch
Patch00034: linux-user-drop-conditionals-for-obsolet.patch
Patch00006: linux-user-Fake-proc-cpuinfo.patch
Patch00007: linux-user-use-target_ulong.patch
Patch00008: linux-user-lseek-explicitly-cast-non-set.patch
Patch00009: PPC-KVM-Disable-mmu-notifier-check.patch
Patch00010: Make-char-muxer-more-robust-wrt-small-FI.patch
Patch00011: qemu-bridge-helper-reduce-security-profi.patch
Patch00012: Raise-soft-address-space-limit-to-hard-l.patch
Patch00013: increase-x86_64-physical-bits-to-42.patch
Patch00014: xen_disk-Add-suse-specific-flush-disable.patch
Patch00015: xen-add-block-resize-support-for-xen-dis.patch
Patch00016: xen-ignore-live-parameter-from-xen-save-.patch
Patch00017: scsi-generic-replace-logical-block-count.patch
Patch00018: hw-scsi-megasas-check-for-NULL-frame-in-.patch
Patch00019: scsi-generic-check-for-additional-SG_IO-.patch
Patch00020: Revert-tests-qtest-enable-more-vhost-use.patch
Patch00021: tests-change-error-message-in-test-162.patch
Patch00022: tests-qemu-iotests-Triple-timeout-of-i-o.patch
Patch00023: Disable-some-tests-that-have-problems-in.patch
Patch00024: Make-installed-scripts-explicitly-python.patch
Patch00025: meson-install-ivshmem-client-and-ivshmem.patch
Patch00026: meson-remove-pkgversion-from-CONFIG_STAM.patch
Patch00027: linux-user-use-max-as-default-CPU-model-.patch
Patch00028: net-tulip-Restrict-DMA-engine-to-memorie.patch
Patch00029: linux-user-add-more-compat-ioctl-definit.patch
Patch00030: linux-user-remove-conditionals-for-many-.patch
Patch00031: meson-enforce-a-minimum-Linux-kernel-hea.patch
Patch00032: linux-user-drop-conditionals-for-obsolet.patch
# Patches applied in roms/seabios/:
Patch01000: seabios-switch-to-python3-as-needed.patch
Patch01001: enable-cross-compilation-on-ARM.patch
@ -467,8 +465,6 @@ syscall layer occurs on the native hardware and operating system.
%_bindir/qemu-x86_64
%_bindir/qemu-xtensa
%_bindir/qemu-xtensaeb
%_bindir/qemu-binfmt
%_bindir/qemu-*-binfmt
%_sbindir/qemu-binfmt-conf.sh
# End of description and files for qemu-linux-user
@ -2186,40 +2182,6 @@ rm -rf %{buildroot}%_datadir/qemu/keymaps
unlink %{buildroot}%_datadir/qemu/trace-events-all
install -d -m 755 %{buildroot}%_sbindir
install -m 755 scripts/qemu-binfmt-conf.sh %{buildroot}%_sbindir
ln -s qemu-binfmt %{buildroot}%_bindir/qemu-aarch64-binfmt
ln -s qemu-binfmt %{buildroot}%_bindir/qemu-aarch64_be-binfmt
ln -s qemu-binfmt %{buildroot}%_bindir/qemu-alpha-binfmt
ln -s qemu-binfmt %{buildroot}%_bindir/qemu-arm-binfmt
ln -s qemu-binfmt %{buildroot}%_bindir/qemu-armeb-binfmt
ln -s qemu-binfmt %{buildroot}%_bindir/qemu-cris-binfmt
ln -s qemu-binfmt %{buildroot}%_bindir/qemu-hexagon-binfmt
ln -s qemu-binfmt %{buildroot}%_bindir/qemu-hppa-binfmt
ln -s qemu-binfmt %{buildroot}%_bindir/qemu-i386-binfmt
ln -s qemu-binfmt %{buildroot}%_bindir/qemu-m68k-binfmt
ln -s qemu-binfmt %{buildroot}%_bindir/qemu-microblaze-binfmt
ln -s qemu-binfmt %{buildroot}%_bindir/qemu-microblazeel-binfmt
ln -s qemu-binfmt %{buildroot}%_bindir/qemu-mips-binfmt
ln -s qemu-binfmt %{buildroot}%_bindir/qemu-mips64-binfmt
ln -s qemu-binfmt %{buildroot}%_bindir/qemu-mips64el-binfmt
ln -s qemu-binfmt %{buildroot}%_bindir/qemu-mipsel-binfmt
ln -s qemu-binfmt %{buildroot}%_bindir/qemu-mipsn32-binfmt
ln -s qemu-binfmt %{buildroot}%_bindir/qemu-mipsn32el-binfmt
ln -s qemu-binfmt %{buildroot}%_bindir/qemu-nios2-binfmt
ln -s qemu-binfmt %{buildroot}%_bindir/qemu-or1k-binfmt
ln -s qemu-binfmt %{buildroot}%_bindir/qemu-ppc-binfmt
ln -s qemu-binfmt %{buildroot}%_bindir/qemu-ppc64-binfmt
ln -s qemu-binfmt %{buildroot}%_bindir/qemu-ppc64le-binfmt
ln -s qemu-binfmt %{buildroot}%_bindir/qemu-riscv32-binfmt
ln -s qemu-binfmt %{buildroot}%_bindir/qemu-riscv64-binfmt
ln -s qemu-binfmt %{buildroot}%_bindir/qemu-s390x-binfmt
ln -s qemu-binfmt %{buildroot}%_bindir/qemu-sh4-binfmt
ln -s qemu-binfmt %{buildroot}%_bindir/qemu-sh4eb-binfmt
ln -s qemu-binfmt %{buildroot}%_bindir/qemu-sparc-binfmt
ln -s qemu-binfmt %{buildroot}%_bindir/qemu-sparc32plus-binfmt
ln -s qemu-binfmt %{buildroot}%_bindir/qemu-sparc64-binfmt
ln -s qemu-binfmt %{buildroot}%_bindir/qemu-x86_64-binfmt
ln -s qemu-binfmt %{buildroot}%_bindir/qemu-xtensa-binfmt
ln -s qemu-binfmt %{buildroot}%_bindir/qemu-xtensaeb-binfmt
# End of additional installation steps for qemu-linux-user
%else

View File

@ -408,8 +408,6 @@ syscall layer occurs on the native hardware and operating system.
%_bindir/qemu-x86_64
%_bindir/qemu-xtensa
%_bindir/qemu-xtensaeb
%_bindir/qemu-binfmt
%_bindir/qemu-*-binfmt
%_sbindir/qemu-binfmt-conf.sh
# End of description and files for qemu-linux-user
@ -2127,40 +2125,6 @@ rm -rf %{buildroot}%_datadir/qemu/keymaps
unlink %{buildroot}%_datadir/qemu/trace-events-all
install -d -m 755 %{buildroot}%_sbindir
install -m 755 scripts/qemu-binfmt-conf.sh %{buildroot}%_sbindir
ln -s qemu-binfmt %{buildroot}%_bindir/qemu-aarch64-binfmt
ln -s qemu-binfmt %{buildroot}%_bindir/qemu-aarch64_be-binfmt
ln -s qemu-binfmt %{buildroot}%_bindir/qemu-alpha-binfmt
ln -s qemu-binfmt %{buildroot}%_bindir/qemu-arm-binfmt
ln -s qemu-binfmt %{buildroot}%_bindir/qemu-armeb-binfmt
ln -s qemu-binfmt %{buildroot}%_bindir/qemu-cris-binfmt
ln -s qemu-binfmt %{buildroot}%_bindir/qemu-hexagon-binfmt
ln -s qemu-binfmt %{buildroot}%_bindir/qemu-hppa-binfmt
ln -s qemu-binfmt %{buildroot}%_bindir/qemu-i386-binfmt
ln -s qemu-binfmt %{buildroot}%_bindir/qemu-m68k-binfmt
ln -s qemu-binfmt %{buildroot}%_bindir/qemu-microblaze-binfmt
ln -s qemu-binfmt %{buildroot}%_bindir/qemu-microblazeel-binfmt
ln -s qemu-binfmt %{buildroot}%_bindir/qemu-mips-binfmt
ln -s qemu-binfmt %{buildroot}%_bindir/qemu-mips64-binfmt
ln -s qemu-binfmt %{buildroot}%_bindir/qemu-mips64el-binfmt
ln -s qemu-binfmt %{buildroot}%_bindir/qemu-mipsel-binfmt
ln -s qemu-binfmt %{buildroot}%_bindir/qemu-mipsn32-binfmt
ln -s qemu-binfmt %{buildroot}%_bindir/qemu-mipsn32el-binfmt
ln -s qemu-binfmt %{buildroot}%_bindir/qemu-nios2-binfmt
ln -s qemu-binfmt %{buildroot}%_bindir/qemu-or1k-binfmt
ln -s qemu-binfmt %{buildroot}%_bindir/qemu-ppc-binfmt
ln -s qemu-binfmt %{buildroot}%_bindir/qemu-ppc64-binfmt
ln -s qemu-binfmt %{buildroot}%_bindir/qemu-ppc64le-binfmt
ln -s qemu-binfmt %{buildroot}%_bindir/qemu-riscv32-binfmt
ln -s qemu-binfmt %{buildroot}%_bindir/qemu-riscv64-binfmt
ln -s qemu-binfmt %{buildroot}%_bindir/qemu-s390x-binfmt
ln -s qemu-binfmt %{buildroot}%_bindir/qemu-sh4-binfmt
ln -s qemu-binfmt %{buildroot}%_bindir/qemu-sh4eb-binfmt
ln -s qemu-binfmt %{buildroot}%_bindir/qemu-sparc-binfmt
ln -s qemu-binfmt %{buildroot}%_bindir/qemu-sparc32plus-binfmt
ln -s qemu-binfmt %{buildroot}%_bindir/qemu-sparc64-binfmt
ln -s qemu-binfmt %{buildroot}%_bindir/qemu-x86_64-binfmt
ln -s qemu-binfmt %{buildroot}%_bindir/qemu-xtensa-binfmt
ln -s qemu-binfmt %{buildroot}%_bindir/qemu-xtensaeb-binfmt
# End of additional installation steps for qemu-linux-user
%else