cross compile fix
[openocd.git] / src / target / etm.c
index 0b8a8f5f10856249f043655b241ae298aadcc501..afea12b3b8c898ced9e577eb456b8100b85b8708 100644 (file)
@@ -223,7 +223,6 @@ reg_cache_t* etm_build_reg_cache(target_t *target, arm_jtag_t *jtag_info, etm_co
        etm_reg_t *arch_info = NULL;
        int num_regs = sizeof(etm_reg_arch_info)/sizeof(int);
        int i;
-       u32 etm_ctrl_value;
        
        /* register a register arch-type for etm registers only once */
        if (etm_reg_arch_type == -1)
@@ -256,21 +255,6 @@ reg_cache_t* etm_build_reg_cache(target_t *target, arm_jtag_t *jtag_info, etm_co
                arch_info[i].jtag_info = jtag_info;
        }
 
-       /* initialize some ETM control register settings */     
-       etm_get_reg(&reg_list[ETM_CTRL]);
-       etm_ctrl_value = buf_get_u32(reg_list[ETM_CTRL].value, 0, reg_list[ETM_CTRL].size);
-       
-       /* clear the ETM powerdown bit (0) */
-       etm_ctrl_value &= ~0x1;
-               
-       /* configure port width (6:4), mode (17:16) and clocking (13) */
-       etm_ctrl_value = (etm_ctrl_value & 
-               ~ETM_PORT_WIDTH_MASK & ~ETM_PORT_MODE_MASK & ~ETM_PORT_CLOCK_MASK)
-               | etm_ctx->portmode;
-       
-       buf_set_u32(reg_list[ETM_CTRL].value, 0, reg_list[ETM_CTRL].size, etm_ctrl_value);
-       etm_store_reg(&reg_list[ETM_CTRL]);
-       
        /* the ETM might have an ETB connected */
        if (strcmp(etm_ctx->capture_driver->name, "etb") == 0)
        {
@@ -278,7 +262,7 @@ reg_cache_t* etm_build_reg_cache(target_t *target, arm_jtag_t *jtag_info, etm_co
                
                if (!etb)
                {
-                       ERROR("etb selected as etm capture driver, but no ETB configured");
+                       LOG_ERROR("etb selected as etm capture driver, but no ETB configured");
                        return ERROR_OK;
                }
                
@@ -287,26 +271,55 @@ reg_cache_t* etm_build_reg_cache(target_t *target, arm_jtag_t *jtag_info, etm_co
                etb->reg_cache = reg_cache->next;
        }
        
-       if (etm_ctx->capture_driver->init(etm_ctx) != ERROR_OK)
-       {
-               ERROR("ETM capture driver initialization failed");
-               exit(-1);
-       }
        
        return reg_cache;
 }
 
+int etm_setup(target_t *target)
+{
+       int retval;
+       u32 etm_ctrl_value;
+       armv4_5_common_t *armv4_5 = target->arch_info;
+       arm7_9_common_t *arm7_9 = armv4_5->arch_info;
+       etm_context_t *etm_ctx = arm7_9->etm_ctx;
+       reg_t *etm_ctrl_reg = &arm7_9->etm_ctx->reg_cache->reg_list[ETM_CTRL];
+       /* initialize some ETM control register settings */     
+       etm_get_reg(etm_ctrl_reg);
+       etm_ctrl_value = buf_get_u32(etm_ctrl_reg->value, 0, etm_ctrl_reg->size);
+       
+       /* clear the ETM powerdown bit (0) */
+       etm_ctrl_value &= ~0x1;
+               
+       /* configure port width (6:4), mode (17:16) and clocking (13) */
+       etm_ctrl_value = (etm_ctrl_value & 
+               ~ETM_PORT_WIDTH_MASK & ~ETM_PORT_MODE_MASK & ~ETM_PORT_CLOCK_MASK)
+               | etm_ctx->portmode;
+       
+       buf_set_u32(etm_ctrl_reg->value, 0, etm_ctrl_reg->size, etm_ctrl_value);
+       etm_store_reg(etm_ctrl_reg);
+       
+       if ((retval=jtag_execute_queue())!=ERROR_OK)
+               return retval;
+       
+       if ((retval=etm_ctx->capture_driver->init(etm_ctx)) != ERROR_OK)
+       {
+               LOG_ERROR("ETM capture driver initialization failed");
+               return retval;
+       }
+       return ERROR_OK;
+}
+
 int etm_get_reg(reg_t *reg)
 {
        if (etm_read_reg(reg) != ERROR_OK)
        {
-               ERROR("BUG: error scheduling etm register read");
+               LOG_ERROR("BUG: error scheduling etm register read");
                exit(-1);
        }
        
        if (jtag_execute_queue() != ERROR_OK)
        {
-               ERROR("register read failed");
+               LOG_ERROR("register read failed");
        }
        
        return ERROR_OK;
@@ -318,7 +331,7 @@ int etm_read_reg_w_check(reg_t *reg, u8* check_value, u8* check_mask)
        u8 reg_addr = etm_reg->addr & 0x7f;
        scan_field_t fields[3];
        
-       DEBUG("%i", etm_reg->addr);
+       LOG_DEBUG("%i", etm_reg->addr);
 
        jtag_add_end_state(TAP_RTI);
        arm_jtag_scann(etm_reg->jtag_info, 0x6);
@@ -356,13 +369,12 @@ int etm_read_reg_w_check(reg_t *reg, u8* check_value, u8* check_mask)
        fields[2].in_handler = NULL;
        fields[2].in_handler_priv = NULL;
        
-       jtag_add_dr_scan(3, fields, -1, NULL);
+       jtag_add_dr_scan(3, fields, -1);
        
        fields[0].in_value = reg->value;
-       fields[0].in_check_value = check_value;
-       fields[0].in_check_mask = check_mask;
+       jtag_set_check_value(fields+0, check_value, check_mask, NULL);  
                
-       jtag_add_dr_scan(3, fields, -1, NULL);
+       jtag_add_dr_scan(3, fields, -1);
 
        free(fields[1].out_value);
        free(fields[2].out_value);
@@ -379,7 +391,7 @@ int etm_set_reg(reg_t *reg, u32 value)
 {
        if (etm_write_reg(reg, value) != ERROR_OK)
        {
-               ERROR("BUG: error scheduling etm register write");
+               LOG_ERROR("BUG: error scheduling etm register write");
                exit(-1);
        }
        
@@ -396,7 +408,7 @@ int etm_set_reg_w_exec(reg_t *reg, u8 *buf)
        
        if (jtag_execute_queue() != ERROR_OK)
        {
-               ERROR("register write failed");
+               LOG_ERROR("register write failed");
                exit(-1);
        }
        return ERROR_OK;
@@ -408,7 +420,7 @@ int etm_write_reg(reg_t *reg, u32 value)
        u8 reg_addr = etm_reg->addr & 0x7f;
        scan_field_t fields[3];
        
-       DEBUG("%i: 0x%8.8x", etm_reg->addr, value);
+       LOG_DEBUG("%i: 0x%8.8x", etm_reg->addr, value);
        
        jtag_add_end_state(TAP_RTI);
        arm_jtag_scann(etm_reg->jtag_info, 0x6);
@@ -447,7 +459,7 @@ int etm_write_reg(reg_t *reg, u32 value)
        fields[2].in_handler = NULL;
        fields[2].in_handler_priv = NULL;
        
-       jtag_add_dr_scan(3, fields, -1, NULL);
+       jtag_add_dr_scan(3, fields, -1);
        
        free(fields[0].out_value);
        free(fields[1].out_value);
@@ -527,7 +539,7 @@ int etm_read_instruction(etm_context_t *ctx, arm_instruction_t *instruction)
                        ctx->current_pc - ctx->image->sections[section].base_address,
                        4, buf, &size_read)) != ERROR_OK)
                {
-                       ERROR("error while reading instruction: %i", retval);
+                       LOG_ERROR("error while reading instruction: %i", retval);
                        return ERROR_TRACE_INSTRUCTION_UNAVAILABLE;
                }
                opcode = target_buffer_get_u32(ctx->target, buf);
@@ -540,7 +552,7 @@ int etm_read_instruction(etm_context_t *ctx, arm_instruction_t *instruction)
                        ctx->current_pc - ctx->image->sections[section].base_address,
                        2, buf, &size_read)) != ERROR_OK)
                {
-                       ERROR("error while reading instruction: %i", retval);
+                       LOG_ERROR("error while reading instruction: %i", retval);
                        return ERROR_TRACE_INSTRUCTION_UNAVAILABLE;
                }
                opcode = target_buffer_get_u16(ctx->target, buf);
