qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [RFC PATCH] elf loader: exit if incompatible architecture i


From: Alexey Kardashevskiy
Subject: [Qemu-devel] [RFC PATCH] elf loader: exit if incompatible architecture is detected
Date: Tue, 7 Jan 2014 15:35:53 +1100

If we know for sure that the image in "-kernel" is an ELF and we know its
architecture and it is not supported by the current QEMU, there is no
point to continue trying booting this image so let's exit once we deteced
this fact.

Signed-off-by: Alexey Kardashevskiy <address@hidden>
---


One of our users tried an X86 image with qemu-system-ppc64. Instead of
printing some reasonable message (which is possible in this case as the image
is ELF), QEMU (spapr.c) simply copied the image in RAM as a raw image and
SLOF failed to boot from it.

The patch fixes the issue but there are still questions.

1. Do we need more sophisticated error checking here? Return -2 instead of 
exit(1)
and do exit(1) few levels up?

2. The patch does not handle x86's vmlinuz case - these images are not ELFs
but "Linux kernel x86 boot executable bzImage" and QEMU does not parse them.
As a result, SLOF crashes with the registers dump. Do we really care to handle 
this?


---
 include/hw/elf_ops.h | 13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)

diff --git a/include/hw/elf_ops.h b/include/hw/elf_ops.h
index acc701e..6bcc61f 100644
--- a/include/hw/elf_ops.h
+++ b/include/hw/elf_ops.h
@@ -212,21 +212,21 @@ static int glue(load_elf, SZ)(const char *name, int fd,
         case EM_PPC64:
             if (EM_PPC64 != ehdr.e_machine)
                 if (EM_PPC != ehdr.e_machine)
-                    goto fail;
+                    goto arch_fail;
             break;
         case EM_X86_64:
             if (EM_X86_64 != ehdr.e_machine)
                 if (EM_386 != ehdr.e_machine)
-                    goto fail;
+                    goto arch_fail;
             break;
         case EM_MICROBLAZE:
             if (EM_MICROBLAZE != ehdr.e_machine)
                 if (EM_MICROBLAZE_OLD != ehdr.e_machine)
-                    goto fail;
+                    goto arch_fail;
             break;
         default:
             if (elf_machine != ehdr.e_machine)
-                goto fail;
+                goto arch_fail;
     }
 
     if (pentry)
@@ -306,4 +306,9 @@ static int glue(load_elf, SZ)(const char *name, int fd,
     g_free(data);
     g_free(phdr);
     return -1;
+
+arch_fail:
+    fprintf(stderr, "qemu: could not load arch-incompatible kernel '%s'\n",
+            name);
+    exit(1);
 }
-- 
1.8.4.rc4




reply via email to

[Prev in Thread] Current Thread [Next in Thread]