openocd: src/target: replace the GPL-2.0-or-later license tag
[fw/openocd] / src / target / arm9tdmi.c
index 1cb9fbdb2be2326f221535d4b60ff6b8758b2bca..f672899cd9dc932f02a22d78448665155c1dd96e 100644 (file)
@@ -1,3 +1,5 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+
 /***************************************************************************
  *   Copyright (C) 2005 by Dominic Rath                                    *
  *   Dominic.Rath@gmx.de                                                   *
@@ -7,21 +9,6 @@
  *                                                                         *
  *   Copyright (C) 2008 by Hongtao Zheng                                   *
  *   hontor@126.com                                                        *
- *                                                                         *
- *   This program is free software; you can redistribute it and/or modify  *
- *   it under the terms of the GNU General Public License as published by  *
- *   the Free Software Foundation; either version 2 of the License, or     *
- *   (at your option) any later version.                                   *
- *                                                                         *
- *   This program is distributed in the hope that it will be useful,       *
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
- *   GNU General Public License for more details.                          *
- *                                                                         *
- *   You should have received a copy of the GNU General Public License     *
- *   along with this program; if not, write to the                         *
- *   Free Software Foundation, Inc.,                                       *
- *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
  ***************************************************************************/
 
 #ifdef HAVE_CONFIG_H
@@ -32,6 +19,7 @@
 #include "target_type.h"
 #include "register.h"
 #include "arm_opcodes.h"