@@ -548,12 +560,12 @@ int etm_read_instruction(etm_context_t *ctx, arm_instruction_t *instruction)
        }
        else if (ctx->core_state == ARMV4_5_STATE_JAZELLE)
        {
-               ERROR("BUG: tracing of jazelle code not supported");
+               LOG_ERROR("BUG: tracing of jazelle code not supported");
                exit(-1);
        }
        else
        {
-               ERROR("BUG: unknown core state encountered");
+               LOG_ERROR("BUG: unknown core state encountered");
                exit(-1);
        }
        
@@ -724,13 +736,18 @@ int etmv1_data(etm_context_t *ctx, int size, u32 *data)
        }
        
        if (size == 8)
-               ERROR("TODO: add support for 64-bit values");
+       {
+               LOG_ERROR("TODO: add support for 64-bit values");
+               return -1;
+       }
        else if (size == 4)
                *data = target_buffer_get_u32(ctx->target, buf);
        else if (size == 2)
                *data = target_buffer_get_u16(ctx->target, buf);
        else if (size == 1)
                *data = buf[0];
+       else
+               return -1;
                
        return 0;
 }
@@ -804,7 +821,7 @@ int etmv1_analyze_trace(etm_context_t *ctx, struct command_context_s *cmd_ctx)
                                /* a positive return values means the current branch was abandoned,
                                 * and a new branch was encountered in cycle ctx->pipe_index + retval;
                                 */
