Signed-off-by: Zhaofeng Li <he...@zhaofeng.li>
---
 kexec/arch/i386/kexec-elf-x86.c      | 44 +++++++++++++++++++++++-----
 kexec/arch/i386/kexec-x86.h          |  1 +
 kexec/arch/x86_64/kexec-elf-x86_64.c | 28 ++----------------
 3 files changed, 40 insertions(+), 33 deletions(-)

diff --git a/kexec/arch/i386/kexec-elf-x86.c b/kexec/arch/i386/kexec-elf-x86.c
index fedf031..8eba242 100644
--- a/kexec/arch/i386/kexec-elf-x86.c
+++ b/kexec/arch/i386/kexec-elf-x86.c
@@ -42,7 +42,7 @@
 
 static const int probe_debug = 0;
 
-int elf_x86_probe(const char *buf, off_t len)
+int elf_x86_any_probe(const char *buf, off_t len, enum coretype arch)
 {
        
        struct mem_ehdr ehdr;
@@ -56,20 +56,50 @@ int elf_x86_probe(const char *buf, off_t len)
        }
 
        /* Verify the architecuture specific bits */
-       if ((ehdr.e_machine != EM_386) && (ehdr.e_machine != EM_486)) {
-               /* for a different architecture */
-               if (probe_debug) {
-                       fprintf(stderr, "Not i386 ELF executable\n");
+       switch (arch) {
+       case CORE_TYPE_ELF32:
+               if ((ehdr.e_machine != EM_386) && (ehdr.e_machine != EM_486)) {
+                       if (probe_debug)
+                               fprintf(stderr, "Not i386 ELF executable\n");
+                       result = -1;
+                       goto out;
                }
-               result = -1;
-               goto out;
+               break;
+
+       case CORE_TYPE_ELF64:
+               if (ehdr.e_machine != EM_X86_64) {
+                       if (probe_debug)
+                               fprintf(stderr, "Not x86_64 ELF executable\n");
+                       result = -1;
+                       goto out;
+               }
+               break;
+
+       case CORE_TYPE_UNDEF:
+       default:
+               if (
+                       (ehdr.e_machine != EM_386) &&
+                       (ehdr.e_machine != EM_486) &&
+                       (ehdr.e_machine != EM_X86_64)
+               ) {
+                       if (probe_debug)
+                               fprintf(stderr, "Not i386 or x86_64 ELF 
executable\n");
+                       result = -1;
+                       goto out;
+               }
+               break;
        }
+
        result = 0;
  out:
        free_elf_info(&ehdr);
        return result;
 }
 
+int elf_x86_probe(const char *buf, off_t len) {
+       return elf_x86_any_probe(buf, len, CORE_TYPE_ELF32);
+}
+
 void elf_x86_usage(void)
 {
        printf( "    --command-line=STRING Set the kernel command line to 
STRING\n"
diff --git a/kexec/arch/i386/kexec-x86.h b/kexec/arch/i386/kexec-x86.h
index 0f941df..71e4329 100644
--- a/kexec/arch/i386/kexec-x86.h
+++ b/kexec/arch/i386/kexec-x86.h
@@ -66,6 +66,7 @@ void multiboot2_x86_usage(void);
 int multiboot2_x86_probe(const char *buf, off_t buf_len);
 
 int elf_x86_probe(const char *buf, off_t len);
+int elf_x86_any_probe(const char *buf, off_t len, enum coretype arch);
 int elf_x86_load(int argc, char **argv, const char *buf, off_t len,
        struct kexec_info *info);
 void elf_x86_usage(void);
diff --git a/kexec/arch/x86_64/kexec-elf-x86_64.c 
b/kexec/arch/x86_64/kexec-elf-x86_64.c
index ad22311..7f9540a 100644
--- a/kexec/arch/x86_64/kexec-elf-x86_64.c
+++ b/kexec/arch/x86_64/kexec-elf-x86_64.c
@@ -37,37 +37,13 @@
 #include "../../kexec-elf-boot.h"
 #include "../i386/x86-linux-setup.h"
 #include "kexec-x86_64.h"
+#include "../i386/kexec-x86.h"
 #include "../i386/crashdump-x86.h"
 #include <arch/options.h>
 
-static const int probe_debug = 0;
-
 int elf_x86_64_probe(const char *buf, off_t len)
 {
-       
-       struct mem_ehdr ehdr;
-       int result;
-       result = build_elf_exec_info(buf, len, &ehdr, 0);
-       if (result < 0) {
-               if (probe_debug) {
-                       fprintf(stderr, "Not an ELF executable\n");
-               }
-               goto out;
-       }
-
-       /* Verify the architecuture specific bits */
-       if (ehdr.e_machine != EM_X86_64) {
-               /* for a different architecture */
-               if (probe_debug) {
-                       fprintf(stderr, "Not x86_64 ELF executable\n");
-               }
-               result = -1;
-               goto out;
-       }
-       result = 0;
- out:
-       free_elf_info(&ehdr);
-       return result;
+       return elf_x86_any_probe(buf, len, CORE_TYPE_ELF64);
 }
 
 void elf_x86_64_usage(void)
-- 
2.32.0


_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec

Reply via email to