+#include "arm_semihosting.h"
 
 /*
  * NOTE:  this holds code that's used with multiple ARM9 processors:
@@ -100,7 +88,7 @@ int arm9tdmi_examine_debug_reason(struct target *target)
                retval = arm_jtag_scann(&arm7_9->jtag_info, 0x1, TAP_DRPAUSE);
                if (retval != ERROR_OK)
                        return retval;
-               retval = arm_jtag_set_instr(&arm7_9->jtag_info, arm7_9->jtag_info.intest_instr, NULL, TAP_DRPAUSE);
+               retval = arm_jtag_set_instr(arm7_9->jtag_info.tap, arm7_9->jtag_info.intest_instr, NULL, TAP_DRPAUSE);
                if (retval != ERROR_OK)
                        return retval;
 
@@ -154,7 +142,7 @@ int arm9tdmi_clock_out(struct arm_jtag *jtag_info, uint32_t instr,
        if (retval != ERROR_OK)
                return retval;
 
-       retval = arm_jtag_set_instr(jtag_info, jtag_info->intest_instr, NULL, TAP_DRPAUSE);
+       retval = arm_jtag_set_instr(jtag_info->tap, jtag_info->intest_instr, NULL, TAP_DRPAUSE);
        if (retval != ERROR_OK)
                return retval;
 
@@ -206,7 +194,7 @@ int arm9tdmi_clock_data_in(struct arm_jtag *jtag_info, uint32_t *in)
        if (retval != ERROR_OK)
                return retval;
 
-       retval = arm_jtag_set_instr(jtag_info, jtag_info->intest_instr, NULL, TAP_DRPAUSE);
+       retval = arm_jtag_set_instr(jtag_info->tap, jtag_info->intest_instr, NULL, TAP_DRPAUSE);
        if (retval != ERROR_OK)
                return retval;
 
@@ -258,7 +246,7 @@ int arm9tdmi_clock_data_in_endianness(struct arm_jtag *jtag_info,
        if (retval != ERROR_OK)
                return retval;
 
-       retval = arm_jtag_set_instr(jtag_info, jtag_info->intest_instr, NULL, TAP_DRPAUSE);
+       retval = arm_jtag_set_instr(jtag_info->tap, jtag_info->intest_instr, NULL, TAP_DRPAUSE);
        if (retval != ERROR_OK)
                return retval;
 
@@ -716,6 +704,7 @@ int arm9tdmi_init_target(struct command_context *cmd_ctx,
                struct target *target)
 {
        arm9tdmi_build_reg_cache(target);
+       arm_semihosting_init(target);
        return ERROR_OK;
 }
 
@@ -752,6 +741,9 @@ int arm9tdmi_init_arch_info(struct target *target,
        arm7_9->enable_single_step = arm9tdmi_enable_single_step;
        arm7_9->disable_single_step = arm9tdmi_disable_single_step;
 
+       arm7_9->write_memory = arm7_9_write_memory;
+       arm7_9->bulk_write_memory = arm7_9_bulk_write_memory;
+
        arm7_9->post_debug_entry = NULL;
 
        arm7_9->pre_restore_context = NULL;
@@ -778,11 +770,21 @@ static int arm9tdmi_target_create(struct target *target, Jim_Interp *interp)
        struct arm7_9_common *arm7_9 = calloc(1, sizeof(struct arm7_9_common));
 
        arm9tdmi_init_arch_info(target, arm7_9, target->tap);
-       arm7_9->arm.is_armv4 = true;
+       arm7_9->arm.arch = ARM_ARCH_V4;
 
        return ERROR_OK;
 }
 
+void arm9tdmi_deinit_target(struct target *target)
+{
+       struct arm *arm = target_to_arm(target);
+       struct arm7_9_common *arm7_9 = target_to_arm7_9(target);
+
+       arm7_9_deinit(target);
+       arm_free_reg_cache(arm);
+       free(arm7_9);
+}
+
 COMMAND_HANDLER(handle_arm9tdmi_catch_vectors_command)
 {
        struct target *target = get_current_target(CMD_CTX);
@@ -798,7 +800,7 @@ COMMAND_HANDLER(handle_arm9tdmi_catch_vectors_command)
        /* it's uncommon, but some ARM7 chips can support this */
        if (arm7_9->common_magic != ARM7_9_COMMON_MAGIC
                        || !arm7_9->has_vector_catch) {
-               command_print(CMD_CTX, "target doesn't have EmbeddedICE "
+               command_print(CMD, "target doesn't have EmbeddedICE "
                                "with vector_catch");
                return ERROR_TARGET_INVALID;
        }
@@ -831,7 +833,7 @@ COMMAND_HANDLER(handle_arm9tdmi_catch_vectors_command)
 
                                /* complain if vector wasn't found */
                                if (!arm9tdmi_vectors[j].name) {
-                                       command_print(CMD_CTX, "vector '%s' not found, leaving current setting unchanged", CMD_ARGV[i]);
+                                       command_print(CMD, "vector '%s' not found, leaving current setting unchanged", CMD_ARGV[i]);
 
                                        /* reread current setting */
                                        vector_catch_value = buf_get_u32(
@@ -849,7 +851,7 @@ COMMAND_HANDLER(handle_arm9tdmi_catch_vectors_command)
 
        /* output current settings */
        for (unsigned i = 0; arm9tdmi_vectors[i].name; i++) {
-               command_print(CMD_CTX, "%s: %s", arm9tdmi_vectors[i].name,
+               command_print(CMD, "%s: %s", arm9tdmi_vectors[i].name,
                        (vector_catch_value & arm9tdmi_vectors[i].value)
                                ? "catch" : "don't catch");
        }
@@ -899,11 +901,11 @@ struct target_type arm9tdmi_target = {
        .deassert_reset = arm7_9_deassert_reset,
        .soft_reset_halt = arm7_9_soft_reset_halt,
 
+       .get_gdb_arch = arm_get_gdb_arch,
        .get_gdb_reg_list = arm_get_gdb_reg_list,
 
        .read_memory = arm7_9_read_memory,
-       .write_memory = arm7_9_write_memory,
-       .bulk_write_memory = arm7_9_bulk_write_memory,
+       .write_memory = arm7_9_write_memory_opt,
 
        .checksum_memory = arm_checksum_memory,
        .blank_check_memory = arm_blank_check_memory,
@@ -918,6 +920,7 @@ struct target_type arm9tdmi_target = {
        .commands = arm9tdmi_command_handlers,
        .target_create = arm9tdmi_target_create,
        .init_target = arm9tdmi_init_target,
+       .deinit_target = arm9tdmi_deinit_target,
        .examine = arm7_9_examine,
        .check_reset = arm7_9_check_reset,
 };