LogoopenSUSE Build Service > Projects
Sign Up | Log In

View File 0009-linux-user-binfmt-support-host-bina.patch of Package qemu (Project home:lucidd:branches:Virtualization)

From 9ae09852f058ac34d118cdde08082cbd37f86c2b Mon Sep 17 00:00:00 2001
From: Alexander Graf <agraf@suse.de>
Date: Thu, 2 Feb 2012 18:02:33 +0100
Subject: [PATCH] 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 cd1f513b33..458f136fb4 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));