Fix logically inverted comment
[fw/openocd] / src / target / arm7_9_common.c
index bae7c9985642d6ed9120e9c0f536f2a904d42f5c..72c67490a19836235adef73413f429d841144c8b 100644 (file)
 #include "config.h"
 #endif
 
-#include "replacements.h"
-
 #include "embeddedice.h"
-#include "target.h"
 #include "target_request.h"
-#include "armv4_5.h"
-#include "arm_jtag.h"
-#include "jtag.h"
-#include "log.h"
 #include "arm7_9_common.h"
-#include "breakpoints.h"
 #include "time_support.h"
 #include "arm_simulator.h"
 
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/time.h>
-#include <errno.h>
 
 int arm7_9_debug_entry(target_t *target);
 int arm7_9_enable_sw_bkpts(struct target_s *target);
@@ -78,6 +62,26 @@ static int arm7_9_clear_watchpoints(arm7_9_common_t *arm7_9)
        return jtag_execute_queue();
 }
 
+static void arm7_9_assign_wp(arm7_9_common_t *arm7_9, breakpoint_t *breakpoint)
+{
+       if (!arm7_9->wp0_used)
+       {
+               arm7_9->wp0_used = 1;
+               breakpoint->set = 1;
+               arm7_9->wp_available--;
+       }
+       else if (!arm7_9->wp1_used)
+       {
+               arm7_9->wp1_used = 1;
+               breakpoint->set = 2;
+               arm7_9->wp_available--;
+       }
+       else
+       {
+               LOG_ERROR("BUG: no hardware comparator available");
+       }
+}
+
 /* set up embedded ice registers */
 static int arm7_9_set_software_breakpoints(arm7_9_common_t *arm7_9)
 {
@@ -182,6 +186,13 @@ int arm7_9_set_breakpoint(struct target_s *target, breakpoint_t *breakpoint)
        {
                /* either an ARM (4 byte) or Thumb (2 byte) breakpoint */
                u32 mask = (breakpoint->length == 4) ? 0x3u : 0x1u;
+
+               /* reassign a hw breakpoint */
+               if (breakpoint->set==0)
+               {
+                       arm7_9_assign_wp(arm7_9, breakpoint);
+               }
+
                if (breakpoint->set==1)
                {
                        embeddedice_set_reg(&arm7_9->eice_cache->reg_list[EICE_W0_ADDR_VALUE], breakpoint->address);
@@ -288,11 +299,13 @@ int arm7_9_unset_breakpoint(struct target_s *target, breakpoint_t *breakpoint)
                {
                        embeddedice_set_reg(&arm7_9->eice_cache->reg_list[EICE_W0_CONTROL_VALUE], 0x0);
                        arm7_9->wp0_used = 0;
+                       arm7_9->wp_available++;
                }
                else if (breakpoint->set == 2)
                {
                        embeddedice_set_reg(&arm7_9->eice_cache->reg_list[EICE_W1_CONTROL_VALUE], 0x0);
                        arm7_9->wp1_used = 0;
+                       arm7_9->wp_available++;
                }
                retval = jtag_execute_queue();
                breakpoint->set = 0;
@@ -367,22 +380,7 @@ int arm7_9_add_breakpoint(struct target_s *target, breakpoint_t *breakpoint)
 
        if (breakpoint->type == BKPT_HARD)
        {
-               arm7_9->wp_available--;
-
-               if (!arm7_9->wp0_used)
-               {
-                       arm7_9->wp0_used = 1;
-                       breakpoint->set = 1;
-               }
-               else if (!arm7_9->wp1_used)
-               {
-                       arm7_9->wp1_used = 1;
-                       breakpoint->set = 2;
-               }
-               else
-               {
-                       LOG_ERROR("BUG: no hardware comparator available");
-               }
+               arm7_9_assign_wp(arm7_9, breakpoint);
        }
 
        arm7_9->breakpoint_count++;
@@ -1273,7 +1271,7 @@ int arm7_9_full_context(target_t *target)
        /* iterate through processor modes (User, FIQ, IRQ, SVC, ABT, UND)
         * SYS shares registers with User, so we don't touch SYS
         */
-       for(i = 0; i < 6; i++)
+       for (i = 0; i < 6; i++)
        {
                u32 mask = 0;
                u32* reg_p[16];
@@ -2593,7 +2591,7 @@ int arm7_9_register_commands(struct command_context_s *cmd_ctx)
        register_command(cmd_ctx, arm7_9_cmd, "dbgrq", handle_arm7_9_dbgrq_command,
                COMMAND_ANY, "use EmbeddedICE dbgrq instead of breakpoint for target halt requests <enable|disable>");
        register_command(cmd_ctx, arm7_9_cmd, "fast_memory_access", handle_arm7_9_fast_memory_access_command,
-                COMMAND_ANY, "use fast memory accesses instead of slower but potentially unsafe slow accesses <enable|disable>");
+                COMMAND_ANY, "use fast memory accesses instead of slower but potentially safer accesses <enable|disable>");
        register_command(cmd_ctx, arm7_9_cmd, "dcc_downloads", handle_arm7_9_dcc_downloads_command,
                COMMAND_ANY, "use DCC downloads for larger memory writes <enable|disable>");