Cortex-A8: better context restore
[fw/openocd] / src / target / mips_m4k.c
index 580c0602f578d488a72695f3075e3a7bb4e581a9..0a566c3444175ee8df3f534f48270ecfd7033c8e 100644 (file)
 #include "config.h"
 #endif
 
+#include "breakpoints.h"
 #include "mips32.h"
 #include "mips_m4k.h"
 #include "mips32_dmaacc.h"
 #include "target_type.h"
+#include "register.h"
 
 
 /* cli handling */
 
 /* forward declarations */
-int mips_m4k_poll(target_t *target);
-int mips_m4k_halt(struct target_s *target);
-int mips_m4k_soft_reset_halt(struct target_s *target);
-int mips_m4k_resume(struct target_s *target, int current, uint32_t address, int handle_breakpoints, int debug_execution);
-int mips_m4k_step(struct target_s *target, int current, uint32_t address, int handle_breakpoints);
-int mips_m4k_read_memory(struct target_s *target, uint32_t address, uint32_t size, uint32_t count, uint8_t *buffer);
-int mips_m4k_write_memory(struct target_s *target, uint32_t address, uint32_t size, uint32_t count, uint8_t *buffer);
-int mips_m4k_register_commands(struct command_context_s *cmd_ctx);
-int mips_m4k_init_target(struct command_context_s *cmd_ctx, struct target_s *target);
-int mips_m4k_target_create(struct target_s *target, Jim_Interp *interp);
-
-int mips_m4k_examine(struct target_s *target);
-int mips_m4k_assert_reset(target_t *target);
-int mips_m4k_deassert_reset(target_t *target);
-int mips_m4k_checksum_memory(target_t *target, uint32_t address, uint32_t size, uint32_t *checksum);
-
-target_type_t mips_m4k_target =
+int mips_m4k_poll(struct target *target);
+int mips_m4k_halt(struct target *target);
+int mips_m4k_soft_reset_halt(struct target *target);
+int mips_m4k_resume(struct target *target, int current, uint32_t address, int handle_breakpoints, int debug_execution);
+int mips_m4k_step(struct target *target, int current, uint32_t address, int handle_breakpoints);
+int mips_m4k_read_memory(struct target *target, uint32_t address, uint32_t size, uint32_t count, uint8_t *buffer);
+int mips_m4k_write_memory(struct target *target, uint32_t address, uint32_t size, uint32_t count, uint8_t *buffer);
+int mips_m4k_register_commands(struct command_context *cmd_ctx);
+int mips_m4k_init_target(struct command_context *cmd_ctx, struct target *target);
+int mips_m4k_target_create(struct target *target, Jim_Interp *interp);
+
+int mips_m4k_examine(struct target *target);
+int mips_m4k_assert_reset(struct target *target);
+int mips_m4k_deassert_reset(struct target *target);
+int mips_m4k_checksum_memory(struct target *target, uint32_t address, uint32_t size, uint32_t *checksum);
+
+struct target_type mips_m4k_target =
 {
        .name = "mips_m4k",
 
@@ -86,7 +88,7 @@ target_type_t mips_m4k_target =
        .examine = mips_m4k_examine,
 };
 
-int mips_m4k_examine_debug_reason(target_t *target)
+int mips_m4k_examine_debug_reason(struct target *target)
 {
        uint32_t break_status;
        int retval;
@@ -120,7 +122,7 @@ int mips_m4k_examine_debug_reason(target_t *target)
        return ERROR_OK;
 }
 
-int mips_m4k_debug_entry(target_t *target)
+int mips_m4k_debug_entry(struct target *target)
 {
        struct mips32_common *mips32 = target->arch_info;
        struct mips_ejtag *ejtag_info = &mips32->ejtag_info;
@@ -151,7 +153,7 @@ int mips_m4k_debug_entry(target_t *target)
        return ERROR_OK;
 }
 
-int mips_m4k_poll(target_t *target)
+int mips_m4k_poll(struct target *target)
 {
        int retval;
        struct mips32_common *mips32 = target->arch_info;
@@ -212,7 +214,7 @@ int mips_m4k_poll(target_t *target)
        return ERROR_OK;
 }
 
-int mips_m4k_halt(struct target_s *target)
+int mips_m4k_halt(struct target *target)
 {
        struct mips32_common *mips32 = target->arch_info;
        struct mips_ejtag *ejtag_info = &mips32->ejtag_info;
@@ -257,7 +259,7 @@ int mips_m4k_halt(struct target_s *target)
        return ERROR_OK;
 }
 
