--- trunk/src/file.c 2007/10/08 16:18:31 11 +++ trunk/src/file.c 2007/10/08 16:18:38 12 @@ -25,7 +25,7 @@ * SUCH DAMAGE. * * - * $Id: file.c,v 1.99 2005/06/26 09:21:28 debug Exp $ + * $Id: file.c,v 1.105 2005/08/11 16:11:33 debug Exp $ * * This file contains functions which load executable images into (emulated) * memory. File formats recognized so far: @@ -125,6 +125,7 @@ #define AOUT_FLAG_DECOSF1 1 #define AOUT_FLAG_FROM_BEGINNING 2 +#define AOUT_FLAG_VADDR_ZERO_HACK 4 /* * file_load_aout(): * @@ -145,9 +146,12 @@ uint32_t entry, datasize, textsize; int32_t symbsize = 0; uint32_t vaddr, total_len; - unsigned char buf[4096]; + unsigned char buf[65536]; unsigned char *syms; + if (m->cpus[0]->byte_order == EMUL_BIG_ENDIAN) + encoding = ELFDATA2MSB; + f = fopen(filename, "r"); if (f == NULL) { perror(filename); @@ -177,8 +181,11 @@ } unencode(entry, &aout_header.a_entry, uint32_t); - vaddr = entry; debug("a.out, entry point 0x%08lx\n", (long)entry); + vaddr = entry; + + if (flags & AOUT_FLAG_VADDR_ZERO_HACK) + vaddr = 0; unencode(textsize, &aout_header.a_text, uint32_t); unencode(datasize, &aout_header.a_data, uint32_t); @@ -201,10 +208,20 @@ /* printf("fread len=%i vaddr=%x buf[0..]=%02x %02x %02x\n", len, (int)vaddr, buf[0], buf[1], buf[2]); */ - if (len > 0) - m->cpus[0]->memory_rw(m->cpus[0], mem, vaddr, - &buf[0], len, MEM_WRITE, NO_EXCEPTIONS); - else { + if (len > 0) { + int len2 = 0; + uint64_t vaddr1 = vaddr & + ((1 << BITS_PER_MEMBLOCK) - 1); + uint64_t vaddr2 = (vaddr + + len) & ((1 << BITS_PER_MEMBLOCK) - 1); + if (vaddr2 < vaddr1) { + len2 = len - vaddr2; + m->cpus[0]->memory_rw(m->cpus[0], mem, vaddr, + &buf[0], len2, MEM_WRITE, NO_EXCEPTIONS); + } + m->cpus[0]->memory_rw(m->cpus[0], mem, vaddr + len2, + &buf[len2], len-len2, MEM_WRITE, NO_EXCEPTIONS); + } else { if (flags & AOUT_FLAG_DECOSF1) break; else { @@ -265,7 +282,7 @@ if (type != 0 && addr != 0) add_symbol_name(&m->symbol_context, - addr, 0, string_symbols + str_index, 0); + addr, 0, string_symbols + str_index, 0, -1); i++; } @@ -575,7 +592,7 @@ memcpy(name, sym->name, 8); name[8] = '\0'; add_symbol_name(&m->symbol_context, - v, 0, name, 0); + v, 0, name, 0, -1); n_real_symbols ++; } else if (t == 0x20 && !sym->name[0]) { off_t ofs; @@ -587,7 +604,7 @@ /* debug(" [altname=0x%x '%s']", altname, name); */ add_symbol_name(&m->symbol_context, - v, 0, name, 0); + v, 0, name, 0, -1); n_real_symbols ++; } @@ -658,7 +675,7 @@ add_symbol_name(&m->symbol_context, extsyms[sym_nr].es_value, 0, - symbol_data + extsyms[sym_nr].es_strindex, 0); + symbol_data + extsyms[sym_nr].es_strindex, 0, -1); } free(extsyms); @@ -1060,12 +1077,6 @@ ok = 1; } break; - case ARCH_HPPA: - switch (emachine) { - case EM_PARISC: - ok = 1; - } - break; case ARCH_MIPS: switch (emachine) { case EM_MIPS: @@ -1106,6 +1117,18 @@ ok = 1; } break; + case ARCH_IA64: + switch (emachine) { + case EM_IA_64: + ok = 1; + } + break; + case ARCH_M68K: + switch (emachine) { + case EM_68K: + ok = 1; + } + break; default: fatal("file.c: INTERNAL ERROR: Unimplemented arch!\n"); } @@ -1277,7 +1300,10 @@ } } - /* Read the section headers to find the address of the _gp symbol: */ + /* + * Read the section headers to find the address of the _gp + * symbol (for MIPS): + */ for (i=0; isymbol_context, - addr, size, symbol_strings + st_name, 0); + addr, size, symbol_strings + st_name, + 0, -1); } if (strcmp(symbol_strings + st_name, "_gp") == 0) { @@ -1606,6 +1637,13 @@ entrypointp, arch, byte_orderp); goto ret; } + if (buf[0]==0x00 && buf[1]==0x87 && buf[2]==0x01 && buf[3]==0x08) { + /* M68K a.out */ + file_load_aout(machine, mem, filename, + AOUT_FLAG_VADDR_ZERO_HACK /* for OpenBSD/mac68k */, + entrypointp, arch, byte_orderp); + goto ret; + } if (buf[0]==0x00 && buf[1]==0x86 && buf[2]==0x01 && buf[3]==0x0b) { /* i386 a.out (old OpenBSD and NetBSD etc) */ file_load_aout(machine, mem, filename, AOUT_FLAG_FROM_BEGINNING,