--- trunk/src/file.c 2007/10/08 16:19:43 23 +++ trunk/src/file.c 2007/10/08 16:19:56 24 @@ -25,7 +25,7 @@ * SUCH DAMAGE. * * - * $Id: file.c,v 1.127 2006/01/22 23:20:33 debug Exp $ + * $Id: file.c,v 1.131 2006/03/30 19:36:03 debug Exp $ * * This file contains functions which load executable images into (emulated) * memory. File formats recognized so far are: @@ -61,7 +61,7 @@ /* ELF machine types as strings: (same as exec_elf.h) */ -#define N_ELF_MACHINE_TYPES 64 +#define N_ELF_MACHINE_TYPES 84 static char *elf_machine_type[N_ELF_MACHINE_TYPES] = { "NONE", "M32", "SPARC", "386", /* 0..3 */ "68K", "88K", "486", "860", /* 4..7 */ @@ -78,7 +78,12 @@ "H8S", "H8_500", "IA_64", "MIPS_X", /* 48..51 */ "COLDFIRE", "68HC12", "unknown54", "unknown55", /* 52..55 */ "unknown56", "unknown57", "unknown58", "unknown59", /* 56..59 */ - "unknown60", "unknown61", "AMD64", "unknown63" /* 60..63 */ + "unknown60", "unknown61", "AMD64", "unknown63", /* 60..63 */ + "unknown64", "unknown65", "unknown66", "unknown67", /* 64..67 */ + "unknown68", "unknown69", "unknown70", "unknown71", /* 68..71 */ + "unknown72", "unknown73", "unknown74", "unknown75", /* 72..75 */ + "unknown76", "unknown77", "unknown78", "unknown79", /* 76..79 */ + "unknown80", "unknown81", "unknown82", "AVR" /* 80..83 */ }; @@ -1205,10 +1210,13 @@ vaddr += len; } - debug("RAW: 0x%llx bytes @ 0x%08llx", - (long long) (ftello(f) - skip), (long long)loadaddr); + debug("RAW: 0x%"PRIx64" bytes @ 0x%08"PRIx64, + (uint64_t) (ftello(f) - skip), (uint64_t) loadaddr); + if (skip != 0) - debug(" (0x%llx bytes of header skipped)", (long long)skip); + debug(" (0x%"PRIx64" bytes of header skipped)", + (uint64_t) skip); + debug("\n"); fclose(f); @@ -1463,35 +1471,9 @@ encoding == ELFDATA2LSB? "LSB (LE)" : "MSB (BE)", s); if (elf64) - debug("%016llx\n", (long long)eentry); + debug("%016"PRIx64"\n", (uint64_t) eentry); else - debug("%08x\n", (int)eentry); - - /* - * MIPS16 encoding? - * - * TODO: Find out what e_flag actually contains. - * TODO 2: This only sets mips16 for cpu 0. Yuck. Fix this! - */ - if (arch == ARCH_MIPS && ((eflags >> 24) & 0xff) == 0x24) { - debug("MIPS16 encoding (e_flags = 0x%08x)\n", eflags); -#ifdef ENABLE_MIPS16 - m->cpus[0]->cd.mips.mips16 = 1; -#else - fatal("ENABLE_MIPS16 must be defined in misc.h.\n" - "(or use the --mips16 configure option)\n"); - exit(1); -#endif - } else if (arch == ARCH_MIPS && (eentry & 0x3)) { - debug("MIPS16 encoding (eentry not 32-bit aligned)\n"); -#ifdef ENABLE_MIPS16 - m->cpus[0]->cd.mips.mips16 = 1; -#else - fatal("ENABLE_MIPS16 must be defined in misc.h.\n" - "(or use the --mips16 configure option)\n"); - exit(1); -#endif - } + debug("%08"PRIx32"\n", (uint32_t) eentry); /* * SH64: 32-bit instruction encoding? TODO @@ -1539,17 +1521,15 @@ } /* - * Hack for loading Linux/PPC kernels, linked to high - * addresses, at low addresses. + * Hack for loading PPC kernels that are linked to high + * addresses. (This requires enabling of instruction and + * data virtual address translation.) */ if (arch == ARCH_PPC) { - if (elf64) { - p_vaddr &= 0x0fffffffffffffffULL; - p_paddr &= 0x0fffffffffffffffULL; - } else { - p_vaddr &= 0x0fffffff; - p_paddr &= 0x0fffffff; - } + if ( (elf64 && (p_vaddr >> 60) != 0) || + (!elf64 && (p_vaddr >> 28) != 0) ) + m->cpus[m->bootstrap_cpu]-> + cd.ppc.msr |= PPC_MSR_IR | PPC_MSR_DR; } if (p_memsz != 0 && (p_type == PT_LOAD || @@ -1558,34 +1538,35 @@ if (p_type == PT_LOAD) debug("load"); else - debug("0x%08x", (int)p_type); + debug("0x%08"PRIx32, (uint32_t) p_type); - debug(") @ 0x%llx, vaddr 0x", (long long)p_offset); + debug(") @ 0x%"PRIx64", vaddr 0x", (uint64_t) p_offset); if (elf64) - debug("%016llx", (long long)p_vaddr); + debug("%016"PRIx64, (uint64_t) p_vaddr); else - debug("%08x", (int)p_vaddr); + debug("%08"PRIx32, (uint32_t) p_vaddr); - debug(" len=0x%llx\n", (long long)p_memsz); + debug(" len=0x%"PRIx64"\n", (uint64_t) p_memsz); if (p_vaddr != p_paddr) { if (elf64) - fatal("NOTE: vaddr (0x%llx) and " - "paddr (0x%llx) differ; using " - "vaddr\n", (long long)p_vaddr, - (long long)p_paddr); + debug("NOTE: vaddr (0x%"PRIx64") and " + "paddr (0x%"PRIx64") differ; using " + "vaddr\n", (uint64_t) p_vaddr, + (uint64_t) p_paddr); else - fatal("NOTE: vaddr (0x%08x) and " - "paddr (0x%08x) differ; using vaddr" - "\n", (int)p_vaddr, (int)p_paddr); + debug("NOTE: vaddr (0x%08"PRIx32") and " + "paddr (0x%08"PRIx32") differ; usin" + "g vaddr\n", (uint32_t) p_vaddr, + (uint32_t)p_paddr); } if (p_memsz < p_filesz) { fprintf(stderr, "%s: memsz < filesz. TODO: how" - " to handle this? memsz=%016llx filesz=" - "%016llx\n", filename, (long long)p_memsz, - (long long)p_filesz); + " to handle this? memsz=%016"PRIx64 + " filesz=%016"PRIx64"\n", filename, + (uint64_t) p_memsz, (uint64_t) p_filesz); exit(1); } @@ -1653,8 +1634,8 @@ off_t sh_offset; int n_entries; /* for reading the symbol / string tables */ - /* debug("section header %i at %016llx\n", i, - (long long) eshoff+i*eshentsize); */ + /* debug("section header %i at %016"PRIx64"\n", i, + (uint64_t) eshoff+i*eshentsize); */ fseek(f, eshoff + i * eshentsize, SEEK_SET); @@ -1740,8 +1721,8 @@ exit(1); } - debug("%i symbol entries at 0x%llx\n", - (int)n_entries, (long long)sh_offset); + debug("%i symbol entries at 0x%"PRIx64"\n", + (int) n_entries, (uint64_t) sh_offset); n_symbols = n_entries; } @@ -1774,8 +1755,8 @@ exit(1); } - debug("%i bytes of symbol strings at 0x%llx\n", - (int)sh_size, (long long)sh_offset); + debug("%i bytes of symbol strings at 0x%"PRIx64"\n", + (int) sh_size, (uint64_t) sh_offset); symbol_strings[sh_size] = '\0'; symbol_length = sh_size; @@ -1804,8 +1785,8 @@ unencode(size, &sym32.st_size, Elf32_Word); } - /* debug("symbol info=0x%02x addr=0x%016llx" - " (%i) '%s'\n", st_info, (long long)addr, + /* debug("symbol info=0x%02x addr=0x%016"PRIx64 + " (%i) '%s'\n", st_info, (uint64_t) addr, st_name, symbol_strings + st_name); */ if (size == 0) @@ -1813,8 +1794,8 @@ if (addr != 0) /* && ((st_info >> 4) & 0xf) >= STB_GLOBAL) */ { - /* debug("symbol info=0x%02x addr=0x%016llx" - " '%s'\n", st_info, (long long)addr, + /* debug("symbol info=0x%02x addr=0x%016"PRIx64 + " '%s'\n", st_info, (uint64_t) addr, symbol_strings + st_name); */ add_symbol_name(&m->symbol_context, addr, size, symbol_strings + st_name, @@ -1824,9 +1805,9 @@ if (strcmp(symbol_strings + st_name, "_gp") == 0) { debug("found _gp address: 0x"); if (elf64) - debug("%016llx\n", (long long)addr); + debug("%016"PRIx64"\n", (uint64_t)addr); else - debug("%08x\n", (int)addr); + debug("%08"PRIx32"\n", (uint32_t)addr); *gpp = addr; } } @@ -1879,8 +1860,8 @@ ((uint64_t)b[5] << 16) + ((uint64_t)b[6] << 8) + (uint64_t)b[7]; - debug("entrypoint 0x%016llx, toc_base 0x%016llx\n", - (long long)*entrypointp, (long long)toc_base); + debug("entrypoint 0x%016"PRIx64", toc_base 0x%016"PRIx64"\n", + (uint64_t) *entrypointp, (uint64_t) toc_base); if (tocp != NULL) *tocp = toc_base; }