cortex_a9: add source files for Cortex A9 support.
[fw/openocd] / src / target / target.c
index d200ebc98427b2a3a71c0ed466ab9453eca9b1f6..66aa6bf7bf3d7987b3e31ece61835cd35940f895 100644 (file)
@@ -58,6 +58,7 @@ extern struct target_type arm720t_target;
 extern struct target_type arm9tdmi_target;
 extern struct target_type arm920t_target;
 extern struct target_type arm966e_target;
+extern struct target_type arm946e_target;
 extern struct target_type arm926ejs_target;
 extern struct target_type fa526_target;
 extern struct target_type feroceon_target;
@@ -65,6 +66,7 @@ extern struct target_type dragonite_target;
 extern struct target_type xscale_target;
 extern struct target_type cortexm3_target;
 extern struct target_type cortexa8_target;
+extern struct target_type cortexa9_target;
 extern struct target_type arm11_target;
 extern struct target_type mips_m4k_target;
 extern struct target_type avr_target;
@@ -79,6 +81,7 @@ static struct target_type *target_types[] =
        &arm920t_target,
        &arm720t_target,
        &arm966e_target,
+       &arm946e_target,
        &arm926ejs_target,
        &fa526_target,
        &feroceon_target,
@@ -86,6 +89,7 @@ static struct target_type *target_types[] =
        &xscale_target,
        &cortexm3_target,
        &cortexa8_target,
+       &cortexa9_target,
        &arm11_target,
        &mips_m4k_target,
        &avr_target,
@@ -1211,7 +1215,7 @@ int target_alloc_working_area_try(struct target *target, uint32_t size, struct w
        }
 
        /* mark as used, and return the new (reused) area */
-       new_wa->free = 0;
+       new_wa->free = false;
        *area = new_wa;
 
        /* user pointer */
@@ -1245,7 +1249,7 @@ static int target_free_working_area_restore(struct target *target, struct workin
                        return retval;
        }
 
-       area->free = 1;
+       area->free = true;
 
        /* mark user pointer invalid */
        *area->user = NULL;
