X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=simavr%2Fsim%2Fsim_elf.c;h=af4ab2dad0887c282ab361a7a6866910e7502edb;hb=4a297c69463eeba8646c6cee5b353a0b36995b45;hp=ab34c283fd7cc79edc66e7da5f32844c5f5ee0aa;hpb=f9b556eb54397ec4872130b7132ea5d5ac2b0a97;p=simavr diff --git a/simavr/sim/sim_elf.c b/simavr/sim/sim_elf.c index ab34c28..af4ab2d 100644 --- a/simavr/sim/sim_elf.c +++ b/simavr/sim/sim_elf.c @@ -36,14 +36,22 @@ #include "sim_vcd_file.h" #include "avr_eeprom.h" +#ifndef O_BINARY +#define O_BINARY 0 +#endif + void avr_load_firmware(avr_t * avr, elf_firmware_t * firmware) { - avr->frequency = firmware->frequency; - avr->vcc = firmware->vcc; - avr->avcc = firmware->avcc; - avr->aref = firmware->aref; + if (firmware->frequency) + avr->frequency = firmware->frequency; + if (firmware->vcc) + avr->vcc = firmware->vcc; + if (firmware->avcc) + avr->avcc = firmware->avcc; + if (firmware->aref) + avr->aref = firmware->aref; #if CONFIG_SIMAVR_TRACE - avr->codeline = firmware->codeline; + avr->trace_data->codeline = firmware->codeline; #endif avr_loadcode(avr, firmware->flash, firmware->flashsize, firmware->flashbase); @@ -67,13 +75,16 @@ void avr_load_firmware(avr_t * avr, elf_firmware_t * firmware) avr->vcd, firmware->traceperiod >= 1000 ? firmware->traceperiod : 1000); - printf("Creating VCD trace file '%s'\n", avr->vcd->filename); + AVR_LOG(avr, LOG_TRACE, "Creating VCD trace file '%s'\n", avr->vcd->filename); for (int ti = 0; ti < firmware->tracecount; ti++) { if (firmware->trace[ti].mask == 0xff || firmware->trace[ti].mask == 0) { // easy one - avr_irq_t * all = avr_iomem_getirq(avr, firmware->trace[ti].addr, AVR_IOMEM_IRQ_ALL); + avr_irq_t * all = avr_iomem_getirq(avr, + firmware->trace[ti].addr, + firmware->trace[ti].name, + AVR_IOMEM_IRQ_ALL); if (!all) { - printf("%s: unable to attach trace to address %04x\n", + AVR_LOG(avr, LOG_ERROR, "ELF: %s: unable to attach trace to address %04x\n", __FUNCTION__, firmware->trace[ti].addr); } else { avr_vcd_add_signal(avr->vcd, all, 8, firmware->trace[ti].name); @@ -85,9 +96,12 @@ void avr_load_firmware(avr_t * avr, elf_firmware_t * firmware) count++; for (int bi = 0; bi < 8; bi++) if (firmware->trace[ti].mask & (1 << bi)) { - avr_irq_t * bit = avr_iomem_getirq(avr, firmware->trace[ti].addr, bi); + avr_irq_t * bit = avr_iomem_getirq(avr, + firmware->trace[ti].addr, + firmware->trace[ti].name, + bi); if (!bit) { - printf("%s: unable to attach trace to address %04x\n", + AVR_LOG(avr, LOG_ERROR, "ELF: %s: unable to attach trace to address %04x\n", __FUNCTION__, firmware->trace[ti].addr); break; } @@ -139,7 +153,7 @@ static void elf_parse_mmcu_section(elf_firmware_t * firmware, uint8_t * src, uin uint8_t mask = src[0]; uint16_t addr = src[1] | (src[2] << 8); char * name = (char*)src + 3; - printf("AVR_MMCU_TAG_VCD_TRACE %04x:%02x - %s\n", addr, mask, name); + AVR_LOG(NULL, LOG_TRACE, "AVR_MMCU_TAG_VCD_TRACE %04x:%02x - %s\n", addr, mask, name); firmware->trace[firmware->tracecount].mask = mask; firmware->trace[firmware->tracecount].addr = addr; strncpy(firmware->trace[firmware->tracecount].name, name, @@ -171,9 +185,9 @@ int elf_read_firmware(const char * file, elf_firmware_t * firmware) Elf *elf = NULL; /* Our Elf pointer for libelf */ int fd; // File Descriptor - if ((fd = open(file, O_RDONLY)) == -1 || + if ((fd = open(file, O_RDONLY | O_BINARY)) == -1 || (read(fd, &elf_header, sizeof(elf_header))) < sizeof(elf_header)) { - printf("could not read %s\n", file); + AVR_LOG(NULL, LOG_ERROR, "could not read %s\n", file); perror(file); close(fd); return -1; @@ -192,7 +206,7 @@ int elf_read_firmware(const char * file, elf_firmware_t * firmware) memset(firmware->codeline,0, bitesize); #endif - /* this is actualy mandatory !! otherwise elf_begin() fails */ + /* this is actually mandatory !! otherwise elf_begin() fails */ if (elf_version(EV_CURRENT) == EV_NONE) { /* library out of date - recover from error */ } @@ -276,16 +290,18 @@ int elf_read_firmware(const char * file, elf_firmware_t * firmware) (data_text ? data_text->d_size : 0) + (data_data ? data_data->d_size : 0); firmware->flash = malloc(firmware->flashsize); + + // using unsigned int for output, since there is no AVR with 4GB if (data_text) { // hdump("code", data_text->d_buf, data_text->d_size); memcpy(firmware->flash + offset, data_text->d_buf, data_text->d_size); offset += data_text->d_size; - printf("Loaded %zu .text\n", data_text->d_size); + AVR_LOG(NULL, LOG_TRACE, "Loaded %u .text\n", (unsigned int)data_text->d_size); } if (data_data) { // hdump("data", data_data->d_buf, data_data->d_size); memcpy(firmware->flash + offset, data_data->d_buf, data_data->d_size); - printf("Loaded %zu .data\n", data_data->d_size); + AVR_LOG(NULL, LOG_TRACE, "Loaded %u .data\n", (unsigned int)data_data->d_size); offset += data_data->d_size; firmware->datasize = data_data->d_size; } @@ -293,7 +309,7 @@ int elf_read_firmware(const char * file, elf_firmware_t * firmware) // hdump("eeprom", data_ee->d_buf, data_ee->d_size); firmware->eeprom = malloc(data_ee->d_size); memcpy(firmware->eeprom, data_ee->d_buf, data_ee->d_size); - printf("Loaded %zu .eeprom\n", data_ee->d_size); + AVR_LOG(NULL, LOG_TRACE, "Loaded %u .eeprom\n", (unsigned int)data_ee->d_size); firmware->eesize = data_ee->d_size; } // hdump("flash", avr->flash, offset);