0f796dd004
Update to v4.1.0. Also includes other major packaging changes as follows: There is a new package maintenance workflow - see README.PACKAGING for details. The sibling packages qemu-linux-user and qemu-testsuite are now created with the Build Service's MultiBuild feature. This also necessitates combining the qemu-linux-user changelog content back into qemu's. Luckily the delta there is quite small. Note that the qemu spec file is now that much busier, but added section markers should help reduce the confusion. Also qemu is being enabled for RISCV host compatibility, so some changes are related to that as well. OBS-URL: https://build.opensuse.org/request/show/730437 OBS-URL: https://build.opensuse.org/package/show/Virtualization/qemu?expand=0&rev=487
57 lines
1.6 KiB
Diff
57 lines
1.6 KiB
Diff
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));
|