ARM: zynq: use physical cpuid in zynq_slcr_cpu_stop/start
[linux-2.6-microblaze.git] / fs / binfmt_elf.c
index 5372eab..ecd8d26 100644 (file)
@@ -404,6 +404,17 @@ static unsigned long total_mapping_size(const struct elf_phdr *cmds, int nr)
                                ELF_PAGESTART(cmds[first_idx].p_vaddr);
 }
 
+static int elf_read(struct file *file, void *buf, size_t len, loff_t pos)
+{
+       ssize_t rv;
+
+       rv = kernel_read(file, buf, len, &pos);
+       if (unlikely(rv != len)) {
+               return (rv < 0) ? rv : -EIO;
+       }
+       return 0;
+}
+
 /**
  * load_elf_phdrs() - load ELF program headers
  * @elf_ex:   ELF header of the binary whose program headers should be loaded
@@ -418,7 +429,6 @@ static struct elf_phdr *load_elf_phdrs(const struct elfhdr *elf_ex,
 {
        struct elf_phdr *elf_phdata = NULL;
        int retval, err = -1;
-       loff_t pos = elf_ex->e_phoff;
        unsigned int size;
 
        /*
@@ -439,9 +449,9 @@ static struct elf_phdr *load_elf_phdrs(const struct elfhdr *elf_ex,
                goto out;
 
        /* Read in the program headers */
-       retval = kernel_read(elf_file, elf_phdata, size, &pos);
-       if (retval != size) {
-               err = (retval < 0) ? retval : -EIO;
+       retval = elf_read(elf_file, elf_phdata, size, elf_ex->e_phoff);
+       if (retval < 0) {
+               err = retval;
                goto out;
        }
 
@@ -544,7 +554,7 @@ static inline int make_prot(u32 p_flags)
    an ELF header */
 
 static unsigned long load_elf_interp(struct elfhdr *interp_elf_ex,
-               struct file *interpreter, unsigned long *interp_map_addr,
+               struct file *interpreter,
                unsigned long no_base, struct elf_phdr *interp_elf_phdata)
 {
        struct elf_phdr *eppnt;
@@ -590,8 +600,6 @@ static unsigned long load_elf_interp(struct elfhdr *interp_elf_ex,
                        map_addr = elf_map(interpreter, load_addr + vaddr,
                                        eppnt, elf_prot, elf_type, total_size);
                        total_size = 0;
-                       if (!*interp_map_addr)
-                               *interp_map_addr = map_addr;
                        error = map_addr;
                        if (BAD_ADDR(map_addr))
                                goto out;
@@ -722,7 +730,6 @@ static int load_elf_binary(struct linux_binprm *bprm)
        elf_ppnt = elf_phdata;
        for (i = 0; i < loc->elf_ex.e_phnum; i++, elf_ppnt++) {
                char *elf_interpreter;
-               loff_t pos;
 
                if (elf_ppnt->p_type != PT_INTERP)
                        continue;
@@ -740,14 +747,10 @@ static int load_elf_binary(struct linux_binprm *bprm)
                if (!elf_interpreter)
                        goto out_free_ph;
 
-               pos = elf_ppnt->p_offset;
-               retval = kernel_read(bprm->file, elf_interpreter,
-                                    elf_ppnt->p_filesz, &pos);
-               if (retval != elf_ppnt->p_filesz) {
-                       if (retval >= 0)
-                               retval = -EIO;
+               retval = elf_read(bprm->file, elf_interpreter, elf_ppnt->p_filesz,
+                                 elf_ppnt->p_offset);
+               if (retval < 0)
                        goto out_free_interp;
-               }
                /* make sure path is NULL terminated */
                retval = -ENOEXEC;
                if (elf_interpreter[elf_ppnt->p_filesz - 1] != '\0')
@@ -766,14 +769,10 @@ static int load_elf_binary(struct linux_binprm *bprm)
                would_dump(bprm, interpreter);
 
                /* Get the exec headers */
-               pos = 0;
-               retval = kernel_read(interpreter, &loc->interp_elf_ex,
-                                    sizeof(loc->interp_elf_ex), &pos);
-               if (retval != sizeof(loc->interp_elf_ex)) {
-                       if (retval >= 0)
-                               retval = -EIO;
+               retval = elf_read(interpreter, &loc->interp_elf_ex,
+                                 sizeof(loc->interp_elf_ex), 0);
+               if (retval < 0)
                        goto out_free_dentry;
-               }
 
                break;
 
@@ -1054,11 +1053,8 @@ out_free_interp:
        }
 
        if (interpreter) {
-               unsigned long interp_map_addr = 0;
-
                elf_entry = load_elf_interp(&loc->interp_elf_ex,
                                            interpreter,
-                                           &interp_map_addr,
                                            load_bias, interp_elf_phdata);
                if (!IS_ERR((void *)elf_entry)) {
                        /*
@@ -1179,11 +1175,10 @@ static int load_elf_library(struct file *file)
        unsigned long elf_bss, bss, len;
        int retval, error, i, j;
        struct elfhdr elf_ex;
-       loff_t pos = 0;
 
        error = -ENOEXEC;
-       retval = kernel_read(file, &elf_ex, sizeof(elf_ex), &pos);
-       if (retval != sizeof(elf_ex))
+       retval = elf_read(file, &elf_ex, sizeof(elf_ex), 0);
+       if (retval < 0)
                goto out;
 
        if (memcmp(elf_ex.e_ident, ELFMAG, SELFMAG) != 0)
@@ -1208,9 +1203,8 @@ static int load_elf_library(struct file *file)
 
        eppnt = elf_phdata;
        error = -ENOEXEC;
-       pos =  elf_ex.e_phoff;
-       retval = kernel_read(file, eppnt, j, &pos);
-       if (retval != j)
+       retval = elf_read(file, eppnt, j, elf_ex.e_phoff);
+       if (retval < 0)
                goto out_free_ph;
 
        for (j = 0, i = 0; i<elf_ex.e_phnum; i++)