-int mips_m4k_assert_reset(target_t *target)
+int mips_m4k_assert_reset(struct target *target)
 {
        struct mips32_common *mips32 = target->arch_info;
        struct mips_ejtag *ejtag_info = &mips32->ejtag_info;
@@ -307,7 +309,7 @@ int mips_m4k_assert_reset(target_t *target)
        target->state = TARGET_RESET;
        jtag_add_sleep(50000);
 
-       mips32_invalidate_core_regs(target);
+       register_cache_invalidate(mips32->core_cache);
 
        if (target->reset_halt)
        {
@@ -319,7 +321,7 @@ int mips_m4k_assert_reset(target_t *target)
        return ERROR_OK;
 }
 
-int mips_m4k_deassert_reset(target_t *target)
+int mips_m4k_deassert_reset(struct target *target)
 {
        LOG_DEBUG("target->state: %s",
                target_state_name(target));
@@ -330,13 +332,13 @@ int mips_m4k_deassert_reset(target_t *target)
        return ERROR_OK;
 }
 
-int mips_m4k_soft_reset_halt(struct target_s *target)
+int mips_m4k_soft_reset_halt(struct target *target)
 {
        /* TODO */
        return ERROR_OK;
 }
 
-int mips_m4k_single_step_core(target_t *target)
+int mips_m4k_single_step_core(struct target *target)
 {
        struct mips32_common *mips32 = target->arch_info;
        struct mips_ejtag *ejtag_info = &mips32->ejtag_info;
@@ -355,11 +357,11 @@ int mips_m4k_single_step_core(target_t *target)
        return ERROR_OK;
 }
 
-int mips_m4k_resume(struct target_s *target, int current, uint32_t address, int handle_breakpoints, int debug_execution)
+int mips_m4k_resume(struct target *target, int current, uint32_t address, int handle_breakpoints, int debug_execution)
 {
        struct mips32_common *mips32 = target->arch_info;
        struct mips_ejtag *ejtag_info = &mips32->ejtag_info;
-       breakpoint_t *breakpoint = NULL;
+       struct breakpoint *breakpoint = NULL;
        uint32_t resume_pc;
 
        if (target->state != TARGET_HALTED)
@@ -408,7 +410,7 @@ int mips_m4k_resume(struct target_s *target, int current, uint32_t address, int
        target->debug_reason = DBG_REASON_NOTHALTED;
 
        /* registers are now invalid */
-       mips32_invalidate_core_regs(target);
+       register_cache_invalidate(mips32->core_cache);
 
        if (!debug_execution)
        {
@@ -426,12 +428,12 @@ int mips_m4k_resume(struct target_s *target, int current, uint32_t address, int
        return ERROR_OK;
 }
 
-int mips_m4k_step(struct target_s *target, int current, uint32_t address, int handle_breakpoints)
+int mips_m4k_step(struct target *target, int current, uint32_t address, int handle_breakpoints)
 {
        /* get pointers to arch-specific information */
        struct mips32_common *mips32 = target->arch_info;
        struct mips_ejtag *ejtag_info = &mips32->ejtag_info;
-       breakpoint_t *breakpoint = NULL;
+       struct breakpoint *breakpoint = NULL;
 
        if (target->state != TARGET_HALTED)
        {
@@ -465,7 +467,7 @@ int mips_m4k_step(struct target_s *target, int current, uint32_t address, int ha
        mips_ejtag_exit_debug(ejtag_info);
 
        /* registers are now invalid */
-       mips32_invalidate_core_regs(target);
+       register_cache_invalidate(mips32->core_cache);
 
        if (breakpoint)
                mips_m4k_set_breakpoint(target, breakpoint);
@@ -478,9 +480,9 @@ int mips_m4k_step(struct target_s *target, int current, uint32_t address, int ha
        return ERROR_OK;
 }
 
-void mips_m4k_enable_breakpoints(struct target_s *target)
+void mips_m4k_enable_breakpoints(struct target *target)
 {
-       breakpoint_t *breakpoint = target->breakpoints;
+       struct breakpoint *breakpoint = target->breakpoints;
 
        /* set any pending breakpoints */
        while (breakpoint)
@@ -491,7 +493,7 @@ void mips_m4k_enable_breakpoints(struct target_s *target)
        }
 }
 
-int mips_m4k_set_breakpoint(struct target_s *target, breakpoint_t *breakpoint)
+int mips_m4k_set_breakpoint(struct target *target, struct breakpoint *breakpoint)
 {
        struct mips32_common *mips32 = target->arch_info;
        struct mips32_comparator * comparator_list = mips32->inst_break_list;
@@ -511,10 +513,9 @@ int mips_m4k_set_breakpoint(struct target_s *target, breakpoint_t *breakpoint)
                        bp_num++;
                if (bp_num >= mips32->num_inst_bpoints)
                {
-                       LOG_DEBUG("ERROR Can not find free FP Comparator(bpid: %d)",
+                       LOG_ERROR("Can not find free FP Comparator(bpid: %d)",
                                          breakpoint->unique_id );
-                       LOG_WARNING("ERROR Can not find free FP Comparator");
-                       exit(-1);
+                       return ERROR_FAIL;
                }
                breakpoint->set = bp_num + 1;
                comparator_list[bp_num].used = 1;
@@ -582,7 +583,7 @@ int mips_m4k_set_breakpoint(struct target_s *target, breakpoint_t *breakpoint)
        return ERROR_OK;
 }
 
-int mips_m4k_unset_breakpoint(struct target_s *target, breakpoint_t *breakpoint)
+int mips_m4k_unset_breakpoint(struct target *target, struct breakpoint *breakpoint)
 {
        /* get pointers to arch-specific information */
        struct mips32_common *mips32 = target->arch_info;
@@ -657,7 +658,7 @@ int mips_m4k_unset_breakpoint(struct target_s *target, breakpoint_t *breakpoint)
        return ERROR_OK;
 }
 
-int mips_m4k_add_breakpoint(struct target_s *target, breakpoint_t *breakpoint)
+int mips_m4k_add_breakpoint(struct target *target, struct breakpoint *breakpoint)
 {
        struct mips32_common *mips32 = target->arch_info;
 
@@ -677,7 +678,7 @@ int mips_m4k_add_breakpoint(struct target_s *target, breakpoint_t *breakpoint)
        return ERROR_OK;
 }
 
-int mips_m4k_remove_breakpoint(struct target_s *target, breakpoint_t *breakpoint)
+int mips_m4k_remove_breakpoint(struct target *target, struct breakpoint *breakpoint)
 {
        /* get pointers to arch-specific information */
        struct mips32_common *mips32 = target->arch_info;
@@ -699,7 +700,7 @@ int mips_m4k_remove_breakpoint(struct target_s *target, breakpoint_t *breakpoint
        return ERROR_OK;
 }
 
-int mips_m4k_set_watchpoint(struct target_s *target, struct watchpoint *watchpoint)
+int mips_m4k_set_watchpoint(struct target *target, struct watchpoint *watchpoint)
 {
        struct mips32_common *mips32 = target->arch_info;
        struct mips32_comparator * comparator_list = mips32->data_break_list;
@@ -722,9 +723,8 @@ int mips_m4k_set_watchpoint(struct target_s *target, struct watchpoint *watchpoi
                wp_num++;
        if (wp_num >= mips32->num_data_bpoints)
        {
-               LOG_DEBUG("ERROR Can not find free FP Comparator");
-               LOG_WARNING("ERROR Can not find free FP Comparator");
-               exit(-1);
+               LOG_ERROR("Can not find free FP Comparator");
+               return ERROR_FAIL;
        }
 
        if (watchpoint->length != 4)
@@ -767,7 +767,7 @@ int mips_m4k_set_watchpoint(struct target_s *target, struct watchpoint *watchpoi
        return ERROR_OK;
 }
 
-int mips_m4k_unset_watchpoint(struct target_s *target, struct watchpoint *watchpoint)
+int mips_m4k_unset_watchpoint(struct target *target, struct watchpoint *watchpoint)
 {
        /* get pointers to arch-specific information */
        struct mips32_common *mips32 = target->arch_info;
@@ -793,7 +793,7 @@ int mips_m4k_unset_watchpoint(struct target_s *target, struct watchpoint *watchp
        return ERROR_OK;
 }
 
-int mips_m4k_add_watchpoint(struct target_s *target, struct watchpoint *watchpoint)
+int mips_m4k_add_watchpoint(struct target *target, struct watchpoint *watchpoint)
 {
        struct mips32_common *mips32 = target->arch_info;
 
@@ -809,7 +809,7 @@ int mips_m4k_add_watchpoint(struct target_s *target, struct watchpoint *watchpoi
        return ERROR_OK;
 }
 
-int mips_m4k_remove_watchpoint(struct target_s *target, struct watchpoint *watchpoint)
+int mips_m4k_remove_watchpoint(struct target *target, struct watchpoint *watchpoint)
 {
        /* get pointers to arch-specific information */
        struct mips32_common *mips32 = target->arch_info;
@@ -830,7 +830,7 @@ int mips_m4k_remove_watchpoint(struct target_s *target, struct watchpoint *watch
        return ERROR_OK;
 }
 
-void mips_m4k_enable_watchpoints(struct target_s *target)
+void mips_m4k_enable_watchpoints(struct target *target)
 {
        struct watchpoint *watchpoint = target->watchpoints;
 
@@ -843,7 +843,7 @@ void mips_m4k_enable_watchpoints(struct target_s *target)
        }
 }
 
-int mips_m4k_read_memory(struct target_s *target, uint32_t address, uint32_t size, uint32_t count, uint8_t *buffer)
+int mips_m4k_read_memory(struct target *target, uint32_t address, uint32_t size, uint32_t count, uint8_t *buffer)
 {
        struct mips32_common *mips32 = target->arch_info;
        struct mips_ejtag *ejtag_info = &mips32->ejtag_info;
@@ -875,7 +875,7 @@ int mips_m4k_read_memory(struct target_s *target, uint32_t address, uint32_t siz
        return ERROR_OK;
 }
 
-int mips_m4k_write_memory(struct target_s *target, uint32_t address, uint32_t size, uint32_t count, uint8_t *buffer)
+int mips_m4k_write_memory(struct target *target, uint32_t address, uint32_t size, uint32_t count, uint8_t *buffer)
 {
        struct mips32_common *mips32 = target->arch_info;
        struct mips_ejtag *ejtag_info = &mips32->ejtag_info;
@@ -902,7 +902,7 @@ int mips_m4k_write_memory(struct target_s *target, uint32_t address, uint32_t si
                return mips32_dmaacc_write_mem(ejtag_info, address, size, count, (void *)buffer);
 }
 
-int mips_m4k_register_commands(struct command_context_s *cmd_ctx)
+int mips_m4k_register_commands(struct command_context *cmd_ctx)
 {
        int retval;
 
@@ -910,14 +910,14 @@ int mips_m4k_register_commands(struct command_context_s *cmd_ctx)
        return retval;
 }
 
-int mips_m4k_init_target(struct command_context_s *cmd_ctx, struct target_s *target)
+int mips_m4k_init_target(struct command_context *cmd_ctx, struct target *target)
 {
        mips32_build_reg_cache(target);
 
        return ERROR_OK;
 }
 
-int mips_m4k_init_arch_info(target_t *target, mips_m4k_common_t *mips_m4k, struct jtag_tap *tap)
+int mips_m4k_init_arch_info(struct target *target, struct mips_m4k_common *mips_m4k, struct jtag_tap *tap)
 {
        struct mips32_common *mips32 = &mips_m4k->mips32_common;
 
@@ -930,16 +930,16 @@ int mips_m4k_init_arch_info(target_t *target, mips_m4k_common_t *mips_m4k, struc
        return ERROR_OK;
 }
 
-int mips_m4k_target_create(struct target_s *target, Jim_Interp *interp)
+int mips_m4k_target_create(struct target *target, Jim_Interp *interp)
 {
-       mips_m4k_common_t *mips_m4k = calloc(1,sizeof(mips_m4k_common_t));
+       struct mips_m4k_common *mips_m4k = calloc(1,sizeof(struct mips_m4k_common));
 
        mips_m4k_init_arch_info(target, mips_m4k, target->tap);
 
        return ERROR_OK;
 }
 
-int mips_m4k_examine(struct target_s *target)
+int mips_m4k_examine(struct target *target)
 {
        int retval;
        struct mips32_common *mips32 = target->arch_info;
@@ -970,12 +970,12 @@ int mips_m4k_examine(struct target_s *target)
        return ERROR_OK;
 }
 
-int mips_m4k_bulk_write_memory(target_t *target, uint32_t address, uint32_t count, uint8_t *buffer)
+int mips_m4k_bulk_write_memory(struct target *target, uint32_t address, uint32_t count, uint8_t *buffer)
 {
        return mips_m4k_write_memory(target, address, 4, count, buffer);
 }
 
-int mips_m4k_checksum_memory(target_t *target, uint32_t address, uint32_t size, uint32_t *checksum)
+int mips_m4k_checksum_memory(struct target *target, uint32_t address, uint32_t size, uint32_t *checksum)
 {
        return ERROR_FAIL; /* use bulk read method */
 }