@@ -2312,7 +2316,7 @@ COMMAND_HANDLER(handle_md_command)
 
        bool physical=strcmp(CMD_ARGV[0], "phys")==0;
        int (*fn)(struct target *target,
-                       uint32_t address, uint32_t size, uint32_t count, uint8_t *buffer);
+                       uint32_t address, uint32_t size_value, uint32_t count, uint8_t *buffer);
        if (physical)
        {
                CMD_ARGC--;
@@ -3075,7 +3079,7 @@ static void writeGmon(uint32_t *samples, uint32_t sampleNum, const char *filenam
 
        int addressSpace = (max-min + 1);
 
-       static const uint32_t maxBuckets = 256 * 1024; /* maximum buckets. */
+       static const uint32_t maxBuckets = 16 * 1024; /* maximum buckets. */
        uint32_t length = addressSpace;
        if (length > maxBuckets)
        {
@@ -3102,7 +3106,7 @@ static void writeGmon(uint32_t *samples, uint32_t sampleNum, const char *filenam
        writeLong(f, min);                      /* low_pc */
        writeLong(f, max);                      /* high_pc */
        writeLong(f, length);           /* # of samples */
-       writeLong(f, 64000000);         /* 64MHz */
+       writeLong(f, 100);                      /* KLUDGE! We lie, ca. 100Hz best case. */
        writeString(f, "seconds");
        for (i = 0; i < (15-strlen("seconds")); i++)
                writeData(f, &zero, 1);
@@ -3658,6 +3662,7 @@ enum target_cfg_param {
        TCFG_WORK_AREA_BACKUP,
        TCFG_ENDIAN,
        TCFG_VARIANT,
+       TCFG_COREID,
        TCFG_CHAIN_POSITION,
 };
 
@@ -3670,6 +3675,7 @@ static Jim_Nvp nvp_config_opts[] = {
        { .name = "-work-area-backup", .value = TCFG_WORK_AREA_BACKUP },
        { .name = "-endian" ,          .value = TCFG_ENDIAN },
        { .name = "-variant",          .value = TCFG_VARIANT },
+       { .name = "-coreid",           .value = TCFG_COREID },
        { .name = "-chain-position",   .value = TCFG_CHAIN_POSITION },
 
        { .name = NULL, .value = -1 }
@@ -3922,6 +3928,23 @@ static int target_configure(Jim_GetOptInfo *goi, struct target *target)
                        Jim_SetResultString(goi->interp, target->variant,-1);
                        /* loop for more */
                        break;
+
+               case TCFG_COREID:
+                       if (goi->isconfigure) {
+                               e = Jim_GetOpt_Wide(goi, &w);
+                               if (e != JIM_OK) {
+                                       return e;
+                               }
+                               target->coreid = (int)w;
+                       } else {
+                               if (goi->argc != 0) {
+                                       goto no_params;
+                               }
+                       }
+                       Jim_SetResult(goi->interp, Jim_NewIntObj(goi->interp, target->working_area_size));
+                       /* loop for more */
+                       break;
+
                case TCFG_CHAIN_POSITION:
                        if (goi->isconfigure) {
                                Jim_Obj *o_t;
@@ -4219,9 +4242,6 @@ static int jim_target_examine(Jim_Interp *interp, int argc, Jim_Obj *const *argv
        int e = target->type->examine(target);
        if (e != ERROR_OK)
        {
-               Jim_Obj *eObj = Jim_NewIntObj(interp, e);
-               Jim_SetResultFormatted(interp, "examine-fails: %#s", eObj);
-               Jim_FreeNewObj(interp, eObj);
                return JIM_ERR;
        }
        return JIM_OK;
@@ -4261,9 +4281,6 @@ static int jim_target_poll(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
        }
        if (e != ERROR_OK)
        {
-               Jim_Obj *eObj = Jim_NewIntObj(interp, e);
-               Jim_SetResultFormatted(interp, "poll-fails: %#s", eObj);
-               Jim_FreeNewObj(interp, eObj);
                return JIM_ERR;
        }
        return JIM_OK;
@@ -4638,6 +4655,9 @@ static int target_create(Jim_GetOptInfo *goi)
        /* will be set by "-endian" */
        target->endianness = TARGET_ENDIAN_UNKNOWN;
 
+       /* default to first core, override with -coreid */
+       target->coreid = 0;
+
        target->working_area        = 0x0;
        target->working_area_size   = 0x0;
        target->working_areas       = NULL;
@@ -4962,9 +4982,10 @@ COMMAND_HANDLER(handle_fast_load_image_command)
        struct duration bench;
        duration_start(&bench);
 
-       if (image_open(&image, CMD_ARGV[0], (CMD_ARGC >= 3) ? CMD_ARGV[2] : NULL) != ERROR_OK)
+       retval = image_open(&image, CMD_ARGV[0], (CMD_ARGC >= 3) ? CMD_ARGV[2] : NULL);
+       if (retval != ERROR_OK)
        {
-               return ERROR_OK;
+               return retval;
        }
 
        image_size = 0x0;
@@ -4973,6 +4994,7 @@ COMMAND_HANDLER(handle_fast_load_image_command)
        fastload = (struct FastLoad *)malloc(sizeof(struct FastLoad)*image.num_sections);
        if (fastload == NULL)
        {
+               command_print(CMD_CTX, "out of memory");
                image_close(&image);
                return ERROR_FAIL;
        }
@@ -4984,6 +5006,7 @@ COMMAND_HANDLER(handle_fast_load_image_command)
                {
                        command_print(CMD_CTX, "error allocating buffer for section (%d bytes)",
                                                  (int)(image.sections[i].size));
+                       retval = ERROR_FAIL;
                        break;
                }
 
@@ -5019,6 +5042,9 @@ COMMAND_HANDLER(handle_fast_load_image_command)
                        if (fastload[i].data == NULL)
                        {
                                free(buffer);
+                               command_print(CMD_CTX, "error allocating buffer for section (%d bytes)",
+                                                         length);
+                               retval = ERROR_FAIL;
                                break;
                        }
                        memcpy(fastload[i].data, buffer + offset, length);
@@ -5073,14 +5099,18 @@ COMMAND_HANDLER(handle_fast_load_command)
                command_print(CMD_CTX, "Write to 0x%08x, length 0x%08x",
                                          (unsigned int)(fastload[i].address),
                                          (unsigned int)(fastload[i].length));
-               if (retval == ERROR_OK)
+               retval = target_write_buffer(target, fastload[i].address, fastload[i].length, fastload[i].data);
+               if (retval != ERROR_OK)
                {
-                       retval = target_write_buffer(target, fastload[i].address, fastload[i].length, fastload[i].data);
+                       break;
                }
                size += fastload[i].length;
        }
-       int after = timeval_ms();
-       command_print(CMD_CTX, "Loaded image %f kBytes/s", (float)(size/1024.0)/((float)(after-ms)/1000.0));
+       if (retval == ERROR_OK)
+       {
+               int after = timeval_ms();
+               command_print(CMD_CTX, "Loaded image %f kBytes/s", (float)(size/1024.0)/((float)(after-ms)/1000.0));
+       }
        return retval;
 }