Merge pull request #21 from bsekisser/sim_core_eicall_eijmp_bugfix
[simavr] / simavr / sim / sim_elf.c
index ab34c28..af4ab2d 100644 (file)
 #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);