-                               WARNING("abandoned branch encountered, correctnes of analysis uncertain");
+                               LOG_WARNING("abandoned branch encountered, correctnes of analysis uncertain");
                                ctx->pipe_index += retval;
                                continue;
                        }
@@ -849,7 +866,7 @@ int etmv1_analyze_trace(etm_context_t *ctx, struct command_context_s *cmd_ctx)
                                        }
                                        break;
                                default:        /* reserved */
-                                       ERROR("BUG: branch reason code 0x%x is reserved", ctx->last_branch_reason);             
+                                       LOG_ERROR("BUG: branch reason code 0x%x is reserved", ctx->last_branch_reason);         
                                        exit(-1);
                                        break;
                        }
@@ -1219,7 +1236,7 @@ int handle_etm_config_command(struct command_context_s *cmd_ctx, char *cmd, char
        
        if (argc != 5)
        {
-               ERROR("incomplete 'etm config <target> <port_width> <port_mode> <clocking> <capture_driver>' command");
+               LOG_ERROR("incomplete 'etm config <target> <port_width> <port_mode> <clocking> <capture_driver>' command");
                exit(-1);
        }
        
@@ -1227,7 +1244,7 @@ int handle_etm_config_command(struct command_context_s *cmd_ctx, char *cmd, char
        
        if (!target)
        {
-               ERROR("target number '%s' not defined", args[0]);
+               LOG_ERROR("target number '%s' not defined", args[0]);
                exit(-1);
        }
        
@@ -1305,7 +1322,7 @@ int handle_etm_config_command(struct command_context_s *cmd_ctx, char *cmd, char
        {
                /* no supported capture driver found, don't register an ETM */
                free(etm_ctx);
-               ERROR("trace capture driver '%s' not found", args[4]);
+               LOG_ERROR("trace capture driver '%s' not found", args[4]);
                return ERROR_OK;
        }
        
@@ -1388,6 +1405,9 @@ int handle_etm_info_command(struct command_context_s *cmd_ctx, char *cmd, char *
                case 2:
                        max_port_size = 16;
                        break;
+               default:
+                       LOG_ERROR("Illegal max_port_size");
+                       exit(-1);
        }
        command_print(cmd_ctx, "max. port size: %i", max_port_size);
        
@@ -1506,7 +1526,6 @@ int handle_etm_image_command(struct command_context_s *cmd_ctx, char *cmd, char
                
        if (image_open(etm_ctx->image, args[0], (argc >= 3) ? args[2] : NULL) != ERROR_OK)
        {
-               command_print(cmd_ctx, "image opening error: %s", etm_ctx->image->error_str);
                free(etm_ctx->image);
                etm_ctx->image = NULL;
                return ERROR_OK;
@@ -1563,7 +1582,6 @@ int handle_etm_dump_command(struct command_context_s *cmd_ctx, char *cmd, char *
        
        if (fileio_open(&file, args[0], FILEIO_WRITE, FILEIO_BINARY) != ERROR_OK)
        {
-               command_print(cmd_ctx, "file open error: %s", file.error_str);
                return ERROR_OK;
        }
        
@@ -1621,19 +1639,20 @@ int handle_etm_load_command(struct command_context_s *cmd_ctx, char *cmd, char *
        
        if (fileio_open(&file, args[0], FILEIO_READ, FILEIO_BINARY) != ERROR_OK)
        {
-               command_print(cmd_ctx, "file open error: %s", file.error_str);
                return ERROR_OK;
        }
        
        if (file.size % 4)
        {
                command_print(cmd_ctx, "size isn't a multiple of 4, no valid trace data");
+               fileio_close(&file);
                return ERROR_OK;
        }
        
        if (etm_ctx->trace_depth > 0)
        {
                free(etm_ctx->trace_data);
+               etm_ctx->trace_data = NULL;
        }
        
        fileio_read_u32(&file, &etm_ctx->capture_status);
@@ -1642,6 +1661,12 @@ int handle_etm_load_command(struct command_context_s *cmd_ctx, char *cmd, char *
        fileio_read_u32(&file, &etm_ctx->trace_depth);
        
        etm_ctx->trace_data = malloc(sizeof(etmv1_trace_data_t) * etm_ctx->trace_depth);
+       if(etm_ctx->trace_data == NULL)
+       {
+               command_print(cmd_ctx, "not enough memory to perform operation");
+               fileio_close(&file);
+               return ERROR_OK;
+       }
        
        for (i = 0; i < etm_ctx->trace_depth; i++)
        {

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)