Elf loader 32/64 bit checks
authorBarret Rhoden <brho@cs.berkeley.edu>
Wed, 26 Jun 2013 00:33:35 +0000 (17:33 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Wed, 26 Jun 2013 05:20:24 +0000 (22:20 -0700)
KERN64 was a riscv-only thing.  CONFIG_64BIT is arch-indep (and set by
Kconfig).  Also, x86_64 can't handle 32 bit elves, though riscv can.

kern/arch/riscv/arch.h
kern/src/elf.c

index 415ef83..3d257ab 100644 (file)
 /* Arch Constants */
 #define ARCH_CL_SIZE 64
 
-#ifdef __riscv64
-# define KERN64
-#endif
-
 void print_cpuinfo(void);
 void show_mapping(uintptr_t start, size_t size);
 void backtrace(void);
index 2a79f58..67ab74f 100644 (file)
@@ -8,7 +8,7 @@
 #include <smp.h>
 #include <arch/arch.h>
 
-#ifdef KERN64
+#ifdef CONFIG_64BIT
 # define elf_field(obj, field) (elf64 ? (obj##64)->field : (obj##32)->field)
 #else
 # define elf_field(obj, field) ((obj##32)->field)
@@ -53,12 +53,18 @@ static int load_one_elf(struct proc *p, struct file *f, uintptr_t pgoffset,
                printk("[kernel] load_one_elf: ID as both 32 and 64 bit\n");
                goto fail;
        }
-       #ifndef KERN64
+       #ifndef CONFIG_64BIT
        if (elf64) {
                printk("[kernel] load_one_elf: 64 bit elf on 32 bit kernel\n");
                goto fail;
        }
        #endif
+       #ifdef CONFIG_X86_64
+       if (elf32) {
+               printk("[kernel] load_one_elf: 32 bit elf on 64 bit kernel\n");
+               goto fail;
+       }
+       #endif
 
        size_t phsz = elf64 ? sizeof(proghdr64_t) : sizeof(proghdr32_t);
        uint16_t e_phnum = elf_field(elfhdr, e_phnum);