Diff for /qemu/elf_ops.h between versions 1.1.1.3 and 1.1.1.4

version 1.1.1.3, 2018/04/24 16:47:15 version 1.1.1.4, 2018/04/24 16:50:30
Line 60  static struct elf_shdr *glue(find_sectio Line 60  static struct elf_shdr *glue(find_sectio
     return NULL;      return NULL;
 }  }
   
   static int glue(symfind, SZ)(const void *s0, const void *s1)
   {
       struct elf_sym *key = (struct elf_sym *)s0;
       struct elf_sym *sym = (struct elf_sym *)s1;
       int result = 0;
       if (key->st_value < sym->st_value) {
           result = -1;
       } else if (key->st_value > sym->st_value + sym->st_size) {
           result = 1;
       }
       return result;
   }
   
   static const char *glue(lookup_symbol, SZ)(struct syminfo *s, target_ulong orig_addr)
   {
       struct elf_sym *syms = glue(s->disas_symtab.elf, SZ);
       struct elf_sym key;
       struct elf_sym *sym;
   
       key.st_value = orig_addr;
   
       sym = bsearch(&key, syms, s->disas_num_syms, sizeof(*syms), glue(symfind, SZ));
       if (sym != 0) {
           return s->disas_strtab + sym->st_name;
       }
   
       return "";
   }
   
   static int glue(symcmp, SZ)(const void *s0, const void *s1)
   {
       struct elf_sym *sym0 = (struct elf_sym *)s0;
       struct elf_sym *sym1 = (struct elf_sym *)s1;
       return (sym0->st_value < sym1->st_value)
           ? -1
           : ((sym0->st_value > sym1->st_value) ? 1 : 0);
   }
   
 static int glue(load_symbols, SZ)(struct elfhdr *ehdr, int fd, int must_swab)  static int glue(load_symbols, SZ)(struct elfhdr *ehdr, int fd, int must_swab)
 {  {
     struct elf_shdr *symtab, *strtab, *shdr_table = NULL;      struct elf_shdr *symtab, *strtab, *shdr_table = NULL;
     struct elf_sym *syms = NULL;      struct elf_sym *syms = NULL;
 #if (SZ == 64)  
     struct elf32_sym *syms32 = NULL;  
 #endif  
     struct syminfo *s;      struct syminfo *s;
     int nsyms, i;      int nsyms, i;
     char *str = NULL;      char *str = NULL;
Line 90  static int glue(load_symbols, SZ)(struct Line 125  static int glue(load_symbols, SZ)(struct
         goto fail;          goto fail;
   
     nsyms = symtab->sh_size / sizeof(struct elf_sym);      nsyms = symtab->sh_size / sizeof(struct elf_sym);
 #if (SZ == 64)  
     syms32 = qemu_mallocz(nsyms * sizeof(struct elf32_sym));      i = 0;
 #endif      while (i < nsyms) {
     for (i = 0; i < nsyms; i++) {  
         if (must_swab)          if (must_swab)
             glue(bswap_sym, SZ)(&syms[i]);              glue(bswap_sym, SZ)(&syms[i]);
 #if (SZ == 64)          /* We are only interested in function symbols.
         syms32[i].st_name = syms[i].st_name;             Throw everything else away.  */
         syms32[i].st_info = syms[i].st_info;          if (syms[i].st_shndx == SHN_UNDEF ||
         syms32[i].st_other = syms[i].st_other;                  syms[i].st_shndx >= SHN_LORESERVE ||
         syms32[i].st_shndx = syms[i].st_shndx;                  ELF_ST_TYPE(syms[i].st_info) != STT_FUNC) {
         syms32[i].st_value = syms[i].st_value & 0xffffffff;              nsyms--;
         syms32[i].st_size = syms[i].st_size & 0xffffffff;              if (i < nsyms) {
                   syms[i] = syms[nsyms];
               }
               continue;
           }
   #if defined(TARGET_ARM) || defined (TARGET_MIPS)
           /* The bottom address bit marks a Thumb or MIPS16 symbol.  */
           syms[i].st_value &= ~(target_ulong)1;
 #endif  #endif
           i++;
     }      }
       syms = qemu_realloc(syms, nsyms * sizeof(*syms));
   
       qsort(syms, nsyms, sizeof(*syms), glue(symcmp, SZ));
   
     /* String table */      /* String table */
     if (symtab->sh_link >= ehdr->e_shnum)      if (symtab->sh_link >= ehdr->e_shnum)
         goto fail;          goto fail;
Line 112  static int glue(load_symbols, SZ)(struct Line 158  static int glue(load_symbols, SZ)(struct
   
     str = load_at(fd, strtab->sh_offset, strtab->sh_size);      str = load_at(fd, strtab->sh_offset, strtab->sh_size);
     if (!str)      if (!str)
         goto fail;          goto fail;
   
     /* Commit */      /* Commit */
     s = qemu_mallocz(sizeof(*s));      s = qemu_mallocz(sizeof(*s));
 #if (SZ == 64)      s->lookup_symbol = glue(lookup_symbol, SZ);
     s->disas_symtab = syms32;      glue(s->disas_symtab.elf, SZ) = syms;
     qemu_free(syms);  
 #else  
     s->disas_symtab = syms;  
 #endif  
     s->disas_num_syms = nsyms;      s->disas_num_syms = nsyms;
     s->disas_strtab = str;      s->disas_strtab = str;
     s->next = syminfos;      s->next = syminfos;
Line 129  static int glue(load_symbols, SZ)(struct Line 171  static int glue(load_symbols, SZ)(struct
     qemu_free(shdr_table);      qemu_free(shdr_table);
     return 0;      return 0;
  fail:   fail:
 #if (SZ == 64)  
     qemu_free(syms32);  
 #endif  
     qemu_free(syms);      qemu_free(syms);
     qemu_free(str);      qemu_free(str);
     qemu_free(shdr_table);      qemu_free(shdr_table);
     return -1;      return -1;
 }  }
   
 static int glue(load_elf, SZ)(int fd, int64_t virt_to_phys_addend,  static int glue(load_elf, SZ)(int fd, int64_t address_offset,
                               int must_swab, uint64_t *pentry,                                int must_swab, uint64_t *pentry,
                               uint64_t *lowaddr, uint64_t *highaddr)                                uint64_t *lowaddr, uint64_t *highaddr)
 {  {
Line 190  static int glue(load_elf, SZ)(int fd, in Line 229  static int glue(load_elf, SZ)(int fd, in
                 if (read(fd, data, ph->p_filesz) != ph->p_filesz)                  if (read(fd, data, ph->p_filesz) != ph->p_filesz)
                     goto fail;                      goto fail;
             }              }
             addr = ph->p_vaddr + virt_to_phys_addend;              /* address_offset is hack for kernel images that are
                  linked at the wrong physical address.  */
               addr = ph->p_paddr + address_offset;
   
             cpu_physical_memory_write_rom(addr, data, mem_size);              cpu_physical_memory_write_rom(addr, data, mem_size);
   

Removed from v.1.1.1.3  
changed lines
  Added in v.1.1.1.4


unix.superglobalmegacorp.com