]> Git Repo - qemu.git/commitdiff
Check ELF binaries for machine type and endianness.
authorths <ths@c046a42c-6fe2-441c-8c8c-71466251a162>
Sat, 23 Dec 2006 14:18:40 +0000 (14:18 +0000)
committerths <ths@c046a42c-6fe2-441c-8c8c-71466251a162>
Sat, 23 Dec 2006 14:18:40 +0000 (14:18 +0000)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2274 c046a42c-6fe2-441c-8c8c-71466251a162

elf_ops.h
hw/mips_r4k.c
loader.c
target-arm/cpu.h
target-i386/cpu.h
target-m68k/cpu.h
target-mips/cpu.h
target-ppc/cpu.h
target-sh4/cpu.h
target-sparc/cpu.h

index 122bf10c1f785663ce4a453f4209481bc8cf83ff..1cd4f2b3d529d7a000f73e46c2633e673347cc71 100644 (file)
--- a/elf_ops.h
+++ b/elf_ops.h
@@ -153,6 +153,9 @@ int glue(load_elf, SZ)(int fd, int64_t virt_to_phys_addend,
         glue(bswap_ehdr, SZ)(&ehdr);
     }
 
+    if (ELF_MACHINE != ehdr.e_machine)
+        goto fail;
+
     if (pentry)
        *pentry = (uint64_t)ehdr.e_entry;
 
@@ -164,7 +167,7 @@ int glue(load_elf, SZ)(int fd, int64_t virt_to_phys_addend,
     if (!phdr)
         goto fail;
     if (read(fd, phdr, size) != size)
-        goto fail;
+        goto fail1;
     if (must_swab) {
         for(i = 0; i < ehdr.e_phnum; i++) {
             ph = &phdr[i];
@@ -181,9 +184,9 @@ int glue(load_elf, SZ)(int fd, int64_t virt_to_phys_addend,
             data = qemu_mallocz(mem_size);
             if (ph->p_filesz > 0) {
                 if (lseek(fd, ph->p_offset, SEEK_SET) < 0)
-                    goto fail;
+                    goto fail2;
                 if (read(fd, data, ph->p_filesz) != ph->p_filesz)
-                    goto fail;
+                    goto fail2;
             }
             addr = ph->p_vaddr + virt_to_phys_addend;
 
@@ -197,9 +200,11 @@ int glue(load_elf, SZ)(int fd, int64_t virt_to_phys_addend,
     }
     qemu_free(phdr);
     return total_size;
- fail:
+fail2:
     qemu_free(data);
+fail1:
     qemu_free(phdr);
+fail:
     return -1;
 }
 
index cf52a0358661d379c36ab5340bafc4f603dc1669..d72d768a0a9af40c7c209cc613325e0ccb1014f2 100644 (file)
@@ -11,7 +11,6 @@
 
 #define BIOS_FILENAME "mips_bios.bin"
 //#define BIOS_FILENAME "system.bin"
-#define KERNEL_LOAD_ADDR (int32_t)0x80010000
 #ifdef MIPS_HAS_MIPS64
 #define INITRD_LOAD_ADDR (int64_t)0x80800000
 #else
@@ -86,14 +85,9 @@ void load_kernel (CPUState *env, int ram_size, const char *kernel_filename,
             entry = (int32_t)entry;
         env->PC = entry;
     } else {
-        kernel_size = load_image(kernel_filename,
-                                 phys_ram_base + KERNEL_LOAD_ADDR + VIRT_TO_PHYS_ADDEND);
-        if (kernel_size < 0) {
-            fprintf(stderr, "qemu: could not load kernel '%s'\n",
-                    kernel_filename);
-            exit(1);
-        }
-        env->PC = KERNEL_LOAD_ADDR;
+        fprintf(stderr, "qemu: could not load kernel '%s'\n",
+                kernel_filename);
+        exit(1);
     }
 
     /* load initrd */
index 3fa681dbb0c4fd93fec62336c03d42b98329d994..7823add91786f42998f74c64dac924e858b5480a 100644 (file)
--- a/loader.c
+++ b/loader.c
@@ -197,7 +197,7 @@ static void *load_at(int fd, int offset, int size)
 int load_elf(const char *filename, int64_t virt_to_phys_addend,
              uint64_t *pentry)
 {
-    int fd, data_order, must_swab, ret;
+    int fd, data_order, host_data_order, must_swab, ret;
     uint8_t e_ident[EI_NIDENT];
 
     fd = open(filename, O_RDONLY | O_BINARY);
@@ -218,7 +218,15 @@ int load_elf(const char *filename, int64_t virt_to_phys_addend,
     data_order = ELFDATA2LSB;
 #endif
     must_swab = data_order != e_ident[EI_DATA];
-    
+
+#ifdef TARGET_WORDS_BIGENDIAN
+    host_data_order = ELFDATA2MSB;
+#else
+    host_data_order = ELFDATA2LSB;
+#endif
+    if (host_data_order != e_ident[EI_DATA])
+        return -1;
+
     lseek(fd, 0, SEEK_SET);
     if (e_ident[EI_CLASS] == ELFCLASS64) {
         ret = load_elf64(fd, virt_to_phys_addend, must_swab, pentry);
index b994bdd29a57a121619a986b23f9262d89afd10f..359d5cbdc278afe06237f0e93247c1f1def439cb 100644 (file)
@@ -22,6 +22,8 @@
 
 #define TARGET_LONG_BITS 32
 
+#define ELF_MACHINE    EM_ARM
+
 #include "cpu-defs.h"
 
 #include "softfloat.h"
index 30507403e459e917dd2f7ff7c711cf4a061dd2ae..4296093152f04de7b04c46693d000c1b1c490bb5 100644 (file)
 
 #define TARGET_HAS_ICE 1
 
+#ifdef TARGET_X86_64
+#define ELF_MACHINE    EM_X86_64
+#else
+#define ELF_MACHINE    EM_386
+#endif
+
 #include "cpu-defs.h"
 
 #include "softfloat.h"
index 29e02e8bb206689985e7f6603695c1b639f9ee81..a30bf962dda2ef68d240cbdec9a1945e08ea427c 100644 (file)
@@ -31,6 +31,8 @@
 
 #define TARGET_HAS_ICE 1
 
+#define ELF_MACHINE    EM_68K
+
 #define EXCP_ACCESS         2   /* Access (MMU) error.  */
 #define EXCP_ADDRESS        3   /* Address error.  */
 #define EXCP_ILLEGAL        4   /* Illegal instruction.  */
index 8f0f598b6da92866044989db1e34e219fb8d17b6..c1b13d902d5fc3fe4f098c1443a2d6a9a81698ae 100644 (file)
@@ -3,6 +3,8 @@
 
 #define TARGET_HAS_ICE 1
 
+#define ELF_MACHINE    EM_MIPS
+
 #include "config.h"
 #include "mips-defs.h"
 #include "cpu-defs.h"
index 88d91358e2f9984de292bbea05b23dda009e3555..f05fb280bead75fd5fbf8aa8e10195608c783013 100644 (file)
@@ -32,6 +32,8 @@
 
 #define TARGET_HAS_ICE 1
 
+#define ELF_MACHINE    EM_PPC
+
 /* XXX: this should be tunable: PowerPC 601 & 64 bits PowerPC
  *                              have different cache line sizes
  */
index ef818fdf25b661accc75c4c0f68c391f3e9446c4..7296d9eef454c72d8ae5abb27a0317eeeb517be4 100644 (file)
@@ -25,6 +25,8 @@
 #define TARGET_LONG_BITS 32
 #define TARGET_HAS_ICE 1
 
+#define ELF_MACHINE    EM_SH
+
 #include "cpu-defs.h"
 
 #include "softfloat.h"
index 8cbf0b2e300a72d34d0ade5e4c0770507e00f6fe..86c2320044d98edbef83a31e45f987a595f3ad40 100644 (file)
 
 #define TARGET_HAS_ICE 1
 
+#if !defined(TARGET_SPARC64)
+#define ELF_MACHINE    EM_SPARC
+#else
+#define ELF_MACHINE    EM_SPARCV9
+#endif
+
 /*#define EXCP_INTERRUPT 0x100*/
 
 /* trap definitions */
This page took 0.037317 seconds and 4 git commands to generate.